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 | |
| 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')
| -rw-r--r-- | src/desktop.cpp | 75 | ||||
| -rw-r--r-- | src/desktop.h | 6 | ||||
| -rw-r--r-- | src/dialogs/clonetiler.cpp | 5 | ||||
| -rw-r--r-- | src/dialogs/export.cpp | 5 | ||||
| -rw-r--r-- | src/dialogs/find.cpp | 5 | ||||
| -rw-r--r-- | src/dialogs/spellcheck.cpp | 4 | ||||
| -rw-r--r-- | src/dialogs/xml-tree.cpp | 5 | ||||
| -rw-r--r-- | src/sp-namedview.cpp | 18 | ||||
| -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 | ||||
| -rw-r--r-- | src/ui/widget/dock-item.cpp | 51 | ||||
| -rw-r--r-- | src/ui/widget/dock-item.h | 13 | ||||
| -rw-r--r-- | src/ui/widget/dock.cpp | 4 | ||||
| -rw-r--r-- | src/ui/widget/imagetoggler.cpp | 11 | ||||
| -rw-r--r-- | src/widgets/desktop-widget.cpp | 4 |
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); |
