From fbc8ecd13c696c8e48445bc549e481b4e87e66bc Mon Sep 17 00:00:00 2001 From: Marcus Behrendt Date: Tue, 3 Oct 2023 11:00:19 +0200 Subject: [PATCH] feat(demo): Reconstruct it using gtk-rust-template The demo was recreated using gtk-rust-template and renamed to origami-demo. This makes it more available for people who just want to build it quickly and try it out. Maybe we could also publish it on flathub at some point. --- .gitignore | 3 +- Cargo.lock | 262 +++++++++++++++++- Cargo.toml | 6 +- demo/.gitignore | 1 - demo/Cargo.toml | 11 - demo/src/main.rs | 25 -- origami-demo/.gitignore | 9 + origami-demo/Cargo.toml | 15 + ...er_plane_developers.OrigamiDemo.Devel.json | 64 +++++ origami-demo/build-aux/dist-vendor.sh | 16 ++ ...plane_developers.OrigamiDemo.desktop.in.in | 12 + ...lane_developers.OrigamiDemo.gschema.xml.in | 17 ++ ..._developers.OrigamiDemo.metainfo.xml.in.in | 37 +++ ..._plane_developers.OrigamiDemo-symbolic.svg | 59 ++++ ...per_plane_developers.OrigamiDemo.Devel.svg | 147 ++++++++++ ...hub.paper_plane_developers.OrigamiDemo.svg | 60 ++++ origami-demo/data/icons/meson.build | 10 + origami-demo/data/meson.build | 75 +++++ origami-demo/data/screenshots/screenshot1.png | Bin 0 -> 19037 bytes origami-demo/meson.build | 71 +++++ origami-demo/meson_options.txt | 10 + origami-demo/po/LINGUAS | 0 origami-demo/po/POTFILES.in | 16 ++ origami-demo/po/meson.build | 1 + origami-demo/src/application.rs | 153 ++++++++++ origami-demo/src/config.rs.in | 6 + origami-demo/src/main.rs | 32 +++ origami-demo/src/meson.build | 47 ++++ .../loading_indicator/loading_indicator.blp | 0 .../src/window/loading_indicator/mod.rs | 0 {demo => origami-demo}/src/window/mod.rs | 30 +- .../src/window/shimmer_effect/mod.rs | 0 .../window/shimmer_effect/shimmer_effect.blp | 0 origami-demo/src/window/shortcuts.ui | 29 ++ .../src/window/spoiler/mod.rs | 0 .../src/window/spoiler/spoiler.blp | 8 +- {demo => origami-demo}/src/window/window.blp | 22 ++ 37 files changed, 1191 insertions(+), 63 deletions(-) delete mode 100644 demo/.gitignore delete mode 100644 demo/Cargo.toml delete mode 100644 demo/src/main.rs create mode 100644 origami-demo/.gitignore create mode 100644 origami-demo/Cargo.toml create mode 100644 origami-demo/build-aux/com.github.paper_plane_developers.OrigamiDemo.Devel.json create mode 100644 origami-demo/build-aux/dist-vendor.sh create mode 100644 origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.desktop.in.in create mode 100644 origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.gschema.xml.in create mode 100644 origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.metainfo.xml.in.in create mode 100644 origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo-symbolic.svg create mode 100644 origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo.Devel.svg create mode 100644 origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo.svg create mode 100644 origami-demo/data/icons/meson.build create mode 100644 origami-demo/data/meson.build create mode 100644 origami-demo/data/screenshots/screenshot1.png create mode 100644 origami-demo/meson.build create mode 100644 origami-demo/meson_options.txt create mode 100644 origami-demo/po/LINGUAS create mode 100644 origami-demo/po/POTFILES.in create mode 100644 origami-demo/po/meson.build create mode 100644 origami-demo/src/application.rs create mode 100644 origami-demo/src/config.rs.in create mode 100644 origami-demo/src/main.rs create mode 100644 origami-demo/src/meson.build rename {demo => origami-demo}/src/window/loading_indicator/loading_indicator.blp (100%) rename {demo => origami-demo}/src/window/loading_indicator/mod.rs (100%) rename {demo => origami-demo}/src/window/mod.rs (85%) rename {demo => origami-demo}/src/window/shimmer_effect/mod.rs (100%) rename {demo => origami-demo}/src/window/shimmer_effect/shimmer_effect.blp (100%) create mode 100644 origami-demo/src/window/shortcuts.ui rename {demo => origami-demo}/src/window/spoiler/mod.rs (100%) rename {demo => origami-demo}/src/window/spoiler/spoiler.blp (90%) rename {demo => origami-demo}/src/window/window.blp (80%) diff --git a/.gitignore b/.gitignore index 2f7896d..a272990 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -target/ +**/target/ +**/.vscode diff --git a/Cargo.lock b/Cargo.lock index 19baf59..686c98e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aho-corasick" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" +dependencies = [ + "memchr", +] + [[package]] name = "anyhow" version = "1.0.75" @@ -20,6 +29,12 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "cairo-rs" version = "0.18.2" @@ -45,6 +60,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + [[package]] name = "cfg-expr" version = "0.15.5" @@ -56,13 +80,10 @@ dependencies = [ ] [[package]] -name = "demo" -version = "0.1.0" -dependencies = [ - "gtk4", - "libadwaita", - "origami", -] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "equivalent" @@ -201,6 +222,26 @@ dependencies = [ "system-deps", ] +[[package]] +name = "gettext-rs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e49ea8a8fad198aaa1f9655a2524b64b70eb06b2f3ff37da407566c93054f364" +dependencies = [ + "gettext-sys", + "locale_config", +] + +[[package]] +name = "gettext-sys" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c63ce2e00f56a206778276704bbe38564c8695249fdc8f354b4ef71c57c3839d" +dependencies = [ + "cc", + "temp-dir", +] + [[package]] name = "gio" version = "0.18.2" @@ -421,6 +462,12 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libadwaita" version = "0.5.3" @@ -459,17 +506,39 @@ version = "0.2.148" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" +[[package]] +name = "locale_config" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" +dependencies = [ + "lazy_static", + "objc", + "objc-foundation", + "regex", + "winapi", +] + [[package]] name = "log" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "memchr" -version = "2.6.3" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memoffset" @@ -480,6 +549,45 @@ dependencies = [ "autocfg", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -495,6 +603,24 @@ dependencies = [ "log", ] +[[package]] +name = "origami-demo" +version = "0.1.0" +dependencies = [ + "gettext-rs", + "gtk4", + "libadwaita", + "origami", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "pango" version = "0.18.0" @@ -590,6 +716,35 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "regex" +version = "1.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + [[package]] name = "rustc_version" version = "0.4.0" @@ -634,6 +789,15 @@ dependencies = [ "serde", ] +[[package]] +name = "sharded-slab" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b21f559e07218024e7e9f90f96f601825397de0e25420135f7f952453fed0b" +dependencies = [ + "lazy_static", +] + [[package]] name = "slab" version = "0.4.9" @@ -690,6 +854,12 @@ version = "0.12.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" +[[package]] +name = "temp-dir" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af547b166dd1ea4b472165569fc456cfb6818116f854690b0ff205e636523dab" + [[package]] name = "thiserror" version = "1.0.49" @@ -710,6 +880,16 @@ dependencies = [ "syn 2.0.37", ] +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "toml" version = "0.7.8" @@ -744,12 +924,76 @@ dependencies = [ "winnow", ] +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "version-compare" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index f6c0b41..7672d6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] members = [ - "demo", - "origami" -] \ No newline at end of file + "origami", + "origami-demo", +] diff --git a/demo/.gitignore b/demo/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/demo/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/demo/Cargo.toml b/demo/Cargo.toml deleted file mode 100644 index 7ebf593..0000000 --- a/demo/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "demo" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -adw = { version = "0.5", package = "libadwaita" } -gtk = { version = "0.7", package = "gtk4", features = ["v4_10", "blueprint"] } -ori = { path = "../origami", package = "origami" } \ No newline at end of file diff --git a/demo/src/main.rs b/demo/src/main.rs deleted file mode 100644 index a1b4ae9..0000000 --- a/demo/src/main.rs +++ /dev/null @@ -1,25 +0,0 @@ -mod window; -use window::SpoilerWindow; - -use adw::prelude::*; - -fn main() { - ori::init(); - - let mut args = std::env::args(); - let name = args.next(); - let page = args.next(); - - if args.next().is_some() { - eprintln!("Too many arguments"); - std::process::exit(1); - } - - let app = adw::Application::builder() - .application_id("com.github.paper-plane-developers.OriDemo") - .build(); - - app.connect_activate(move |app| SpoilerWindow::new(app, page.clone()).present()); - - app.run_with_args(&[name.unwrap_or_default()]); -} diff --git a/origami-demo/.gitignore b/origami-demo/.gitignore new file mode 100644 index 0000000..1981755 --- /dev/null +++ b/origami-demo/.gitignore @@ -0,0 +1,9 @@ +/build/ +/_build/ +/builddir/ +/build-aux/app +/build-aux/.flatpak-builder/ +*.ui.in~ +*.ui~ +/.flatpak/ +/vendor diff --git a/origami-demo/Cargo.toml b/origami-demo/Cargo.toml new file mode 100644 index 0000000..bad798d --- /dev/null +++ b/origami-demo/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "origami-demo" +version = "0.1.0" +edition = "2021" + +[profile.release] +lto = true + +[dependencies] +adw = { version = "0.5", package = "libadwaita", features = ["v1_4"] } +gettext-rs = { version = "0.7", features = ["gettext-system"] } +gtk = { version = "0.7", package = "gtk4", features = ["blueprint", "v4_10"] } +ori = { path = "../origami", package = "origami" } +tracing = "0.1.37" +tracing-subscriber = "0.3" diff --git a/origami-demo/build-aux/com.github.paper_plane_developers.OrigamiDemo.Devel.json b/origami-demo/build-aux/com.github.paper_plane_developers.OrigamiDemo.Devel.json new file mode 100644 index 0000000..8b39a0d --- /dev/null +++ b/origami-demo/build-aux/com.github.paper_plane_developers.OrigamiDemo.Devel.json @@ -0,0 +1,64 @@ +{ + "id": "com.github.paper_plane_developers.OrigamiDemo.Devel", + "runtime": "org.gnome.Platform", + "runtime-version": "45", + "sdk": "org.gnome.Sdk", + "sdk-extensions": [ + "org.freedesktop.Sdk.Extension.rust-stable", + "org.freedesktop.Sdk.Extension.llvm16" + ], + "command": "origami-demo", + "finish-args": [ + "--share=ipc", + "--socket=fallback-x11", + "--socket=wayland", + "--device=dri", + "--env=RUST_LOG=origami_demo=debug", + "--env=G_MESSAGES_DEBUG=none", + "--env=RUST_BACKTRACE=1" + ], + "build-options": { + "append-path": "/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/llvm16/bin", + "build-args": [ + "--share=network" + ], + "env": { + "CARGO_REGISTRIES_CRATES_IO_PROTOCOL": "sparse", + "CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER": "clang", + "CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS": "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold", + "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER": "clang", + "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS": "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold" + }, + "test-args": [ + "--socket=x11", + "--share=network" + ] + }, + "modules": [ + { + "name": "blueprint-compiler", + "buildsystem": "meson", + "sources": [ + { + "type": "archive", + "url": "https://gitlab.gnome.org/jwestman/blueprint-compiler/-/archive/v0.10.0/blueprint-compiler-v0.10.0.tar.gz", + "sha256": "eec8a2cf7aca70faff0cd96d2cdc610f76d7e302d0025b3d36a73c8c4583b6fd" + } + ] + }, + { + "name": "origami-demo", + "buildsystem": "meson", + "run-tests": true, + "config-opts": [ + "-Dprofile=development" + ], + "sources": [ + { + "type": "dir", + "path": "../" + } + ] + } + ] +} diff --git a/origami-demo/build-aux/dist-vendor.sh b/origami-demo/build-aux/dist-vendor.sh new file mode 100644 index 0000000..ad6a6f0 --- /dev/null +++ b/origami-demo/build-aux/dist-vendor.sh @@ -0,0 +1,16 @@ +#!/bin/sh +# Since Meson invokes this script as +# "/bin/sh .../dist-vendor.sh DIST SOURCE_ROOT" we can't rely on bash features +set -eu +export DIST="$1" +export SOURCE_ROOT="$2" + +cd "$SOURCE_ROOT" +mkdir "$DIST"/.cargo +cargo vendor > "$DIST/.cargo/config" +# Don't combine the previous and this line with a pipe because we can't catch +# errors with "set -o pipefail" +sed -i 's/^directory = ".*"/directory = "vendor"/g' "$DIST/.cargo/config" +# Move vendor into dist tarball directory +mv vendor "$DIST" + diff --git a/origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.desktop.in.in b/origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.desktop.in.in new file mode 100644 index 0000000..bbfcc3b --- /dev/null +++ b/origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.desktop.in.in @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=Origami Demo +Comment=Write a GTK + Rust application +Type=Application +Exec=origami-demo +Terminal=false +Categories=GNOME;GTK; +# Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! +Keywords=Gnome;GTK; +# Translators: Do NOT translate or transliterate this text (this is an icon file name)! +Icon=@icon@ +StartupNotify=true diff --git a/origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.gschema.xml.in b/origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.gschema.xml.in new file mode 100644 index 0000000..692268f --- /dev/null +++ b/origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.gschema.xml.in @@ -0,0 +1,17 @@ + + + + + 600 + Window width + + + 400 + Window height + + + false + Window maximized state + + + diff --git a/origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.metainfo.xml.in.in b/origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.metainfo.xml.in.in new file mode 100644 index 0000000..cf0e4d9 --- /dev/null +++ b/origami-demo/data/com.github.paper_plane_developers.OrigamiDemo.metainfo.xml.in.in @@ -0,0 +1,37 @@ + + + + @app-id@ + CC0 + + + Origami Demo + Write a GTK + Rust application + +

