diff --git a/Cargo.lock b/Cargo.lock index 7b6a2c6..f71e0cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,7 +88,7 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] name = "cairo-rs" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "bitflags", "cairo-sys-rs", @@ -101,7 +101,7 @@ dependencies = [ [[package]] name = "cairo-sys-rs" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "glib-sys", "libc", @@ -348,7 +348,7 @@ dependencies = [ [[package]] name = "gdk-pixbuf" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "gdk-pixbuf-sys", "gio", @@ -359,7 +359,7 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "gio-sys", "glib-sys", @@ -371,7 +371,7 @@ dependencies = [ [[package]] name = "gdk4" version = "0.1.0" -source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02" +source = "git+https://github.com/gtk-rs/gtk4-rs#abea0c9980bc083494eceb30dfab5eeb99a73118" dependencies = [ "bitflags", "cairo-rs", @@ -386,7 +386,7 @@ dependencies = [ [[package]] name = "gdk4-sys" version = "0.1.0" -source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02" +source = "git+https://github.com/gtk-rs/gtk4-rs#abea0c9980bc083494eceb30dfab5eeb99a73118" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -420,7 +420,7 @@ dependencies = [ [[package]] name = "gio" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "bitflags", "futures-channel", @@ -436,7 +436,7 @@ dependencies = [ [[package]] name = "gio-sys" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "glib-sys", "gobject-sys", @@ -448,7 +448,7 @@ dependencies = [ [[package]] name = "glib" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "bitflags", "futures-channel", @@ -466,7 +466,7 @@ dependencies = [ [[package]] name = "glib-macros" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "anyhow", "heck", @@ -481,7 +481,7 @@ dependencies = [ [[package]] name = "glib-sys" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "libc", "system-deps", @@ -503,6 +503,7 @@ dependencies = [ "gtk4", "libadwaita", "log", + "once_cell", "pretty_env_logger", "zbus", "zvariant", @@ -511,7 +512,7 @@ dependencies = [ [[package]] name = "gobject-sys" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "glib-sys", "libc", @@ -521,7 +522,7 @@ dependencies = [ [[package]] name = "graphene-rs" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "glib", "graphene-sys", @@ -531,7 +532,7 @@ dependencies = [ [[package]] name = "graphene-sys" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "glib-sys", "libc", @@ -542,7 +543,7 @@ dependencies = [ [[package]] name = "gsk4" version = "0.1.0" -source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02" +source = "git+https://github.com/gtk-rs/gtk4-rs#abea0c9980bc083494eceb30dfab5eeb99a73118" dependencies = [ "bitflags", "cairo-rs", @@ -557,7 +558,7 @@ dependencies = [ [[package]] name = "gsk4-sys" version = "0.1.0" -source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02" +source = "git+https://github.com/gtk-rs/gtk4-rs#abea0c9980bc083494eceb30dfab5eeb99a73118" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -578,7 +579,7 @@ checksum = "1874c48e670519ce192093ac906c08a6dde7cb2d18b28722ef237726a39c3a63" [[package]] name = "gtk4" version = "0.1.0" -source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02" +source = "git+https://github.com/gtk-rs/gtk4-rs#abea0c9980bc083494eceb30dfab5eeb99a73118" dependencies = [ "bitflags", "cairo-rs", @@ -600,7 +601,7 @@ dependencies = [ [[package]] name = "gtk4-macros" version = "0.1.0" -source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02" +source = "git+https://github.com/gtk-rs/gtk4-rs#abea0c9980bc083494eceb30dfab5eeb99a73118" dependencies = [ "anyhow", "heck", @@ -615,7 +616,7 @@ dependencies = [ [[package]] name = "gtk4-sys" version = "0.1.0" -source = "git+https://github.com/gtk-rs/gtk4-rs#0f06879b6c4fb1870112d613e5837e8befea0d02" +source = "git+https://github.com/gtk-rs/gtk4-rs#abea0c9980bc083494eceb30dfab5eeb99a73118" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -725,9 +726,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.82" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89203f3fba0a3795506acaad8ebce3c80c0af93f994d5a1d7a0b1eeb23271929" +checksum = "1cca32fa0182e8c0989459524dc356b8f2b5c10f1b9eb521b7d182c03cf8c5ff" [[package]] name = "locale_config" @@ -742,11 +743,11 @@ dependencies = [ [[package]] name = "log" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf3805d4480bb5b86070dcfeb9e2cb2ebc148adb753c5cca5f884d1d65a42b2" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", ] [[package]] @@ -796,7 +797,7 @@ checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" [[package]] name = "pango" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "bitflags", "glib", @@ -808,7 +809,7 @@ dependencies = [ [[package]] name = "pango-sys" version = "0.13.0" -source = "git+https://github.com/gtk-rs/gtk-rs#2418edfb1dd4e511485a47ef7307620f5790ea96" +source = "git+https://github.com/gtk-rs/gtk-rs#82c6b8246ef53de16e97739a701218c5d35b779e" dependencies = [ "glib-sys", "gobject-sys", @@ -982,18 +983,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.121" +version = "1.0.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6159e3c76cab06f6bc466244d43b35e77e9500cd685da87620addadc2a4c40b1" +checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.121" +version = "1.0.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3fcab8778dc651bc65cfab2e4eb64996f3c912b74002fb379c94517e1f27c46" +checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" dependencies = [ "proc-macro2", "quote", @@ -1043,9 +1044,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.59" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cb8b1b4ebf86a89ee88cbd201b022b94138c623644d035185c84d3f41b7e66" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" dependencies = [ "proc-macro2", "quote", @@ -1098,9 +1099,9 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301bdd13d23c49672926be451130892d274d3ba0b410c18e00daa7990ff38d99" +checksum = "d8208a331e1cb318dd5bd76951d2b8fc48ca38a69f5f4e4af1b6a9f8c6236915" dependencies = [ "once_cell", ] diff --git a/Cargo.toml b/Cargo.toml index 4beb3c0..527284d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" anyhow = "1.0.35" gtk-macros = "0.2.0" log = "0.4.11" +once_cell = "1.5.2" pretty_env_logger = "0.4.0" zbus = "1.3.0" zvariant = "2.3.0" diff --git a/src/application.rs b/src/application.rs index d937769..e7b7976 100644 --- a/src/application.rs +++ b/src/application.rs @@ -42,6 +42,7 @@ mod imp { const NAME: &'static str = "IvApplication"; type Type = super::IvApplication; type ParentType = gtk::Application; + type Interfaces = (); type Instance = glib::subclass::simple::InstanceStruct; type Class = glib::subclass::simple::ClassStruct; diff --git a/src/widgets/image_view.rs b/src/widgets/image_view.rs index eeb123c..233fd4c 100644 --- a/src/widgets/image_view.rs +++ b/src/widgets/image_view.rs @@ -29,43 +29,15 @@ use libadwaita::subclass::prelude::*; use anyhow::Context; use ashpd::desktop::wallpaper::{SetOn, WallpaperOptions, WallpaperProxy}; use ashpd::{BasicResponse as Basic, RequestProxy, Response, WindowIdentifier}; +use once_cell::sync::Lazy; use std::cell::{Cell, RefCell}; mod imp { use super::*; use glib::subclass; - static PROPERTIES: [subclass::Property; 3] = [ - subclass::Property("header-visible", |header_visible| { - glib::ParamSpec::boolean( - header_visible, - "Header visible", - "Whether or not the headerbar is visible", - false, - glib::ParamFlags::READWRITE, - ) - }), - subclass::Property("primary-menu-model", |primary_menu_model| { - glib::ParamSpec::object( - primary_menu_model, - "Primary Menu Model", - "The menu model for the menu button", - gio::MenuModel::static_type(), - glib::ParamFlags::READWRITE, - ) - }), - subclass::Property("popover-menu-model", |popover_menu_model| { - glib::ParamSpec::object( - popover_menu_model, - "Popover Menu Model", - "The menu model for the menu button", - gio::MenuModel::static_type(), - glib::ParamFlags::READWRITE, - ) - }), - ]; - #[derive(Debug, CompositeTemplate)] + #[template(resource = "/org/gnome/ImageViewer/gtk/image_view.ui")] pub struct IvImageView { #[template_child] pub headerbar: TemplateChild, @@ -92,6 +64,7 @@ mod imp { const NAME: &'static str = "IvImageView"; type Type = super::IvImageView; type ParentType = libadwaita::Bin; + type Interfaces = (); type Instance = subclass::simple::InstanceStruct; type Class = subclass::simple::ClassStruct; @@ -116,9 +89,7 @@ mod imp { } fn class_init(klass: &mut Self::Class) { - klass.install_properties(&PROPERTIES); - klass.set_template_from_resource("/org/gnome/ImageViewer/gtk/image_view.ui"); - Self::bind_template_children(klass); + Self::bind_template(klass); } fn instance_init(obj: &glib::subclass::InitializingObject) { @@ -127,6 +98,65 @@ mod imp { } impl ObjectImpl for IvImageView { + fn properties() -> &'static [glib::ParamSpec] { + static PROPERTIES: Lazy> = Lazy::new(|| { + vec![ + glib::ParamSpec::boolean( + "header-visible", + "Header visible", + "Whether or not the headerbar is visible", + false, + glib::ParamFlags::READWRITE, + ), + glib::ParamSpec::object( + "primary-menu-model", + "Primary Menu Model", + "The menu model for the menu button", + gio::MenuModel::static_type(), + glib::ParamFlags::READWRITE, + ), + glib::ParamSpec::object( + "popover-menu-model", + "Popover Menu Model", + "The menu model for the menu button", + gio::MenuModel::static_type(), + glib::ParamFlags::READWRITE, + ), + ] + }); + + PROPERTIES.as_ref() + } + + fn get_property(&self, _obj: &Self::Type, _id: usize, psec: &glib::ParamSpec) -> glib::Value { + match psec.get_name() { + "header-visible" => self.header_visible.get().to_value(), + "primary-menu-model" => self.menu_model.borrow().to_value(), + "popover-menu-model" => self.popover_menu_model.borrow().to_value(), + _ => unimplemented!(), + } + } + + fn set_property(&self, _obj: &Self::Type, _id: usize, value: &glib::Value, psec: &glib::ParamSpec) { + match psec.get_name() { + "header-visible" => { + self.header_visible + .set(value.get().unwrap().unwrap_or_default()); + } + "primary-menu-model" => { + let model: Option = value.get().unwrap(); + self.menu_button.set_menu_model(model.as_ref()); + *self.menu_model.borrow_mut() = model; + } + "popover-menu-model" => { + let model: Option = value.get().unwrap(); + self.popover.set_menu_model(model.as_ref()); + *self.popover_menu_model.borrow_mut() = model; + } + _ => unimplemented!(), + } + } + fn constructed(&self, obj: &Self::Type) { self.parent_constructed(obj); @@ -141,40 +171,6 @@ mod imp { })); } - fn get_property(&self, _obj: &Self::Type, id: usize) -> glib::Value { - let prop = &PROPERTIES[id]; - - match *prop { - subclass::Property("header-visible", ..) => self.header_visible.get().to_value(), - subclass::Property("primary-menu-model", ..) => self.menu_model.borrow().to_value(), - subclass::Property("popover-menu-model", ..) => { - self.popover_menu_model.borrow().to_value() - } - _ => unimplemented!(), - } - } - - fn set_property(&self, _obj: &Self::Type, id: usize, value: &glib::Value) { - let prop = &PROPERTIES[id]; - - match *prop { - subclass::Property("header-visible", ..) => { - self.header_visible - .set(value.get().unwrap().unwrap_or_default()); - } - subclass::Property("primary-menu-model", ..) => { - let model: Option = value.get().unwrap(); - self.menu_button.set_menu_model(model.as_ref()); - *self.menu_model.borrow_mut() = model; - } - subclass::Property("popover-menu-model", ..) => { - let model: Option = value.get().unwrap(); - self.popover.set_menu_model(model.as_ref()); - *self.popover_menu_model.borrow_mut() = model; - } - _ => unimplemented!(), - } - } } impl WidgetImpl for IvImageView { diff --git a/src/window.rs b/src/window.rs index 7540806..4c8f810 100644 --- a/src/window.rs +++ b/src/window.rs @@ -41,6 +41,7 @@ mod imp { // For this derive macro, you need to have // `use gtk::CompositeTemplate` in your code. #[derive(Debug, CompositeTemplate)] + #[template(resource = "/org/gnome/ImageViewer/gtk/window.ui")] pub struct IvWindow { // Template children are used with the // TemplateChild wrapper, where T is the @@ -61,6 +62,7 @@ mod imp { const NAME: &'static str = "IvWindow"; type Type = super::IvWindow; type ParentType = libadwaita::ApplicationWindow; + type Interfaces = (); type Instance = glib::subclass::simple::InstanceStruct; type Class = glib::subclass::simple::ClassStruct; @@ -78,10 +80,9 @@ mod imp { } fn class_init(klass: &mut Self::Class) { - klass.set_template_from_resource("/org/gnome/ImageViewer/gtk/window.ui"); - // bind_template_children() is a function generated by the + // bind_template() is a function generated by the // CompositeTemplate macro to bind all children at once. - Self::bind_template_children(klass); + Self::bind_template(klass); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template();