summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog
diff options
context:
space:
mode:
authorJohn Smith <john.smith7545@yahoo.com>2012-02-17 08:05:08 +0000
committerJohn Smith <removethis.john.q.public@bigmail.com>2012-02-17 08:05:08 +0000
commitafb80368d6bf4dc2a55b011c9a14fa4288d2fe84 (patch)
tree6ec54c830a6537271186388726542ca873ff7830 /src/ui/dialog
parentDocumentation of the Text and Font dialog (diff)
downloadinkscape-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.cpp26
-rw-r--r--src/ui/dialog/dialog.h3
-rw-r--r--src/ui/dialog/dock-behavior.cpp23
-rw-r--r--src/ui/dialog/dock-behavior.h1
-rw-r--r--src/ui/dialog/inkscape-preferences.cpp9
-rw-r--r--src/ui/dialog/inkscape-preferences.h2
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;