A boilerplate template for GTK + Rust. It uses Meson as a build system and has flatpak support by default.

+
+ + + https://gitlab.gnome.org/bilelmoussaoui/origami-demo/raw/master/data/screenshots/screenshot1.png + Main window + + + https://gitlab.gnome.org/bilelmoussaoui/origami-demo + https://gitlab.gnome.org/bilelmoussaoui/origami-demo/issues + + + + + + + ModernToolkit + HiDpiIcon + + Paper Plane Developers + + @gettext-package@ + @app-id@.desktop +
diff --git a/origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo-symbolic.svg b/origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo-symbolic.svg new file mode 100644 index 0000000..fc4d934 --- /dev/null +++ b/origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo-symbolic.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo.Devel.svg b/origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo.Devel.svg new file mode 100644 index 0000000..92533ae --- /dev/null +++ b/origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo.Devel.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo.svg b/origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo.svg new file mode 100644 index 0000000..c2bd5b1 --- /dev/null +++ b/origami-demo/data/icons/com.github.paper_plane_developers.OrigamiDemo.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/origami-demo/data/icons/meson.build b/origami-demo/data/icons/meson.build new file mode 100644 index 0000000..2ab86e9 --- /dev/null +++ b/origami-demo/data/icons/meson.build @@ -0,0 +1,10 @@ +install_data( + '@0@.svg'.format(application_id), + install_dir: iconsdir / 'hicolor' / 'scalable' / 'apps' +) + +install_data( + '@0@-symbolic.svg'.format(base_id), + install_dir: iconsdir / 'hicolor' / 'symbolic' / 'apps', + rename: '@0@-symbolic.svg'.format(application_id) +) diff --git a/origami-demo/data/meson.build b/origami-demo/data/meson.build new file mode 100644 index 0000000..c80bda1 --- /dev/null +++ b/origami-demo/data/meson.build @@ -0,0 +1,75 @@ +subdir('icons') +# Desktop file +desktop_conf = configuration_data() +desktop_conf.set('icon', application_id) +desktop_file = i18n.merge_file( + type: 'desktop', + input: configure_file( + input: '@0@.desktop.in.in'.format(base_id), + output: '@BASENAME@', + configuration: desktop_conf + ), + output: '@0@.desktop'.format(application_id), + po_dir: podir, + install: true, + install_dir: datadir / 'applications' +) +# Validate Desktop file +if desktop_file_validate.found() + test( + 'validate-desktop', + desktop_file_validate, + args: [ + desktop_file.full_path() + ], + depends: desktop_file, + ) +endif + +# Appdata +appdata_conf = configuration_data() +appdata_conf.set('app-id', application_id) +appdata_conf.set('gettext-package', gettext_package) +appdata_file = i18n.merge_file( + input: configure_file( + input: '@0@.metainfo.xml.in.in'.format(base_id), + output: '@BASENAME@', + configuration: appdata_conf + ), + output: '@0@.metainfo.xml'.format(application_id), + po_dir: podir, + install: true, + install_dir: datadir / 'metainfo' +) +# Validate Appdata +if appstream_util.found() + test( + 'validate-appdata', appstream_util, + args: [ + 'validate', '--nonet', appdata_file.full_path() + ], + depends: appdata_file, + ) +endif + +# GSchema +gschema_conf = configuration_data() +gschema_conf.set('app-id', application_id) +gschema_conf.set('gettext-package', gettext_package) +configure_file( + input: '@0@.gschema.xml.in'.format(base_id), + output: '@0@.gschema.xml'.format(application_id), + configuration: gschema_conf, + install: true, + install_dir: datadir / 'glib-2.0' / 'schemas' +) + +# Validata GSchema +if glib_compile_schemas.found() + test( + 'validate-gschema', glib_compile_schemas, + args: [ + '--strict', '--dry-run', meson.current_build_dir() + ], + ) +endif diff --git a/origami-demo/data/screenshots/screenshot1.png b/origami-demo/data/screenshots/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..173b6beebdbdd81021d0048036f9ba38476cd887 GIT binary patch literal 19037 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 z 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 literal 0 HcmV?d00001 diff --git a/origami-demo/meson.build b/origami-demo/meson.build new file mode 100644 index 0000000..1580ac8 --- /dev/null +++ b/origami-demo/meson.build @@ -0,0 +1,71 @@ +project( + 'origami-demo', + 'rust', + version: '0.1.0', + meson_version: '>= 0.59', + # license: 'MIT', +) + +i18n = import('i18n') +gnome = import('gnome') + +base_id = 'com.github.paper_plane_developers.OrigamiDemo' + +dependency('glib-2.0', version: '>= 2.66') +dependency('gio-2.0', version: '>= 2.66') +dependency('gtk4', version: '>= 4.0.0') + +glib_compile_resources = find_program('glib-compile-resources', required: true) +glib_compile_schemas = find_program('glib-compile-schemas', required: true) +desktop_file_validate = find_program('desktop-file-validate', required: false) +appstream_util = find_program('appstream-util', required: false) +cargo = find_program('cargo', required: true) + +version = meson.project_version() + +prefix = get_option('prefix') +bindir = prefix / get_option('bindir') +localedir = prefix / get_option('localedir') + +datadir = prefix / get_option('datadir') +pkgdatadir = datadir / meson.project_name() +iconsdir = datadir / 'icons' +podir = meson.project_source_root() / 'po' +gettext_package = meson.project_name() + +if get_option('profile') == 'development' + profile = 'Devel' + vcs_tag = run_command('git', 'rev-parse', '--short', 'HEAD', check: false).stdout().strip() + if vcs_tag == '' + version_suffix = '-devel' + else + version_suffix = '-@0@'.format(vcs_tag) + endif + application_id = '@0@.@1@'.format(base_id, profile) +else + profile = '' + version_suffix = '' + application_id = base_id +endif + +meson.add_dist_script( + 'build-aux/dist-vendor.sh', + meson.project_build_root() / 'meson-dist' / meson.project_name() + '-' + version, + meson.project_source_root() +) + +if get_option('profile') == 'development' + # Setup pre-commit hook for ensuring coding style is always consistent + message('Setting up git pre-commit hook..') + run_command('cp', '-f', 'hooks/pre-commit.hook', '.git/hooks/pre-commit', check: false) +endif + +subdir('data') +subdir('po') +subdir('src') + +gnome.post_install( + gtk_update_icon_cache: true, + glib_compile_schemas: true, + update_desktop_database: true, +) diff --git a/origami-demo/meson_options.txt b/origami-demo/meson_options.txt new file mode 100644 index 0000000..bde6282 --- /dev/null +++ b/origami-demo/meson_options.txt @@ -0,0 +1,10 @@ +option( + 'profile', + type: 'combo', + choices: [ + 'default', + 'development' + ], + value: 'default', + description: 'The build profile for Origami Demo. One of "default" or "development".' +) diff --git a/origami-demo/po/LINGUAS b/origami-demo/po/LINGUAS new file mode 100644 index 0000000..e69de29 diff --git a/origami-demo/po/POTFILES.in b/origami-demo/po/POTFILES.in new file mode 100644 index 0000000..3f40596 --- /dev/null +++ b/origami-demo/po/POTFILES.in @@ -0,0 +1,16 @@ +data/com.github.paper_plane_developers.OrigamiDemo.desktop.in.in +data/com.github.paper_plane_developers.OrigamiDemo.gschema.xml.in +data/com.github.paper_plane_developers.OrigamiDemo.metainfo.xml.in.in + +src/application.rs +src/main.rs +src/window/loading_indicator/mod.rs +src/window/mod.rs +src/window/shimmer_effect/mod.rs +src/window/spoiler/mod.rs + +src/window/shortcuts.ui +src/window/loading_indicator/loading_indicator.blp +src/window/shimmer_effect/shimmer_effect.blp +src/window/spoiler/spoiler.blp +src/window/window.blp diff --git a/origami-demo/po/meson.build b/origami-demo/po/meson.build new file mode 100644 index 0000000..57d1266 --- /dev/null +++ b/origami-demo/po/meson.build @@ -0,0 +1 @@ +i18n.gettext(gettext_package, preset: 'glib') diff --git a/origami-demo/src/application.rs b/origami-demo/src/application.rs new file mode 100644 index 0000000..47311ab --- /dev/null +++ b/origami-demo/src/application.rs @@ -0,0 +1,153 @@ +use gettextrs::gettext; +use tracing::{debug, info}; + +use gtk::prelude::*; +use gtk::subclass::prelude::*; +use gtk::{gdk, gio, glib}; + +use crate::config::{APP_ID, PKGDATADIR, PROFILE, VERSION}; +use crate::window::SpoilerWindow; + +mod imp { + use super::*; + use glib::WeakRef; + use std::cell::OnceCell; + + #[derive(Debug, Default)] + pub struct ExampleApplication { + pub window: OnceCell>, + } + + #[glib::object_subclass] + impl ObjectSubclass for ExampleApplication { + const NAME: &'static str = "ExampleApplication"; + type Type = super::ExampleApplication; + type ParentType = gtk::Application; + } + + impl ObjectImpl for ExampleApplication {} + + impl ApplicationImpl for ExampleApplication { + fn activate(&self) { + debug!("GtkApplication::activate"); + self.parent_activate(); + let app = self.obj(); + + if let Some(window) = self.window.get() { + let window = window.upgrade().unwrap(); + window.present(); + return; + } + + let window = SpoilerWindow::new(&*app, None); + self.window + .set(window.downgrade()) + .expect("Window already set."); + + app.main_window().present(); + } + + fn startup(&self) { + debug!("GtkApplication::startup"); + self.parent_startup(); + let app = self.obj(); + + // Set icons for shell + gtk::Window::set_default_icon_name(APP_ID); + + app.setup_css(); + app.setup_gactions(); + app.setup_accels(); + } + } + + impl GtkApplicationImpl for ExampleApplication {} +} + +glib::wrapper! { + pub struct ExampleApplication(ObjectSubclass) + @extends gio::Application, gtk::Application, + @implements gio::ActionMap, gio::ActionGroup; +} + +impl ExampleApplication { + fn main_window(&self) -> SpoilerWindow { + self.imp().window.get().unwrap().upgrade().unwrap() + } + + fn setup_gactions(&self) { + // Quit + let action_quit = gio::ActionEntry::builder("quit") + .activate(move |app: &Self, _, _| { + // This is needed to trigger the delete event and saving the window state + app.main_window().close(); + app.quit(); + }) + .build(); + + // About + let action_about = gio::ActionEntry::builder("about") + .activate(|app: &Self, _, _| { + app.show_about_dialog(); + }) + .build(); + self.add_action_entries([action_quit, action_about]); + } + + // Sets up keyboard shortcuts + fn setup_accels(&self) { + self.set_accels_for_action("app.quit", &["q"]); + self.set_accels_for_action("window.close", &["w"]); + } + + fn setup_css(&self) { + let provider = gtk::CssProvider::new(); + provider.load_from_resource("/com/github/paper_plane_developers/OrigamiDemo/style.css"); + if let Some(display) = gdk::Display::default() { + gtk::style_context_add_provider_for_display( + &display, + &provider, + gtk::STYLE_PROVIDER_PRIORITY_APPLICATION, + ); + } + } + + fn show_about_dialog(&self) { + let dialog = adw::AboutWindow::builder() + .modal(true) + .transient_for(&self.main_window()) + .application_name("Origami Demo") + .application_icon(APP_ID) + // Insert your license of choice here + // .license_type(gtk::License::MitX11) + // Insert your website here + // .website("https://gitlab.gnome.org/bilelmoussaoui/origami-demo/") + .version(VERSION) + .translator_credits(gettext("translator-credits")) + .developers(vec!["Paper Plane Developers"]) + .artists(vec!["Paper Plane Developers"]) + .website("https://github.com/paper-plane-developers/origami") + .issue_url("https://github.com/paper-plane-developers/origami/issues") + .copyright("© 2023 Paper Plane Developers") + .build(); + + dialog.present(); + } + + pub fn run(&self) -> glib::ExitCode { + info!("Origami Demo ({})", APP_ID); + info!("Version: {} ({})", VERSION, PROFILE); + info!("Datadir: {}", PKGDATADIR); + + ApplicationExtManual::run(self) + } +} + +impl Default for ExampleApplication { + fn default() -> Self { + glib::Object::builder() + .property("application-id", APP_ID) + .property("resource-base-path", "/com/github/paper_plane_developers/OrigamiDemo/") + .build() + } +} diff --git a/origami-demo/src/config.rs.in b/origami-demo/src/config.rs.in new file mode 100644 index 0000000..a004bf7 --- /dev/null +++ b/origami-demo/src/config.rs.in @@ -0,0 +1,6 @@ +pub const APP_ID: &str = @APP_ID@; +pub const GETTEXT_PACKAGE: &str = @GETTEXT_PACKAGE@; +pub const LOCALEDIR: &str = @LOCALEDIR@; +pub const PKGDATADIR: &str = @PKGDATADIR@; +pub const PROFILE: &str = @PROFILE@; +pub const VERSION: &str = @VERSION@; diff --git a/origami-demo/src/main.rs b/origami-demo/src/main.rs new file mode 100644 index 0000000..889385e --- /dev/null +++ b/origami-demo/src/main.rs @@ -0,0 +1,32 @@ +mod config { + #![allow(dead_code)] + + include!(concat!(env!("CODEGEN_BUILD_DIR"), "/config.rs")); +} + +mod application; +mod window; + +use gettextrs::{gettext, LocaleCategory}; +use gtk::glib; + +use self::application::ExampleApplication; +use self::config::{GETTEXT_PACKAGE, LOCALEDIR}; + +fn main() -> glib::ExitCode { + adw::init().unwrap(); + ori::init(); + + // Initialize logger + tracing_subscriber::fmt::init(); + + // Prepare i18n + gettextrs::setlocale(LocaleCategory::LcAll, ""); + gettextrs::bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR).expect("Unable to bind the text domain"); + gettextrs::textdomain(GETTEXT_PACKAGE).expect("Unable to switch to the text domain"); + + glib::set_application_name(&gettext("Origami Demo")); + + let app = ExampleApplication::default(); + app.run() +} diff --git a/origami-demo/src/meson.build b/origami-demo/src/meson.build new file mode 100644 index 0000000..d0fdf17 --- /dev/null +++ b/origami-demo/src/meson.build @@ -0,0 +1,47 @@ +global_conf = configuration_data() +global_conf.set_quoted('APP_ID', application_id) +global_conf.set_quoted('PKGDATADIR', pkgdatadir) +global_conf.set_quoted('PROFILE', profile) +global_conf.set_quoted('VERSION', version + version_suffix) +global_conf.set_quoted('GETTEXT_PACKAGE', gettext_package) +global_conf.set_quoted('LOCALEDIR', localedir) +config = configure_file( + input: 'config.rs.in', + output: 'config.rs', + configuration: global_conf +) + +cargo_options = [ '--manifest-path', meson.project_source_root() / 'Cargo.toml' ] +cargo_options += [ '--target-dir', meson.project_build_root() / 'src' ] + +if get_option('profile') == 'default' + cargo_options += [ '--release' ] + rust_target = 'release' + message('Building in release mode') +else + rust_target = 'debug' + message('Building in debug mode') +endif + +cargo_env = [ + 'CARGO_HOME=' + meson.project_build_root() / 'cargo-home', + 'CODEGEN_BUILD_DIR=' + meson.current_build_dir() +] + +cargo_build = custom_target( + 'cargo-build', + build_by_default: true, + build_always_stale: true, + output: meson.project_name(), + console: true, + install: true, + install_dir: bindir, + command: [ + 'env', + cargo_env, + cargo, 'build', + cargo_options, + '&&', + 'cp', 'src' / rust_target / meson.project_name(), '@OUTPUT@', + ] +) diff --git a/demo/src/window/loading_indicator/loading_indicator.blp b/origami-demo/src/window/loading_indicator/loading_indicator.blp similarity index 100% rename from demo/src/window/loading_indicator/loading_indicator.blp rename to origami-demo/src/window/loading_indicator/loading_indicator.blp diff --git a/demo/src/window/loading_indicator/mod.rs b/origami-demo/src/window/loading_indicator/mod.rs similarity index 100% rename from demo/src/window/loading_indicator/mod.rs rename to origami-demo/src/window/loading_indicator/mod.rs diff --git a/demo/src/window/mod.rs b/origami-demo/src/window/mod.rs similarity index 85% rename from demo/src/window/mod.rs rename to origami-demo/src/window/mod.rs index 3df0835..c624ae6 100644 --- a/demo/src/window/mod.rs +++ b/origami-demo/src/window/mod.rs @@ -1,13 +1,13 @@ -mod loading_indicator; -mod shimmer_effect; -mod spoiler; - +use gtk::prelude::StaticType; use adw::prelude::*; use adw::subclass::prelude::*; use gtk::{gio, glib}; -mod imp { +mod loading_indicator; +mod shimmer_effect; +mod spoiler; +mod imp { use super::*; #[derive(Debug, Default, gtk::CompositeTemplate)] @@ -24,11 +24,11 @@ mod imp { type ParentType = adw::ApplicationWindow; fn class_init(klass: &mut Self::Class) { + klass.bind_template(); + + spoiler::SpoilerPage::static_type(); loading_indicator::LoadingIndicatorPage::static_type(); shimmer_effect::ShimmerEffectPage::static_type(); - spoiler::SpoilerPage::static_type(); - - klass.bind_template(); } fn instance_init(obj: &glib::subclass::InitializingObject) { @@ -36,7 +36,19 @@ mod imp { } } - impl ObjectImpl for SpoilerWindow {} + impl ObjectImpl for SpoilerWindow { + fn constructed(&self) { + self.parent_constructed(); + + let obj = &*self.obj(); + + let shortcuts: gtk::ShortcutsWindow = + gtk::Builder::from_file("src/window/shortcuts.ui") + .object("shortcuts") + .unwrap(); + obj.set_help_overlay(Some(&shortcuts)); + } + } impl WidgetImpl for SpoilerWindow {} diff --git a/demo/src/window/shimmer_effect/mod.rs b/origami-demo/src/window/shimmer_effect/mod.rs similarity index 100% rename from demo/src/window/shimmer_effect/mod.rs rename to origami-demo/src/window/shimmer_effect/mod.rs diff --git a/demo/src/window/shimmer_effect/shimmer_effect.blp b/origami-demo/src/window/shimmer_effect/shimmer_effect.blp similarity index 100% rename from demo/src/window/shimmer_effect/shimmer_effect.blp rename to origami-demo/src/window/shimmer_effect/shimmer_effect.blp diff --git a/origami-demo/src/window/shortcuts.ui b/origami-demo/src/window/shortcuts.ui new file mode 100644 index 0000000..1b96df8 --- /dev/null +++ b/origami-demo/src/window/shortcuts.ui @@ -0,0 +1,29 @@ + + + + True + + + shortcuts + 10 + + + General + + + Show Shortcuts + win.show-help-overlay + + + + + Quit + app.quit + + + + + + + + diff --git a/demo/src/window/spoiler/mod.rs b/origami-demo/src/window/spoiler/mod.rs similarity index 100% rename from demo/src/window/spoiler/mod.rs rename to origami-demo/src/window/spoiler/mod.rs diff --git a/demo/src/window/spoiler/spoiler.blp b/origami-demo/src/window/spoiler/spoiler.blp similarity index 90% rename from demo/src/window/spoiler/spoiler.blp rename to origami-demo/src/window/spoiler/spoiler.blp index 53e75e1..043c690 100644 --- a/demo/src/window/spoiler/spoiler.blp +++ b/origami-demo/src/window/spoiler/spoiler.blp @@ -7,7 +7,7 @@ template $OriDemoSpoilerPage : Adw.Bin { actions: copy; formats: "GdkFileList"; } - + orientation: vertical; vexpand: true; @@ -32,14 +32,14 @@ template $OriDemoSpoilerPage : Adw.Bin { vexpand: true; // the most important property - hidden: bind revealer.reveal-child inverted bidirectional; + hidden: bind-property revealer.reveal-child inverted bidirectional; child: Adw.StatusPage { title: "Drop any pictures here"; description: "To see how will they look under the spoiler"; - }; + }; } } } }; -} \ No newline at end of file +} diff --git a/demo/src/window/window.blp b/origami-demo/src/window/window.blp similarity index 80% rename from demo/src/window/window.blp rename to origami-demo/src/window/window.blp index 837d069..39fed05 100644 --- a/demo/src/window/window.blp +++ b/origami-demo/src/window/window.blp @@ -1,6 +1,20 @@ using Gtk 4.0; using Adw 1; +menu menu { + section { + item { + label: _("_Keyboard Shortcuts"); + action: "win.show-help-overlay"; + } + + item { + label: _("_About Origami Demo"); + action: "app.about"; + } + } +} + template $SpoilerWindow : Adw.ApplicationWindow { height-request: 400; @@ -22,6 +36,14 @@ template $SpoilerWindow : Adw.ApplicationWindow { Adw.WindowTitle { title: "Origami Demo"; } + + [end] + MenuButton { + icon-name: "open-menu-symbolic"; + menu-model: menu; + primary: true; + tooltip-text: _("Main Menu"); + } } StackSidebar {