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
213 lines
9.1 KiB
XML
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>
|