diff options
| author | John Smith <john.smith7545@yahoo.com> | 2012-02-17 08:05:08 +0000 |
|---|---|---|
| committer | John Smith <removethis.john.q.public@bigmail.com> | 2012-02-17 08:05:08 +0000 |
| commit | afb80368d6bf4dc2a55b011c9a14fa4288d2fe84 (patch) | |
| tree | 6ec54c830a6537271186388726542ca873ff7830 /src/ui/dialog | |
| parent | Documentation of the Text and Font dialog (diff) | |
| download | inkscape-afb80368d6bf4dc2a55b011c9a14fa4288d2fe84.tar.gz inkscape-afb80368d6bf4dc2a55b011c9a14fa4288d2fe84.zip | |
Fix for 171579 : Make inkscape remember dialogs window status
(bzr r10992)
Diffstat (limited to 'src/ui/dialog')
| -rw-r--r-- | src/ui/dialog/dialog.cpp | 26 | ||||
| -rw-r--r-- | src/ui/dialog/dialog.h | 3 | ||||
| -rw-r--r-- | src/ui/dialog/dock-behavior.cpp | 23 | ||||
| -rw-r--r-- | src/ui/dialog/dock-behavior.h | 1 | ||||
| -rw-r--r-- | src/ui/dialog/inkscape-preferences.cpp | 9 | ||||
| -rw-r--r-- | src/ui/dialog/inkscape-preferences.h | 2 |
6 files changed, 54 insertions, 10 deletions
diff --git a/src/ui/dialog/dialog.cpp b/src/ui/dialog/dialog.cpp index 43c9493b3..3e53dcb53 100644 --- a/src/ui/dialog/dialog.cpp +++ b/src/ui/dialog/dialog.cpp @@ -83,11 +83,12 @@ Dialog::Dialog(Behavior::BehaviorFactory behavior_factory, const char *prefs_pat : _user_hidden(false), _hiddenF12(false), retransientize_suppress(false), - // _prefs_path(prefs_path), _verb_num(verb_num), _title(), _apply_label(apply_label), + _desktop(NULL), + _is_active_desktop(true), _behavior(0) { gchar title[500]; @@ -97,8 +98,8 @@ Dialog::Dialog(Behavior::BehaviorFactory behavior_factory, const char *prefs_pat } _title = title; - _behavior = behavior_factory(*this); + _desktop = SP_ACTIVE_DESKTOP; g_signal_connect(G_OBJECT(INKSCAPE), "activate_desktop", G_CALLBACK(sp_retransientize), (void *)this); g_signal_connect(G_OBJECT(INKSCAPE), "dialogs_hide", G_CALLBACK(hideCallback), (void *)this); @@ -124,13 +125,14 @@ Dialog::~Dialog() void Dialog::onDesktopActivated(SPDesktop *desktop) { + _is_active_desktop = (desktop == _desktop); _behavior->onDesktopActivated(desktop); } void Dialog::onShutdown() { save_geometry(); - _user_hidden = true; + //_user_hidden = true; _behavior->onShutdown(); } @@ -224,6 +226,24 @@ void Dialog::save_geometry() } +void +Dialog::save_status(int visible, int state, int placement) +{ + // Only save dialog status for dialogs on the "last document" + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if (desktop != NULL || !_is_active_desktop ) { + return; + } + + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (prefs) { + prefs->setInt(_prefs_path + "/visible", visible); + prefs->setInt(_prefs_path + "/state", state); + prefs->setInt(_prefs_path + "/placement", placement); + } +} + + void Dialog::_handleResponse(int response_id) { switch (response_id) { diff --git a/src/ui/dialog/dialog.h b/src/ui/dialog/dialog.h index 3bd4f9d65..43e7dda3b 100644 --- a/src/ui/dialog/dialog.h +++ b/src/ui/dialog/dialog.h @@ -108,6 +108,7 @@ public: * Save window position to preferences. */ void save_geometry(); + void save_status(int visible, int state, int placement); bool retransientize_suppress; // when true, do not retransientize (prevents races when switching new windows too fast) @@ -116,6 +117,8 @@ protected: int _verb_num; Glib::ustring _title; Glib::ustring _apply_label; + SPDesktop * _desktop; + bool _is_active_desktop; virtual void _handleResponse(int response_id); diff --git a/src/ui/dialog/dock-behavior.cpp b/src/ui/dialog/dock-behavior.cpp index cf4d36cff..9b216e841 100644 --- a/src/ui/dialog/dock-behavior.cpp +++ b/src/ui/dialog/dock-behavior.cpp @@ -46,16 +46,22 @@ DockBehavior::DockBehavior(Dialog &dialog) : Inkscape::Verb::get(dialog._verb_num)->get_image() : ""), static_cast<Widget::DockItem::State>( Inkscape::Preferences::get()->getInt(_dialog._prefs_path + "/state", - UI::Widget::DockItem::DOCKED_STATE))) + UI::Widget::DockItem::DOCKED_STATE)), + static_cast<Widget::DockItem::Placement>( + Inkscape::Preferences::get()->getInt(_dialog._prefs_path + "/placement", + UI::Widget::DockItem::TOP))) + { // Connect signals _signal_hide_connection = signal_hide().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::Behavior::DockBehavior::_onHide)); + signal_show().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::Behavior::DockBehavior::_onShow)); _dock_item.signal_state_changed().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::Behavior::DockBehavior::_onStateChanged)); if (_dock_item.getState() == Widget::DockItem::FLOATING_STATE) { if (Gtk::Window *floating_win = _dock_item.getWindow()) sp_transientize(GTK_WIDGET(floating_win->gobj())); } + } DockBehavior::~DockBehavior() @@ -178,8 +184,12 @@ DockBehavior::_onHide() { _dialog.save_geometry(); _dialog._user_hidden = true; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setInt(_dialog._prefs_path + "/state", _dock_item.getPrevState()); +} + +void +DockBehavior::_onShow() +{ + _dialog._user_hidden = false; } void @@ -187,8 +197,6 @@ DockBehavior::_onStateChanged(Widget::DockItem::State /*prev_state*/, Widget::DockItem::State new_state) { // TODO probably need to avoid window calls unless the state is different. Check. - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setInt(_dialog._prefs_path + "/state", new_state); if (new_state == Widget::DockItem::FLOATING_STATE) { if (Gtk::Window *floating_win = _dock_item.getWindow()) @@ -212,8 +220,9 @@ DockBehavior::onShowF12() void DockBehavior::onShutdown() { - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setInt(_dialog._prefs_path + "/state", _dock_item.getPrevState()); + int visible = _dock_item.isIconified() || !_dialog._user_hidden; + int status = (_dock_item.getState() == Inkscape::UI::Widget::DockItem::UNATTACHED) ? _dock_item.getPrevState() : _dock_item.getState(); + _dialog.save_status( visible, status, _dock_item.getPlacement() ); } void diff --git a/src/ui/dialog/dock-behavior.h b/src/ui/dialog/dock-behavior.h index cc599286f..de7386ad9 100644 --- a/src/ui/dialog/dock-behavior.h +++ b/src/ui/dialog/dock-behavior.h @@ -74,6 +74,7 @@ private: /** Internal signal handlers */ void _onHide(); + void _onShow(); bool _onDeleteEvent(GdkEventAny *event); void _onStateChanged(Widget::DockItem::State prev_state, Widget::DockItem::State new_state); bool _onKeyPress(GdkEventKey *event); diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index dc6543c92..9f63f4654 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -573,6 +573,9 @@ void InkscapePreferences::initPageUI() _win_save_geom_prefs.init ( _("Remember and use last window's geometry"), "/options/savewindowgeometry/value", 2, false, &_win_save_geom); _win_save_geom_off.init ( _("Don't save window geometry"), "/options/savewindowgeometry/value", 0, false, &_win_save_geom); + _win_save_dialog_pos_on.init ( _("Save and restore dialogs status"), "/options/savedialogposition/value", 1, true, 0); + _win_save_dialog_pos_off.init ( _("Don't save dialogs status"), "/options/savedialogposition/value", 0, false, &_win_save_dialog_pos_on); + _win_dockable.init ( _("Dockable"), "/options/dialogtype/value", 1, true, 0); _win_floating.init ( _("Floating"), "/options/dialogtype/value", 0, false, &_win_dockable); @@ -591,6 +594,12 @@ void InkscapePreferences::initPageUI() _page_windows.add_line( true, "", _win_save_geom, "", _("Save and restore window geometry for each document (saves geometry in the document)")); + _page_windows.add_group_header( _("Saving dialogs status")); + _page_windows.add_line( true, "", _win_save_dialog_pos_off, "", + _("Don't save dialogs status")); + _page_windows.add_line( true, "", _win_save_dialog_pos_on, "", + _("Save and restore dialogs status (the last open windows dialogs are saved when it closes)")); + _page_windows.add_group_header( _("Dialog behavior (requires restart)")); _page_windows.add_line( true, "", _win_dockable, "", _("Dockable")); diff --git a/src/ui/dialog/inkscape-preferences.h b/src/ui/dialog/inkscape-preferences.h index 7da51e190..6a46ef83c 100644 --- a/src/ui/dialog/inkscape-preferences.h +++ b/src/ui/dialog/inkscape-preferences.h @@ -219,6 +219,8 @@ protected: UI::Widget::PrefRadioButton _win_dockable; UI::Widget::PrefRadioButton _win_floating; + UI::Widget::PrefRadioButton _win_save_dialog_pos_on; + UI::Widget::PrefRadioButton _win_save_dialog_pos_off; UI::Widget::PrefRadioButton _win_ontop_none; UI::Widget::PrefRadioButton _win_ontop_normal; UI::Widget::PrefRadioButton _win_ontop_agressive; |
