Loupe/data/gtk/window.ui
Sophie Herold f2357513da imageView: Use custom slide widget and IndexSet
Use IndexSet to allow direct access by Path and also allow
an arbitrary ordering that was not possible with Vec. Also
add monitoring of file changes in the directory.

Use a custom LpSlidingView instead of AdwCarousel because
Carousel was never designed for this job and suffered of
bugs. LpSlidingView does not support swiping gestures yet
since they currently don't work yet anyways #24.

Use a new algorithm to fill the LpSlidingView that is
stateless and covers all potential changes in the directory.
This not only fixes bugs but would also work with changed
sorting orders.

This also adds build time template XML validation since it
was useful for the refactoring #46.

Closes #9, #11, #30, #33, #42
2023-01-30 01:08:57 +00:00

213 lines
9.1 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<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 Loupe</attribute>
<attribute name="action">app.about</attribute>
</item>
</section>
</menu>
<template class="LpWindow" parent="AdwApplicationWindow">
<property name="default-width">600</property>
<property name="default-height">498</property>
<property name="width-request">360</property>
<property name="title" translatable="yes">Loupe</property>
<binding name="title">
<closure type="gchararray" function="window_title">
<lookup name="path">
<lookup name="image">
<lookup name="current-page">image_view</lookup>
</lookup>
</lookup>
</closure>
</binding>
<property name="content">
<object class="AdwFlap" id="flap">
<property name="orientation">vertical</property>
<property name="fold-policy">never</property>
<property name="swipe-to-open">False</property>
<property name="swipe-to-close">False</property>
<property name="locked">true</property>
<property name="modal">false</property>
<binding name="fold-policy">
<closure type="AdwFlapFoldPolicy" function="fold_policy">
<lookup name="fullscreened">LpWindow</lookup>
<lookup type="AdwFlap" name="reveal-flap">properties_flap</lookup>
</closure>
</binding>
<property name="flap">
<object class="GtkHeaderBar" id="headerbar">
<property name="show_title_buttons" bind-source="LpWindow" bind-property="fullscreened" bind-flags="sync-create|invert-boolean"/>
<child type="start">
<object class="GtkButton">
<property name="icon-name">edit-copy-symbolic</property>
<property name="action-name">win.copy</property>
<property name="tooltip-text">Copy to Clipboard</property>
</object>
</child>
<child type="end">
<object class="GtkMenuButton" id="menu_button">
<property name="icon-name">open-menu-symbolic</property>
<property name="tooltip-text" translatable="yes">Main 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>
<child>
<!-- Set the shortcut here since it only makes sense if the button is visible -->
<object class="GtkShortcutController">
<property name="scope">managed</property>
<child>
<object class="GtkShortcut">
<property name="trigger">F10</property>
<property name="action">activate</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child type="end">
<object class="GtkToggleButton" id="properties_button">
<property name="icon-name">help-about-symbolic</property>
<property name="tooltip-text" translatable="yes">Image Properties</property>
</object>
</child>
</object>
</property>
<property name="content">
<object class="AdwToastOverlay" id="toast_overlay">
<property name="child">
<object class="AdwFlap" id="properties_flap">
<property name="flap-position">end</property>
<property name="fold-policy">never</property>
<property name="locked">True</property>
<property name="reveal-flap" bind-source="properties_button" bind-property="active" bind-flags="bidirectional|sync-create"/>
<property name="content">
<object class="GtkStack" id="stack">
<property name="visible-child">status_page</property>
<property name="vexpand">True</property>
<child>
<object class="AdwStatusPage" id="status_page">
<property name="title" translatable="yes">Loupe</property>
<property name="description" translatable="yes">Drag and drop images here</property>
<child>
<object class="GtkButton">
<property name="halign">center</property>
<property name="label" translatable="yes">Open File…</property>
<property name="action-name">win.open</property>
<style>
<class name="pill"/>
<class name="suggested-action"/>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="LpImageView" id="image_view"/>
</child>
<child>
<object class="GtkDropTarget" id="drop_target">
<property name="actions">copy</property>
</object>
</child>
</object>
</property>
<property name="separator">
<object class="GtkSeparator"/>
</property>
<property name="flap">
<object class="LpPropertiesView" id="properties_view">
<binding name="image">
<lookup name="image">
<lookup name="current-page">
image_view
</lookup>
</lookup>
</binding>
</object>
</property>
</object>
</property>
</object>
</property>
<style>
<class name="fullscreen-widget"/>
</style>
</object>
</property>
</template>
</interface>