meow
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/target
|
||||||
|
.direnv
|
||||||
4798
Cargo.lock
generated
Normal file
4798
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
9
Cargo.toml
Normal file
9
Cargo.toml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
[package]
|
||||||
|
name = "imgui-testing"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
floem = { git = "https://github.com/lapce/floem", features = ["crossbeam", "vello"], version = "0.2.0" }
|
||||||
|
tracing = "0.1.41"
|
||||||
|
tracing-subscriber = "0.3.20"
|
||||||
63
flake.lock
generated
Normal file
63
flake.lock
generated
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"fenix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"rust-analyzer-src": "rust-analyzer-src"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1759301100,
|
||||||
|
"narHash": "sha256-hmiTEoVAqLnn80UkreCNunnRKPucKvcg5T4/CELEtbw=",
|
||||||
|
"rev": "0956bc5d1df2ea800010172c6bc4470d9a22cb81",
|
||||||
|
"revCount": 2408,
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://api.flakehub.com/f/pinned/nix-community/fenix/0.1.2408%2Brev-0956bc5d1df2ea800010172c6bc4470d9a22cb81/01999edc-854f-7714-9439-7c9ee1181398/source.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://flakehub.com/f/nix-community/fenix/0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1760878510,
|
||||||
|
"narHash": "sha256-K5Osef2qexezUfs0alLvZ7nQFTGS9DL2oTVsIXsqLgs=",
|
||||||
|
"rev": "5e2a59a5b1a82f89f2c7e598302a9cacebb72a67",
|
||||||
|
"revCount": 880095,
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.880095%2Brev-5e2a59a5b1a82f89f2c7e598302a9cacebb72a67/0199ff22-59dd-7eb0-a8c6-783df1d83a4f/source.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://flakehub.com/f/NixOS/nixpkgs/0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"fenix": "fenix",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-analyzer-src": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1759245522,
|
||||||
|
"narHash": "sha256-H4Hx/EuMJ9qi1WzPV4UG2bbZiDCdREtrtDvYcHr0kmk=",
|
||||||
|
"owner": "rust-lang",
|
||||||
|
"repo": "rust-analyzer",
|
||||||
|
"rev": "a6bc4a4bbe6a65b71cbf76a0cf528c47a8d9f97f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "rust-lang",
|
||||||
|
"ref": "nightly",
|
||||||
|
"repo": "rust-analyzer",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
91
flake.nix
Normal file
91
flake.nix
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
{
|
||||||
|
description = "A Nix-flake-based Rust development environment";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1"; # unstable Nixpkgs
|
||||||
|
fenix = {
|
||||||
|
url = "https://flakehub.com/f/nix-community/fenix/0.1";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{ self, ... }@inputs:
|
||||||
|
|
||||||
|
let
|
||||||
|
supportedSystems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
"x86_64-darwin"
|
||||||
|
"aarch64-darwin"
|
||||||
|
];
|
||||||
|
forEachSupportedSystem =
|
||||||
|
f:
|
||||||
|
inputs.nixpkgs.lib.genAttrs supportedSystems (
|
||||||
|
system:
|
||||||
|
f {
|
||||||
|
pkgs = import inputs.nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [
|
||||||
|
inputs.self.overlays.default
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
overlays.default = final: prev: {
|
||||||
|
rustToolchain =
|
||||||
|
with inputs.fenix.packages.${prev.stdenv.hostPlatform.system};
|
||||||
|
combine (
|
||||||
|
with stable;
|
||||||
|
[
|
||||||
|
clippy
|
||||||
|
rustc
|
||||||
|
cargo
|
||||||
|
rustfmt
|
||||||
|
rust-src
|
||||||
|
]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
devShells = forEachSupportedSystem (
|
||||||
|
{ pkgs }:
|
||||||
|
{
|
||||||
|
default = pkgs.mkShellNoCC {
|
||||||
|
packages = with pkgs; [
|
||||||
|
rustToolchain
|
||||||
|
openssl
|
||||||
|
pkg-config
|
||||||
|
cargo-deny
|
||||||
|
cargo-edit
|
||||||
|
cargo-watch
|
||||||
|
rust-analyzer
|
||||||
|
gcc
|
||||||
|
gtk3-x11
|
||||||
|
atk
|
||||||
|
mesa # libGL + llvmpipe + lavapipe ICD (user-space GL & Vulkan soft drivers)
|
||||||
|
vulkan-loader # Vulkan loader
|
||||||
|
vulkan-tools # vulkaninfo, etc.
|
||||||
|
xorg.libX11
|
||||||
|
libxcb
|
||||||
|
xorg.libXrandr
|
||||||
|
xorg.libXinerama
|
||||||
|
xorg.libXcursor
|
||||||
|
xorg.libXfixes
|
||||||
|
xorg.libXcomposite
|
||||||
|
xorg.libXdamage
|
||||||
|
# xorg.libxkbcommon
|
||||||
|
# xorg.libdrm
|
||||||
|
llvm # JIT for llvmpipe (pulled in by mesa often, but safe to include)
|
||||||
|
];
|
||||||
|
|
||||||
|
env = {
|
||||||
|
# Required by rust-analyzer
|
||||||
|
RUST_SRC_PATH = "${pkgs.rustToolchain}/lib/rustlib/src/rust/library";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
95
src/main.rs
Normal file
95
src/main.rs
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
use floem::{
|
||||||
|
IntoView, View,
|
||||||
|
keyboard::{Key, NamedKey},
|
||||||
|
peniko::Color,
|
||||||
|
peniko::color::palette,
|
||||||
|
reactive::{SignalGet, SignalUpdate, create_signal},
|
||||||
|
unit::UnitExt,
|
||||||
|
views::{Decorators, LabelCustomStyle, dyn_view},
|
||||||
|
};
|
||||||
|
|
||||||
|
fn app_view() -> impl IntoView {
|
||||||
|
let (counter, set_counter) = create_signal(0);
|
||||||
|
let view = (
|
||||||
|
dyn_view(move || format!("Value: {}", counter.get())),
|
||||||
|
counter.style(|s| s.padding(10.0)),
|
||||||
|
(
|
||||||
|
"Increment"
|
||||||
|
.style(|s| {
|
||||||
|
s.border_radius(10.0)
|
||||||
|
.padding(10.0)
|
||||||
|
.background(palette::css::WHITE)
|
||||||
|
.box_shadow_blur(5.0)
|
||||||
|
.focus_visible(|s| s.outline(2.).outline_color(palette::css::BLUE))
|
||||||
|
.hover(|s| s.background(palette::css::LIGHT_GREEN))
|
||||||
|
.active(|s| {
|
||||||
|
s.color(palette::css::WHITE)
|
||||||
|
.background(palette::css::DARK_GREEN)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.on_click_stop({
|
||||||
|
move |_| {
|
||||||
|
set_counter.update(|value| *value += 1);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.keyboard_navigable(),
|
||||||
|
"Decrement"
|
||||||
|
.on_click_stop({
|
||||||
|
move |_| {
|
||||||
|
set_counter.update(|value| *value -= 1);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.style(|s| {
|
||||||
|
s.box_shadow_blur(5.0)
|
||||||
|
.background(palette::css::WHITE)
|
||||||
|
.border_radius(10.0)
|
||||||
|
.padding(10.0)
|
||||||
|
.margin_left(10.0)
|
||||||
|
.focus_visible(|s| s.outline(2.).outline_color(palette::css::BLUE))
|
||||||
|
.hover(|s| s.background(Color::from_rgb8(244, 67, 54)))
|
||||||
|
.active(|s| s.color(palette::css::WHITE).background(palette::css::RED))
|
||||||
|
})
|
||||||
|
.keyboard_navigable(),
|
||||||
|
"Reset to 0"
|
||||||
|
.on_click_stop(move |_| {
|
||||||
|
println!("Reset counter pressed"); // will not fire if button is disabled
|
||||||
|
set_counter.update(|value| *value = 0);
|
||||||
|
})
|
||||||
|
.disabled(move || counter.get() == 0)
|
||||||
|
.style(|s| {
|
||||||
|
s.box_shadow_blur(5.0)
|
||||||
|
.border_radius(10.0)
|
||||||
|
.padding(10.0)
|
||||||
|
.margin_left(10.0)
|
||||||
|
.background(palette::css::LIGHT_BLUE)
|
||||||
|
.focus_visible(|s| s.outline(2.).outline_color(palette::css::BLUE))
|
||||||
|
.disabled(|s| s.background(palette::css::LIGHT_GRAY))
|
||||||
|
.hover(|s| s.background(palette::css::LIGHT_YELLOW))
|
||||||
|
.active(|s| {
|
||||||
|
s.color(palette::css::WHITE)
|
||||||
|
.background(palette::css::YELLOW_GREEN)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.keyboard_navigable(),
|
||||||
|
)
|
||||||
|
.style(|s| s.custom_style_class(|s: LabelCustomStyle| s.selectable(false))),
|
||||||
|
)
|
||||||
|
.style(|s| {
|
||||||
|
s.size(100.pct(), 100.pct())
|
||||||
|
.flex_col()
|
||||||
|
.items_center()
|
||||||
|
.justify_center()
|
||||||
|
});
|
||||||
|
|
||||||
|
let id = view.id();
|
||||||
|
view.on_key_up(
|
||||||
|
Key::Named(NamedKey::F11),
|
||||||
|
|m| m.is_empty(),
|
||||||
|
move |_| id.inspect(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
tracing_subscriber::fmt::init();
|
||||||
|
floem::launch(app_view);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user