index 1e232cb4e8acc4c0dd78db574d7e2461871cf747..026eac8e08b3b751a72108aa7aac6d85bc696ad1 100644 (file)
* Released under GNU GPL. Read the file 'COPYING' for more information.
*/
+#include <gtk/gtk.h>
+#include <gtkmm.h>
+
#include "dock-item.h"
#include "desktop.h"
#include "inkscape.h"
+#include "preferences.h"
#include "ui/widget/dock.h"
#include "widgets/icon.h"
-#include <gtk/gtk.h>
-
-#include <gtkmm/invisible.h>
-#include <gtkmm/stock.h>
-
namespace Inkscape {
namespace UI {
namespace Widget {
DockItem::DockItem(Dock& dock, const Glib::ustring& name, const Glib::ustring& long_name,
const Glib::ustring& icon_name, State state) :
- _dock (dock),
- _prev_state (state),
- _window (NULL),
- _dock_item_action_area (NULL)
-{
- /* Add a "signal_response" signal to the GdlDockItem, make sure it is
- * only done once for the class.
- */
- static guint response_signal = 0;
-
- if (response_signal == 0) {
- response_signal = g_signal_new ("signal_response",
- GDL_TYPE_DOCK_ITEM,
- G_SIGNAL_RUN_FIRST,
- 0,
- NULL, NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE, 1, G_TYPE_INT);
- }
-
+ _dock(dock),
+ _prev_state(state),
+ _prev_position(0),
+ _window(0),
+ _x(0),
+ _y(0),
+ _grab_focus_on_realize(false),
+ _gdl_dock_item(0),
+ _dock_item_action_area(0)
+{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ GdlDockItemBehavior gdl_dock_behavior =
+ (prefs->getBool("/options/dock/cancenterdock", true) ?
+ GDL_DOCK_ITEM_BEH_NORMAL :
+ GDL_DOCK_ITEM_BEH_CANT_DOCK_CENTER);
if (!icon_name.empty()) {
- Gtk::Widget *icon = sp_icon_get_icon(icon_name, Inkscape::ICON_SIZE_MENU);
- if (icon) {
- // check icon type (inkscape, gtk, none)
- if ( SP_IS_ICON(icon->gobj()) ) {
- SPIcon* sp_icon = SP_ICON(icon->gobj());
- sp_icon_fetch_pixbuf(sp_icon);
- _icon_pixbuf = Glib::wrap(sp_icon->pb, true);
- } else if ( GTK_IS_IMAGE(icon->gobj()) ) {
- _icon_pixbuf = Gtk::Invisible().render_icon(Gtk::StockID(icon_name),
- Gtk::ICON_SIZE_MENU);
- }
- delete icon;
-
- _gdl_dock_item =
- gdl_dock_item_new_with_pixbuf_icon(name.c_str(), long_name.c_str(), _icon_pixbuf->gobj(),
- GDL_DOCK_ITEM_BEH_NORMAL);
- }
+ int width = 0, height = 0;
+ Gtk::IconSize::lookup(Gtk::ICON_SIZE_MENU, width, height);
+ _icon_pixbuf = Gtk::IconTheme::get_default()->load_icon(icon_name, width, (Gtk::IconLookupFlags) 0);
+ _gdl_dock_item =
+ gdl_dock_item_new_with_pixbuf_icon(name.c_str(), long_name.c_str(),
+ _icon_pixbuf->gobj(), gdl_dock_behavior);
} else {
- _gdl_dock_item =
- gdl_dock_item_new(name.c_str(), long_name.c_str(), GDL_DOCK_ITEM_BEH_NORMAL);
+ _gdl_dock_item =
+ gdl_dock_item_new(name.c_str(), long_name.c_str(), gdl_dock_behavior);
}
_frame.set_shadow_type(Gtk::SHADOW_IN);
signal_show().connect(sigc::mem_fun(*this, &Inkscape::UI::Widget::DockItem::_onShow), false);
signal_state_changed().connect(sigc::mem_fun(*this, &Inkscape::UI::Widget::DockItem::_onStateChanged));
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));
}
+void
+DockItem::get_position(int& x, int& y)
+{
+ if (getWindow()) {
+ getWindow()->get_position(x, y);
+ } else {
+ x = _x;
+ y = _y;
+ }
+}
+
+void
+DockItem::get_size(int& width, int& height)
+{
+ if (_window) {
+ _window->get_size(width, height);
+ } else {
+ width = get_vbox()->get_width();
+ height = get_vbox()->get_height();
+ }
+}
+
+
+void
+DockItem::resize(int width, int height)
+{
+ if (_window)
+ _window->resize(width, height);
+}
+
+
+void
+DockItem::move(int x, int y)
+{
+ if (_window)
+ _window->move(x, y);
+}
+
+void
+DockItem::set_position(Gtk::WindowPosition position)
+{
+ if (_window)
+ _window->set_position(position);
+}
+
+void
+DockItem::set_size_request(int width, int height)
+{
+ getWidget().set_size_request(width, height);
+}
+
+void
+DockItem::size_request(Gtk::Requisition& requisition)
+{
+ getWidget().size_request(requisition);
+}
+
+void
+DockItem::set_title(Glib::ustring title)
+{
+ g_object_set (_gdl_dock_item,
+ "long-name", title.c_str(),
+ NULL);
+
+ gdl_dock_item_set_tablabel(GDL_DOCK_ITEM(_gdl_dock_item),
+ gtk_label_new (title.c_str()));
+}
+
bool
DockItem::isAttached() const
{
bool
DockItem::isFloating() const
{
- gboolean floating = FALSE;
- if (GDL_IS_DOCK (gdl_dock_object_get_parent_object (GDL_DOCK_OBJECT (_gdl_dock_item)))) {
- GdlDock* dock = GDL_DOCK (gdl_dock_object_get_parent_object (GDL_DOCK_OBJECT (_gdl_dock_item)));
- g_object_get (dock,
- "floating", &floating,
- NULL);
- }
- return floating;
+ return (GTK_WIDGET(gdl_dock_object_get_toplevel(GDL_DOCK_OBJECT (_gdl_dock_item))) !=
+ _dock.getGdlWidget());
}
bool
return (Placement)placement;
}
-
-void
-DockItem::addButton(Gtk::Button* button, int response_id)
-{
- // Create a button box for the response buttons if it's the first button to be added
- if (!_dock_item_action_area) {
- _dock_item_action_area = new Gtk::HButtonBox(Gtk::BUTTONBOX_END, 6);
- _dock_item_box.pack_end(*_dock_item_action_area, Gtk::PACK_SHRINK, 0);
- _dock_item_action_area->set_border_width(6);
- }
-
- _dock_item_action_area->pack_start(*button);
-}
-
void
DockItem::hide()
{
void
DockItem::present()
{
- // iconified
- if (isIconified()) {
+
+ if (isIconified() || !isAttached()) {
show();
- return;
- }
-
- // unattached
- if (!isAttached()) {
- gdl_dock_item_show_item (GDL_DOCK_ITEM(_gdl_dock_item));
- return;
}
// tabbed
- if (getPlacement() == CENTER) {
+ else if (getPlacement() == CENTER) {
int i = gtk_notebook_page_num (GTK_NOTEBOOK (_gdl_dock_item->parent),
GTK_WIDGET (_gdl_dock_item));
if (i >= 0)
gtk_notebook_set_current_page (GTK_NOTEBOOK (_gdl_dock_item->parent), i);
- return;
- }
-
- // we're already present, do nothing
-}
-
-
-void
-DockItem::get_position(int& x, int& y)
-{
- if (_getWindow()) {
- _getWindow()->get_position(x, y);
- } else {
- x = _x;
- y = _y;
}
-}
-void
-DockItem::get_size(int& width, int& height)
-{
- if (_window) {
- _window->get_size(width, height);
- } else {
- width = get_vbox()->get_width();
- height = get_vbox()->get_height();
- }
-}
+ // always grab focus, even if we're already present
+ grab_focus();
-
-void
-DockItem::resize(int width, int height)
-{
- if (_window)
- _window->resize(width, height);
+ if (!isFloating() && getWidget().is_realized())
+ _dock.scrollToItem(*this);
}
void
-DockItem::move(int x, int y)
+DockItem::grab_focus()
{
- if (_window)
- _window->move(x, y);
-}
+ if (GTK_WIDGET_REALIZED (_gdl_dock_item)) {
-void
-DockItem::set_position(Gtk::WindowPosition position)
-{
- if (_window)
- _window->set_position(position);
-}
+ // make sure the window we're in is present
+ Gtk::Widget *toplevel = getWidget().get_toplevel();
+ if (Gtk::Window *window = dynamic_cast<Gtk::Window *>(toplevel)) {
+ window->present();
+ }
-void
-DockItem::set_size_request(int width, int height)
-{
- getWidget().set_size_request(width, height);
-}
+ gtk_widget_grab_focus (_gdl_dock_item);
-void
-DockItem::size_request(Gtk::Requisition& requisition)
-{
- getWidget().size_request(requisition);
+ } else {
+ _grab_focus_on_realize = true;
+ }
}
-void
-DockItem::set_title(Glib::ustring title)
-{
- g_object_set (_gdl_dock_item,
- "long-name", title.c_str(),
- NULL);
-
- gdl_dock_item_set_tablabel(GDL_DOCK_ITEM(_gdl_dock_item),
- gtk_label_new (title.c_str()));
-}
-
/* Signal wrappers */
Glib::SignalProxy0<void>
DockItem::signal_show()
-{
- return Glib::SignalProxy0<void>(Glib::wrap(GTK_WIDGET(_gdl_dock_item)),
+{
+ return Glib::SignalProxy0<void>(Glib::wrap(GTK_WIDGET(_gdl_dock_item)),
&_signal_show_proxy);
}
Glib::SignalProxy0<void>
DockItem::signal_hide()
-{
- return Glib::SignalProxy0<void>(Glib::wrap(GTK_WIDGET(_gdl_dock_item)),
+{
+ return Glib::SignalProxy0<void>(Glib::wrap(GTK_WIDGET(_gdl_dock_item)),
&_signal_hide_proxy);
}
&_signal_delete_event_proxy);
}
-Glib::SignalProxy1<void, int>
-DockItem::signal_response()
-{
- return Glib::SignalProxy1<void, int>(Glib::wrap(GTK_WIDGET(_gdl_dock_item)),
- &_signal_response_proxy);
-}
-
Glib::SignalProxy0<void>
DockItem::signal_drag_begin()
{
&_signal_drag_end_proxy);
}
+Glib::SignalProxy0<void>
+DockItem::signal_realize()
+{
+ return Glib::SignalProxy0<void>(Glib::wrap(GTK_WIDGET(_gdl_dock_item)),
+ &_signal_realize_proxy);
+}
+
sigc::signal<void, DockItem::State, DockItem::State>
DockItem::signal_state_changed()
{
_prev_state = state;
}
+void
+DockItem::_onRealize()
+{
+ if (_grab_focus_on_realize) {
+ _grab_focus_on_realize = false;
+ grab_focus();
+ }
+}
+
bool
DockItem::_onKeyPress(GdkEventKey *event)
{
}
void
-DockItem::_onStateChanged(State prev_state, State new_state)
+DockItem::_onStateChanged(State /*prev_state*/, State new_state)
{
- _window = _getWindow();
+ _window = getWindow();
- if (new_state == FLOATING_STATE) {
+ if (new_state == FLOATING_STATE && _window) {
_window->signal_hide().connect(sigc::mem_fun(*this, &Inkscape::UI::Widget::DockItem::_onHideWindow));
- _signal_key_press_event_connection =
+ _signal_key_press_event_connection =
_window->signal_key_press_event().connect(sigc::mem_fun(*this, &Inkscape::UI::Widget::DockItem::_onKeyPress));
}
}
bool
-DockItem::_onDeleteEvent(GdkEventAny *event)
+DockItem::_onDeleteEvent(GdkEventAny */*event*/)
{
hide();
return false;
Gtk::Window *
-DockItem::_getWindow()
+DockItem::getWindow()
{
g_return_val_if_fail(_gdl_dock_item, 0);
Gtk::Container *parent = getWidget().get_parent();
}
const Glib::SignalProxyInfo
-DockItem::_signal_show_proxy =
+DockItem::_signal_show_proxy =
{
"show",
(GCallback) &Glib::SignalProxyNormal::slot0_void_callback,
};
const Glib::SignalProxyInfo
-DockItem::_signal_hide_proxy =
+DockItem::_signal_hide_proxy =
{
"hide",
(GCallback) &Glib::SignalProxyNormal::slot0_void_callback,
const Glib::SignalProxyInfo
-DockItem::_signal_delete_event_proxy =
+DockItem::_signal_delete_event_proxy =
{
"delete_event",
(GCallback) &_signal_delete_event_callback,
const Glib::SignalProxyInfo
-DockItem::_signal_response_proxy =
-{
- "signal_response",
- (GCallback) &_signal_response_callback,
- (GCallback) &_signal_response_callback
-};
-
-const Glib::SignalProxyInfo
-DockItem::_signal_drag_begin_proxy =
+DockItem::_signal_drag_begin_proxy =
{
"dock-drag-begin",
(GCallback) &Glib::SignalProxyNormal::slot0_void_callback,
const Glib::SignalProxyInfo
-DockItem::_signal_drag_end_proxy =
+DockItem::_signal_drag_end_proxy =
{
"dock_drag_end",
(GCallback) &_signal_drag_end_callback,
};
+const Glib::SignalProxyInfo
+DockItem::_signal_realize_proxy =
+{
+ "realize",
+ (GCallback) &Glib::SignalProxyNormal::slot0_void_callback,
+ (GCallback) &Glib::SignalProxyNormal::slot0_void_callback
+};
+
+
gboolean
DockItem::_signal_delete_event_callback(GtkWidget *self, GdkEventAny *event, void *data)
{
@@ -490,23 +478,7 @@ DockItem::_signal_delete_event_callback(GtkWidget *self, GdkEventAny *event, voi
return RType();
}
-void
-DockItem::_signal_response_callback(GtkWidget *self, gint response_id, void *data)
-{
- using namespace Gtk;
- typedef sigc::slot<void, int> SlotType;
-
- if (Glib::ObjectBase::_get_current_wrapper((GObject *) self)) {
- try {
- if(sigc::slot_base *const slot = Glib::SignalProxyNormal::data_to_slot(data))
- (*static_cast<SlotType *>(slot))(response_id);
- } catch(...) {
- Glib::exception_handlers_invoke();
- }
- }
-}
-
-void
+void
DockItem::_signal_drag_end_callback(GtkWidget *self, gboolean cancelled, void *data)
{
using namespace Gtk;
@@ -536,4 +508,4 @@ DockItem::_signal_drag_end_callback(GtkWidget *self, gboolean cancelled, void *d
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :