diff options
author | Tristan Van Berkom <tvb@src.gnome.org> | 2007-06-20 00:54:54 +0000 |
---|---|---|
committer | Tristan Van Berkom <tvb@src.gnome.org> | 2007-06-20 00:54:54 +0000 |
commit | 3a903cdd47666d1c66502af2a103c4d26a2d1809 (patch) | |
tree | 223188821bdcaec90c34b0440d613f21790e3381 | |
parent | 2365a039a7f78e8f5014328fc640463bc2d7e93a (diff) | |
download | glade-3a903cdd47666d1c66502af2a103c4d26a2d1809.tar.gz |
- Added Drag/Resize button in the toolbar
* src/glade-project-window.c:
- Added Drag/Resize button in the toolbar
* gladeui/glade-design-layout.c: More reliable pointer handling
* gladeui/glade-app.c: New pointer-mode property
* gladeui/glade-fixed.c, gladeui/glade-placeholder.c, gladeui/glade-palette.c:
Use pointer-mode to set pointer interaction mode
* gladeui/glade-builtins.c: Added trailing end marker on the stock list
enum paramspec.
svn path=/trunk/; revision=1368
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | gladeui/glade-app.c | 73 | ||||
-rw-r--r-- | gladeui/glade-app.h | 33 | ||||
-rw-r--r-- | gladeui/glade-builtins.c | 8 | ||||
-rw-r--r-- | gladeui/glade-builtins.h | 6 | ||||
-rw-r--r-- | gladeui/glade-design-layout.c | 15 | ||||
-rw-r--r-- | gladeui/glade-editor-property.c | 2 | ||||
-rw-r--r-- | gladeui/glade-fixed.c | 23 | ||||
-rw-r--r-- | gladeui/glade-palette-item.c | 2 | ||||
-rw-r--r-- | gladeui/glade-palette.c | 15 | ||||
-rw-r--r-- | gladeui/glade-placeholder.c | 10 | ||||
-rw-r--r-- | gladeui/glade-widget-adaptor.h | 5 | ||||
-rw-r--r-- | src/glade-project-window.c | 107 |
13 files changed, 257 insertions, 58 deletions
@@ -5,9 +5,21 @@ * gladeui/glade-project.[ch]: added glade_project_undo_items() and glade_project_redo_items(). - * src/glade-project-window.c: Made Undo/Redo buttons use a GtkMenuToolButton - and include undo/redo history in those buttons + * src/glade-project-window.c: + - Made Undo/Redo buttons use a GtkMenuToolButton and include + undo/redo history in those buttons + - Added Drag/Resize button in the toolbar + + * gladeui/glade-design-layout.c: More reliable pointer handling + * gladeui/glade-app.c: New pointer-mode property + + * gladeui/glade-fixed.c, gladeui/glade-placeholder.c, gladeui/glade-palette.c: + Use pointer-mode to set pointer interaction mode + + * gladeui/glade-builtins.c: Added trailing end marker on the stock list + enum paramspec. + 2007-06-18 Juan Pablo Ugarte <juanpablougarte@gmail.com> * bindings/python/glade-python-gwa.defs: deleted launch_editor wrapper. diff --git a/gladeui/glade-app.c b/gladeui/glade-app.c index c70ac3eb..c95d82ac 100644 --- a/gladeui/glade-app.c +++ b/gladeui/glade-app.c @@ -53,7 +53,8 @@ enum enum { PROP_0, - PROP_ACTIVE_PROJECT + PROP_ACTIVE_PROJECT, + PROP_POINTER_MODE }; struct _GladeAppPrivate @@ -78,6 +79,8 @@ struct _GladeAppPrivate */ GtkAccelGroup *accel_group; /* Default acceleration group for this app */ GList *undo_list, *redo_list; /* Lists of buttons to refresh in update-ui signal */ + + GladePointerMode pointer_mode; /* Current mode for the pointer in the workspace */ }; static guint glade_app_signals[LAST_SIGNAL] = { 0 }; @@ -97,6 +100,27 @@ static void glade_init_check (void); G_DEFINE_TYPE (GladeApp, glade_app, G_TYPE_OBJECT); +GType +glade_pointer_mode_get_type (void) +{ + static GType etype = 0; + + if (etype == 0) + { + static const GEnumValue values[] = + { + { GLADE_POINTER_SELECT, "select", "Select widgets" }, + { GLADE_POINTER_ADD_WIDGET, "add", "Add widgets" }, + { GLADE_POINTER_DRAG_RESIZE, "drag-resize", "Drag and resize widgets" }, + { 0, NULL, NULL } + }; + etype = g_enum_register_static ("GladePointerMode", + values); + } + return etype; +} + + /***************************************************************** * GObjectClass * *****************************************************************/ @@ -186,6 +210,9 @@ glade_app_set_property (GObject *object, case PROP_ACTIVE_PROJECT: glade_app_set_project (g_value_get_object (value)); break; + case PROP_POINTER_MODE: + glade_app_set_pointer_mode (g_value_get_enum (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -207,6 +234,9 @@ glade_app_get_property (GObject *object, case PROP_ACTIVE_PROJECT: g_value_set_object (value, app->priv->active_project); break; + case PROP_POINTER_MODE: + g_value_set_enum (value, app->priv->pointer_mode); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); break; @@ -516,6 +546,14 @@ glade_app_class_init (GladeAppClass * klass) _("The active project"), GLADE_TYPE_PROJECT, G_PARAM_READWRITE)); + g_object_class_install_property + (object_class, PROP_POINTER_MODE, + g_param_spec_enum + ("pointer-mode", _("Pointer Mode"), + _("Current mode for the pointer in the workspace"), + GLADE_TYPE_POINTER_MODE, + GLADE_POINTER_SELECT, + G_PARAM_READWRITE)); g_type_class_add_private (klass, sizeof (GladeAppPrivate)); } @@ -1071,6 +1109,39 @@ glade_app_set_project (GladeProject *project) g_object_notify (G_OBJECT (app), "active-project"); } + +/** + * glade_app_set_pointer_mode: + * @mode: A #GladePointerMode + * + * Sets the #GladePointerMode + */ +void +glade_app_set_pointer_mode (GladePointerMode mode) +{ + GladeApp *app = glade_app_get(); + + app->priv->pointer_mode = mode; + + g_object_notify (G_OBJECT (app), "pointer-mode"); +} + + +/** + * glade_app_get_pointer_mode: + * + * Gets the current #GladePointerMode + * + * Returns: The #GladePointerMode + */ +GladePointerMode +glade_app_get_pointer_mode (void) +{ + GladeApp *app = glade_app_get(); + + return app->priv->pointer_mode; +} + /** * glade_app_command_copy: * @app: A #GladeApp diff --git a/gladeui/glade-app.h b/gladeui/glade-app.h index 195ef42e..74b86791 100644 --- a/gladeui/glade-app.h +++ b/gladeui/glade-app.h @@ -37,9 +37,29 @@ G_BEGIN_DECLS #define GLADE_IS_APP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_APP)) #define GLADE_APP_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_APP, GladeAppClass)) -typedef struct _GladeApp GladeApp; -typedef struct _GladeAppPrivate GladeAppPrivate; -typedef struct _GladeAppClass GladeAppClass; +#define GLADE_TYPE_POINTER_MODE (glade_pointer_mode_get_type()) + +typedef struct _GladeApp GladeApp; +typedef struct _GladeAppPrivate GladeAppPrivate; +typedef struct _GladeAppClass GladeAppClass; +typedef enum _GladePointerMode GladePointerMode; + + +/** + * GladePointerMode: + * @GLADE_POINTER_SELECT: Mouse pointer used for selecting widgets + * @GLADE_POINTER_ADD_WIDGET: Mouse pointer used for adding widgets + * @GLADE_POINTER_DRAG_RESIZE: Mouse pointer used for dragging and + * resizing widgets in containers + * + * Indicates what the pointer is used for in the workspace. + */ +enum _GladePointerMode +{ + GLADE_POINTER_SELECT = 0, + GLADE_POINTER_ADD_WIDGET, + GLADE_POINTER_DRAG_RESIZE +}; struct _GladeApp { @@ -68,6 +88,8 @@ struct _GladeAppClass GType glade_app_get_type (void) G_GNUC_CONST; +GType glade_pointer_mode_get_type (void) G_GNUC_CONST; + GladeApp* glade_app_get (void); void glade_app_update_ui (void); @@ -88,11 +110,14 @@ GladeClipboard* glade_app_get_clipboard (void); GtkWidget* glade_app_get_clipboard_view (void); - GladeProject* glade_app_get_project (void); void glade_app_set_project (GladeProject *project); + +GladePointerMode glade_app_get_pointer_mode (void); +void glade_app_set_pointer_mode (GladePointerMode mode); + void glade_app_add_project (GladeProject *project); void glade_app_remove_project (GladeProject *project); diff --git a/gladeui/glade-builtins.c b/gladeui/glade-builtins.c index 4ac78252..eafdfe81 100644 --- a/gladeui/glade-builtins.c +++ b/gladeui/glade-builtins.c @@ -100,7 +100,7 @@ list_stock_items (gboolean include_images) stock_list = g_slist_reverse (gtk_stock_list_ids ()); values = g_array_sized_new (TRUE, TRUE, sizeof (GEnumValue), - g_slist_length (stock_list) + 1); + g_slist_length (stock_list) + 2); /* Add first "no stock" element */ @@ -144,6 +144,12 @@ list_stock_items (gboolean include_images) } } + + /* Add the trailing end marker */ + value.value = 0; + value.value_name = NULL; + value.value_nick = NULL; + values = g_array_append_val (values, value); stock_prefixs_done = TRUE; g_slist_free (stock_list); diff --git a/gladeui/glade-builtins.h b/gladeui/glade-builtins.h index ea67c593..378824d8 100644 --- a/gladeui/glade-builtins.h +++ b/gladeui/glade-builtins.h @@ -9,8 +9,9 @@ G_BEGIN_DECLS typedef struct _GladeParamSpecObjects GladeParamSpecObjects; typedef struct _GladeParamSpecAccel GladeParamSpecAccel; - typedef struct _GladeKey GladeKey; + + struct _GladeKey { guint value; gchar *name; @@ -29,7 +30,7 @@ extern const GladeKey GladeKeys[]; #define GLADE_TYPE_ACCEL_GLIST (glade_accel_glist_get_type()) #define GLADE_TYPE_PARAM_OBJECTS (glade_param_objects_get_type()) #define GLADE_TYPE_PARAM_ACCEL (glade_param_accel_get_type()) -#define GLADE_ITEM_APPEARANCE_TYPE (glade_item_appearance_get_type()) +#define GLADE_TYPE_ITEM_APPEARANCE (glade_item_appearance_get_type()) #define GLADE_IS_STOCK(pspec) \ (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), GLADE_TYPE_STOCK)) @@ -59,7 +60,6 @@ GType glade_param_objects_get_type (void) G_GNUC_CONST; GType glade_param_accel_get_type (void) G_GNUC_CONST; GType glade_item_appearance_get_type (void) G_GNUC_CONST; - guint glade_builtin_key_from_string (const gchar *string); const gchar *glade_builtin_string_from_key (guint key); diff --git a/gladeui/glade-design-layout.c b/gladeui/glade-design-layout.c index a34e100e..500bc2c2 100644 --- a/gladeui/glade-design-layout.c +++ b/gladeui/glade-design-layout.c @@ -338,13 +338,7 @@ glade_design_layout_motion_notify_event (GtkWidget *widget, GdkEventMotion *ev) priv = GLADE_DESIGN_LAYOUT_GET_PRIVATE (widget); - if (((GdkEventMotion *)ev)->is_hint) - gdk_window_get_pointer (priv->event_window, &x, &y, NULL); - else - { - x = (gint) ((GdkEventMotion *)ev)->x; - y = (gint) ((GdkEventMotion *)ev)->y; - } + gdk_window_get_pointer (priv->event_window, &x, &y, NULL); child_glade_widget = glade_widget_get_from_gobject (child); allocation = child->allocation; @@ -425,10 +419,9 @@ glade_design_layout_button_press_event (GtkWidget *widget, GdkEventButton *ev) if ((child = GTK_BIN (widget)->child) == NULL) return FALSE; - x = (gint) ((GdkEventButton *) ev)->x; - y = (gint) ((GdkEventButton *) ev)->y; - - priv = GLADE_DESIGN_LAYOUT_GET_PRIVATE (widget); + priv = GLADE_DESIGN_LAYOUT_GET_PRIVATE (widget); + + gdk_window_get_pointer (priv->event_window, &x, &y, NULL); region = glade_design_layout_get_pointer_region (GLADE_DESIGN_LAYOUT (widget), x, y); if (((GdkEventButton *) ev)->button == 1) diff --git a/gladeui/glade-editor-property.c b/gladeui/glade-editor-property.c index d98de0af..ca778161 100644 --- a/gladeui/glade-editor-property.c +++ b/gladeui/glade-editor-property.c @@ -197,7 +197,7 @@ glade_editor_property_sensitivity_cb (GladeProperty *property, gtk_widget_set_sensitive (eprop->check, sensitive); } -void +static void glade_editor_property_value_changed_cb (GladeProperty *property, GValue *old_value, GValue *value, diff --git a/gladeui/glade-fixed.c b/gladeui/glade-fixed.c index abcf7f13..ff4d1387 100644 --- a/gladeui/glade-fixed.c +++ b/gladeui/glade-fixed.c @@ -511,6 +511,7 @@ glade_fixed_handle_child_event (GladeFixed *fixed, { GladeCursorType operation; GdkModifierType event_state = 0; + GladePointerMode pointer_mode; GtkWidget *fixed_widget, *child_widget; gint fixed_x, fixed_y, child_x, child_y; gboolean handled = FALSE, sig_handled; @@ -518,6 +519,8 @@ glade_fixed_handle_child_event (GladeFixed *fixed, fixed_widget = GTK_WIDGET (GLADE_WIDGET (fixed)->object); child_widget = GTK_WIDGET (child->object); + pointer_mode = glade_app_get_pointer_mode (); + /* when widget->window points to a parent window, these calculations * would be wrong if we based them on the GTK_WIDGET (fixed)->window, * so we must always consult the event widget's window @@ -545,10 +548,11 @@ glade_fixed_handle_child_event (GladeFixed *fixed, case GDK_MOTION_NOTIFY: if (fixed->configuring == NULL) { - if (event_state & GDK_SHIFT_MASK) + if ((event_state & GDK_SHIFT_MASK) || + pointer_mode == GLADE_POINTER_DRAG_RESIZE) glade_cursor_set (((GdkEventAny *)event)->window, operation); - else + else if (pointer_mode == GLADE_POINTER_SELECT) glade_cursor_set (((GdkEventAny *)event)->window, GLADE_CURSOR_SELECTOR); @@ -578,7 +582,9 @@ glade_fixed_handle_child_event (GladeFixed *fixed, /* We cant rely on GDK_BUTTON1_MASK since event->state isnt yet updated * by the current event itself */ - if (((GdkEventButton *)event)->button == 1 && (event_state & GDK_SHIFT_MASK)) + if (((GdkEventButton *)event)->button == 1 && + ((event_state & GDK_SHIFT_MASK) || + pointer_mode == GLADE_POINTER_DRAG_RESIZE)) { fixed->configuring = child; /* Save widget allocation and pointer pos */ @@ -598,7 +604,8 @@ glade_fixed_handle_child_event (GladeFixed *fixed, if (((GdkEventButton *)event)->button == 1 && fixed->configuring) { - if (event_state & GDK_SHIFT_MASK) + if ((event_state & GDK_SHIFT_MASK) || + pointer_mode == GLADE_POINTER_DRAG_RESIZE) glade_cursor_set (((GdkEventAny *)event)->window, operation); else @@ -639,7 +646,7 @@ glade_fixed_child_event (GladeWidget *gwidget, * the palette. */ if (GLADE_IS_FIXED (gwidget) && - glade_palette_get_current_item (glade_app_get_palette ()) != NULL) + glade_app_get_pointer_mode() == GLADE_POINTER_ADD_WIDGET) { glade_cursor_set (((GdkEventAny *)event)->window, GLADE_CURSOR_ADD_WIDGET); @@ -804,15 +811,15 @@ glade_fixed_event (GladeWidget *gwidget_fixed, } break; case GDK_MOTION_NOTIFY: - if (adaptor != NULL) + if (glade_app_get_pointer_mode() == GLADE_POINTER_ADD_WIDGET) { glade_cursor_set (((GdkEventAny *)event)->window, GLADE_CURSOR_ADD_WIDGET); handled = TRUE; } - /* XXX I dont think this line is needed */ - else if (GLADE_IS_FIXED (gwidget_fixed->parent) == FALSE) + else if (GLADE_IS_FIXED (gwidget_fixed->parent) == FALSE && + glade_app_get_pointer_mode() == GLADE_POINTER_SELECT) glade_cursor_set (((GdkEventAny *)event)->window, GLADE_CURSOR_SELECTOR); break; diff --git a/gladeui/glade-palette-item.c b/gladeui/glade-palette-item.c index 51172e8c..420f1697 100644 --- a/gladeui/glade-palette-item.c +++ b/gladeui/glade-palette-item.c @@ -281,7 +281,7 @@ glade_palette_item_class_init (GladePaletteItemClass *klass) g_param_spec_enum ("appearance", "Appearance", "The appearance of the item", - GLADE_ITEM_APPEARANCE_TYPE, + GLADE_TYPE_ITEM_APPEARANCE, GLADE_ITEM_ICON_ONLY, G_PARAM_READWRITE)); diff --git a/gladeui/glade-palette.c b/gladeui/glade-palette.c index a74f36a6..6dc1ffab 100644 --- a/gladeui/glade-palette.c +++ b/gladeui/glade-palette.c @@ -358,7 +358,7 @@ glade_palette_class_init (GladePaletteClass *klass) g_param_spec_enum ("item-appearance", "Item Appearance", "The appearance of the palette items", - GLADE_ITEM_APPEARANCE_TYPE, + GLADE_TYPE_ITEM_APPEARANCE, GLADE_ITEM_ICON_ONLY, G_PARAM_READWRITE)); @@ -410,6 +410,10 @@ glade_palette_on_button_toggled (GtkWidget *button, GladePalette *palette) if (priv->current_item == GLADE_PALETTE_ITEM (button)) { priv->current_item = NULL; + g_object_notify (G_OBJECT (palette), "current-item"); + + glade_app_set_pointer_mode (GLADE_POINTER_SELECT); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->selector_button), TRUE); priv->sticky_selection_mode = FALSE; @@ -427,6 +431,10 @@ glade_palette_on_button_toggled (GtkWidget *button, GladePalette *palette) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->current_item), FALSE); priv->current_item = GLADE_PALETTE_ITEM (button); + g_object_notify (G_OBJECT (palette), "current-item"); + + glade_app_set_pointer_mode (GLADE_POINTER_ADD_WIDGET); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->selector_button), FALSE); /* check whether to enable sticky selection */ @@ -434,7 +442,6 @@ glade_palette_on_button_toggled (GtkWidget *button, GladePalette *palette) gdk_window_get_pointer (button->window, NULL, NULL, &mask); priv->sticky_selection_mode = (!GWA_IS_TOPLEVEL (adaptor)) && (mask & GDK_CONTROL_MASK); - g_signal_emit (G_OBJECT (palette), glade_palette_signals[TOGGLED], 0); } @@ -722,8 +729,12 @@ glade_palette_deselect_current_item (GladePalette *palette, gboolean sticky_awar gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (palette->priv->selector_button), TRUE); palette->priv->current_item = NULL; + g_object_notify (G_OBJECT (palette), "current-item"); + + glade_app_set_pointer_mode (GLADE_POINTER_SELECT); g_signal_emit (G_OBJECT (palette), glade_palette_signals[TOGGLED], 0); + } } diff --git a/gladeui/glade-placeholder.c b/gladeui/glade-placeholder.c index 0bf5c3b5..2ca84444 100644 --- a/gladeui/glade-placeholder.c +++ b/gladeui/glade-placeholder.c @@ -309,24 +309,24 @@ glade_placeholder_expose (GtkWidget *widget, GdkEventExpose *event) static gboolean glade_placeholder_motion_notify_event (GtkWidget *widget, GdkEventMotion *event) { - GladeWidgetAdaptor *adaptor; + GladePointerMode pointer_mode; GladeWidget *gparent; g_return_val_if_fail (GLADE_IS_PLACEHOLDER (widget), FALSE); gparent = glade_placeholder_get_parent (GLADE_PLACEHOLDER (widget)); - adaptor = glade_palette_get_current_item (glade_app_get_palette ()); + pointer_mode = glade_app_get_pointer_mode (); - if (adaptor == NULL && + if (pointer_mode == GLADE_POINTER_SELECT && /* If we are the child of a widget that is in a GladeFixed, then * we are the means of drag/resize and we dont want to fight for * the cursor (ideally; GladeCursor should somehow deal with such * concurrencies I suppose). */ (gparent->parent && - GLADE_IS_FIXED (gparent->parent)) == FALSE) + GLADE_IS_FIXED (gparent->parent)) == FALSE) glade_cursor_set (event->window, GLADE_CURSOR_SELECTOR); - else if (adaptor) + else if (pointer_mode == GLADE_POINTER_ADD_WIDGET) glade_cursor_set (event->window, GLADE_CURSOR_ADD_WIDGET); return FALSE; diff --git a/gladeui/glade-widget-adaptor.h b/gladeui/glade-widget-adaptor.h index 6528f2fa..1194e05d 100644 --- a/gladeui/glade-widget-adaptor.h +++ b/gladeui/glade-widget-adaptor.h @@ -26,6 +26,7 @@ typedef struct _GladeWidgetAdaptor GladeWidgetAdaptor; typedef struct _GladeWidgetAdaptorPrivate GladeWidgetAdaptorPrivate; typedef struct _GladeWidgetAdaptorClass GladeWidgetAdaptorClass; typedef struct _GladeSignalClass GladeSignalClass; +typedef enum _GladeCreateReason GladeCreateReason; /** * GWA_IS_FIXED: @@ -121,14 +122,14 @@ typedef struct _GladeSignalClass GladeSignalClass; * * These are the reasons your #GladePostCreateFunc can be called. */ -typedef enum _GladeCreateReason +enum _GladeCreateReason { GLADE_CREATE_USER = 0, GLADE_CREATE_COPY, GLADE_CREATE_LOAD, GLADE_CREATE_REBUILD, GLADE_CREATE_REASONS -} GladeCreateReason; +}; #define GLADE_CREATE_REASON (glade_create_reason_get_type()) diff --git a/src/glade-project-window.c b/src/glade-project-window.c index 507f2b26..79846ab0 100644 --- a/src/glade-project-window.c +++ b/src/glade-project-window.c @@ -79,6 +79,8 @@ struct _GladeProjectWindowPrivate gchar *default_path; /* the default path for open/save operations */ GtkToggleToolButton *selector_button; /* the widget selector button (replaces the one in the palette) */ + GtkToggleToolButton *drag_resize_button; /* sets the pointer to drag/resize mode */ + gboolean setting_pointer_mode; /* avoid feedback signal loops */ GtkToolItem *undo; /* customized buttons for undo/redo with history */ GtkToolItem *redo; @@ -710,22 +712,52 @@ gpw_construct_dock_item (GladeProjectWindow *gpw, const gchar *title, GtkWidget return vbox; } -void -on_palette_toggled (GladePalette *palette, GladeProjectWindow *gpw) +static void +on_selector_button_toggled (GtkToggleToolButton *button, GladeProjectWindow *gpw) { - if (glade_palette_get_current_item (palette)) - gtk_toggle_tool_button_set_active (gpw->priv->selector_button, FALSE); + if (gpw->priv->setting_pointer_mode) + return; + + if (gtk_toggle_tool_button_get_active (gpw->priv->selector_button)) + { + glade_palette_deselect_current_item (glade_app_get_palette(), FALSE); + glade_app_set_pointer_mode (GLADE_POINTER_SELECT); + } else - gtk_toggle_tool_button_set_active (gpw->priv->selector_button, TRUE); + gtk_toggle_tool_button_set_active (gpw->priv->selector_button, TRUE); } -void -on_selector_button_toggled (GtkToggleToolButton *button, GladeProjectWindow *gpw) +static void +on_drag_resize_button_toggled (GtkToggleToolButton *button, GladeProjectWindow *gpw) { - if (gtk_toggle_tool_button_get_active (gpw->priv->selector_button)) - glade_palette_deselect_current_item (glade_app_get_palette(), FALSE); - else if (glade_palette_get_current_item (glade_app_get_palette()) == FALSE) + if (gpw->priv->setting_pointer_mode) + return; + + if (gtk_toggle_tool_button_get_active (gpw->priv->drag_resize_button)) + glade_app_set_pointer_mode (GLADE_POINTER_DRAG_RESIZE); + else + gtk_toggle_tool_button_set_active (gpw->priv->drag_resize_button, TRUE); + +} + +static void +on_pointer_mode_changed (GladeApp *app, + GParamSpec *pspec, + GladeProjectWindow *gpw) +{ + gpw->priv->setting_pointer_mode = TRUE; + + if (glade_app_get_pointer_mode () == GLADE_POINTER_SELECT) gtk_toggle_tool_button_set_active (gpw->priv->selector_button, TRUE); + else + gtk_toggle_tool_button_set_active (gpw->priv->selector_button, FALSE); + + if (glade_app_get_pointer_mode () == GLADE_POINTER_DRAG_RESIZE) + gtk_toggle_tool_button_set_active (gpw->priv->drag_resize_button, TRUE); + else + gtk_toggle_tool_button_set_active (gpw->priv->drag_resize_button, FALSE); + + gpw->priv->setting_pointer_mode = FALSE; } static void @@ -2119,6 +2151,35 @@ create_selector_tool_button (GtkToolbar *toolbar) return GTK_WIDGET (button); } +static GtkWidget * +create_drag_resize_tool_button (GtkToolbar *toolbar) +{ + GtkToolItem *button; + GtkWidget *image; + gchar *image_path; + + image_path = g_build_filename (glade_app_get_pixmaps_dir (), "selector.png", NULL); + image = gtk_image_new_from_file (image_path); + g_free (image_path); + + button = gtk_toggle_tool_button_new (); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (button), TRUE); + + gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (button), image); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (button), _("Drag Resize")); + + gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (button), + toolbar->tooltips, + _("Drag and resize widgets in the workspace"), + NULL); + + gtk_widget_show (GTK_WIDGET (button)); + gtk_widget_show (image); + + return GTK_WIDGET (button); +} + + static gint gpw_hijack_editor_key_press (GtkWidget *win, GdkEventKey *event, @@ -2272,19 +2333,31 @@ glade_project_window_create (GladeProjectWindow *gpw) widget = gtk_ui_manager_get_widget (gpw->priv->ui, "/MenuBar/FileMenu/OpenRecent"); gtk_menu_item_set_submenu (GTK_MENU_ITEM (widget), gpw->priv->recent_menu); - /* palette selector button */ - gpw->priv->selector_button = GTK_TOGGLE_TOOL_BUTTON (create_selector_tool_button (GTK_TOOLBAR (toolbar))); - + /* palette selector & drag/resize buttons */ sep = gtk_separator_tool_item_new(); gtk_widget_show (GTK_WIDGET (sep)); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), GTK_TOOL_ITEM (sep), -1); + + gpw->priv->selector_button = + GTK_TOGGLE_TOOL_BUTTON (create_selector_tool_button (GTK_TOOLBAR (toolbar))); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), + GTK_TOOL_ITEM (gpw->priv->selector_button), -1); + + gpw->priv->drag_resize_button = + GTK_TOGGLE_TOOL_BUTTON (create_drag_resize_tool_button + (GTK_TOOLBAR (toolbar))); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), + GTK_TOOL_ITEM (gpw->priv->drag_resize_button), -1); - gtk_toolbar_insert (GTK_TOOLBAR (toolbar), GTK_TOOL_ITEM (gpw->priv->selector_button), -1); - - g_signal_connect (G_OBJECT (glade_app_get_palette ()), "toggled", - G_CALLBACK (on_palette_toggled), gpw); + gtk_toggle_tool_button_set_active (gpw->priv->selector_button, TRUE); + gtk_toggle_tool_button_set_active (gpw->priv->drag_resize_button, FALSE); + g_signal_connect (G_OBJECT (gpw->priv->selector_button), "toggled", G_CALLBACK (on_selector_button_toggled), gpw); + g_signal_connect (G_OBJECT (gpw->priv->drag_resize_button), "toggled", + G_CALLBACK (on_drag_resize_button_toggled), gpw); + g_signal_connect (G_OBJECT (glade_app_get()), "notify::pointer-mode", + G_CALLBACK (on_pointer_mode_changed), gpw); /* support for opening a file by dragging onto the project window */ |