app: Introduce gimp_dialog_factory_set_put_in_dockables()

Change gimp_dialog_factory_set_constructor() to
gimp_dialog_factory_set_put_in_dockables() order to narrow the
interface a bit. We can make both
gimp_dialog_factory_set_put_in_dockables() and the
GimpDialogConstructor typedef internal this way.

The main reason we do this is because we want to get rid of a
dependency on factory->p->new_dock_func. Eventually we want to
construct docks just like we construct other widgets in the factory,
so new_dock_func will be removed.

Also improve readability of code such as making it explicit that
gimp_dialog_factory_put_in_dockable_constructor() is just an extended
version of gimp_dialog_factory_default_constructor().
This commit is contained in:
Martin Nordholts 2010-01-16 17:54:56 +01:00
parent 73445668a6
commit deb07e812d
5 changed files with 71 additions and 58 deletions

View File

@ -266,35 +266,6 @@ dialogs_dock_window_new (GimpDialogFactory *factory,
/* dockables */ /* dockables */
/***************/ /***************/
/***** the dockable constructor *****/
GtkWidget *
dialogs_dockable_constructor (GimpDialogFactory *factory,
GimpDialogFactoryEntry *entry,
GimpContext *context,
gint view_size)
{
GtkWidget *dockable = NULL;
GtkWidget *widget;
widget = entry->new_func (factory, context, view_size);
if (widget)
{
dockable = gimp_dockable_new (entry->name, entry->blurb,
entry->stock_id, entry->help_id);
gtk_container_add (GTK_CONTAINER (dockable), widget);
gtk_widget_show (widget);
/* EEK */
g_object_set_data (G_OBJECT (dockable), "gimp-dialog-identifier",
entry->identifier);
}
return dockable;
}
/***** singleton dialogs *****/ /***** singleton dialogs *****/
GtkWidget * GtkWidget *

View File

@ -84,11 +84,6 @@ GtkWidget * dialogs_dock_window_new (GimpDialogFactory *factory,
/* dockables */ /* dockables */
GtkWidget * dialogs_dockable_constructor (GimpDialogFactory *factory,
GimpDialogFactoryEntry *entry,
GimpContext *context,
gint view_size);
GtkWidget * dialogs_tool_options_new (GimpDialogFactory *factory, GtkWidget * dialogs_tool_options_new (GimpDialogFactory *factory,
GimpContext *context, GimpContext *context,
gint view_size); gint view_size);

View File

@ -328,8 +328,7 @@ dialogs_init (Gimp *gimp,
menu_factory, menu_factory,
dialogs_toolbox_new, dialogs_toolbox_new,
TRUE); TRUE);
gimp_dialog_factory_set_constructor (global_toolbox_factory, gimp_dialog_factory_set_put_in_dockables (global_toolbox_factory, TRUE);
dialogs_dockable_constructor);
gimp_dialog_factory_set_dock_window_func (global_toolbox_factory, gimp_dialog_factory_set_dock_window_func (global_toolbox_factory,
dialogs_toolbox_dock_window_new); dialogs_toolbox_dock_window_new);
@ -339,8 +338,7 @@ dialogs_init (Gimp *gimp,
menu_factory, menu_factory,
dialogs_dock_new, dialogs_dock_new,
TRUE); TRUE);
gimp_dialog_factory_set_constructor (global_dock_window_factory, gimp_dialog_factory_set_put_in_dockables (global_dock_window_factory, TRUE);
dialogs_dockable_constructor);
gimp_dialog_factory_set_dock_window_func (global_dock_window_factory, gimp_dialog_factory_set_dock_window_func (global_dock_window_factory,
dialogs_dock_window_new); dialogs_dock_window_new);

View File

