menus: Add rotate left and right buttons

This commit is contained in:
Sophie Herold 2022-11-05 00:57:18 +01:00
parent 57f573f98a
commit c2e3bb2f83
5 changed files with 153 additions and 85 deletions

View file

@ -1,5 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<menu id="image_menu">
<section>
<item>
<attribute name="label" translatable="yes">_Open With…</attribute>
<attribute name="action">win.open-with</attribute>
</item>
<!--<item>
<attribute name="label" translatable="yes">_Display On…</attribute>
<attribute name="action">win.display-on</attribute>
</item>-->
<item>
<attribute name="label" translatable="yes">_Print…</attribute>
<attribute name="action">win.print</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Copy</attribute>
<attribute name="action">win.copy</attribute>
</item>
</section>
<section>
<attribute name="label" translatable="yes">Rotate</attribute>
<attribute name="display-hint">inline-buttons</attribute>
<item>
<attribute name="custom">rotate-left</attribute>
</item>
<item>
<attribute name="custom">rotate-right</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Set as Background…</attribute>
<attribute name="action">win.set-background</attribute>
</item>
</section>
</menu>
<template class="LpImagePage" parent="AdwBin"> <template class="LpImagePage" parent="AdwBin">
<property name="hexpand">True</property> <property name="hexpand">True</property>
<property name="vexpand">True</property> <property name="vexpand">True</property>
@ -36,6 +72,28 @@
<object class="GtkPopoverMenu" id="popover"> <object class="GtkPopoverMenu" id="popover">
<property name="has-arrow">False</property> <property name="has-arrow">False</property>
<property name="menu-model">image_menu</property> <property name="menu-model">image_menu</property>
<child type="rotate-left">
<object class="GtkButton">
<property name="icon-name">object-rotate-left-symbolic</property>
<property name="tooltip-text" translatable="yes">Rotate Left</property>
<property name="action-name">win.rotate</property>
<property name="action-target">-90.0</property>
<style>
<class name="flat" />
</style>
</object>
</child>
<child type="rotate-right">
<object class="GtkButton">
<property name="icon-name">object-rotate-right-symbolic</property>
<property name="tooltip-text" translatable="yes">Rotate Right</property>
<property name="action-name">win.rotate</property>
<property name="action-target">90.0</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>
@ -43,32 +101,4 @@
</object> </object>
</property> </property>
</template> </template>
<menu id="image_menu">
<section>
<item>
<attribute name="label" translatable="yes">_Open With…</attribute>
<attribute name="action">win.open-with</attribute>
</item>
<!--<item>
<attribute name="label" translatable="yes">_Display On…</attribute>
<attribute name="action">win.display-on</attribute>
</item>-->
<item>
<attribute name="label" translatable="yes">_Print…</attribute>
<attribute name="action">win.print</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Copy</attribute>
<attribute name="action">win.copy</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Rotate</attribute>
<attribute name="action">win.rotate-image</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Set as Background…</attribute>
<attribute name="action">win.set-background</attribute>
</item>
</section>
</menu>
</interface> </interface>

View file

