From da0de0873fc52314ebfb34b1572478bf17e5aa73 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Mon, 10 May 2004 00:41:57 +0000 Subject: [PATCH] Started making the toolbox configurable. Addresses bug #105764. Not 2004-05-10 Michael Natterer Started making the toolbox configurable. Addresses bug #105764. Not finished yet. * app/core/gimptoolinfo.[ch]: renamed "in_toolbox" to "visible" and made it a GObject property. * app/tools/gimp-tools.[ch]: added new function gimp_tools_get_default_order() which returns a GList of tool identifiers. * app/actions/tools-actions.c * app/actions/tools-commands.[ch]: added actions & callbacks for toggling the "visible" boolean and for resetting all tools. * app/widgets/Makefile.am * app/widgets/widgets-types.h * app/widgets/gimptoolview.[ch]: new widget which allows to toggle a tool's visibility and to reorder the tools. * app/widgets/gimptoolbox.[ch]: removed member "GtkWidget *trash" and pack all tool buttons into the same wrap box. Connect to "reoder" of the tool container and to "notify::visible" of all tool infos and update the toolbox accordingly. * app/gui/dialogs-constructors.c: create a GimpToolView for the tools list/grid. * app/menus/menus.c: register a menu for the dialog above. * menus/Makefile.am * menus/tools-menu.xml: added the menu. --- ChangeLog | 34 ++++++ app/actions/tools-actions.c | 38 +++++- app/actions/tools-commands.c | 33 +++++ app/actions/tools-commands.h | 19 +-- app/core/gimptoolinfo.c | 63 +++++++++- app/core/gimptoolinfo.h | 2 +- app/dialogs/dialogs-constructors.c | 19 +-- app/gui/dialogs-constructors.c | 19 +-- app/menus/menus.c | 7 ++ app/tools/gimp-tools.c | 39 +++++- app/tools/gimp-tools.h | 2 + app/widgets/Makefile.am | 2 + app/widgets/gimptoolbox.c | 81 ++++++++---- app/widgets/gimptoolbox.h | 1 - app/widgets/gimptoolview.c | 190 +++++++++++++++++++++++++++++ app/widgets/gimptoolview.h | 62 ++++++++++ app/widgets/widgets-types.h | 1 + menus/Makefile.am | 1 + menus/tools-menu.xml | 10 ++ 19 files changed, 567 insertions(+), 56 deletions(-) create mode 100644 app/widgets/gimptoolview.c create mode 100644 app/widgets/gimptoolview.h create mode 100644 menus/tools-menu.xml diff --git a/ChangeLog b/ChangeLog index cb965f106b..4a94e9388b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,37 @@ +2004-05-10 Michael Natterer + + Started making the toolbox configurable. + Addresses bug #105764. Not finished yet. + + * app/core/gimptoolinfo.[ch]: renamed "in_toolbox" to "visible" + and made it a GObject property. + + * app/tools/gimp-tools.[ch]: added new function + gimp_tools_get_default_order() which returns a GList of tool + identifiers. + + * app/actions/tools-actions.c + * app/actions/tools-commands.[ch]: added actions & callbacks for + toggling the "visible" boolean and for resetting all tools. + + * app/widgets/Makefile.am + * app/widgets/widgets-types.h + * app/widgets/gimptoolview.[ch]: new widget which allows to + toggle a tool's visibility and to reorder the tools. + + * app/widgets/gimptoolbox.[ch]: removed member "GtkWidget *trash" + and pack all tool buttons into the same wrap box. Connect to + "reoder" of the tool container and to "notify::visible" of all + tool infos and update the toolbox accordingly. + + * app/gui/dialogs-constructors.c: create a GimpToolView for the + tools list/grid. + + * app/menus/menus.c: register a menu for the dialog above. + + * menus/Makefile.am + * menus/tools-menu.xml: added the menu. + 2004-05-10 Michael Natterer * app/widgets/gimpuimanager.c: re-added help for menu items. Still diff --git a/app/actions/tools-actions.c b/app/actions/tools-actions.c index e038c9e789..eb22771bff 100644 --- a/app/actions/tools-actions.c +++ b/app/actions/tools-actions.c @@ -27,10 +27,13 @@ #include "actions-types.h" #include "core/gimp.h" +#include "core/gimpcontext.h" #include "core/gimplist.h" #include "core/gimptoolinfo.h" #include "widgets/gimpactiongroup.h" +#include "widgets/gimpcontainereditor.h" +#include "widgets/gimpcontainerview.h" #include "widgets/gimphelp-ids.h" #include "actions/tools-actions.h" @@ -41,6 +44,9 @@ static GimpActionEntry tools_actions[] = { + { "tools-popup", GIMP_STOCK_TOOLS, N_("Tools Menu"), NULL, NULL, NULL, + GIMP_HELP_TOOLS_DIALOG }, + { "tools-menu", NULL, N_("_Tools") }, { "tools-select-menu", NULL, N_("_Selection Tools") }, { "tools-paint-menu", NULL, N_("_Paint Tools") }, @@ -55,7 +61,21 @@ static GimpActionEntry tools_actions[] = { "tools-swap-colors", GIMP_STOCK_SWAP_COLORS, N_("S_wap Colors"), "X", NULL, G_CALLBACK (tools_swap_colors_cmd_callback), - GIMP_HELP_TOOLBOX_SWAP_COLORS } + GIMP_HELP_TOOLBOX_SWAP_COLORS }, + + { "tools-reset", GIMP_STOCK_RESET, + N_("_Reset Order & Visibility"), NULL, NULL, + G_CALLBACK (tools_reset_cmd_callback), + NULL } +}; + +static GimpToggleActionEntry tools_toggle_actions[] = +{ + { "tools-visibility", NULL, + N_("Show in Toolbox"), NULL, NULL, + G_CALLBACK (tools_toggle_visibility_cmd_callback), + TRUE, + NULL /* FIXME */ } }; static GimpStringActionEntry tools_alternative_actions[] = @@ -82,6 +102,10 @@ tools_actions_setup (GimpActionGroup *group) tools_actions, G_N_ELEMENTS (tools_actions)); + gimp_action_group_add_toggle_actions (group, + tools_toggle_actions, + G_N_ELEMENTS (tools_toggle_actions)); + gimp_action_group_add_string_actions (group, tools_alternative_actions, G_N_ELEMENTS (tools_alternative_actions), @@ -138,4 +162,16 @@ void tools_actions_update (GimpActionGroup *group, gpointer data) { + GimpToolInfo *tool_info = NULL; + + if (GIMP_IS_CONTAINER_EDITOR (data)) + tool_info = + gimp_context_get_tool (GIMP_CONTAINER_EDITOR (data)->view->context); + +#define SET_ACTIVE(action,condition) \ + gimp_action_group_set_action_active (group, action, (condition) != 0) + + SET_ACTIVE ("tools-visibility", tool_info && tool_info->visible); + +#undef SET_ACTIVE } diff --git a/app/actions/tools-commands.c b/app/actions/tools-commands.c index 9119af6de8..74ab38ea4b 100644 --- a/app/actions/tools-commands.c +++ b/app/actions/tools-commands.c @@ -28,6 +28,10 @@ #include "core/gimpimage.h" #include "core/gimptoolinfo.h" +#include "widgets/gimpcontainereditor.h" +#include "widgets/gimpcontainerview.h" +#include "widgets/gimptoolview.h" + #include "display/gimpdisplay.h" #include "tools/gimptool.h" @@ -94,3 +98,32 @@ tools_select_cmd_callback (GtkAction *action, if (gdisp) tool_manager_initialize_active (gimp, gdisp); } + +void +tools_toggle_visibility_cmd_callback (GtkAction *action, + gpointer data) +{ + if (GIMP_IS_CONTAINER_EDITOR (data)) + { + GimpToolInfo *tool_info; + gboolean active; + + tool_info = + gimp_context_get_tool (GIMP_CONTAINER_EDITOR (data)->view->context); + + active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + + if (active != tool_info->visible) + g_object_set (tool_info, "visible", active, NULL); + } +} + +void +tools_reset_cmd_callback (GtkAction *action, + gpointer data) +{ + GimpToolView *view = GIMP_TOOL_VIEW (data); + + if (GTK_WIDGET_SENSITIVE (view->reset_button)) + gtk_button_clicked (GTK_BUTTON (view->reset_button)); +} diff --git a/app/actions/tools-commands.h b/app/actions/tools-commands.h index 9e7a80636b..b773739ce8 100644 --- a/app/actions/tools-commands.h +++ b/app/actions/tools-commands.h @@ -20,13 +20,18 @@ #define __TOOLS_COMMANDS_H__ -void tools_default_colors_cmd_callback (GtkAction *action, - gpointer data); -void tools_swap_colors_cmd_callback (GtkAction *action, - gpointer data); -void tools_select_cmd_callback (GtkAction *action, - const gchar *value, - gpointer data); +void tools_default_colors_cmd_callback (GtkAction *action, + gpointer data); +void tools_swap_colors_cmd_callback (GtkAction *action, + gpointer data); +void tools_select_cmd_callback (GtkAction *action, + const gchar *value, + gpointer data); + +void tools_toggle_visibility_cmd_callback (GtkAction *action, + gpointer data); +void tools_reset_cmd_callback (GtkAction *action, + gpointer data); #endif /* __TOOLS_COMMANDS_H__ */ diff --git a/app/core/gimptoolinfo.c b/app/core/gimptoolinfo.c index 6b5d3e681e..dad4b2fd32 100644 --- a/app/core/gimptoolinfo.c +++ b/app/core/gimptoolinfo.c @@ -35,10 +35,25 @@ #include "gimptooloptions.h" +enum +{ + PROP_0, + PROP_VISIBLE +}; + + static void gimp_tool_info_class_init (GimpToolInfoClass *klass); static void gimp_tool_info_init (GimpToolInfo *tool_info); static void gimp_tool_info_finalize (GObject *object); +static void gimp_tool_info_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); +static void gimp_tool_info_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); static gchar * gimp_tool_info_get_description (GimpViewable *viewable, gchar **tooltip); @@ -83,8 +98,16 @@ gimp_tool_info_class_init (GimpToolInfoClass *klass) parent_class = g_type_class_peek_parent (klass); object_class->finalize = gimp_tool_info_finalize; + object_class->get_property = gimp_tool_info_get_property; + object_class->set_property = gimp_tool_info_set_property; viewable_class->get_description = gimp_tool_info_get_description; + + g_object_class_install_property (object_class, PROP_VISIBLE, + g_param_spec_boolean ("visible", + NULL, NULL, + TRUE, + G_PARAM_READWRITE)); } static void @@ -105,7 +128,7 @@ gimp_tool_info_init (GimpToolInfo *tool_info) tool_info->help_domain = NULL; tool_info->help_id = NULL; - tool_info->in_toolbox = TRUE; + tool_info->visible = TRUE; tool_info->tool_options = NULL; tool_info->paint_info = NULL; } @@ -163,6 +186,44 @@ gimp_tool_info_finalize (GObject *object) G_OBJECT_CLASS (parent_class)->finalize (object); } +static void +gimp_tool_info_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GimpToolInfo *tool_info = GIMP_TOOL_INFO (object); + + switch (property_id) + { + case PROP_VISIBLE: + g_value_set_boolean (value, tool_info->visible); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gimp_tool_info_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GimpToolInfo *tool_info = GIMP_TOOL_INFO (object); + + switch (property_id) + { + case PROP_VISIBLE: + tool_info->visible = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + static gchar * gimp_tool_info_get_description (GimpViewable *viewable, gchar **tooltip) diff --git a/app/core/gimptoolinfo.h b/app/core/gimptoolinfo.h index 156d15aede..ed9d0f3a8d 100644 --- a/app/core/gimptoolinfo.h +++ b/app/core/gimptoolinfo.h @@ -52,7 +52,7 @@ struct _GimpToolInfo gchar *help_domain; gchar *help_id; - gboolean in_toolbox; + gboolean visible; GimpToolOptions *tool_options; GimpPaintInfo *paint_info; diff --git a/app/dialogs/dialogs-constructors.c b/app/dialogs/dialogs-constructors.c index 74a42b768a..3d35c13629 100644 --- a/app/dialogs/dialogs-constructors.c +++ b/app/dialogs/dialogs-constructors.c @@ -62,6 +62,7 @@ #include "widgets/gimptemplateview.h" #include "widgets/gimptoolbox.h" #include "widgets/gimptooloptionseditor.h" +#include "widgets/gimptoolview.h" #include "widgets/gimpundoeditor.h" #include "widgets/gimpvectorstreeview.h" @@ -370,10 +371,11 @@ dialogs_tool_list_view_new (GimpDialogFactory *factory, { GtkWidget *view; - view = gimp_container_tree_view_new (context->gimp->tool_info_list, - context, - preview_size, 0, - FALSE); + view = gimp_tool_view_new (GIMP_VIEW_TYPE_LIST, + context->gimp->tool_info_list, + context, + preview_size, 0, + factory->menu_factory); return dialogs_dockable_new (view, _("Tools"), NULL, @@ -579,10 +581,11 @@ dialogs_tool_grid_view_new (GimpDialogFactory *factory, { GtkWidget *view; - view = gimp_container_grid_view_new (context->gimp->tool_info_list, - context, - preview_size, 1, - FALSE); + view = gimp_tool_view_new (GIMP_VIEW_TYPE_GRID, + context->gimp->tool_info_list, + context, + preview_size, 1, + factory->menu_factory); return dialogs_dockable_new (view, _("Tools"), NULL, diff --git a/app/gui/dialogs-constructors.c b/app/gui/dialogs-constructors.c index 74a42b768a..3d35c13629 100644 --- a/app/gui/dialogs-constructors.c +++ b/app/gui/dialogs-constructors.c @@ -62,6 +62,7 @@ #include "widgets/gimptemplateview.h" #include "widgets/gimptoolbox.h" #include "widgets/gimptooloptionseditor.h" +#include "widgets/gimptoolview.h" #include "widgets/gimpundoeditor.h" #include "widgets/gimpvectorstreeview.h" @@ -370,10 +371,11 @@ dialogs_tool_list_view_new (GimpDialogFactory *factory, { GtkWidget *view; - view = gimp_container_tree_view_new (context->gimp->tool_info_list, - context, - preview_size, 0, - FALSE); + view = gimp_tool_view_new (GIMP_VIEW_TYPE_LIST, + context->gimp->tool_info_list, + context, + preview_size, 0, + factory->menu_factory); return dialogs_dockable_new (view, _("Tools"), NULL, @@ -579,10 +581,11 @@ dialogs_tool_grid_view_new (GimpDialogFactory *factory, { GtkWidget *view; - view = gimp_container_grid_view_new (context->gimp->tool_info_list, - context, - preview_size, 1, - FALSE); + view = gimp_tool_view_new (GIMP_VIEW_TYPE_GRID, + context->gimp->tool_info_list, + context, + preview_size, 1, + factory->menu_factory); return dialogs_dockable_new (view, _("Tools"), NULL, diff --git a/app/menus/menus.c b/app/menus/menus.c index 179b1bf536..487d29b5f3 100644 --- a/app/menus/menus.c +++ b/app/menus/menus.c @@ -232,6 +232,13 @@ menus_init (Gimp *gimp) "images-menu.xml", NULL, NULL); + gimp_menu_factory_manager_register (global_menu_factory, "", + "tools", + NULL, + "/tools-popup", + "tools-menu.xml", NULL, + NULL); + gimp_menu_factory_manager_register (global_menu_factory, "", "gradient-editor", NULL, diff --git a/app/tools/gimp-tools.c b/app/tools/gimp-tools.c index a22520da31..9ca8604aa6 100644 --- a/app/tools/gimp-tools.c +++ b/app/tools/gimp-tools.c @@ -157,7 +157,9 @@ gimp_tools_init (Gimp *gimp) gimp_rect_select_tool_register }; - gint i; + GList *default_order = NULL; + GList *list; + gint i; g_return_if_fail (GIMP_IS_GIMP (gimp)); @@ -171,13 +173,37 @@ gimp_tools_init (Gimp *gimp) } gimp_container_thaw (gimp->tool_info_list); + + for (list = GIMP_LIST (gimp->tool_info_list)->list; + list; + list = g_list_next (list)) + { + const gchar *identifier = gimp_object_get_name (list->data); + + + default_order = g_list_prepend (default_order, g_strdup (identifier)); + } + + default_order = g_list_reverse (default_order); + + g_object_set_data (G_OBJECT (gimp), "gimp-tools-default-order", default_order); } void gimp_tools_exit (Gimp *gimp) { + GList *default_order; + g_return_if_fail (GIMP_IS_GIMP (gimp)); + default_order = g_object_get_data (G_OBJECT (gimp), + "gimp-tools-default-order"); + + g_list_foreach (default_order, (GFunc) g_free, NULL); + g_list_free (default_order); + + g_object_set_data (G_OBJECT (gimp), "gimp-tools-default-order", NULL); + tool_manager_exit (gimp); } @@ -285,6 +311,15 @@ gimp_tools_save (Gimp *gimp) } } +GList * +gimp_tools_get_default_order (Gimp *gimp) +{ + g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); + + return g_object_get_data (G_OBJECT (gimp), + "gimp-tools-default-order"); +} + /* private functions */ @@ -367,7 +402,7 @@ gimp_tools_register (GType tool_type, stock_id); if (g_type_is_a (tool_type, GIMP_TYPE_IMAGE_MAP_TOOL)) - tool_info->in_toolbox = FALSE; + g_object_set (tool_info, "visible", FALSE, NULL); g_object_set_data (G_OBJECT (tool_info), "gimp-tool-options-gui-func", options_gui_func); diff --git a/app/tools/gimp-tools.h b/app/tools/gimp-tools.h index 4a67a1754f..8cda395aa0 100644 --- a/app/tools/gimp-tools.h +++ b/app/tools/gimp-tools.h @@ -26,5 +26,7 @@ void gimp_tools_exit (Gimp *gimp); void gimp_tools_restore (Gimp *gimp); void gimp_tools_save (Gimp *gimp); +GList *gimp_tools_get_default_order (Gimp *gimp); + #endif /* __GIMP_TOOLS_H__ */ diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am index 7789416a2c..5d6112fcf6 100644 --- a/app/widgets/Makefile.am +++ b/app/widgets/Makefile.am @@ -202,6 +202,8 @@ libappwidgets_a_sources = \ gimptooldialog.h \ gimptooloptionseditor.c \ gimptooloptionseditor.h \ + gimptoolview.c \ + gimptoolview.h \ gimpuimanager.c \ gimpuimanager.h \ gimpundoeditor.c \ diff --git a/app/widgets/gimptoolbox.c b/app/widgets/gimptoolbox.c index 5760eef29e..842123a27a 100644 --- a/app/widgets/gimptoolbox.c +++ b/app/widgets/gimptoolbox.c @@ -83,6 +83,14 @@ static void toolbox_tool_changed (GimpContext *context, GimpToolInfo *tool_info, gpointer data); +static void toolbox_tool_reorder (GimpContainer *container, + GimpToolInfo *tool_info, + gint index, + GtkWidget *wrap_box); +static void toolbox_tool_visible_notify (GimpToolInfo *tool_info, + GParamSpec *pspec, + GtkWidget *button); + static void toolbox_tool_button_toggled (GtkWidget *widget, GimpToolInfo *tool_info); static gboolean toolbox_tool_button_press (GtkWidget *widget, @@ -195,12 +203,6 @@ gimp_toolbox_init (GimpToolbox *toolbox) gtk_box_pack_start (GTK_BOX (vbox), toolbox->wbox, FALSE, FALSE, 0); gtk_widget_show (toolbox->wbox); - - /* A container that keeps references on the buttons that are not - * added to the toolbox. Just to make sure they are freed on exit. - */ - toolbox->trash = gtk_hbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (vbox), toolbox->trash); } static gboolean @@ -256,7 +258,7 @@ gimp_toolbox_size_allocate (GtkWidget *widget, { tool_info = (GimpToolInfo *) list->data; - if (tool_info->in_toolbox) + if (tool_info->visible) n_tools++; } @@ -298,8 +300,6 @@ gimp_toolbox_style_set (GtkWidget *widget, GtkStyle *previous_style) { Gimp *gimp; - GimpToolInfo *tool_info; - GtkWidget *tool_button; GtkIconSize tool_icon_size; GtkReliefStyle relief; GList *list; @@ -321,10 +321,8 @@ gimp_toolbox_style_set (GtkWidget *widget, list; list = g_list_next (list)) { - tool_info = GIMP_TOOL_INFO (list->data); - - if (! tool_info->in_toolbox) - continue; + GimpToolInfo *tool_info = list->data; + GtkWidget *tool_button; tool_button = g_object_get_data (G_OBJECT (tool_info), TOOL_BUTTON_DATA_KEY); @@ -632,21 +630,20 @@ toolbox_create_tools (GimpToolbox *toolbox, group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE); - if (tool_info->in_toolbox) - { - gtk_wrap_box_pack (GTK_WRAP_BOX (toolbox->wbox), button, - FALSE, FALSE, FALSE, FALSE); - gtk_widget_show (button); + gtk_wrap_box_pack (GTK_WRAP_BOX (toolbox->wbox), button, + FALSE, FALSE, FALSE, FALSE); - stock_id = gimp_viewable_get_stock_id (GIMP_VIEWABLE (tool_info)); - image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (button), image); - gtk_widget_show (image); - } - else - { - gtk_container_add (GTK_CONTAINER (toolbox->trash), button); - } + if (tool_info->visible) + gtk_widget_show (button); + + g_signal_connect_object (tool_info, "notify::visible", + G_CALLBACK (toolbox_tool_visible_notify), + button, 0); + + stock_id = gimp_viewable_get_stock_id (GIMP_VIEWABLE (tool_info)); + image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_BUTTON); + gtk_container_add (GTK_CONTAINER (button), image); + gtk_widget_show (image); g_object_set_data (G_OBJECT (tool_info), TOOL_BUTTON_DATA_KEY, button); g_object_set_data (G_OBJECT (button), TOOL_INFO_DATA_KEY, tool_info); @@ -706,6 +703,10 @@ toolbox_create_tools (GimpToolbox *toolbox, gimp_help_set_help_data (button, tool_info->help, tool_info->help_id); #endif } + + g_signal_connect_object (context->gimp->tool_info_list, "reorder", + G_CALLBACK (toolbox_tool_reorder), + toolbox->wbox, 0); } static void @@ -797,6 +798,32 @@ toolbox_tool_changed (GimpContext *context, } } +static void +toolbox_tool_reorder (GimpContainer *container, + GimpToolInfo *tool_info, + gint index, + GtkWidget *wrap_box) +{ + if (tool_info) + { + GtkWidget *button = g_object_get_data (G_OBJECT (tool_info), + TOOL_BUTTON_DATA_KEY); + + gtk_wrap_box_reorder_child (GTK_WRAP_BOX (wrap_box), button, index); + } +} + +static void +toolbox_tool_visible_notify (GimpToolInfo *tool_info, + GParamSpec *pspec, + GtkWidget *button) +{ + if (tool_info->visible) + gtk_widget_show (button); + else + gtk_widget_hide (button); +} + static void toolbox_tool_button_toggled (GtkWidget *widget, GimpToolInfo *tool_info) diff --git a/app/widgets/gimptoolbox.h b/app/widgets/gimptoolbox.h index e8224b4657..07f27eb706 100644 --- a/app/widgets/gimptoolbox.h +++ b/app/widgets/gimptoolbox.h @@ -39,7 +39,6 @@ struct _GimpToolbox GtkWidget *menu_bar; GtkWidget *wbox; - GtkWidget *trash; GtkWidget *color_area; GtkWidget *indicator_area; diff --git a/app/widgets/gimptoolview.c b/app/widgets/gimptoolview.c new file mode 100644 index 0000000000..63b9ffce60 --- /dev/null +++ b/app/widgets/gimptoolview.c @@ -0,0 +1,190 @@ +/* The GIMP -- an image manipulation program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimptoolview.c + * Copyright (C) 2001-2004 Michael Natterer + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "libgimpwidgets/gimpwidgets.h" + +#include "widgets-types.h" + +#include "core/gimp.h" +#include "core/gimpcontainer.h" +#include "core/gimpcontext.h" +#include "core/gimptoolinfo.h" + +#include "tools/tools-types.h" + +#include "tools/gimp-tools.h" +#include "tools/gimpimagemaptool.h" + +#include "gimpcontainerview.h" +#include "gimptoolview.h" +#include "gimphelp-ids.h" + +#include "gimp-intl.h" + + +static void gimp_tool_view_class_init (GimpToolViewClass *klass); +static void gimp_tool_view_init (GimpToolView *view); + +static void gimp_tool_view_reset_clicked (GtkWidget *widget, + GimpToolView *view); +static void gimp_tool_view_select_item (GimpContainerEditor *editor, + GimpViewable *viewable); +static void gimp_tool_view_activate_item (GimpContainerEditor *editor, + GimpViewable *viewable); + + +static GimpContainerEditorClass *parent_class = NULL; + + +GType +gimp_tool_view_get_type (void) +{ + static GType view_type = 0; + + if (! view_type) + { + static const GTypeInfo view_info = + { + sizeof (GimpToolViewClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gimp_tool_view_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GimpToolView), + 0, /* n_preallocs */ + (GInstanceInitFunc) gimp_tool_view_init, + }; + + view_type = g_type_register_static (GIMP_TYPE_CONTAINER_EDITOR, + "GimpToolView", + &view_info, 0); + } + + return view_type; +} + +static void +gimp_tool_view_class_init (GimpToolViewClass *klass) +{ + GimpContainerEditorClass *editor_class = GIMP_CONTAINER_EDITOR_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + editor_class->select_item = gimp_tool_view_select_item; + editor_class->activate_item = gimp_tool_view_activate_item; +} + +static void +gimp_tool_view_init (GimpToolView *view) +{ +} + +GtkWidget * +gimp_tool_view_new (GimpViewType view_type, + GimpContainer *container, + GimpContext *context, + gint preview_size, + gint preview_border_width, + GimpMenuFactory *menu_factory) +{ + GimpToolView *tool_view; + GimpContainerEditor *editor; + + tool_view = g_object_new (GIMP_TYPE_TOOL_VIEW, NULL); + + if (! gimp_container_editor_construct (GIMP_CONTAINER_EDITOR (tool_view), + view_type, + container,context, + preview_size, preview_border_width, + TRUE, /* reorderable */ + menu_factory, "", + "/tools-popup")) + { + g_object_unref (tool_view); + return NULL; + } + + editor = GIMP_CONTAINER_EDITOR (tool_view); + + tool_view->reset_button = + gimp_editor_add_button (GIMP_EDITOR (editor->view), + GIMP_STOCK_RESET, + _("Reset tool order and visibility"), + NULL, + G_CALLBACK (gimp_tool_view_reset_clicked), + NULL, + editor); + + return GTK_WIDGET (tool_view); +} + +static void +gimp_tool_view_reset_clicked (GtkWidget *widget, + GimpToolView *view) +{ + GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (view); + GimpContainer *tool_infos; + GList *list; + gint i = 0; + + tool_infos = editor->view->context->gimp->tool_info_list; + + for (list = gimp_tools_get_default_order (editor->view->context->gimp); + list; + list = g_list_next (list)) + { + GimpObject *object = gimp_container_get_child_by_name (tool_infos, + list->data); + + if (object) + { + gimp_container_reorder (tool_infos, object, i); + + g_object_set (object, "visible", + ! g_type_is_a (GIMP_TOOL_INFO (object)->tool_type, + GIMP_TYPE_IMAGE_MAP_TOOL), + NULL); + + i++; + } + } +} + +static void +gimp_tool_view_select_item (GimpContainerEditor *editor, + GimpViewable *viewable) +{ + if (GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item) + GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item (editor, viewable); +} + +static void +gimp_tool_view_activate_item (GimpContainerEditor *editor, + GimpViewable *viewable) +{ + if (GIMP_CONTAINER_EDITOR_CLASS (parent_class)->activate_item) + GIMP_CONTAINER_EDITOR_CLASS (parent_class)->activate_item (editor, viewable); +} diff --git a/app/widgets/gimptoolview.h b/app/widgets/gimptoolview.h new file mode 100644 index 0000000000..f3fb1be13f --- /dev/null +++ b/app/widgets/gimptoolview.h @@ -0,0 +1,62 @@ +/* The GIMP -- an image manipulation program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimptoolview.h + * Copyright (C) 2001 Michael Natterer + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GIMP_TOOL_VIEW_H__ +#define __GIMP_TOOL_VIEW_H__ + + +#include "gimpcontainereditor.h" + + +#define GIMP_TYPE_TOOL_VIEW (gimp_tool_view_get_type ()) +#define GIMP_TOOL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_TOOL_VIEW, GimpToolView)) +#define GIMP_TOOL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_TOOL_VIEW, GimpToolViewClass)) +#define GIMP_IS_TOOL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_TOOL_VIEW)) +#define GIMP_IS_TOOL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_TOOL_VIEW)) +#define GIMP_TOOL_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_TOOL_VIEW, GimpToolViewClass)) + + +typedef struct _GimpToolViewClass GimpToolViewClass; + +struct _GimpToolView +{ + GimpContainerEditor parent_instance; + + GtkWidget *reset_button; +}; + +struct _GimpToolViewClass +{ + GimpContainerEditorClass parent_class; +}; + + +GType gimp_tool_view_get_type (void) G_GNUC_CONST; + +GtkWidget * gimp_tool_view_new (GimpViewType view_type, + GimpContainer *container, + GimpContext *context, + gint preview_size, + gint preview_border_width, + GimpMenuFactory *menu_factory); + + +#endif /* __GIMP_TOOL_VIEW_H__ */ diff --git a/app/widgets/widgets-types.h b/app/widgets/widgets-types.h index ba27b51d27..09af0b625e 100644 --- a/app/widgets/widgets-types.h +++ b/app/widgets/widgets-types.h @@ -104,6 +104,7 @@ typedef struct _GimpDocumentView GimpDocumentView; typedef struct _GimpFontView GimpFontView; typedef struct _GimpImageView GimpImageView; typedef struct _GimpTemplateView GimpTemplateView; +typedef struct _GimpToolView GimpToolView; typedef struct _GimpDataFactoryView GimpDataFactoryView; typedef struct _GimpBrushFactoryView GimpBrushFactoryView; typedef struct _GimpPatternFactoryView GimpPatternFactoryView; diff --git a/menus/Makefile.am b/menus/Makefile.am index 352d32b228..bfc4ddb3e6 100644 --- a/menus/Makefile.am +++ b/menus/Makefile.am @@ -30,6 +30,7 @@ menudata_DATA = \ qmask-menu.xml \ templates-menu.xml \ tool-options-menu.xml \ + tools-menu.xml \ vectors-menu.xml EXTRA_DIST = \ diff --git a/menus/tools-menu.xml b/menus/tools-menu.xml new file mode 100644 index 0000000000..2c2022c17e --- /dev/null +++ b/menus/tools-menu.xml @@ -0,0 +1,10 @@ + + + + + + + + + +