@ -59,6 +59,10 @@ enum
LAST_SIGNAL LAST_SIGNAL
}; };
typedef GtkWidget * (* GimpDialogConstructor) (GimpDialogFactory *factory,
GimpDialogFactoryEntry *entry,
GimpContext *context,
gint view_size);
struct _GimpDialogFactoryPrivate struct _GimpDialogFactoryPrivate
{ {
@ -84,6 +88,11 @@ static GtkWidget * gimp_dialog_factory_default_constructor (GimpDialogFactory
GimpDialogFactoryEntry *entry, GimpDialogFactoryEntry *entry,
GimpContext *context, GimpContext *context,
gint view_size); gint view_size);
static GtkWidget * gimp_dialog_factory_put_in_dockable_constructor
(GimpDialogFactory *factory,
GimpDialogFactoryEntry *entry,
GimpContext *context,
gint view_size);
static void gimp_dialog_factory_set_widget_data (GtkWidget *dialog, static void gimp_dialog_factory_set_widget_data (GtkWidget *dialog,
GimpDialogFactory *factory, GimpDialogFactory *factory,
GimpDialogFactoryEntry *entry); GimpDialogFactoryEntry *entry);
@ -319,15 +328,14 @@ gimp_dialog_factory_from_name (const gchar *name)
} }
void void
gimp_dialog_factory_set_constructor (GimpDialogFactory *factory, gimp_dialog_factory_set_put_in_dockables (GimpDialogFactory *factory,
GimpDialogConstructor constructor) gboolean put_in_dockables)
{ {
g_return_if_fail (GIMP_IS_DIALOG_FACTORY (factory)); g_return_if_fail (GIMP_IS_DIALOG_FACTORY (factory));
if (! constructor) factory->p->constructor = (put_in_dockables ?
constructor = gimp_dialog_factory_default_constructor; gimp_dialog_factory_put_in_dockable_constructor :
gimp_dialog_factory_default_constructor);
factory->p->constructor = constructor;
} }
void void
@ -502,18 +510,23 @@ gimp_dialog_factory_dialog_new_internal (GimpDialogFactory *factory,
/* create the dialog if it was not found */ /* create the dialog if it was not found */
if (! dialog) if (! dialog)
{ {
GtkWidget *dock = NULL; GtkWidget *dock = NULL;
gboolean dialog_will_be_dockable = FALSE;
gboolean called_from_raise = FALSE;
/* If the dialog will be a dockable (factory->p->new_dock_func) and dialog_will_be_dockable = (factory->p->constructor ==
* we are called from gimp_dialog_factory_dialog_raise() (! context), gimp_dialog_factory_put_in_dockable_constructor);
* create a new dock _before_ creating the dialog. called_from_raise = (context == NULL);
* We do this because the new dockable needs to be created in it's
* dock's context. if (dialog_will_be_dockable && called_from_raise)
*/
if (factory->p->new_dock_func && ! context)
{ {
GtkWidget *dockbook; GtkWidget *dockbook;
/* It doesn't make sense to have a dockable without a dock
* so create one. Create a new dock _before_ creating the
* dialog. We do this because the new dockable needs to be
* created in its dock's context.
*/
dock = gimp_dialog_factory_dock_with_window_new (factory, screen); dock = gimp_dialog_factory_dock_with_window_new (factory, screen);
dockbook = gimp_dockbook_new (factory->p->menu_factory); dockbook = gimp_dockbook_new (factory->p->menu_factory);
@ -1391,6 +1404,46 @@ gimp_dialog_factory_default_constructor (GimpDialogFactory *factory,
return entry->new_func (factory, context, view_size); return entry->new_func (factory, context, view_size);
} }
/**
* gimp_dialog_factory_put_in_dockable_constructor:
* @factory:
* @entry:
* @context:
* @view_size:
*
* Put the created widget inside a #GimpDockable.
*
* Returns:
**/
static GtkWidget *
gimp_dialog_factory_put_in_dockable_constructor (GimpDialogFactory *factory,
GimpDialogFactoryEntry *entry,
GimpContext *context,
gint view_size)
{
GtkWidget *dockable = NULL;
GtkWidget *widget;
widget = gimp_dialog_factory_default_constructor (factory,
entry,
context,
view_size);
if (widget)
{
dockable = gimp_dockable_new (entry->name, entry->blurb,
entry->stock_id, entry->help_id);
gtk_container_add (GTK_CONTAINER (dockable), widget);
gtk_widget_show (widget);
/* EEK */
g_object_set_data (G_OBJECT (dockable), "gimp-dialog-identifier",
entry->identifier);
}
return dockable;
}
static void static void
gimp_dialog_factory_set_widget_data (GtkWidget *dialog, gimp_dialog_factory_set_widget_data (GtkWidget *dialog,
GimpDialogFactory *factory, GimpDialogFactory *factory,

View File

@ -40,10 +40,6 @@ typedef GtkWidget * (* GimpDialogNewFunc) (GimpDialogFactory *factory,
typedef GtkWidget * (* GimpDialogNewDockFunc) (GimpDialogFactory *factory, typedef GtkWidget * (* GimpDialogNewDockFunc) (GimpDialogFactory *factory,
GimpContext *context, GimpContext *context,
GimpUIManager *ui_manager); GimpUIManager *ui_manager);
typedef GtkWidget * (* GimpDialogConstructor) (GimpDialogFactory *factory,
GimpDialogFactoryEntry *entry,
GimpContext *context,
gint view_size);
struct _GimpDialogFactoryEntry struct _GimpDialogFactoryEntry
@ -114,8 +110,8 @@ GimpDialogFactory * gimp_dialog_factory_new (const gchar
GimpDialogNewDockFunc new_dock_func, GimpDialogNewDockFunc new_dock_func,
gboolean toggle_visibility); gboolean toggle_visibility);
GimpDialogFactory * gimp_dialog_factory_from_name (const gchar *name); GimpDialogFactory * gimp_dialog_factory_from_name (const gchar *name);
void gimp_dialog_factory_set_constructor (GimpDialogFactory *factory, void gimp_dialog_factory_set_put_in_dockables (GimpDialogFactory *factory,
GimpDialogConstructor constructor); gboolean put_in_dockables);
void gimp_dialog_factory_set_dock_window_func (GimpDialogFactory *factory, void gimp_dialog_factory_set_dock_window_func (GimpDialogFactory *factory,
GimpDialogNewFunc new_dock_window_func); GimpDialogNewFunc new_dock_window_func);
void gimp_dialog_factory_register_entry (GimpDialogFactory *factory, void gimp_dialog_factory_register_entry (GimpDialogFactory *factory,