gimp r25943 - in trunk: . app/tools app/widgets
- From: mitch svn gnome org
- To: svn-commits-list gnome org
- Subject: gimp r25943 - in trunk: . app/tools app/widgets
- Date: Fri, 13 Jun 2008 11:56:46 +0000 (UTC)
Author: mitch
Date: Fri Jun 13 11:56:46 2008
New Revision: 25943
URL: http://svn.gnome.org/viewvc/gimp?rev=25943&view=rev
Log:
2008-06-13 Michael Natterer <mitch gimp org>
* app/widgets/Makefile.am
* app/widgets/widgets-types.h
* app/widgets/gimpsettingsbox.[ch]: new widget containing the
combo and menu button for the image map tool settings plus most of
their logic. Has "import" and "export" signals that might go away
if I figure a way to nicely abstract that. Contains some minor
bugfixes and cosmetic improvements compared to the old code.
* app/tools/gimpimagemaptool.[ch]
* app/tools/gimpimagemaptool-settings.[ch]: changed accordingly,
mostly removal of lots of code that is now in the widget.
Added:
trunk/app/widgets/gimpsettingsbox.c
trunk/app/widgets/gimpsettingsbox.h
Modified:
trunk/ChangeLog
trunk/app/tools/gimpimagemaptool-settings.c
trunk/app/tools/gimpimagemaptool-settings.h
trunk/app/tools/gimpimagemaptool.c
trunk/app/tools/gimpimagemaptool.h
trunk/app/widgets/Makefile.am
trunk/app/widgets/widgets-types.h
Modified: trunk/app/tools/gimpimagemaptool-settings.c
==============================================================================
--- trunk/app/tools/gimpimagemaptool-settings.c (original)
+++ trunk/app/tools/gimpimagemaptool-settings.c Fri Jun 13 11:56:46 2008
@@ -38,9 +38,7 @@
#include "core/gimplist.h"
#include "core/gimptoolinfo.h"
-#include "widgets/gimpcontainercombobox.h"
-#include "widgets/gimpcontainerview.h"
-#include "widgets/gimpwidgets-utils.h"
+#include "widgets/gimpsettingsbox.h"
#include "gimpimagemapoptions.h"
#include "gimpimagemaptool.h"
@@ -51,67 +49,23 @@
/* local function prototypes */
-static void gimp_image_map_tool_recent_deserialize (GimpImageMapTool *im_tool);
-static void gimp_image_map_tool_recent_serialize (GimpImageMapTool *im_tool);
-
-static gboolean
- gimp_image_map_tool_row_separator_func (GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data);
-static void gimp_image_map_tool_recent_selected (GimpContainerView *view,
- GimpViewable *object,
- gpointer insert_data,
- GimpImageMapTool *tool);
-
-static gboolean gimp_image_map_tool_menu_press (GtkWidget *widget,
- GdkEventButton *bevent,
- GimpImageMapTool *tool);
-static void gimp_image_map_tool_favorite_activate (GtkWidget *widget,
- GimpImageMapTool *tool);
-static void gimp_image_map_tool_import_activate (GtkWidget *widget,
- GimpImageMapTool *tool);
-static void gimp_image_map_tool_export_activate (GtkWidget *widget,
- GimpImageMapTool *tool);
-
-static void gimp_image_map_tool_settings_dialog (GimpImageMapTool *im_tool,
- const gchar *title,
- gboolean save);
-
-static void gimp_image_map_tool_favorite_callback (GtkWidget *query_box,
- const gchar *string,
- gpointer data);
-static gboolean gimp_image_map_tool_settings_import(GimpImageMapTool *tool,
- const gchar *filename);
-static gboolean gimp_image_map_tool_settings_export(GimpImageMapTool *tool,
- const gchar *filename);
+static void gimp_image_map_tool_import_activate (GtkWidget *widget,
+ GimpImageMapTool *tool);
+static void gimp_image_map_tool_export_activate (GtkWidget *widget,
+ GimpImageMapTool *tool);
+
+static void gimp_image_map_tool_settings_dialog (GimpImageMapTool *im_tool,
+ const gchar *title,
+ gboolean save);
+
+static gboolean gimp_image_map_tool_settings_import (GimpImageMapTool *tool,
+ const gchar *filename);
+static gboolean gimp_image_map_tool_settings_export (GimpImageMapTool *tool,
+ const gchar *filename);
/* public functions */
-static GtkWidget *
-gimp_image_map_tool_menu_item_add (GimpImageMapTool *image_map_tool,
- const gchar *stock_id,
- const gchar *label,
- GCallback callback)
-{
- GtkWidget *item;
- GtkWidget *image;
-
- item = gtk_image_menu_item_new_with_mnemonic (label);
- image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
-
- gtk_menu_shell_append (GTK_MENU_SHELL (image_map_tool->favorites_menu),
- item);
- gtk_widget_show (item);
-
- g_signal_connect (item, "activate",
- callback,
- image_map_tool);
-
- return item;
-}
-
gboolean
gimp_image_map_tool_add_settings_gui (GimpImageMapTool *image_map_tool)
{
@@ -119,17 +73,12 @@
GimpToolInfo *tool_info;
GtkWidget *hbox;
GtkWidget *label;
- GtkWidget *combo;
- GtkWidget *button;
- GtkWidget *arrow;
+ gchar *filename;
klass = GIMP_IMAGE_MAP_TOOL_GET_CLASS (image_map_tool);
tool_info = GIMP_TOOL (image_map_tool)->tool_info;
- if (gimp_container_num_children (klass->recent_settings) == 0)
- gimp_image_map_tool_recent_deserialize (image_map_tool);
-
hbox = gtk_hbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (image_map_tool->main_vbox), hbox,
FALSE, FALSE, 0);
@@ -143,108 +92,36 @@
gtk_size_group_add_widget (image_map_tool->label_group, label);
g_object_unref (image_map_tool->label_group);
- combo = gimp_container_combo_box_new (klass->recent_settings,
- GIMP_CONTEXT (tool_info->tool_options),
- 16, 0);
- gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combo),
- gimp_image_map_tool_row_separator_func,
- NULL, NULL);
- gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0);
- gtk_widget_show (combo);
-
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
-
- gimp_help_set_help_data (combo, _("Pick a setting from the list"),
- NULL);
-
- g_signal_connect_after (combo, "select-item",
- G_CALLBACK (gimp_image_map_tool_recent_selected),
- image_map_tool);
-
- button = gtk_button_new ();
- GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
- gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
- gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
- gtk_widget_show (button);
-
- arrow = gtk_image_new_from_stock (GIMP_STOCK_MENU_LEFT, GTK_ICON_SIZE_MENU);
- gtk_container_add (GTK_CONTAINER (button), arrow);
- gtk_widget_show (arrow);
-
- g_signal_connect (button, "button-press-event",
- G_CALLBACK (gimp_image_map_tool_menu_press),
- image_map_tool);
-
- /* Favorites menu */
+ filename = gimp_tool_info_build_options_filename (tool_info, ".settings");
- image_map_tool->favorites_menu = gtk_menu_new ();
- gtk_menu_attach_to_widget (GTK_MENU (image_map_tool->favorites_menu),
- button, NULL);
-
- gimp_image_map_tool_menu_item_add (image_map_tool,
- GTK_STOCK_ADD,
- _("Add Settings to _Favorites"),
- G_CALLBACK (gimp_image_map_tool_favorite_activate));
-
- image_map_tool->import_item =
- gimp_image_map_tool_menu_item_add (image_map_tool,
- GTK_STOCK_OPEN,
- _("_Import Settings from File"),
- G_CALLBACK (gimp_image_map_tool_import_activate));
-
- image_map_tool->export_item =
- gimp_image_map_tool_menu_item_add (image_map_tool,
- GTK_STOCK_SAVE,
- _("_Export Settings to File"),
- G_CALLBACK (gimp_image_map_tool_export_activate));
+ image_map_tool->settings_box = gimp_settings_box_new (tool_info->gimp,
+ image_map_tool->config,
+ klass->recent_settings,
+ filename);
+ gtk_box_pack_start (GTK_BOX (hbox), image_map_tool->settings_box,
+ TRUE, TRUE, 0);
+ gtk_widget_show (image_map_tool->settings_box);
- return TRUE;
-}
-
-void
-gimp_image_map_tool_add_recent_settings (GimpImageMapTool *image_map_tool)
-{
- GimpContainer *recent;
- GimpConfig *current;
- GimpConfig *config = NULL;
- GList *list;
-
- recent = GIMP_IMAGE_MAP_TOOL_GET_CLASS (image_map_tool)->recent_settings;
- current = GIMP_CONFIG (image_map_tool->config);
-
- for (list = GIMP_LIST (recent)->list; list; list = g_list_next (list))
- {
- config = list->data;
+ g_free (filename);
- if (GIMP_IMAGE_MAP_CONFIG (config)->time > 0 &&
- gimp_config_is_equal_to (config, current))
- {
- g_object_set (current,
- "time", (guint) time (NULL),
- NULL);
- break;
- }
- }
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label),
+ GIMP_SETTINGS_BOX (image_map_tool->settings_box)->combo);
- if (! list)
- {
- config = gimp_config_duplicate (current);
- g_object_set (config,
- "time", (guint) time (NULL),
- NULL);
-
- gimp_container_insert (recent, GIMP_OBJECT (config), 0);
- g_object_unref (config);
- }
+ g_signal_connect (image_map_tool->settings_box, "import",
+ G_CALLBACK (gimp_image_map_tool_import_activate),
+ image_map_tool);
+ g_signal_connect (image_map_tool->settings_box, "export",
+ G_CALLBACK (gimp_image_map_tool_export_activate),
+ image_map_tool);
- gimp_image_map_tool_recent_serialize (image_map_tool);
+ return TRUE;
}
gboolean
-gimp_image_map_tool_real_settings_import (GimpImageMapTool *tool,
- const gchar *filename,
- GError **error)
+gimp_image_map_tool_real_settings_import (GimpImageMapTool *tool,
+ const gchar *filename,
+ GError **error)
{
gboolean success;
@@ -259,9 +136,9 @@
}
gboolean
-gimp_image_map_tool_real_settings_export (GimpImageMapTool *tool,
- const gchar *filename,
- GError **error)
+gimp_image_map_tool_real_settings_export (GimpImageMapTool *tool,
+ const gchar *filename,
+ GError **error)
{
GimpImageMapToolClass *klass = GIMP_IMAGE_MAP_TOOL_GET_CLASS (tool);
gchar *header;
@@ -289,165 +166,6 @@
/* private functions */
static void
-gimp_image_map_tool_separator_add (GimpContainer *container)
-{
- GimpObject *sep = g_object_new (GIMP_TYPE_IMAGE_MAP_CONFIG, NULL);
-
- gimp_container_add (container, sep);
- g_object_unref (sep);
-
- g_object_set_data (G_OBJECT (container), "separator", sep);
-}
-
-static void
-gimp_image_map_tool_separator_remove (GimpContainer *container)
-{
- GimpObject *sep = g_object_get_data (G_OBJECT (container), "separator");
-
- gimp_container_remove (container, sep);
-
- g_object_set_data (G_OBJECT (container), "separator", NULL);
-}
-
-static void
-gimp_image_map_tool_recent_deserialize (GimpImageMapTool *im_tool)
-{
- GimpImageMapToolClass *klass = GIMP_IMAGE_MAP_TOOL_GET_CLASS (im_tool);
- GimpToolInfo *tool_info = GIMP_TOOL (im_tool)->tool_info;
- gchar *filename;
- GError *error = NULL;
-
- filename = gimp_tool_info_build_options_filename (tool_info,
- ".settings");
-
- if (tool_info->gimp->be_verbose)
- g_print ("Parsing '%s'\n", gimp_filename_to_utf8 (filename));
-
- if (! gimp_config_deserialize_file (GIMP_CONFIG (klass->recent_settings),
- filename,
- NULL, &error))
- {
- if (error->code != GIMP_CONFIG_ERROR_OPEN_ENOENT)
- gimp_message (tool_info->gimp, NULL, GIMP_MESSAGE_ERROR,
- "%s", error->message);
-
- g_clear_error (&error);
- }
-
- g_free (filename);
-
- gimp_image_map_tool_separator_add (klass->recent_settings);
-}
-
-static void
-gimp_image_map_tool_recent_serialize (GimpImageMapTool *im_tool)
-{
- GimpImageMapToolClass *klass = GIMP_IMAGE_MAP_TOOL_GET_CLASS (im_tool);
- GimpToolInfo *tool_info = GIMP_TOOL (im_tool)->tool_info;
- gchar *filename;
- GError *error = NULL;
-
- gimp_image_map_tool_separator_remove (klass->recent_settings);
-
- filename = gimp_tool_info_build_options_filename (tool_info,
- ".settings");
-
- if (tool_info->gimp->be_verbose)
- g_print ("Writing '%s'\n", gimp_filename_to_utf8 (filename));
-
- if (! gimp_config_serialize_to_file (GIMP_CONFIG (klass->recent_settings),
- filename,
- "tool settings",
- "end of tool settings",
- NULL, &error))
- {
- gimp_message (tool_info->gimp, NULL, GIMP_MESSAGE_ERROR,
- "%s", error->message);
- g_clear_error (&error);
- }
-
- g_free (filename);
-
- gimp_image_map_tool_separator_add (klass->recent_settings);
-}
-
-static gboolean
-gimp_image_map_tool_row_separator_func (GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- gchar *name = NULL;
-
-#ifdef __GNUC__
-#warning FIXME: dont use magic model column
-#endif
- gtk_tree_model_get (model, iter,
- 1, &name,
- -1);
-
- g_free (name);
-
- return name == NULL;
-}
-
-static void
-gimp_image_map_tool_recent_selected (GimpContainerView *view,
- GimpViewable *object,
- gpointer insert_data,
- GimpImageMapTool *tool)
-{
- if (object)
- {
- gimp_config_copy (GIMP_CONFIG (object),
- GIMP_CONFIG (tool->config), 0);
-
- gimp_container_view_select_item (view, NULL);
- }
-}
-
-static void
-gimp_image_map_tool_menu_position (GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer user_data)
-{
- gimp_button_menu_position (user_data, menu, GTK_POS_LEFT, x, y);
-}
-
-static gboolean
-gimp_image_map_tool_menu_press (GtkWidget *widget,
- GdkEventButton *bevent,
- GimpImageMapTool *tool)
-{
- if (bevent->type == GDK_BUTTON_PRESS)
- {
- gtk_menu_popup (GTK_MENU (tool->favorites_menu),
- NULL, NULL,
- gimp_image_map_tool_menu_position, widget,
- bevent->button, bevent->time);
- }
-
- return TRUE;
-}
-
-static void
-gimp_image_map_tool_favorite_activate (GtkWidget *widget,
- GimpImageMapTool *tool)
-{
- GtkWidget *dialog;
-
- dialog = gimp_query_string_box (_("Add Settings to Favorites"),
- tool->shell,
- gimp_standard_help_func, NULL,
- _("Enter a name for the settings"),
- _("Saved Settings"),
- G_OBJECT (tool->shell), "hide",
- gimp_image_map_tool_favorite_callback, tool);
- gtk_widget_show (dialog);
-}
-
-static void
gimp_image_map_tool_import_activate (GtkWidget *widget,
GimpImageMapTool *tool)
{
@@ -489,9 +207,9 @@
}
if (save)
- gtk_widget_set_sensitive (tool->import_item, TRUE);
+ gtk_widget_set_sensitive (GIMP_SETTINGS_BOX (tool->settings_box)->import_item, TRUE);
else
- gtk_widget_set_sensitive (tool->export_item, TRUE);
+ gtk_widget_set_sensitive (GIMP_SETTINGS_BOX (tool->settings_box)->export_item, TRUE);
gtk_widget_destroy (dialog);
}
@@ -517,9 +235,9 @@
}
if (save)
- gtk_widget_set_sensitive (tool->import_item, FALSE);
+ gtk_widget_set_sensitive (GIMP_SETTINGS_BOX (tool->settings_box)->import_item, FALSE);
else
- gtk_widget_set_sensitive (tool->export_item, FALSE);
+ gtk_widget_set_sensitive (GIMP_SETTINGS_BOX (tool->settings_box)->export_item, FALSE);
tool->settings_dialog =
gtk_file_chooser_dialog_new (title, GTK_WINDOW (tool->shell),
@@ -582,23 +300,6 @@
gtk_widget_show (tool->settings_dialog);
}
-static void
-gimp_image_map_tool_favorite_callback (GtkWidget *query_box,
- const gchar *string,
- gpointer data)
-{
- GimpImageMapTool *tool = GIMP_IMAGE_MAP_TOOL (data);
- GimpConfig *config;
-
- config = gimp_config_duplicate (GIMP_CONFIG (tool->config));
- gimp_object_set_name (GIMP_OBJECT (config), string);
- gimp_container_add (GIMP_IMAGE_MAP_TOOL_GET_CLASS (tool)->recent_settings,
- GIMP_OBJECT (config));
- g_object_unref (config);
-
- gimp_image_map_tool_recent_serialize (tool);
-}
-
static gboolean
gimp_image_map_tool_settings_import (GimpImageMapTool *tool,
const gchar *filename)
Modified: trunk/app/tools/gimpimagemaptool-settings.h
==============================================================================
--- trunk/app/tools/gimpimagemaptool-settings.h (original)
+++ trunk/app/tools/gimpimagemaptool-settings.h Fri Jun 13 11:56:46 2008
@@ -24,8 +24,6 @@
gboolean gimp_image_map_tool_add_settings_gui (GimpImageMapTool *image_map_tool);
-void gimp_image_map_tool_add_recent_settings (GimpImageMapTool *image_map_tool);
-
gboolean gimp_image_map_tool_real_settings_import (GimpImageMapTool *tool,
const gchar *filename,
GError **error);
Modified: trunk/app/tools/gimpimagemaptool.c
==============================================================================
--- trunk/app/tools/gimpimagemaptool.c (original)
+++ trunk/app/tools/gimpimagemaptool.c Fri Jun 13 11:56:46 2008
@@ -42,6 +42,7 @@
#include "core/gimptoolinfo.h"
#include "widgets/gimpdialogfactory.h"
+#include "widgets/gimpsettingsbox.h"
#include "widgets/gimptooldialog.h"
#include "widgets/gimpwidgets-utils.h"
@@ -171,7 +172,7 @@
static void
gimp_image_map_tool_base_init (GimpImageMapToolClass *klass)
{
- klass->recent_settings = gimp_list_new (GIMP_TYPE_VIEWABLE, TRUE);
+ klass->recent_settings = gimp_list_new (GIMP_TYPE_IMAGE_MAP_CONFIG, TRUE);
gimp_list_set_sort_func (GIMP_LIST (klass->recent_settings),
(GCompareFunc) gimp_image_map_config_compare);
}
@@ -196,9 +197,8 @@
image_map_tool->shell = NULL;
image_map_tool->main_vbox = NULL;
- image_map_tool->favorites_menu = NULL;
- image_map_tool->import_item = NULL;
- image_map_tool->export_item = NULL;
+ image_map_tool->settings_box = NULL;
+ image_map_tool->label_group = NULL;
image_map_tool->settings_dialog = NULL;
}
@@ -243,11 +243,10 @@
if (image_map_tool->shell)
{
gtk_widget_destroy (image_map_tool->shell);
- image_map_tool->shell = NULL;
- image_map_tool->main_vbox = NULL;
- image_map_tool->favorites_menu = NULL;
- image_map_tool->import_item = NULL;
- image_map_tool->export_item = NULL;
+ image_map_tool->shell = NULL;
+ image_map_tool->main_vbox = NULL;
+ image_map_tool->settings_box = NULL;
+ image_map_tool->label_group = NULL;
}
G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -549,7 +548,7 @@
gimp_image_flush (tool->display->image);
if (image_map_tool->config)
- gimp_image_map_tool_add_recent_settings (image_map_tool);
+ gimp_settings_box_add_current (GIMP_SETTINGS_BOX (image_map_tool->settings_box));
}
tool->display = NULL;
Modified: trunk/app/tools/gimpimagemaptool.h
==============================================================================
--- trunk/app/tools/gimpimagemaptool.h (original)
+++ trunk/app/tools/gimpimagemaptool.h Fri Jun 13 11:56:46 2008
@@ -51,9 +51,7 @@
/* dialog */
GtkWidget *shell;
GtkWidget *main_vbox;
- GtkWidget *favorites_menu;
- GtkWidget *import_item;
- GtkWidget *export_item;
+ GtkWidget *settings_box;
GtkSizeGroup *label_group;
/* settings file dialog */
Modified: trunk/app/widgets/Makefile.am
==============================================================================
--- trunk/app/widgets/Makefile.am (original)
+++ trunk/app/widgets/Makefile.am Fri Jun 13 11:56:46 2008
@@ -255,6 +255,8 @@
gimpsessioninfo-dock.h \
gimpsessioninfo-dockable.c \
gimpsessioninfo-dockable.h \
+ gimpsettingsbox.c \
+ gimpsettingsbox.h \
gimpsizebox.c \
gimpsizebox.h \
gimpstringaction.c \
Added: trunk/app/widgets/gimpsettingsbox.c
==============================================================================
--- (empty file)
+++ trunk/app/widgets/gimpsettingsbox.c Fri Jun 13 11:56:46 2008
@@ -0,0 +1,598 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpsettingsbox.c
+ * Copyright (C) 2008 Michael Natterer <mitch gimp 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
+ * 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 <gtk/gtk.h>
+
+#include "libgimpbase/gimpbase.h"
+#include "libgimpconfig/gimpconfig.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "widgets-types.h"
+
+#include "core/gimp.h"
+#include "core/gimplist.h"
+
+#include "gimpcontainercombobox.h"
+#include "gimpcontainerview.h"
+#include "gimpsettingsbox.h"
+#include "gimpwidgets-utils.h"
+
+#include "gimp-intl.h"
+
+
+enum
+{
+ IMPORT,
+ EXPORT,
+ LAST_SIGNAL
+};
+
+enum
+{
+ PROP_0,
+ PROP_GIMP,
+ PROP_CONFIG,
+ PROP_CONTAINER,
+ PROP_FILENAME
+};
+
+
+static GObject * gimp_settings_box_constructor (GType type,
+ guint n_params,
+ GObjectConstructParam *params);
+static void gimp_settings_box_finalize (GObject *object);
+static void gimp_settings_box_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void gimp_settings_box_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+
+static void gimp_settings_box_deserialize (GimpSettingsBox *box);
+static void gimp_settings_box_serialize (GimpSettingsBox *box);
+static GtkWidget *
+ gimp_settings_box_menu_item_add (GimpSettingsBox *box,
+ const gchar *stock_id,
+ const gchar *label,
+ GCallback callback);
+static gboolean
+ gimp_settings_box_row_separator_func (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data);
+static void gimp_settings_box_setting_selected (GimpContainerView *view,
+ GimpViewable *object,
+ gpointer insert_data,
+ GimpSettingsBox *box);
+static gboolean gimp_settings_box_menu_press (GtkWidget *widget,
+ GdkEventButton *bevent,
+ GimpSettingsBox *box);
+static void gimp_settings_box_favorite_activate (GtkWidget *widget,
+ GimpSettingsBox *box);
+static void gimp_settings_box_import_activate (GtkWidget *widget,
+ GimpSettingsBox *box);
+static void gimp_settings_box_export_activate (GtkWidget *widget,
+ GimpSettingsBox *box);
+
+static void gimp_settings_box_favorite_callback (GtkWidget *query_box,
+ const gchar *string,
+ gpointer data);
+
+
+G_DEFINE_TYPE (GimpSettingsBox, gimp_settings_box, GTK_TYPE_HBOX)
+
+#define parent_class gimp_settings_box_parent_class
+
+static guint settings_box_signals[LAST_SIGNAL] = { 0 };
+
+
+static void
+gimp_settings_box_class_init (GimpSettingsBoxClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ settings_box_signals[IMPORT] =
+ g_signal_new ("import",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GimpSettingsBoxClass, import),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ settings_box_signals[EXPORT] =
+ g_signal_new ("export",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GimpSettingsBoxClass, export),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ object_class->constructor = gimp_settings_box_constructor;
+ object_class->finalize = gimp_settings_box_finalize;
+ object_class->set_property = gimp_settings_box_set_property;
+ object_class->get_property = gimp_settings_box_get_property;
+
+ g_object_class_install_property (object_class, PROP_GIMP,
+ g_param_spec_object ("gimp",
+ NULL, NULL,
+ GIMP_TYPE_GIMP,
+ GIMP_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
+
+ g_object_class_install_property (object_class, PROP_CONFIG,
+ g_param_spec_object ("config",
+ NULL, NULL,
+ GIMP_TYPE_CONFIG,
+ GIMP_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
+
+ g_object_class_install_property (object_class, PROP_CONTAINER,
+ g_param_spec_object ("container",
+ NULL, NULL,
+ GIMP_TYPE_CONTAINER,
+ GIMP_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
+
+ g_object_class_install_property (object_class, PROP_FILENAME,
+ g_param_spec_string ("filename",
+ NULL, NULL,
+ NULL,
+ GIMP_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
+}
+
+static void
+gimp_settings_box_init (GimpSettingsBox *box)
+{
+ gtk_box_set_spacing (GTK_BOX (box), 6);
+}
+
+static GObject *
+gimp_settings_box_constructor (GType type,
+ guint n_params,
+ GObjectConstructParam *params)
+{
+ GObject *object;
+ GimpSettingsBox *box;
+ GtkWidget *button;
+ GtkWidget *arrow;
+
+ object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
+
+ box = GIMP_SETTINGS_BOX (object);
+
+ g_assert (GIMP_IS_GIMP (box->gimp));
+ g_assert (GIMP_IS_CONFIG (box->config));
+ g_assert (GIMP_IS_CONTAINER (box->container));
+ g_assert (box->filename != NULL);
+
+ if (gimp_container_num_children (box->container) == 0)
+ gimp_settings_box_deserialize (box);
+
+ box->combo = gimp_container_combo_box_new (box->container,
+ gimp_get_user_context (box->gimp),
+ 16, 0);
+ gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (box->combo),
+ gimp_settings_box_row_separator_func,
+ NULL, NULL);
+ gtk_box_pack_start (GTK_BOX (box), box->combo, TRUE, TRUE, 0);
+ gtk_widget_show (box->combo);
+
+ gimp_help_set_help_data (box->combo, _("Pick a setting from the list"),
+ NULL);
+
+ g_signal_connect_after (box->combo, "select-item",
+ G_CALLBACK (gimp_settings_box_setting_selected),
+ box);
+
+ button = gtk_button_new ();
+ GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
+ gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+ gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
+ gtk_widget_show (button);
+
+ arrow = gtk_image_new_from_stock (GIMP_STOCK_MENU_LEFT, GTK_ICON_SIZE_MENU);
+ gtk_container_add (GTK_CONTAINER (button), arrow);
+ gtk_widget_show (arrow);
+
+ g_signal_connect (button, "button-press-event",
+ G_CALLBACK (gimp_settings_box_menu_press),
+ box);
+
+ /* Favorites menu */
+
+ box->menu = gtk_menu_new ();
+ gtk_menu_attach_to_widget (GTK_MENU (box->menu), button, NULL);
+
+ gimp_settings_box_menu_item_add (box,
+ GTK_STOCK_ADD,
+ _("Add Settings to _Favorites..."),
+ G_CALLBACK (gimp_settings_box_favorite_activate));
+
+ box->import_item =
+ gimp_settings_box_menu_item_add (box,
+ GTK_STOCK_OPEN,
+ _("_Import Settings from File..."),
+ G_CALLBACK (gimp_settings_box_import_activate));
+
+ box->export_item =
+ gimp_settings_box_menu_item_add (box,
+ GTK_STOCK_SAVE,
+ _("_Export Settings to File..."),
+ G_CALLBACK (gimp_settings_box_export_activate));
+
+ return object;
+}
+
+static void
+gimp_settings_box_finalize (GObject *object)
+{
+ GimpSettingsBox *box = GIMP_SETTINGS_BOX (object);
+
+ if (box->config)
+ {
+ g_object_unref (box->config);
+ box->config = NULL;
+ }
+
+ if (box->container)
+ {
+ g_object_unref (box->container);
+ box->container = NULL;
+ }
+
+ if (box->filename)
+ {
+ g_free (box->filename);
+ box->filename = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gimp_settings_box_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GimpSettingsBox *box = GIMP_SETTINGS_BOX (object);
+
+ switch (property_id)
+ {
+ case PROP_GIMP:
+ box->gimp = g_value_get_object (value); /* don't dup */
+ break;
+
+ case PROP_CONFIG:
+ box->config = g_value_dup_object (value);
+ break;
+
+ case PROP_CONTAINER:
+ box->container = g_value_dup_object (value);
+ break;
+
+ case PROP_FILENAME:
+ box->filename = g_value_dup_string (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gimp_settings_box_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GimpSettingsBox *box = GIMP_SETTINGS_BOX (object);
+
+ switch (property_id)
+ {
+ case PROP_GIMP:
+ g_value_set_object (value, box->gimp);
+ break;
+
+ case PROP_CONFIG:
+ g_value_set_object (value, box->config);
+ break;
+
+ case PROP_CONTAINER:
+ g_value_set_object (value, box->container);
+ break;
+
+ case PROP_FILENAME:
+ g_value_set_string (value, box->filename);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gimp_settings_box_separator_add (GimpContainer *container)
+{
+ GimpObject *sep = g_object_new (container->children_type, NULL);
+
+ gimp_container_add (container, sep);
+ g_object_unref (sep);
+
+ g_object_set_data (G_OBJECT (container), "separator", sep);
+}
+
+static void
+gimp_settings_box_separator_remove (GimpContainer *container)
+{
+ GimpObject *sep = g_object_get_data (G_OBJECT (container), "separator");
+
+ gimp_container_remove (container, sep);
+
+ g_object_set_data (G_OBJECT (container), "separator", NULL);
+}
+
+static void
+gimp_settings_box_deserialize (GimpSettingsBox *box)
+{
+ GError *error = NULL;
+
+ if (box->gimp->be_verbose)
+ g_print ("Parsing '%s'\n", gimp_filename_to_utf8 (box->filename));
+
+ if (! gimp_config_deserialize_file (GIMP_CONFIG (box->container),
+ box->filename,
+ NULL, &error))
+ {
+ if (error->code != GIMP_CONFIG_ERROR_OPEN_ENOENT)
+ gimp_message (box->gimp, NULL, GIMP_MESSAGE_ERROR,
+ "%s", error->message);
+
+ g_clear_error (&error);
+ }
+
+ gimp_settings_box_separator_add (box->container);
+}
+
+static void
+gimp_settings_box_serialize (GimpSettingsBox *box)
+{
+ GError *error = NULL;
+
+ gimp_settings_box_separator_remove (box->container);
+
+ if (box->gimp->be_verbose)
+ g_print ("Writing '%s'\n", gimp_filename_to_utf8 (box->filename));
+
+ if (! gimp_config_serialize_to_file (GIMP_CONFIG (box->container),
+ box->filename,
+ "settings",
+ "end of settings",
+ NULL, &error))
+ {
+ gimp_message (box->gimp, NULL, GIMP_MESSAGE_ERROR,
+ "%s", error->message);
+ g_clear_error (&error);
+ }
+
+ gimp_settings_box_separator_add (box->container);
+}
+
+static GtkWidget *
+gimp_settings_box_menu_item_add (GimpSettingsBox *box,
+ const gchar *stock_id,
+ const gchar *label,
+ GCallback callback)
+{
+ GtkWidget *item;
+ GtkWidget *image;
+
+ item = gtk_image_menu_item_new_with_mnemonic (label);
+ image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (box->menu), item);
+ gtk_widget_show (item);
+
+ g_signal_connect (item, "activate",
+ callback,
+ box);
+
+ return item;
+}
+
+static gboolean
+gimp_settings_box_row_separator_func (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ gchar *name = NULL;
+
+#ifdef __GNUC__
+#warning FIXME: dont use magic model column
+#endif
+ gtk_tree_model_get (model, iter,
+ 1, &name,
+ -1);
+
+ g_free (name);
+
+ return name == NULL;
+}
+
+static void
+gimp_settings_box_setting_selected (GimpContainerView *view,
+ GimpViewable *object,
+ gpointer insert_data,
+ GimpSettingsBox *box)
+{
+ if (object)
+ {
+ gimp_config_copy (GIMP_CONFIG (object),
+ GIMP_CONFIG (box->config), 0);
+
+ gimp_container_view_select_item (view, NULL);
+ }
+}
+
+static void
+gimp_settings_box_menu_position (GtkMenu *menu,
+ gint *x,
+ gint *y,
+ gboolean *push_in,
+ gpointer user_data)
+{
+ gimp_button_menu_position (user_data, menu, GTK_POS_LEFT, x, y);
+}
+
+static gboolean
+gimp_settings_box_menu_press (GtkWidget *widget,
+ GdkEventButton *bevent,
+ GimpSettingsBox *box)
+{
+ if (bevent->type == GDK_BUTTON_PRESS)
+ {
+ gtk_menu_popup (GTK_MENU (box->menu),
+ NULL, NULL,
+ gimp_settings_box_menu_position, widget,
+ bevent->button, bevent->time);
+ }
+
+ return TRUE;
+}
+
+static void
+gimp_settings_box_favorite_activate (GtkWidget *widget,
+ GimpSettingsBox *box)
+{
+ GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
+ GtkWidget *dialog;
+
+ dialog = gimp_query_string_box (_("Add Settings to Favorites"),
+ toplevel,
+ gimp_standard_help_func, NULL,
+ _("Enter a name for the settings"),
+ _("Saved Settings"),
+ G_OBJECT (toplevel), "hide",
+ gimp_settings_box_favorite_callback, box);
+ gtk_widget_show (dialog);
+}
+
+static void
+gimp_settings_box_import_activate (GtkWidget *widget,
+ GimpSettingsBox *box)
+{
+ g_signal_emit (box, settings_box_signals[IMPORT], 0);
+}
+
+static void
+gimp_settings_box_export_activate (GtkWidget *widget,
+ GimpSettingsBox *box)
+{
+ g_signal_emit (box, settings_box_signals[EXPORT], 0);
+}
+
+static void
+gimp_settings_box_favorite_callback (GtkWidget *query_box,
+ const gchar *string,
+ gpointer data)
+{
+ GimpSettingsBox *box = GIMP_SETTINGS_BOX (data);
+ GimpConfig *config;
+
+ config = gimp_config_duplicate (GIMP_CONFIG (box->config));
+ gimp_object_set_name (GIMP_OBJECT (config), string);
+ gimp_container_add (box->container, GIMP_OBJECT (config));
+ g_object_unref (config);
+
+ gimp_settings_box_serialize (box);
+}
+
+
+/* public functions */
+
+GtkWidget *
+gimp_settings_box_new (Gimp *gimp,
+ GObject *config,
+ GimpContainer *container,
+ const gchar *filename)
+{
+ g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
+ g_return_val_if_fail (GIMP_IS_CONFIG (config), NULL);
+ g_return_val_if_fail (GIMP_IS_CONTAINER (container), NULL);
+ g_return_val_if_fail (filename != NULL, NULL);
+
+ return g_object_new (GIMP_TYPE_SETTINGS_BOX,
+ "gimp", gimp,
+ "config", config,
+ "container", container,
+ "filename", filename,
+ NULL);
+}
+
+void
+gimp_settings_box_add_current (GimpSettingsBox *box)
+{
+ GimpConfig *config = NULL;
+ GList *list;
+
+ g_return_if_fail (GIMP_IS_SETTINGS_BOX (box));
+
+ for (list = GIMP_LIST (box->container)->list; list; list = g_list_next (list))
+ {
+ guint t;
+
+ config = list->data;
+
+ g_object_get (config,
+ "time", &t,
+ NULL);
+
+ if (t > 0 && gimp_config_is_equal_to (config, GIMP_CONFIG (box->config)))
+ {
+ g_object_set (config,
+ "time", (guint) time (NULL),
+ NULL);
+ break;
+ }
+ }
+
+ if (! list)
+ {
+ config = gimp_config_duplicate (GIMP_CONFIG (box->config));
+ g_object_set (config,
+ "time", (guint) time (NULL),
+ NULL);
+
+ gimp_container_insert (box->container, GIMP_OBJECT (config), 0);
+ g_object_unref (config);
+ }
+
+ gimp_settings_box_serialize (box);
+}
Added: trunk/app/widgets/gimpsettingsbox.h
==============================================================================
--- (empty file)
+++ trunk/app/widgets/gimpsettingsbox.h Fri Jun 13 11:56:46 2008
@@ -0,0 +1,70 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpsettingsbox.h
+ * Copyright (C) 2008 Michael Natterer <mitch gimp 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
+ * 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_SETTINGS_BOX_H__
+#define __GIMP_SETTINGS_BOX_H__
+
+
+#define GIMP_TYPE_SETTINGS_BOX (gimp_settings_box_get_type ())
+#define GIMP_SETTINGS_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_SETTINGS_BOX, GimpSettingsBox))
+#define GIMP_SETTINGS_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_SETTINGS_BOX, GimpSettingsBoxClass))
+#define GIMP_IS_SETTINGS_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_SETTINGS_BOX))
+#define GIMP_IS_SETTINGS_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_SETTINGS_BOX))
+#define GIMP_SETTINGS_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_SETTINGS_BOX, GimpSettingsBoxClass))
+
+
+typedef struct _GimpSettingsBoxClass GimpSettingsBoxClass;
+
+struct _GimpSettingsBox
+{
+ GtkHBox parent_instance;
+
+ GtkWidget *combo;
+ GtkWidget *menu;
+ GtkWidget *import_item;
+ GtkWidget *export_item;
+
+ Gimp *gimp;
+ GObject *config;
+ GimpContainer *container;
+ gchar *filename;
+};
+
+struct _GimpSettingsBoxClass
+{
+ GtkHBoxClass parent_class;
+
+ void (* import) (GimpSettingsBox *box);
+ void (* export) (GimpSettingsBox *box);
+};
+
+
+GType gimp_settings_box_get_type (void) G_GNUC_CONST;
+
+GtkWidget * gimp_settings_box_new (Gimp *gimp,
+ GObject *config,
+ GimpContainer *container,
+ const gchar *filename);
+
+void gimp_settings_box_add_current (GimpSettingsBox *box);
+
+
+#endif /* __GIMP_SETTINGS_BOX_H__ */
Modified: trunk/app/widgets/widgets-types.h
==============================================================================
--- trunk/app/widgets/widgets-types.h (original)
+++ trunk/app/widgets/widgets-types.h Fri Jun 13 11:56:46 2008
@@ -175,6 +175,7 @@
typedef struct _GimpMessageBox GimpMessageBox;
typedef struct _GimpProgressBox GimpProgressBox;
typedef struct _GimpScaleButton GimpScaleButton;
+typedef struct _GimpSettingsBox GimpSettingsBox;
typedef struct _GimpSizeBox GimpSizeBox;
typedef struct _GimpStrokeEditor GimpStrokeEditor;
typedef struct _GimpTemplateEditor GimpTemplateEditor;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]