From 2526601d2fdb2d9addba9c0de4901521f41171ae Mon Sep 17 00:00:00 2001 From: "[d.j.a.y] Jerome Blanchi" Date: Sun, 16 Mar 2014 00:07:06 +0100 Subject: [PATCH 1/4] 588-Window menu doesn't remove a closed document - progress - Add DockManager::signal_dockable_unregistered --- synfig-studio/src/gui/docks/dockmanager.cpp | 1 + synfig-studio/src/gui/docks/dockmanager.h | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/synfig-studio/src/gui/docks/dockmanager.cpp b/synfig-studio/src/gui/docks/dockmanager.cpp index 5d4bd4964ef..ad058f1672c 100644 --- a/synfig-studio/src/gui/docks/dockmanager.cpp +++ b/synfig-studio/src/gui/docks/dockmanager.cpp @@ -205,6 +205,7 @@ DockManager::unregister_dockable(Dockable& x) { remove_widget_recursive(x); dockable_list_.erase(iter); + signal_dockable_unregistered()(&x); synfig::info("DockManager::unregister_dockable(): \"%s\" has been Unregistered",x.get_name().c_str()); update_window_titles(); return true; diff --git a/synfig-studio/src/gui/docks/dockmanager.h b/synfig-studio/src/gui/docks/dockmanager.h index 1820731ff8d..db5f4bb3e40 100644 --- a/synfig-studio/src/gui/docks/dockmanager.h +++ b/synfig-studio/src/gui/docks/dockmanager.h @@ -60,6 +60,7 @@ class DockManager : public sigc::trackable std::list dock_dialog_list_; sigc::signal signal_dockable_registered_; + sigc::signal signal_dockable_unregistered_; etl::smart_ptr dock_settings; @@ -84,8 +85,12 @@ class DockManager : public sigc::trackable DockDialog& find_dock_dialog(int id); const DockDialog& find_dock_dialog(int id)const; - + //! Connect to that signal to get the info a dock has been registred + /*! \see studio::DockManager::register_dockable */ sigc::signal& signal_dockable_registered() { return signal_dockable_registered_; } + //! Connect to that signal to get the info that a dock has been unregistred + /*! \see studio::DockManager::unregister_dockable */ + sigc::signal& signal_dockable_unregistered() { return signal_dockable_unregistered_; } void register_dockable(Dockable& x); bool unregister_dockable(Dockable& x); From d5e08dae20a726923f07982a63d0e55402dea6ae Mon Sep 17 00:00:00 2001 From: "[d.j.a.y] Jerome Blanchi" Date: Sun, 16 Mar 2014 01:21:19 +0100 Subject: [PATCH 2/4] 588-Window menu doesn't remove a closed document - progress2 - Add MainWindow::on_dockable_unregistered(Dockable* dockable) - Connect MainWindow::on_dockable_unregistered(Dockable* dockable) to DockManager::signal_dockable_unregistered --- synfig-studio/src/gui/mainwindow.cpp | 10 ++++++++++ synfig-studio/src/gui/mainwindow.h | 1 + 2 files changed, 11 insertions(+) diff --git a/synfig-studio/src/gui/mainwindow.cpp b/synfig-studio/src/gui/mainwindow.cpp index c7a963bf31f..35b138e303c 100644 --- a/synfig-studio/src/gui/mainwindow.cpp +++ b/synfig-studio/src/gui/mainwindow.cpp @@ -134,6 +134,9 @@ MainWindow::MainWindow() App::dock_manager->signal_dockable_registered().connect( sigc::mem_fun(*this,&MainWindow::on_dockable_registered) ); + App::dock_manager->signal_dockable_unregistered().connect( + sigc::mem_fun(*this,&MainWindow::on_dockable_unregistered) ); + GRAB_HINT_DATA("mainwindow"); } @@ -339,4 +342,11 @@ MainWindow::on_dockable_registered(Dockable* dockable) App::ui_manager()->add_ui_from_string(ui_info_menubar); } +void +MainWindow::on_dockable_unregistered(Dockable* dockable) +{ + + + return; +} /* === E N T R Y P O I N T ================================================= */ diff --git a/synfig-studio/src/gui/mainwindow.h b/synfig-studio/src/gui/mainwindow.h index adec500cb55..d32fb460916 100644 --- a/synfig-studio/src/gui/mainwindow.h +++ b/synfig-studio/src/gui/mainwindow.h @@ -58,6 +58,7 @@ namespace studio { static void show_dialog_input(); void on_recent_files_changed(); void on_dockable_registered(Dockable* dockable); + void on_dockable_unregistered(Dockable* dockable); void toggle_show_maintoolbar(); void toggle_show_menubar(); From 2f1ef9de1bba1061c403f06785762793142a316d Mon Sep 17 00:00:00 2001 From: "[d.j.a.y] Jerome Blanchi" Date: Sun, 16 Mar 2014 01:55:22 +0100 Subject: [PATCH 3/4] 588-Window menu doesn't remove a closed document - progress3 - Add CanvasView get & set, popup and toolbar ui_merge_id - Affect CanvasView popup & toolbar ui_merge_id on MainWindow::on_dockable_registered --- synfig-studio/src/gui/canvasview.cpp | 24 ++++++++++++++++++++++++ synfig-studio/src/gui/canvasview.h | 8 ++++++++ synfig-studio/src/gui/mainwindow.cpp | 13 ++++++++++--- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/synfig-studio/src/gui/canvasview.cpp b/synfig-studio/src/gui/canvasview.cpp index 2f79c7338e9..cabb29e0a7b 100644 --- a/synfig-studio/src/gui/canvasview.cpp +++ b/synfig-studio/src/gui/canvasview.cpp @@ -3887,6 +3887,30 @@ CanvasView::set_ext_widget(const synfig::String& x, Gtk::Widget* y) keyframe_tree=dynamic_cast(y); } +Gtk::UIManager::ui_merge_id +CanvasView::get_popup_id() +{ + return merge_id_popup_; +} + +void +CanvasView::set_popup_id(Gtk::UIManager::ui_merge_id popup_id) +{ + merge_id_popup_ = popup_id; +} + +Gtk::UIManager::ui_merge_id +CanvasView::get_toolbar_id() +{ + return merge_id_toolbar_; +} + +void +CanvasView::set_toolbar_id(Gtk::UIManager::ui_merge_id toolbar_id) +{ + merge_id_toolbar_ = toolbar_id; +} + bool CanvasView::on_delete_event(GdkEventAny* event __attribute__ ((unused))) { diff --git a/synfig-studio/src/gui/canvasview.h b/synfig-studio/src/gui/canvasview.h index 3aba58c316d..093f0694667 100644 --- a/synfig-studio/src/gui/canvasview.h +++ b/synfig-studio/src/gui/canvasview.h @@ -373,6 +373,9 @@ class CanvasView : public Dockable, public etl::shared_object //! Menu members Gtk::Menu parammenu; + Gtk::UIManager::ui_merge_id merge_id_popup_; + Gtk::UIManager::ui_merge_id merge_id_toolbar_; + Glib::RefPtr grid_snap_toggle; Glib::RefPtr grid_show_toggle; Glib::RefPtr onion_skin_toggle; @@ -522,6 +525,11 @@ class CanvasView : public Dockable, public etl::shared_object Gtk::Widget* get_ext_widget(const synfig::String& x); void set_ext_widget(const synfig::String& x, Gtk::Widget* y); + Gtk::UIManager::ui_merge_id get_popup_id(); + void set_popup_id(Gtk::UIManager::ui_merge_id popup_id); + Gtk::UIManager::ui_merge_id get_toolbar_id(); + void set_toolbar_id(Gtk::UIManager::ui_merge_id toolbar_id); + //std::map& tree_view_book() { return tree_view_book_; } //std::map& ext_widget_book() { return tree_view_book_; } diff --git a/synfig-studio/src/gui/mainwindow.cpp b/synfig-studio/src/gui/mainwindow.cpp index 35b138e303c..f0d081711a0 100644 --- a/synfig-studio/src/gui/mainwindow.cpp +++ b/synfig-studio/src/gui/mainwindow.cpp @@ -338,15 +338,22 @@ MainWindow::on_dockable_registered(Dockable* dockable) std::string ui_info_menubar = "" + ui_info + ""; - App::ui_manager()->add_ui_from_string(ui_info_popup); - App::ui_manager()->add_ui_from_string(ui_info_menubar); + Gtk::UIManager::ui_merge_id merge_id_popup = App::ui_manager()->add_ui_from_string(ui_info_popup); + Gtk::UIManager::ui_merge_id merge_id_menubar = App::ui_manager()->add_ui_from_string(ui_info_menubar); + + // record CanvasView toolbar and popup id's + CanvasView *canvas_view = dynamic_cast(dockable); + if(canvas_view) + { + canvas_view->set_popup_id(merge_id_popup); + canvas_view->set_toolbar_id(merge_id_menubar); + } } void MainWindow::on_dockable_unregistered(Dockable* dockable) { - return; } /* === E N T R Y P O I N T ================================================= */ From ee2ca531589c71c620929a6010532d19456da92d Mon Sep 17 00:00:00 2001 From: "[d.j.a.y] Jerome Blanchi" Date: Sun, 16 Mar 2014 02:08:05 +0100 Subject: [PATCH 4/4] Fix 588-Window menu doesn't remove a closed document - On MainWindow::on_dockable_unregistered, remove from App::ui_manager CanvasView popup and toolbar ids. Nota : If a canvas has an exported group, the closed exported group appear in the window listing until all reffering canvas aren't closed ... It's a kind of feature. --- synfig-studio/src/gui/mainwindow.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/synfig-studio/src/gui/mainwindow.cpp b/synfig-studio/src/gui/mainwindow.cpp index f0d081711a0..959a4ed2265 100644 --- a/synfig-studio/src/gui/mainwindow.cpp +++ b/synfig-studio/src/gui/mainwindow.cpp @@ -353,7 +353,12 @@ MainWindow::on_dockable_registered(Dockable* dockable) void MainWindow::on_dockable_unregistered(Dockable* dockable) { - - return; + // remove the document from the menus + CanvasView *canvas_view = dynamic_cast(dockable); + if(canvas_view) + { + App::ui_manager()->remove_ui(canvas_view->get_popup_id()); + App::ui_manager()->remove_ui(canvas_view->get_toolbar_id()); + } } /* === E N T R Y P O I N T ================================================= */