summaryrefslogtreecommitdiffstats
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
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)
-rw-r--r--src/desktop.cpp75
-rw-r--r--src/desktop.h6
-rw-r--r--src/dialogs/clonetiler.cpp5
-rw-r--r--src/dialogs/export.cpp5
-rw-r--r--src/dialogs/find.cpp5
-rw-r--r--src/dialogs/spellcheck.cpp4
-rw-r--r--src/dialogs/xml-tree.cpp5
-rw-r--r--src/sp-namedview.cpp18
-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
-rw-r--r--src/ui/widget/dock-item.cpp51
-rw-r--r--src/ui/widget/dock-item.h13
-rw-r--r--src/ui/widget/dock.cpp4
-rw-r--r--src/ui/widget/imagetoggler.cpp11
-rw-r--r--src/widgets/desktop-widget.cpp4
19 files changed, 243 insertions, 27 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp
index 98791064e..add940a3b 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -72,6 +72,7 @@
#include "sp-root.h"
#include "widgets/desktop-widget.h"
#include "xml/repr.h"
+#include "helper/action.h" //sp_action_perform
// TODO those includes are only for node tool quick zoom. Remove them after fixing it.
#include "ui/tool/node-tool.h"
@@ -117,6 +118,7 @@ SPDesktop::SPDesktop() :
window_state(0),
interaction_disabled_counter( 0 ),
waiting_cursor( false ),
+ showing_dialogs ( false ),
guides_active( false ),
gr_item( 0 ),
gr_point_type( 0 ),
@@ -803,7 +805,6 @@ SPDesktop::set_display_area (double x0, double y0, double x1, double y1, double
_widget->updateScrollbars(_d2w.descrim());
_widget->updateZoom();
-
if ( zoomChanged ) {
signal_zoom_changed.emit(_d2w.descrim());
}
@@ -1770,7 +1771,79 @@ Geom::Point SPDesktop::dt2doc(Geom::Point const &p) const
return p * dt2doc();
}
+void
+SPDesktop::show_dialogs()
+{
+
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ if (prefs == NULL) {
+ return;
+ }
+
+ int active = prefs->getInt("/options/savedialogposition/value", 1);
+ if (active == 0) {
+ // User has turned off this feature in preferences
+ return;
+ }
+
+ if (showing_dialogs) {
+ return;
+ }
+
+ showing_dialogs = TRUE;
+
+ /*
+ * Get each dialogs previous state from preferences and reopen on startup if needed.
+ * Map dialog 'open' verb ids to dialog last visible state preference.
+ * Would prefer to use the Dialog Manager to open, but currently it doesn't support non-dockable dialogs
+ */
+ std::map<int, Glib::ustring> mapVerbPreference;
+ std::map<int, Glib::ustring>::const_iterator iter;
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_LAYERS, "/dialogs/layers") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_FILL_STROKE, "/dialogs/fillstroke") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_EXTENSIONEDITOR, "/dialogs/extensioneditor") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_ALIGN_DISTRIBUTE, "/dialogs/align") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_METADATA, "/dialogs/documentmetadata") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_NAMEDVIEW, "/dialogs/documentoptions") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_FILTER_EFFECTS, "/dialogs/filtereffects") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_FIND, "/dialogs/find") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_GLYPHS, "/dialogs/glyphs") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_DEBUG, "/dialogs/messages") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_HELP_MEMORY, "/dialogs/memory") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_LIVE_PATH_EFFECT, "/dialogs/livepatheffect") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_UNDO_HISTORY, "/dialogs/undo-history") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_TRANSFORM, "/dialogs/transformation") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_SWATCHES, "/dialogs/swatches") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_VIEW_ICON_PREVIEW, "/dialogs/iconpreview") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_SVG_FONTS, "/dialogs/svgfonts") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_INPUT, "/dialogs/inputdevices") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_CONTEXT_SELECT_PREFS, "/dialogs/preferences") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_SELECTION_GRIDTILE, "/dialogs/gridtiler") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_SELECTION_TRACE, "/dialogs/trace") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_TEXT, "/dialogs/textandfont") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_FILE_EXPORT, "/dialogs/export") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_XML_EDITOR, "/dialogs/xml") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_FIND, "/dialogs/find") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_CLONETILER, "/dialogs/clonetiler") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_ITEM, "/dialogs/object") );
+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_SPELLCHECK, "/dialogs/spellcheck") );
+
+ for (iter = mapVerbPreference.begin(); iter != mapVerbPreference.end(); iter++) {
+ int verbId = iter->first;
+ Glib::ustring pref = iter->second;
+ int visible = prefs->getInt(pref + "/visible", 0);
+ if (visible) {
+ Inkscape::Verb *verb = Inkscape::Verb::get(verbId);
+ if (verb) {
+ SPAction *action = verb->get_action(this);
+ if (action) {
+ sp_action_perform(action, NULL);
+ }
+ }
+ }
+ }
+}
/*
* Pop event context from desktop's context stack. Never used.
*/
diff --git a/src/desktop.h b/src/desktop.h
index 9927e45f3..75dfd7743 100644
--- a/src/desktop.h
+++ b/src/desktop.h
@@ -152,6 +152,7 @@ public:
guint window_state;
unsigned int interaction_disabled_counter;
bool waiting_cursor;
+ bool showing_dialogs;
/// \todo fixme: This has to be implemented in different way */
guint guides_active : 1;
@@ -365,6 +366,10 @@ public:
void maximize();
void fullscreen();
void focusMode(bool mode = true);
+ /**
+ * Reopen any dialogs that were open when inkscape last shutdown
+ */
+ void show_dialogs();
Geom::Affine w2d() const; //transformation from window to desktop coordinates (used for zooming)
Geom::Point w2d(Geom::Point const &p) const;
@@ -379,6 +384,7 @@ public:
virtual void mouseover() {}
virtual void mouseout() {}
+
virtual bool onDeleteUI (GdkEventAny*);
virtual bool onWindowStateEvent (GdkEventWindowState* event);
diff --git a/src/dialogs/clonetiler.cpp b/src/dialogs/clonetiler.cpp
index bd4364cc1..c56abc21a 100644
--- a/src/dialogs/clonetiler.cpp
+++ b/src/dialogs/clonetiler.cpp
@@ -97,6 +97,9 @@ static Inkscape::UI::Widget::ColorPicker *color_picker;
static void clonetiler_dialog_destroy(GtkObject */*object*/, gpointer /*data*/)
{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setInt(prefs_path + "visible", 0);
+
sp_signal_disconnect_by_data (INKSCAPE, dlg);
_color_changed_connection.disconnect();
@@ -1769,6 +1772,8 @@ void clonetiler_dialog(void)
h = prefs->getInt(prefs_path + "h", 0);
}
+ prefs->setInt(prefs_path + "visible", 1);
+
// if (x<0) x=0;
// if (y<0) y=0;
diff --git a/src/dialogs/export.cpp b/src/dialogs/export.cpp
index 85149ccaa..706ece066 100644
--- a/src/dialogs/export.cpp
+++ b/src/dialogs/export.cpp
@@ -156,6 +156,9 @@ static const char * selection_labels[SELECTION_NUMBER_OF] = {
static void
sp_export_dialog_destroy ( GtkObject */*object*/, gpointer /*data*/ )
{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setInt(prefs_path + "visible", 0);
+
sp_signal_disconnect_by_data (INKSCAPE, dlg);
wd.win = dlg = NULL;
@@ -422,6 +425,8 @@ sp_export_dialog (void)
h = prefs->getInt(prefs_path + "h", 0);
}
+ prefs->setInt(prefs_path + "visible", 1);
+
// if (x<0) x=0;
// if (y<0) y=0;
diff --git a/src/dialogs/find.cpp b/src/dialogs/find.cpp
index 7219c910e..b96284209 100644
--- a/src/dialogs/find.cpp
+++ b/src/dialogs/find.cpp
@@ -77,6 +77,9 @@ static Glib::ustring const prefs_path = "/dialogs/find/";
static void sp_find_dialog_destroy(GtkObject *object, gpointer)
{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setInt(prefs_path + "visible", 0);
+
sp_signal_disconnect_by_data (INKSCAPE, object);
wd.win = dlg = NULL;
wd.stop = 0;
@@ -661,6 +664,8 @@ sp_find_dialog_old (void)
h = prefs->getInt(prefs_path + "h", 0);
}
+ prefs->setInt(prefs_path + "visible", 1);
+
// if (x<0) x=0;
// if (y<0) y=0;
diff --git a/src/dialogs/spellcheck.cpp b/src/dialogs/spellcheck.cpp
index 399d6ce81..cc1afd475 100644
--- a/src/dialogs/spellcheck.cpp
+++ b/src/dialogs/spellcheck.cpp
@@ -156,6 +156,8 @@ spellcheck_disconnect()
static void sp_spellcheck_dialog_destroy(GtkObject *object, gpointer)
{
+ _prefs->setInt(prefs_path + "visible", 0);
+
spellcheck_clear_rects();
spellcheck_clear_langs();
spellcheck_disconnect();
@@ -903,6 +905,8 @@ sp_spellcheck_dialog (void)
h = _prefs->getInt(prefs_path + "h", 0);
}
+ _prefs->setInt(prefs_path + "visible", 1);
+
if (w && h)
gtk_window_resize ((GtkWindow *) dlg, w, h);
if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) {
diff --git a/src/dialogs/xml-tree.cpp b/src/dialogs/xml-tree.cpp
index 608e7e121..6cf130c2b 100644
--- a/src/dialogs/xml-tree.cpp
+++ b/src/dialogs/xml-tree.cpp
@@ -206,6 +206,8 @@ void sp_xml_tree_dialog()
h = prefs->getInt(prefs_path + "h", 0);
}
+ prefs->setInt(prefs_path + "visible", 1);
+
// if (x<0) x=0;
// if (y<0) y=0;
@@ -991,6 +993,9 @@ void after_tree_move(GtkCTree */*tree*/,
static void on_destroy(GtkObject */*object*/, gpointer /*data*/)
{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setInt(prefs_path + "visible", 0);
+
set_tree_desktop(NULL);
sp_signal_disconnect_by_data(INKSCAPE, dlg);
wd.win = dlg = NULL;
diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp
index a7d7c4b01..bd26a1b16 100644
--- a/src/sp-namedview.cpp
+++ b/src/sp-namedview.cpp
@@ -790,6 +790,7 @@ void sp_namedview_window_from_document(SPDesktop *desktop)
SPNamedView *nv = desktop->namedview;
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
bool geometry_from_file = prefs->getBool("/options/savewindowgeometry/value");
+ bool show_dialogs = TRUE;
// restore window size and position stored with the document
if (geometry_from_file) {
@@ -808,10 +809,23 @@ void sp_namedview_window_from_document(SPDesktop *desktop)
x = MAX(MIN_ONSCREEN_DISTANCE - nv->window_width, x);
y = MAX(MIN_ONSCREEN_DISTANCE - nv->window_height, y);
if (w>0 && h>0) {
+
+ #ifndef WIN32
+ gint dx, dy, dw, dh;
+ desktop->getWindowGeometry(dx, dy, dw, dh);
+ if (w != dw || h != dh) {
+ // Don't show dialogs when window is initially resized on OSX/Linux due to gdl dock bug
+ // This will happen on sp_desktop_widget_size_allocate
+ show_dialogs = FALSE;
+ }
+ #endif
+
desktop->setWindowSize(w, h);
desktop->setWindowPosition(Geom::Point(x, y));
+
}
}
+
}
// restore zoom and view
@@ -825,6 +839,10 @@ void sp_namedview_window_from_document(SPDesktop *desktop)
// cancel any history of zooms up to this point
desktop->zooms_past.clear();
+
+ if (show_dialogs) {
+ desktop->show_dialogs();
+ }
}
bool SPNamedView::getSnapGlobal() const
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;
diff --git a/src/ui/widget/dock-item.cpp b/src/ui/widget/dock-item.cpp
index 34c68284e..07098fa11 100644
--- a/src/ui/widget/dock-item.cpp
+++ b/src/ui/widget/dock-item.cpp
@@ -14,6 +14,7 @@
#include "inkscape.h"
#include "preferences.h"
#include "ui/widget/dock.h"
+#include "ui/icon-names.h"
#include "widgets/icon.h"
#include <gtkmm/icontheme.h>
@@ -24,7 +25,7 @@ namespace UI {
namespace Widget {
DockItem::DockItem(Dock& dock, const Glib::ustring& name, const Glib::ustring& long_name,
- const Glib::ustring& icon_name, State state) :
+ const Glib::ustring& icon_name, State state, Placement placement) :
_dock(dock),
_prev_state(state),
_prev_position(0),
@@ -41,8 +42,13 @@ DockItem::DockItem(Dock& dock, const Glib::ustring& name, const Glib::ustring& l
GDL_DOCK_ITEM_BEH_NORMAL :
GDL_DOCK_ITEM_BEH_CANT_DOCK_CENTER);
+
if (!icon_name.empty()) {
Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default();
+
+ if (!iconTheme->has_icon(icon_name)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(icon_name.data()), Inkscape::ICON_SIZE_MENU );
+ }
// Icon might be in the icon theme, or might be a stock item. Check the proper source:
if ( iconTheme->has_icon(icon_name) ) {
int width = 0;
@@ -78,9 +84,14 @@ DockItem::DockItem(Dock& dock, const Glib::ustring& name, const Glib::ustring& l
signal_delete_event().connect(sigc::mem_fun(*this, &Inkscape::UI::Widget::DockItem::_onDeleteEvent));
signal_realize().connect(sigc::mem_fun(*this, &Inkscape::UI::Widget::DockItem::_onRealize));
- _dock.addItem(*this, (_prev_state == FLOATING_STATE ? FLOATING : TOP));
+ _dock.addItem(*this, ( _prev_state == FLOATING_STATE || _prev_state == ICONIFIED_FLOATING_STATE ) ? FLOATING : placement);
+
+ if (_prev_state == ICONIFIED_FLOATING_STATE || _prev_state == ICONIFIED_DOCKED_STATE) {
+ iconify();
+ }
show_all();
+
}
DockItem::~DockItem()
@@ -198,7 +209,17 @@ DockItem::isIconified() const
DockItem::State
DockItem::getState() const
{
- return (isAttached() ? (isFloating() ? FLOATING_STATE : DOCKED_STATE) : UNATTACHED);
+ if (isIconified() && _prev_state == FLOATING_STATE) {
+ return ICONIFIED_FLOATING_STATE;
+ } else if (isIconified()) {
+ return ICONIFIED_DOCKED_STATE;
+ } else if (isFloating() && isAttached()) {
+ return FLOATING_STATE;
+ } else if (isAttached()) {
+ return DOCKED_STATE;
+ }
+
+ return UNATTACHED;
}
DockItem::State
@@ -210,10 +231,12 @@ DockItem::getPrevState() const
DockItem::Placement
DockItem::getPlacement() const
{
- GdlDockPlacement placement = (GdlDockPlacement)NONE;
- gdl_dock_object_child_placement(gdl_dock_object_get_parent_object (GDL_DOCK_OBJECT(_gdl_dock_item)),
- GDL_DOCK_OBJECT(_gdl_dock_item),
- &placement);
+ GdlDockPlacement placement = (GdlDockPlacement)TOP;
+ GdlDockObject *parent = gdl_dock_object_get_parent_object (GDL_DOCK_OBJECT(_gdl_dock_item));
+ if (parent) {
+ gdl_dock_object_child_placement(parent, GDL_DOCK_OBJECT(_gdl_dock_item), &placement);
+ }
+
return (Placement)placement;
}
@@ -230,6 +253,12 @@ DockItem::show()
}
void
+DockItem::iconify()
+{
+ gdl_dock_item_iconify_item (GDL_DOCK_ITEM(_gdl_dock_item));
+}
+
+void
DockItem::show_all()
{
gtk_widget_show_all(_gdl_dock_item);
@@ -239,10 +268,9 @@ void
DockItem::present()
{
- if (isIconified() || !isAttached()) {
+ if (!isIconified() && !isAttached()) {
show();
}
-
// tabbed
else if (getPlacement() == CENTER) {
int i = gtk_notebook_page_num(GTK_NOTEBOOK(gtk_widget_get_parent(_gdl_dock_item)),
@@ -338,6 +366,11 @@ DockItem::_onHideWindow()
void
DockItem::_onHide()
{
+ if (_prev_state == ICONIFIED_DOCKED_STATE)
+ _prev_state = DOCKED_STATE;
+ else if (_prev_state == ICONIFIED_FLOATING_STATE)
+ _prev_state = FLOATING_STATE;
+
_signal_state_changed.emit(UNATTACHED, getState());
}
diff --git a/src/ui/widget/dock-item.h b/src/ui/widget/dock-item.h
index 573307452..75ffea1a0 100644
--- a/src/ui/widget/dock-item.h
+++ b/src/ui/widget/dock-item.h
@@ -34,10 +34,12 @@ class DockItem {
public:
- enum State { UNATTACHED, // item not bound to the dock (a temporary state)
- FLOATING_STATE, // item not in its dock (but can be docked in other,
- // e.g. floating, docks)
- DOCKED_STATE }; // item in its assigned dock
+ enum State { UNATTACHED, // item not bound to the dock (a temporary state)
+ FLOATING_STATE, // item not in its dock (but can be docked in other,
+ // e.g. floating, docks)
+ DOCKED_STATE, // item in its assigned dock
+ ICONIFIED_DOCKED_STATE, // item iconified in its assigned dock from dock
+ ICONIFIED_FLOATING_STATE}; // item iconified in its assigned dock from float
enum Placement {
NONE = GDL_DOCK_NONE,
@@ -50,7 +52,7 @@ public:
};
DockItem(Dock& dock, const Glib::ustring& name, const Glib::ustring& long_name,
- const Glib::ustring& icon_name, State state);
+ const Glib::ustring& icon_name, State state, Placement placement);
~DockItem();
@@ -80,6 +82,7 @@ public:
void hide();
void show();
+ void iconify();
void show_all();
void present();
diff --git a/src/ui/widget/dock.cpp b/src/ui/widget/dock.cpp
index 62682b9dc..a6e983304 100644
--- a/src/ui/widget/dock.cpp
+++ b/src/ui/widget/dock.cpp
@@ -229,12 +229,14 @@ void Dock::_onLayoutChanged()
{
if (isEmpty()) {
if (hasIconifiedItems()) {
+ _paned->get_child1()->set_size_request(-1, -1);
_scrolled_window->set_size_request(_default_dock_bar_width);
} else {
+ _paned->get_child1()->set_size_request(-1, -1);
_scrolled_window->set_size_request(_default_empty_width);
}
-
getParentPaned()->set_position(INT_MAX);
+
} else {
// unset any forced size requests
_paned->get_child1()->set_size_request(-1, -1);
diff --git a/src/ui/widget/imagetoggler.cpp b/src/ui/widget/imagetoggler.cpp
index 073e071af..6517219f2 100644
--- a/src/ui/widget/imagetoggler.cpp
+++ b/src/ui/widget/imagetoggler.cpp
@@ -14,6 +14,8 @@
#include <gtkmm/icontheme.h>
#include "widgets/icon.h"
+#include "widgets/toolbox.h"
+#include "ui/icon-names.h"
namespace Inkscape {
namespace UI {
@@ -33,10 +35,17 @@ ImageToggler::ImageToggler( char const* on, char const* off) :
int phys = sp_icon_get_phys_size((int)Inkscape::ICON_SIZE_DECORATION);
Glib::RefPtr<Gtk::IconTheme> icon_theme = Gtk::IconTheme::get_default();
+ if (!icon_theme->has_icon(_pixOnName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixOnName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+ if (!icon_theme->has_icon(_pixOffName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixOffName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+
+
if (icon_theme->has_icon(_pixOnName)) {
_property_pixbuf_on = icon_theme->load_icon(_pixOnName, phys, (Gtk::IconLookupFlags)0);
}
-
if (icon_theme->has_icon(_pixOffName)) {
_property_pixbuf_off = icon_theme->load_icon(_pixOffName, phys, (Gtk::IconLookupFlags)0);
}
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index 2c41bf2d1..49979493c 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -722,6 +722,10 @@ sp_desktop_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
}
dtw->desktop->zoom_absolute(area.midpoint()[Geom::X], area.midpoint()[Geom::Y], zoom);
+ // TODO - Should call show_dialogs() from sp_namedview_window_from_document only.
+ // But delaying the call to here solves dock sizing issues on OS X, (see #171579)
+ dtw->desktop->show_dialogs();
+
} else {
if (GTK_WIDGET_CLASS (dtw_parent_class)->size_allocate) {
GTK_WIDGET_CLASS (dtw_parent_class)->size_allocate (widget, allocation);