Add Lightroom's export and copy shortcuts to develop

Ctrl+E opens an export sheet: the export defaults on their own, over the
photograph, with an Export button. Ctrl+Shift+E exports straight away on
those defaults. There is no per-export copy of the settings, so what is
chosen in the sheet is saved as it is on the settings page, and the next
Ctrl+Shift+E uses it.

To make that one set of controls in two places, the export options move
out of the settings page into export.slint: an `ExportOptions` global
that Rust writes once, and two panels that read it. The window no longer
forwards forty `settings-*` properties to the page.

Ctrl+Shift+C opens a copy sheet with the edit-kind chips the preset
sheet already uses and a Copy button, which is how a paste leaves each
photograph's crop and rotation alone (Compose off). A and D step along
the roll beside the arrows. While either sheet is up the develop keys
stand down, so A cannot change the photograph behind the form, and
Escape closes it.
This commit is contained in:
2026-09-24 05:11:16 +02:00
parent 41486bd59b
commit bddf3250c5
9 changed files with 898 additions and 571 deletions
+5 -5
View File
@@ -1958,7 +1958,7 @@ fn wire_settings_screen(
{
let (weak, ctl, library, start) = (weak.clone(), ctl.clone(), library.clone(), start);
window.on_settings_browse_open_picker(move || {
window.global::<ExportOptions>().on_browse_open_picker(move || {
let Some(w) = weak.upgrade() else { return };
// Opens on the library root rather than on whatever the
// destination field happens to contain: a half-typed path
@@ -1975,7 +1975,7 @@ fn wire_settings_screen(
{
let (weak, ctl, library, start) = (weak.clone(), ctl.clone(), library.clone(), start);
window.on_settings_browse_into(move |name| {
window.global::<ExportOptions>().on_browse_into(move |name| {
let Some(w) = weak.upgrade() else { return };
let path = {
let mut browser = ctl.browser.borrow_mut();
@@ -1993,7 +1993,7 @@ fn wire_settings_screen(
{
let (weak, ctl, library, start) = (weak.clone(), ctl.clone(), library.clone(), start);
window.on_settings_browse_up(move || {
window.global::<ExportOptions>().on_browse_up(move || {
let Some(w) = weak.upgrade() else { return };
let path = {
let mut browser = ctl.browser.borrow_mut();
@@ -2011,7 +2011,7 @@ fn wire_settings_screen(
{
let (weak, ctl) = (weak.clone(), ctl.clone());
window.on_settings_browse_confirm(move || {
window.global::<ExportOptions>().on_browse_confirm(move || {
let Some(w) = weak.upgrade() else { return };
// The folder being *shown* is the one chosen, matching the
// library picker — so "use this one" means the same thing in
@@ -2029,7 +2029,7 @@ fn wire_settings_screen(
{
let (weak, ctl) = (weak.clone(), ctl.clone());
window.on_settings_browse_cancel(move || {
window.global::<ExportOptions>().on_browse_cancel(move || {
let Some(w) = weak.upgrade() else { return };
ctl.browser.replace(None);
settings_ui::render(&w, &ctl);