[gimp] app: Resurrect "You can drop dockable dialogs here"
- From: Martin Nordholts <martinn src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: Resurrect "You can drop dockable dialogs here"
- Date: Tue, 16 Aug 2011 20:34:05 +0000 (UTC)
commit c0208e70c00c9199197b9fb5cae2c4b8eea616f5
Author: Martin Nordholts <martinn src gnome org>
Date: Tue Aug 16 22:17:25 2011 +0200
app: Resurrect "You can drop dockable dialogs here"
Resurrect the help string "You can drop dockable dialogs here" inside
GimpPanedBox. It got killed when we removed GimpDockSeparator.
NEWS | 2 +
app/widgets/gimppanedbox.c | 147 ++++++++++++++++++++++++++++++++++----------
2 files changed, 116 insertions(+), 33 deletions(-)
---
diff --git a/NEWS b/NEWS
index 940b22d..6e68a97 100644
--- a/NEWS
+++ b/NEWS
@@ -39,6 +39,8 @@ UI:
regression, and add the same guides options as in the rectangle tools
- Don't unmaximize the single-window mode image window when closing
images
+ - Resurrect the "You can drop dockable dialogs here" help string
+ below the toolbox
Core:
diff --git a/app/widgets/gimppanedbox.c b/app/widgets/gimppanedbox.c
index f183a94..532f128 100644
--- a/app/widgets/gimppanedbox.c
+++ b/app/widgets/gimppanedbox.c
@@ -3,7 +3,7 @@
*
* gimppanedbox.c
* Copyright (C) 2001-2005 Michael Natterer <mitch gimp org>
- * Copyright (C) 2009 Martin Nordholts <martinn src gnome org>
+ * Copyright (C) 2009-2011 Martin Nordholts <martinn src gnome org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,6 +23,8 @@
#include <gtk/gtk.h>
+#include "libgimpwidgets/gimpwidgets.h"
+
#include "widgets-types.h"
#include "core/gimp.h"
@@ -40,15 +42,20 @@
#include "gimp-log.h"
+#include "gimp-intl.h"
+
/**
* Defines the size of the area that dockables can be dropped on in
* order to be inserted and get space on their own (rather than
* inserted among others and sharing space)
*/
-#define DROP_AREA_SIZE 5
+#define DROP_AREA_SIZE 5
-#define INSERT_INDEX_UNUSED G_MININT
+#define INSERT_INDEX_UNUSED G_MININT
+
+#define INSTRUCTIONS_TEXT_PADDING 4
+#define INSTRUCTIONS_TEXT _("You can drop dockable dialogs here")
struct _GimpPanedBoxPrivate
@@ -56,6 +63,9 @@ struct _GimpPanedBoxPrivate
/* Widgets that are separated by panes */
GList *widgets;
+ /* Displays INSTRUCTIONS_TEXT when there are no dockables */
+ GtkWidget *instructions;
+
/* Window used for drag-and-drop output */
GdkWindow *dnd_window;
@@ -90,7 +100,7 @@ static void gimp_paned_box_realize (GtkWidget *widget)
static void gimp_paned_box_unrealize (GtkWidget *widget);
static void gimp_paned_box_set_widget_drag_handler (GtkWidget *widget,
GimpPanedBox *handler);
-
+static gint gimp_paned_box_get_drop_area_size (GimpPanedBox *paned_box);
G_DEFINE_TYPE (GimpPanedBox, gimp_paned_box, GTK_TYPE_BOX)
@@ -124,6 +134,26 @@ gimp_paned_box_init (GimpPanedBox *paned_box)
GIMP_TYPE_PANED_BOX,
GimpPanedBoxPrivate);
+ /* Instructions label
+ *
+ * Size a small size request so it don't mess up dock window layouts
+ * during startup
+ */
+ paned_box->p->instructions = gtk_label_new (INSTRUCTIONS_TEXT);
+ gtk_misc_set_padding (GTK_MISC (paned_box->p->instructions),
+ INSTRUCTIONS_TEXT_PADDING, INSTRUCTIONS_TEXT_PADDING);
+ gtk_label_set_line_wrap (GTK_LABEL (paned_box->p->instructions), TRUE);
+ gtk_label_set_justify (GTK_LABEL (paned_box->p->instructions), GTK_JUSTIFY_CENTER);
+ gtk_widget_set_size_request (paned_box->p->instructions, 100, 100);
+ gimp_label_set_attributes (GTK_LABEL (paned_box->p->instructions),
+ PANGO_ATTR_STYLE, PANGO_STYLE_ITALIC,
+ -1);
+ gtk_box_pack_start (GTK_BOX (paned_box), paned_box->p->instructions,
+ TRUE, TRUE, 0);
+ gtk_widget_show (paned_box->p->instructions);
+
+
+ /* Setup DND */
gtk_drag_dest_set (GTK_WIDGET (paned_box),
0,
dialog_target_table, G_N_ELEMENTS (dialog_target_table),
@@ -201,6 +231,33 @@ gimp_paned_box_set_widget_drag_handler (GtkWidget *widget,
}
}
+static gint
+gimp_paned_box_get_drop_area_size (GimpPanedBox *paned_box)
+{
+ gboolean no_widgets = (g_list_length (paned_box->p->widgets) == 0);
+ gint drop_area_size = 0;
+
+ if (no_widgets)
+ {
+ GtkAllocation allocation;
+ GtkOrientation orientation;
+
+ gtk_widget_get_allocation (GTK_WIDGET (paned_box), &allocation);
+ orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (paned_box));
+
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ drop_area_size = allocation.width;
+ else if (orientation == GTK_ORIENTATION_VERTICAL)
+ drop_area_size = allocation.height;
+ }
+ else
+ {
+ drop_area_size = DROP_AREA_SIZE;
+ }
+
+ return drop_area_size;
+}
+
static void
gimp_paned_box_position_drop_indicator (GimpPanedBox *paned_box,
gint x,
@@ -273,15 +330,17 @@ gimp_paned_box_drag_motion (GtkWidget *widget,
gint y,
guint time)
{
- GimpPanedBox *paned_box = GIMP_PANED_BOX (widget);
- gint insert_index = INSERT_INDEX_UNUSED;
- gint dnd_window_x = 0;
- gint dnd_window_y = 0;
- gint dnd_window_w = 0;
- gint dnd_window_h = 0;
- GtkOrientation orientation = 0;
- GtkAllocation allocation = { 0, };
- gboolean handle = FALSE;
+ GimpPanedBox *paned_box = GIMP_PANED_BOX (widget);
+ gint insert_index = INSERT_INDEX_UNUSED;
+ gint dnd_window_x = 0;
+ gint dnd_window_y = 0;
+ gint dnd_window_w = 0;
+ gint dnd_window_h = 0;
+ GtkAllocation allocation = { 0, };
+ GtkOrientation orientation = 0;
+ gboolean handle = FALSE;
+ gint drop_area_size = gimp_paned_box_get_drop_area_size (paned_box);
+ gboolean no_widgets = (g_list_length (paned_box->p->widgets) == 0);
if (gimp_paned_box_will_handle_drag (paned_box->p->drag_handler,
widget,
@@ -296,40 +355,55 @@ gimp_paned_box_drag_motion (GtkWidget *widget,
gtk_widget_get_allocation (widget, &allocation);
- /* See if we're at the edge of the dock */
+ /* If there are no widgets, the drop area is as big as the paned
+ * box
+ */
+ no_widgets = (g_list_length (paned_box->p->widgets) == 0);
+
+ /* See if we're at the edge of the dock If there are no dockables,
+ * the entire paned box is a drop area
+ */
orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (paned_box));
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
dnd_window_y = 0;
- dnd_window_w = DROP_AREA_SIZE;
dnd_window_h = allocation.height;
- if (x < DROP_AREA_SIZE)
+ if (no_widgets)
+ dnd_window_w = allocation.width;
+ else
+ dnd_window_w = drop_area_size;
+
+ if (x < drop_area_size)
{
insert_index = 0;
dnd_window_x = 0;
}
- if (x > allocation.width - DROP_AREA_SIZE)
+ if (x > allocation.width - drop_area_size)
{
insert_index = -1;
- dnd_window_x = allocation.width - DROP_AREA_SIZE;
+ dnd_window_x = allocation.width - drop_area_size;
}
}
else /* if (orientation = GTK_ORIENTATION_VERTICAL) */
{
dnd_window_x = 0;
dnd_window_w = allocation.width;
- dnd_window_h = DROP_AREA_SIZE;
- if (y < DROP_AREA_SIZE)
+ if (no_widgets)
+ dnd_window_h = allocation.height;
+ else
+ dnd_window_h = drop_area_size;
+
+ if (y < drop_area_size)
{
insert_index = 0;
dnd_window_y = 0;
}
- if (y > allocation.height - DROP_AREA_SIZE)
+ if (y > allocation.height - drop_area_size)
{
insert_index = -1;
- dnd_window_y = allocation.height - DROP_AREA_SIZE;
+ dnd_window_y = allocation.height - drop_area_size;
}
}
@@ -461,6 +535,9 @@ gimp_paned_box_add_widget (GimpPanedBox *paned_box,
/* Insert into the GtkPaned hierarchy */
if (old_length == 0)
{
+ /* A widget is added, hide the instructions */
+ gtk_widget_hide (paned_box->p->instructions);
+
gtk_box_pack_start (GTK_BOX (paned_box), widget, TRUE, TRUE, 0);
}
else
@@ -570,6 +647,9 @@ gimp_paned_box_remove_widget (GimpPanedBox *paned_box,
*/
if (gtk_widget_get_parent (widget) != NULL)
gtk_container_remove (GTK_CONTAINER (paned_box), widget);
+
+ /* The last widget is removed, show the instructions */
+ gtk_widget_show (paned_box->p->instructions);
}
else
{
@@ -621,11 +701,12 @@ gimp_paned_box_will_handle_drag (GimpPanedBox *paned_box,
gint y,
gint time)
{
- gint paned_box_x = 0;
- gint paned_box_y = 0;
- GtkAllocation allocation = { 0, };
- GtkOrientation orientation = 0;
- gboolean will_handle = FALSE;
+ gint paned_box_x = 0;
+ gint paned_box_y = 0;
+ GtkAllocation allocation = { 0, };
+ GtkOrientation orientation = 0;
+ gboolean will_handle = FALSE;
+ gint drop_area_size = 0;
g_return_val_if_fail (paned_box == NULL ||
GIMP_IS_PANED_BOX (paned_box), FALSE);
@@ -659,17 +740,17 @@ gimp_paned_box_will_handle_drag (GimpPanedBox *paned_box,
* handle the event
*/
gtk_widget_get_allocation (GTK_WIDGET (paned_box), &allocation);
-
- orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (paned_box));
+ orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (paned_box));
+ drop_area_size = gimp_paned_box_get_drop_area_size (paned_box);
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
- will_handle = (paned_box_x < DROP_AREA_SIZE ||
- paned_box_x > allocation.width - DROP_AREA_SIZE);
+ will_handle = (paned_box_x < drop_area_size ||
+ paned_box_x > allocation.width - drop_area_size);
}
else /*if (orientation = GTK_ORIENTATION_VERTICAL)*/
{
- will_handle = (paned_box_y < DROP_AREA_SIZE ||
- paned_box_y > allocation.height - DROP_AREA_SIZE);
+ will_handle = (paned_box_y < drop_area_size ||
+ paned_box_y > allocation.height - drop_area_size);
}
return will_handle;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]