app: Add gimp_dock_columns_new() and GimpContext property

Add and use gimp_dock_columns_new() and add a GimpContext property to
GimpDockColumns. Also move the widget construction from _init() to
_constructor() in GimpDockWindow so we have a context object to pass
to gimp_dock_columns_new().
This commit is contained in:
Martin Nordholts 2010-01-07 19:13:13 +01:00
parent 33573b466b
commit bc5da21ba2
4 changed files with 183 additions and 101 deletions

View File

@ -310,7 +310,8 @@ gimp_image_window_constructor (GType type,
gtk_widget_show (private->left_hpane);
/* Create the left dock columns widget */
private->left_docks = g_object_new (GIMP_TYPE_DOCK_COLUMNS, NULL);
private->left_docks =
gimp_dock_columns_new (gimp_get_user_context (private->gimp));
gimp_dock_columns_set_context (GIMP_DOCK_COLUMNS (private->left_docks),
gimp_get_user_context (private->gimp));
gtk_paned_pack1 (GTK_PANED (private->left_hpane), private->left_docks,
@ -339,9 +340,8 @@ gimp_image_window_constructor (GType type,
gtk_widget_show (private->notebook);
/* Create the right dock columns widget */
private->right_docks = g_object_new (GIMP_TYPE_DOCK_COLUMNS, NULL);
gimp_dock_columns_set_context (GIMP_DOCK_COLUMNS (private->right_docks),
gimp_get_user_context (private->gimp));
private->right_docks =
gimp_dock_columns_new (gimp_get_user_context (private->gimp));
gtk_paned_pack2 (GTK_PANED (private->right_hpane), private->right_docks,
FALSE, FALSE);
if (config->single_window_mode)

View File

@ -43,6 +43,13 @@
#include "gimp-log.h"
enum
{
PROP_0,
PROP_CONTEXT
};
enum
{
DOCK_ADDED,
@ -61,16 +68,24 @@ struct _GimpDockColumnsPrivate
};
static gboolean gimp_dock_columns_dropped_cb (GtkWidget *source,
gint insert_index,
gpointer data);
static void gimp_dock_columns_real_dock_added (GimpDockColumns *dock_columns,
GimpDock *dock);
static void gimp_dock_columns_real_dock_removed (GimpDockColumns *dock_columns,
GimpDock *dock);
static void gimp_dock_columns_dock_book_removed (GimpDockColumns *dock_columns,
GimpDockbook *dockbook,
GimpDock *dock);
static void gimp_dock_columns_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_dock_columns_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
static gboolean gimp_dock_columns_dropped_cb (GtkWidget *source,
gint insert_index,
gpointer data);
static void gimp_dock_columns_real_dock_added (GimpDockColumns *dock_columns,
GimpDock *dock);
static void gimp_dock_columns_real_dock_removed (GimpDockColumns *dock_columns,
GimpDock *dock);
static void gimp_dock_columns_dock_book_removed (GimpDockColumns *dock_columns,
GimpDockbook *dockbook,
GimpDock *dock);
G_DEFINE_TYPE (GimpDockColumns, gimp_dock_columns, GTK_TYPE_HBOX)
@ -83,9 +98,21 @@ static guint dock_columns_signals[LAST_SIGNAL] = { 0 };
static void
gimp_dock_columns_class_init (GimpDockColumnsClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->set_property = gimp_dock_columns_set_property;
object_class->get_property = gimp_dock_columns_get_property;
klass->dock_added = gimp_dock_columns_real_dock_added;
klass->dock_removed = gimp_dock_columns_real_dock_removed;
g_object_class_install_property (object_class, PROP_CONTEXT,
g_param_spec_object ("context",
NULL, NULL,
GIMP_TYPE_CONTEXT,
GIMP_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
dock_columns_signals[DOCK_ADDED] =
g_signal_new ("dock-added",
G_TYPE_FROM_CLASS (klass),
@ -125,6 +152,46 @@ gimp_dock_columns_init (GimpDockColumns *dock_columns)
gtk_widget_show (dock_columns->p->paned_hbox);
}
static void
gimp_dock_columns_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
GimpDockColumns *dock_columns = GIMP_DOCK_COLUMNS (object);
switch (property_id)
{
case PROP_CONTEXT:
dock_columns->p->context = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
gimp_dock_columns_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
GimpDockColumns *dock_columns = GIMP_DOCK_COLUMNS (object);
switch (property_id)
{
case PROP_CONTEXT:
g_value_set_object (value, dock_columns->p->context);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static gboolean
gimp_dock_columns_dropped_cb (GtkWidget *source,
gint insert_index,
@ -185,6 +252,22 @@ gimp_dock_columns_dock_book_removed (GimpDockColumns *dock_columns,
}
/**
* gimp_dock_columns_new:
* @context:
*
* Returns: A new #GimpDockColumns.
**/
GtkWidget *
gimp_dock_columns_new (GimpContext *context)
{
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
return g_object_new (GIMP_TYPE_DOCK_COLUMNS,
"context", context,
NULL);
}
/**
* gimp_dock_columns_add_dock:
* @dock_columns:

View File

@ -58,6 +58,7 @@ struct _GimpDockColumnsClass
GType gimp_dock_columns_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_dock_columns_new (GimpContext *context);
void gimp_dock_columns_add_dock (GimpDockColumns *dock_columns,
GimpDock *dock,
gint index);

View File

@ -246,6 +246,73 @@ gimp_dock_window_init (GimpDockWindow *dock_window)
/* Misc */
gtk_window_set_resizable (GTK_WINDOW (dock_window), TRUE);
gtk_window_set_focus_on_map (GTK_WINDOW (dock_window), FALSE);
}
static GObject *
gimp_dock_window_constructor (GType type,
guint n_params,
GObjectConstructParam *params)
{
GObject *object = NULL;
GimpDockWindow *dock_window = NULL;
GimpGuiConfig *config = NULL;
GtkAccelGroup *accel_group = NULL;
Gimp *gimp = NULL;
GtkSettings *settings = NULL;
gint menu_view_width = -1;
gint menu_view_height = -1;
/* Init */
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
dock_window = GIMP_DOCK_WINDOW (object);
gimp = GIMP (dock_window->p->context->gimp);
config = GIMP_GUI_CONFIG (gimp->config);
/* Create a separate context per dock so that docks can be bound to
* a specific image and does not necessarily have to follow the
* active image in the user context
*/
g_object_unref (dock_window->p->context);
dock_window->p->context = gimp_context_new (gimp, "Dock Context", NULL);
dock_window->p->image_container = gimp->images;
dock_window->p->display_container = gimp->displays;
/* Setup hints */
gimp_window_set_hint (GTK_WINDOW (dock_window), config->dock_window_hint);
/* Make image window related keyboard shortcuts work also when a
* dock window is the focused window
*/
dock_window->p->ui_manager =
gimp_menu_factory_manager_new (global_menu_factory,
dock_window->p->ui_manager_name,
dock_window,
config->tearoff_menus);
accel_group =
gtk_ui_manager_get_accel_group (GTK_UI_MANAGER (dock_window->p->ui_manager));
gtk_window_add_accel_group (GTK_WINDOW (dock_window), accel_group);
g_signal_connect_object (dock_window->p->context, "display-changed",
G_CALLBACK (gimp_dock_window_display_changed),
dock_window,
G_CONNECT_SWAPPED);
g_signal_connect_object (dock_window->p->context, "image-changed",
G_CALLBACK (gimp_dock_window_image_changed),
dock_window,
G_CONNECT_SWAPPED);
dock_window->p->image_flush_handler_id =
gimp_container_add_handler (gimp->images, "flush",
G_CALLBACK (gimp_dock_window_image_flush),
dock_window);
gimp_context_define_properties (dock_window->p->context,
GIMP_CONTEXT_ALL_PROPS_MASK &
~(GIMP_CONTEXT_IMAGE_MASK |
GIMP_CONTEXT_DISPLAY_MASK),
FALSE);
gimp_context_set_parent (dock_window->p->context,
gimp_dialog_factory_get_context (dock_window->p->dialog_factory));
/* Setup widget hierarchy */
{
@ -294,7 +361,12 @@ gimp_dock_window_init (GimpDockWindow *dock_window)
}
/* GimpDockColumns */
dock_window->p->dock_columns =g_object_new (GIMP_TYPE_DOCK_COLUMNS, NULL);
/* Let the GimpDockColumns mirror the context so that a GimpDock can
* get it when inside a dock window. We do the same thing in the
* GimpImageWindow so docks can get the GimpContext there as well
*/
dock_window->p->dock_columns =
GIMP_DOCK_COLUMNS (gimp_dock_columns_new (dock_window->p->context));
gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (dock_window->p->dock_columns),
TRUE, TRUE, 0);
gtk_widget_show (GTK_WIDGET (dock_window->p->dock_columns));
@ -303,92 +375,6 @@ gimp_dock_window_init (GimpDockWindow *dock_window)
dock_window,
G_CONNECT_SWAPPED);
}
}
static GObject *
gimp_dock_window_constructor (GType type,
guint n_params,
GObjectConstructParam *params)
{
GObject *object = NULL;
GimpDockWindow *dock_window = NULL;
GimpGuiConfig *config = NULL;
GtkAccelGroup *accel_group = NULL;
Gimp *gimp = NULL;
GtkSettings *settings = NULL;
gint menu_view_width = -1;
gint menu_view_height = -1;
/* Init */
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
dock_window = GIMP_DOCK_WINDOW (object);
gimp = GIMP (dock_window->p->context->gimp);
config = GIMP_GUI_CONFIG (gimp->config);
/* Create a separate context per dock so that docks can be bound to
* a specific image and does not necessarily have to follow the
* active image in the user context
*/
g_object_unref (dock_window->p->context);
dock_window->p->context = gimp_context_new (gimp, "Dock Context", NULL);
dock_window->p->image_container = gimp->images;
dock_window->p->display_container = gimp->displays;
/* Let the GimpDockColumns mirror the context so that a GimpDock can
* get it when inside a dock window. We do the same thing in the
* GimpImageWindow so docks can get the GimpContext there as well
*/
gimp_dock_columns_set_context (dock_window->p->dock_columns,
dock_window->p->context);
/* Setup hints */
gimp_window_set_hint (GTK_WINDOW (dock_window), config->dock_window_hint);
/* Make image window related keyboard shortcuts work also when a
* dock window is the focused window
*/
dock_window->p->ui_manager =
gimp_menu_factory_manager_new (global_menu_factory,
dock_window->p->ui_manager_name,
dock_window,
config->tearoff_menus);
accel_group =
gtk_ui_manager_get_accel_group (GTK_UI_MANAGER (dock_window->p->ui_manager));
gtk_window_add_accel_group (GTK_WINDOW (dock_window), accel_group);
g_signal_connect_object (dock_window->p->context, "display-changed",
G_CALLBACK (gimp_dock_window_display_changed),
dock_window,
G_CONNECT_SWAPPED);
g_signal_connect_object (dock_window->p->context, "image-changed",
G_CALLBACK (gimp_dock_window_image_changed),
dock_window,
G_CONNECT_SWAPPED);
dock_window->p->image_flush_handler_id =
gimp_container_add_handler (gimp->images, "flush",
G_CALLBACK (gimp_dock_window_image_flush),
dock_window);
gimp_context_define_properties (dock_window->p->context,
GIMP_CONTEXT_ALL_PROPS_MASK &
~(GIMP_CONTEXT_IMAGE_MASK |
GIMP_CONTEXT_DISPLAY_MASK),
FALSE);
gimp_context_set_parent (dock_window->p->context,
gimp_dialog_factory_get_context (dock_window->p->dialog_factory));
if (dock_window->p->auto_follow_active)
{
if (gimp_context_get_display (gimp_dialog_factory_get_context (dock_window->p->dialog_factory)))
gimp_context_copy_property (gimp_dialog_factory_get_context (dock_window->p->dialog_factory),
dock_window->p->context,
GIMP_CONTEXT_PROP_DISPLAY);
else
gimp_context_copy_property (gimp_dialog_factory_get_context (dock_window->p->dialog_factory),
dock_window->p->context,
GIMP_CONTEXT_PROP_IMAGE);
}
g_signal_connect_object (gimp_dialog_factory_get_context (dock_window->p->dialog_factory), "display-changed",
G_CALLBACK (gimp_dock_window_factory_display_changed),
@ -413,6 +399,18 @@ gimp_dock_window_constructor (GType type,
gimp_help_connect (GTK_WIDGET (dock_window), gimp_standard_help_func,
GIMP_HELP_DOCK, NULL);
if (dock_window->p->auto_follow_active)
{
if (gimp_context_get_display (gimp_dialog_factory_get_context (dock_window->p->dialog_factory)))
gimp_context_copy_property (gimp_dialog_factory_get_context (dock_window->p->dialog_factory),
dock_window->p->context,
GIMP_CONTEXT_PROP_DISPLAY);
else
gimp_context_copy_property (gimp_dialog_factory_get_context (dock_window->p->dialog_factory),
dock_window->p->context,
GIMP_CONTEXT_PROP_IMAGE);
}
/* Done! */
return object;
}