From db7d56c253433e94d892f5bbeaa5226008a410f5 Mon Sep 17 00:00:00 2001 From: Lawrence Lee <45837045+Lawrence37@users.noreply.github.com> Date: Sun, 25 Jul 2021 17:45:20 -0700 Subject: [PATCH] Synchronize send to external editor buttons Keep all buttons updated when using a multiple editor tabs mode. --- rtgui/editorpanel.cc | 32 ++++++++++++++++++++++++++++++++ rtgui/editorpanel.h | 10 ++++++++++ rtgui/editwindow.cc | 2 ++ rtgui/editwindow.h | 2 ++ 4 files changed, 46 insertions(+) diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index e52dab5db..6649fc970 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -2003,6 +2003,9 @@ void EditorPanel::sendToExternalChanged(int) index = -1; } options.externalEditorIndex = index; + if (externalEditorChangedSignal) { + externalEditorChangedSignal->emit(); + } } void EditorPanel::sendToExternalPressed() @@ -2069,6 +2072,23 @@ void EditorPanel::syncFileBrowser() // synchronize filebrowser with image in E } } +ExternalEditorChangedSignal * EditorPanel::getExternalEditorChangedSignal() +{ + return externalEditorChangedSignal; +} + +void EditorPanel::setExternalEditorChangedSignal(ExternalEditorChangedSignal *signal) +{ + if (externalEditorChangedSignal) { + externalEditorChangedSignalConnection.disconnect(); + } + externalEditorChangedSignal = signal; + if (signal) { + externalEditorChangedSignalConnection = signal->connect( + sigc::mem_fun(*this, &EditorPanel::updateExternalEditorSelection)); + } +} + void EditorPanel::histogramProfile_toggled() { options.rtSettings.HistogramWorking = toggleHistogramProfile->get_active(); @@ -2203,6 +2223,18 @@ void EditorPanel::onAppChooserDialogResponse(int responseId) } } +void EditorPanel::updateExternalEditorSelection() +{ + int index = send_to_external->getSelected(); + if (index >= 0 && static_cast(index) == options.externalEditors.size()) { + index = -1; + } + if (options.externalEditorIndex != index) { + send_to_external->setSelected( + options.externalEditorIndex >= 0 ? options.externalEditorIndex : options.externalEditors.size()); + } +} + void EditorPanel::historyBeforeLineChanged (const rtengine::procparams::ProcParams& params) { diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 1372a2171..1bbb95a6e 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -38,6 +38,8 @@ template class array2D; } +using ExternalEditorChangedSignal = sigc::signal; + class BatchQueueEntry; class EditorPanel; class FilePanel; @@ -66,6 +68,7 @@ class EditorPanel final : public rtengine::NonCopyable { public: + explicit EditorPanel (FilePanel* filePanel = nullptr); ~EditorPanel () override; @@ -170,6 +173,10 @@ public: void openPreviousEditorImage (); void syncFileBrowser (); + // Signals. + ExternalEditorChangedSignal * getExternalEditorChangedSignal(); + void setExternalEditorChangedSignal(ExternalEditorChangedSignal *signal); + void tbTopPanel_1_visible (bool visible); bool CheckSidePanelsVisibility(); void tbShowHideSidePanels_managestate(); @@ -207,6 +214,7 @@ private: void histogramProfile_toggled (); Gtk::AppChooserDialog *getAppChooserDialog(); void onAppChooserDialogResponse(int resposneId); + void updateExternalEditorSelection(); Glib::ustring lastSaveAsFileName; @@ -242,6 +250,8 @@ private: Gtk::Button* navPrev; Glib::RefPtr external_editor_info; std::unique_ptr app_chooser_dialog; + ExternalEditorChangedSignal *externalEditorChangedSignal; + sigc::connection externalEditorChangedSignalConnection; rtengine::InitialImage *cached_exported_image; rtengine::procparams::ProcParams cached_exported_pparams; diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index d0e53d730..0584edf77 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -250,6 +250,7 @@ void EditWindow::addEditorPanel (EditorPanel* ep, const std::string &name) { ep->setParent (parent); ep->setParentWindow(this); + ep->setExternalEditorChangedSignal(&externalEditorChangedSignal); // construct closeable tab for the image Gtk::Box* hb = Gtk::manage (new Gtk::Box ()); @@ -288,6 +289,7 @@ void EditWindow::remEditorPanel (EditorPanel* ep) return; // Will crash if destroyed while loading } + ep->setExternalEditorChangedSignal(nullptr); epanels.erase (ep->getFileName()); filesEdited.erase (ep->getFileName ()); parent->fpanel->refreshEditedState (filesEdited); diff --git a/rtgui/editwindow.h b/rtgui/editwindow.h index b8eeaee82..27d4598c1 100644 --- a/rtgui/editwindow.h +++ b/rtgui/editwindow.h @@ -39,6 +39,8 @@ private: std::set filesEdited; std::map epanels; + sigc::signal externalEditorChangedSignal; + bool isFullscreen; bool isClosed; bool isMinimized;