summaryrefslogtreecommitdiffstats
path: root/app/actions/tool-options-actions.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/actions/tool-options-actions.c')
-rw-r--r--app/actions/tool-options-actions.c238
1 files changed, 238 insertions, 0 deletions
diff --git a/app/actions/tool-options-actions.c b/app/actions/tool-options-actions.c
new file mode 100644
index 0000000..10c59eb
--- /dev/null
+++ b/app/actions/tool-options-actions.c
@@ -0,0 +1,238 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * 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 3 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, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "actions-types.h"
+
+#include "core/gimp.h"
+#include "core/gimpcontext.h"
+#include "core/gimplist.h"
+#include "core/gimptoolinfo.h"
+#include "core/gimptoolpreset.h"
+
+#include "widgets/gimpactiongroup.h"
+#include "widgets/gimphelp-ids.h"
+
+#include "tool-options-actions.h"
+#include "tool-options-commands.h"
+
+#include "gimp-intl.h"
+
+
+/* local function prototypes */
+
+static void tool_options_actions_update_presets (GimpActionGroup *group,
+ const gchar *action_prefix,
+ GimpActionCallback callback,
+ const gchar *help_id,
+ GimpContainer *presets,
+ gboolean need_writable,
+ gboolean need_deletable);
+
+
+/* global variables */
+
+static const GimpActionEntry tool_options_actions[] =
+{
+ { "tool-options-popup", GIMP_ICON_DIALOG_TOOL_OPTIONS,
+ NC_("tool-options-action", "Tool Options Menu"), NULL, NULL, NULL,
+ GIMP_HELP_TOOL_OPTIONS_DIALOG },
+
+ { "tool-options-save-preset-menu", GIMP_ICON_DOCUMENT_SAVE,
+ NC_("tool-options-action", "_Save Tool Preset"), "", NULL, NULL,
+ GIMP_HELP_TOOL_OPTIONS_SAVE },
+
+ { "tool-options-restore-preset-menu", GIMP_ICON_DOCUMENT_REVERT,
+ NC_("tool-options-action", "_Restore Tool Preset"), "", NULL, NULL,
+ GIMP_HELP_TOOL_OPTIONS_RESTORE },
+
+ { "tool-options-edit-preset-menu", GIMP_ICON_EDIT,
+ NC_("tool-options-action", "E_dit Tool Preset"), NULL, NULL, NULL,
+ GIMP_HELP_TOOL_OPTIONS_EDIT },
+
+ { "tool-options-delete-preset-menu", GIMP_ICON_EDIT_DELETE,
+ NC_("tool-options-action", "_Delete Tool Preset"), "", NULL, NULL,
+ GIMP_HELP_TOOL_OPTIONS_DELETE },
+
+ { "tool-options-save-new-preset", GIMP_ICON_DOCUMENT_NEW,
+ NC_("tool-options-action", "_New Tool Preset..."), "", NULL,
+ tool_options_save_new_preset_cmd_callback,
+ GIMP_HELP_TOOL_OPTIONS_SAVE },
+
+ { "tool-options-reset", GIMP_ICON_RESET,
+ NC_("tool-options-action", "R_eset Tool Options"), NULL,
+ NC_("tool-options-action", "Reset to default values"),
+ tool_options_reset_cmd_callback,
+ GIMP_HELP_TOOL_OPTIONS_RESET },
+
+ { "tool-options-reset-all", GIMP_ICON_RESET,
+ NC_("tool-options-action", "Reset _all Tool Options"), NULL,
+ NC_("tool-options-action", "Reset all tool options"),
+ tool_options_reset_all_cmd_callback,
+ GIMP_HELP_TOOL_OPTIONS_RESET }
+};
+
+
+/* public functions */
+
+#define SET_VISIBLE(action,condition) \
+ gimp_action_group_set_action_visible (group, action, (condition) != 0)
+#define SET_SENSITIVE(action,condition) \
+ gimp_action_group_set_action_sensitive (group, action, (condition) != 0)
+#define SET_HIDE_EMPTY(action,condition) \
+ gimp_action_group_set_action_hide_empty (group, action, (condition) != 0)
+
+void
+tool_options_actions_setup (GimpActionGroup *group)
+{
+ gimp_action_group_add_actions (group, "tool-options-action",
+ tool_options_actions,
+ G_N_ELEMENTS (tool_options_actions));
+
+ SET_HIDE_EMPTY ("tool-options-restore-preset-menu", FALSE);
+ SET_HIDE_EMPTY ("tool-options-edit-preset-menu", FALSE);
+ SET_HIDE_EMPTY ("tool-options-delete-preset-menu", FALSE);
+}
+
+void
+tool_options_actions_update (GimpActionGroup *group,
+ gpointer data)
+{
+ GimpContext *context = gimp_get_user_context (group->gimp);
+ GimpToolInfo *tool_info = gimp_context_get_tool (context);
+
+ SET_VISIBLE ("tool-options-save-preset-menu", tool_info->presets);
+ SET_VISIBLE ("tool-options-restore-preset-menu", tool_info->presets);
+ SET_VISIBLE ("tool-options-edit-preset-menu", tool_info->presets);
+ SET_VISIBLE ("tool-options-delete-preset-menu", tool_info->presets);
+
+ tool_options_actions_update_presets (group, "tool-options-save-preset",
+ tool_options_save_preset_cmd_callback,
+ GIMP_HELP_TOOL_OPTIONS_SAVE,
+ tool_info->presets,
+ TRUE /* writable */,
+ FALSE /* deletable */);
+
+ tool_options_actions_update_presets (group, "tool-options-restore-preset",
+ tool_options_restore_preset_cmd_callback,
+ GIMP_HELP_TOOL_OPTIONS_RESTORE,
+ tool_info->presets,
+ FALSE /* writable */,
+ FALSE /* deletable */);
+
+ tool_options_actions_update_presets (group, "tool-options-edit-preset",
+ tool_options_edit_preset_cmd_callback,
+ GIMP_HELP_TOOL_OPTIONS_EDIT,
+ tool_info->presets,
+ FALSE /* writable */,
+ FALSE /* deletable */);
+
+ tool_options_actions_update_presets (group, "tool-options-delete-preset",
+ tool_options_delete_preset_cmd_callback,
+ GIMP_HELP_TOOL_OPTIONS_DELETE,
+ tool_info->presets,
+ FALSE /* writable */,
+ TRUE /* deletable */);
+}
+
+
+/* private function */
+
+static void
+tool_options_actions_update_presets (GimpActionGroup *group,
+ const gchar *action_prefix,
+ GimpActionCallback callback,
+ const gchar *help_id,
+ GimpContainer *presets,
+ gboolean need_writable,
+ gboolean need_deletable)
+{
+ GList *list;
+ gint n_children = 0;
+ gint i;
+
+ for (i = 0; ; i++)
+ {
+ gchar *action_name;
+ GimpAction *action;
+
+ action_name = g_strdup_printf ("%s-%03d", action_prefix, i);
+ action = gimp_action_group_get_action (group, action_name);
+ g_free (action_name);
+
+ if (! action)
+ break;
+
+ gimp_action_group_remove_action (group, action);
+ }
+
+ if (presets)
+ n_children = gimp_container_get_n_children (presets);
+
+ if (n_children > 0)
+ {
+ GimpEnumActionEntry entry;
+
+ entry.name = NULL;
+ entry.label = NULL;
+ entry.accelerator = "";
+ entry.tooltip = NULL;
+ entry.value = 0;
+ entry.value_variable = FALSE;
+ entry.help_id = help_id;
+
+ for (list = GIMP_LIST (presets)->queue->head, i = 0;
+ list;
+ list = g_list_next (list), i++)
+ {
+ GimpObject *preset = list->data;
+ GdkPixbuf *pixbuf = NULL;
+
+ entry.name = g_strdup_printf ("%s-%03d", action_prefix, i);
+ entry.label = gimp_object_get_name (preset);
+ entry.icon_name = gimp_viewable_get_icon_name (GIMP_VIEWABLE (preset));
+ entry.value = i;
+
+ g_object_get (preset, "icon-pixbuf", &pixbuf, NULL);
+
+ gimp_action_group_add_enum_actions (group, NULL, &entry, 1, callback);
+
+ if (need_writable)
+ SET_SENSITIVE (entry.name,
+ gimp_data_is_writable (GIMP_DATA (preset)));
+
+ if (need_deletable)
+ SET_SENSITIVE (entry.name,
+ gimp_data_is_deletable (GIMP_DATA (preset)));
+
+ if (pixbuf)
+ gimp_action_group_set_action_pixbuf (group, entry.name, pixbuf);
+
+ g_free ((gchar *) entry.name);
+ }
+ }
+}
+
+#undef SET_VISIBLE
+#undef SET_SENSITIVE
+#undef SET_HIDE_EMPTY