diff --git a/data/gtk/image_view.ui b/data/gtk/image_view.ui index f1001c0..473b052 100644 --- a/data/gtk/image_view.ui +++ b/data/gtk/image_view.ui @@ -15,77 +15,49 @@ - vertical + True - - start - False - - - - 6 - False - view-restore-symbolic - win.toggle-fullscreen - - - - - open-menu-symbolic - - + + start + center + 18 + 18 + go-previous-symbolic + iv.previous - - True - - - start - center - 18 - 18 - go-previous-symbolic - iv.previous - - - - - - True - end - center - 18 - 18 - go-next-symbolic - iv.next - - - - - - 3 - - - - - True - - - - - False - - + + True + end + center + 18 + 18 + go-next-symbolic + iv.next + + + + + + 3 + + + + + True + + + + + False diff --git a/data/gtk/window.ui b/data/gtk/window.ui index a2efd71..5513310 100644 --- a/data/gtk/window.ui +++ b/data/gtk/window.ui @@ -6,12 +6,15 @@ 360 Image Viewer - + vertical - + never + true + false + titlebar - + open-menu-symbolic @@ -19,14 +22,14 @@ - + view-fullscreen-symbolic win.toggle-fullscreen - - + + status_page True @@ -41,13 +44,14 @@ - - primary_menu image_menu - + + diff --git a/data/style.css b/data/style.css index 2cffbb2..702c76d 100644 --- a/data/style.css +++ b/data/style.css @@ -8,6 +8,10 @@ button.circular { background-color: @theme_base_color; } +flap.fullscreen-widget dimming, shadow, border, outline { + background: none; +} + .checkerboard { background-color: #7f7f7f; background-image: linear-gradient( diff --git a/src/widgets/image_view.rs b/src/widgets/image_view.rs index dd78c38..88d2a5b 100644 --- a/src/widgets/image_view.rs +++ b/src/widgets/image_view.rs @@ -41,10 +41,6 @@ mod imp { #[derive(Debug, Default, CompositeTemplate)] #[template(resource = "/org/gnome/ImageViewer/gtk/image_view.ui")] pub struct IvImageView { - #[template_child] - pub headerbar: TemplateChild, - #[template_child] - pub menu_button: TemplateChild, #[template_child] pub picture: TemplateChild, #[template_child] @@ -54,9 +50,7 @@ mod imp { #[template_child] pub press_gesture: TemplateChild, - // Cell allows for interior mutability of primitive types - pub header_visible: Cell, - // RefCell does the same for non-primitive types. + // RefCell allows for interior mutability of non-primitive types. pub menu_model: RefCell>, pub popover_menu_model: RefCell>, @@ -64,6 +58,7 @@ mod imp { pub filename: RefCell>, // Path of filenames pub directory_pictures: RefCell>, + // Cell allows for interior mutability of primitive types pub index: Cell, } @@ -94,20 +89,6 @@ mod imp { fn properties() -> &'static [glib::ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpec::new_boolean( - "header-visible", - "Header visible", - "Whether or not the headerbar is visible", - false, - glib::ParamFlags::READWRITE, - ), - glib::ParamSpec::new_object( - "primary-menu-model", - "Primary Menu Model", - "The menu model for the menu button", - gio::MenuModel::static_type(), - glib::ParamFlags::READWRITE, - ), glib::ParamSpec::new_object( "popover-menu-model", "Popover Menu Model", @@ -150,8 +131,6 @@ mod imp { fn property(&self, _obj: &Self::Type, _id: usize, psec: &glib::ParamSpec) -> glib::Value { match psec.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(), "filename" => self.filename.borrow().to_value(), _ => unimplemented!(), @@ -166,14 +145,6 @@ mod imp { psec: &glib::ParamSpec, ) { match psec.name() { - "header-visible" => { - self.header_visible.set(value.get::().unwrap()); - } - "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()); diff --git a/src/window.rs b/src/window.rs index 9a80f00..7f4e8eb 100644 --- a/src/window.rs +++ b/src/window.rs @@ -52,8 +52,14 @@ mod imp { // TemplateChild wrapper, where T is the // object type of the template child. #[template_child] + pub flap: TemplateChild, + #[template_child] pub headerbar: TemplateChild, #[template_child] + pub menu_button: TemplateChild, + #[template_child] + pub fullscreen_button: TemplateChild, + #[template_child] pub stack: TemplateChild, #[template_child] pub status_page: TemplateChild, @@ -76,7 +82,7 @@ mod imp { // Set up actions klass.install_action("win.toggle-fullscreen", None, move |win, _, _| { - win.set_fullscreened(!win.is_fullscreened()); + win.toggle_fullscreen(!win.is_fullscreened()); }); klass.install_action("win.open", None, move |win, _, _| { @@ -163,6 +169,31 @@ impl IvWindow { glib::Object::new(&[("application", app)]).expect("Failed to create IvWindow") } + fn toggle_fullscreen(&self, fullscreen: bool) { + let imp = imp::IvWindow::from_instance(&self); + + if fullscreen { + imp.flap.set_fold_policy(libadwaita::FlapFoldPolicy::Always); + imp.headerbar.add_css_class("osd"); + imp.menu_button.unparent(); + imp.fullscreen_button.unparent(); + imp.headerbar.pack_end(&*imp.fullscreen_button); + imp.headerbar.pack_end(&*imp.menu_button); + imp.fullscreen_button.set_icon_name("view-restore-symbolic"); + } else { + imp.flap.set_fold_policy(libadwaita::FlapFoldPolicy::Never); + imp.headerbar.remove_css_class("osd"); + imp.menu_button.unparent(); + imp.fullscreen_button.unparent(); + imp.headerbar.pack_end(&*imp.menu_button); + imp.headerbar.pack_end(&*imp.fullscreen_button); + imp.fullscreen_button + .set_icon_name("view-fullscreen-symbolic"); + } + + self.set_fullscreened(fullscreen); + } + fn pick_file(&self) { let chooser = gtk::FileChooserNative::new( Some(&"Open Image".to_string()),