@ -1,5 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<menu id="primary_menu">
<section>
<item>
<attribute name="label" translatable="yes">_New Window</attribute>
<attribute name="action">app.new-window</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Open…</attribute>
<attribute name="action">win.open</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Open With…</attribute>
<attribute name="action">win.open-with</attribute>
</item>
<!--<item>
<attribute name="label" translatable="yes">_Display On…</attribute>
<attribute name="action">win.display-on</attribute>
</item>-->
<item>
<attribute name="label" translatable="yes">_Print…</attribute>
<attribute name="action">win.print</attribute>
</item>
</section>
<section>
<attribute name="label" translatable="yes">Rotate</attribute>
<attribute name="display-hint">inline-buttons</attribute>
<item>
<attribute name="custom">rotate-left</attribute>
</item>
<item>
<attribute name="custom">rotate-right</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Set as Background…</attribute>
<attribute name="action">win.set-background</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Help</attribute>
<attribute name="action">app.help</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute>
<attribute name="action">win.show-help-overlay</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_About Image Viewer</attribute>
<attribute name="action">app.about</attribute>
</item>
</section>
</menu>
<template class="LpWindow" parent="AdwApplicationWindow"> <template class="LpWindow" parent="AdwApplicationWindow">
<property name="default-width">600</property> <property name="default-width">600</property>
<property name="default-height">498</property> <property name="default-height">498</property>
@ -37,8 +93,34 @@
<child type="end"> <child type="end">
<object class="GtkMenuButton" id="menu_button"> <object class="GtkMenuButton" id="menu_button">
<property name="icon-name">open-menu-symbolic</property> <property name="icon-name">open-menu-symbolic</property>
<property name="menu-model">primary_menu</property>
<property name="tooltip-text" translatable="yes">Primary Menu</property> <property name="tooltip-text" translatable="yes">Primary Menu</property>
<property name="popover">
<object class="GtkPopoverMenu">
<property name="menu-model">primary_menu</property>
<child type="rotate-left">
<object class="GtkButton">
<property name="icon-name">object-rotate-left-symbolic</property>
<property name="tooltip-text" translatable="yes">Rotate Left</property>
<property name="action-name">win.rotate</property>
<property name="action-target">-90.0</property>
<style>
<class name="flat" />
</style>
</object>
</child>
<child type="rotate-right">
<object class="GtkButton">
<property name="icon-name">object-rotate-right-symbolic</property>
<property name="tooltip-text" translatable="yes">Rotate Right</property>
<property name="action-name">win.rotate</property>
<property name="action-target">90.0</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</property>
</object> </object>
</child> </child>
<child type="end"> <child type="end">
@ -105,52 +187,4 @@
</object> </object>
</property> </property>
</template> </template>
<menu id="primary_menu">
<section>
<item>
<attribute name="label" translatable="yes">_New Window</attribute>
<attribute name="action">app.new-window</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Open…</attribute>
<attribute name="action">win.open</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Open With…</attribute>
<attribute name="action">win.open-with</attribute>
</item>
<!--<item>
<attribute name="label" translatable="yes">_Display On…</attribute>
<attribute name="action">win.display-on</attribute>
</item>-->
<item>
<attribute name="label" translatable="yes">_Print…</attribute>
<attribute name="action">win.print</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Rotate</attribute>
<attribute name="action">win.rotate-image</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Set as Background…</attribute>
<attribute name="action">win.set-background</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Help</attribute>
<attribute name="action">app.help</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute>
<attribute name="action">win.show-help-overlay</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_About Image Viewer</attribute>
<attribute name="action">app.about</attribute>
</item>
</section>
</menu>
</interface> </interface>

View file

@ -102,6 +102,9 @@ mod imp {
fn dispose(&self) { fn dispose(&self) {
let obj = self.instance(); let obj = self.instance();
self.rotation_animation.replace(None);
while let Some(child) = obj.first_child() { while let Some(child) = obj.first_child() {
child.unparent(); child.unparent();
} }
@ -257,9 +260,9 @@ impl LpImage {
gdk::ContentProvider::new_union(contents.as_slice()) gdk::ContentProvider::new_union(contents.as_slice())
} }
pub fn rotate(&self) { pub fn rotate(&self, angle: f64) {
let target = &self.imp().rotation_target; let target = &self.imp().rotation_target;
target.set(target.get() + 90.); target.set(target.get() + angle);
let borrow = self.imp().rotation_animation.borrow(); let borrow = self.imp().rotation_animation.borrow();
let animation = borrow.as_ref().unwrap(); let animation = borrow.as_ref().unwrap();

View file

@ -385,9 +385,9 @@ impl LpImageView {
} }
} }
pub fn rotate_image(&self) { pub fn rotate_image(&self, angle: f64) {
if let Some(current_page) = self.current_page() { if let Some(current_page) = self.current_page() {
current_page.image().rotate(); current_page.image().rotate(angle);
} }
} }

View file

@ -102,8 +102,8 @@ mod imp {
win.open_with(); win.open_with();
}); });
klass.install_action("win.rotate-image", None, move |win, _, _| { klass.install_action("win.rotate", Some("d"), move |win, _, angle| {
win.rotate_image(); win.rotate_image(angle.unwrap().get().unwrap());
}); });
klass.install_action("win.set-background", None, move |win, _, _| { klass.install_action("win.set-background", None, move |win, _, _| {
@ -290,8 +290,8 @@ impl LpWindow {
} }
} }
fn rotate_image(&self) { fn rotate_image(&self, angle: f64) {
self.imp().image_view.rotate_image() self.imp().image_view.rotate_image(angle)
} }
fn set_background(&self) { fn set_background(&self) {
@ -352,6 +352,7 @@ impl LpWindow {
self.action_set_enabled("win.set-background", enabled); self.action_set_enabled("win.set-background", enabled);
self.action_set_enabled("win.toggle-fullscreen", enabled); self.action_set_enabled("win.toggle-fullscreen", enabled);
self.action_set_enabled("win.print", enabled); self.action_set_enabled("win.print", enabled);
self.action_set_enabled("win.rotate", enabled);
self.action_set_enabled("win.copy", enabled); self.action_set_enabled("win.copy", enabled);
} }