summaryrefslogtreecommitdiffstats
path: root/app/tools/gimptool-progress.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/tools/gimptool-progress.c')
-rw-r--r--app/tools/gimptool-progress.c260
1 files changed, 260 insertions, 0 deletions
diff --git a/app/tools/gimptool-progress.c b/app/tools/gimptool-progress.c
new file mode 100644
index 0000000..09b0a9d
--- /dev/null
+++ b/app/tools/gimptool-progress.c
@@ -0,0 +1,260 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimptool-progress.c
+ * Copyright (C) 2011 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 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 <gdk/gdkkeysyms.h>
+
+#include "tools-types.h"
+
+#include "core/gimpprogress.h"
+
+#include "widgets/gimpwidgets-utils.h"
+
+#include "display/gimpcanvasprogress.h"
+
+#include "display/gimpdisplay.h"
+#include "display/gimpdisplayshell.h"
+#include "display/gimpdisplayshell-items.h"
+#include "display/gimpdisplayshell-transform.h"
+
+#include "gimptool.h"
+#include "gimptool-progress.h"
+
+
+/* local function prototypes */
+
+static GimpProgress * gimp_tool_progress_start (GimpProgress *progress,
+ gboolean cancellable,
+ const gchar *message);
+static void gimp_tool_progress_end (GimpProgress *progress);
+static gboolean gimp_tool_progress_is_active (GimpProgress *progress);
+static void gimp_tool_progress_set_text (GimpProgress *progress,
+ const gchar *message);
+static void gimp_tool_progress_set_value (GimpProgress *progress,
+ gdouble percentage);
+static gdouble gimp_tool_progress_get_value (GimpProgress *progress);
+static void gimp_tool_progress_pulse (GimpProgress *progress);
+static gboolean gimp_tool_progress_message (GimpProgress *progress,
+ Gimp *gimp,
+ GimpMessageSeverity severity,
+ const gchar *domain,
+ const gchar *message);
+
+
+/* public functions */
+
+void
+gimp_tool_progress_iface_init (GimpProgressInterface *iface)
+{
+ iface->start = gimp_tool_progress_start;
+ iface->end = gimp_tool_progress_end;
+ iface->is_active = gimp_tool_progress_is_active;
+ iface->set_text = gimp_tool_progress_set_text;
+ iface->set_value = gimp_tool_progress_set_value;
+ iface->get_value = gimp_tool_progress_get_value;
+ iface->pulse = gimp_tool_progress_pulse;
+ iface->message = gimp_tool_progress_message;
+}
+
+
+/* private functions */
+
+static gboolean
+gimp_tool_progress_button_press (GtkWidget *widget,
+ const GdkEventButton *bevent,
+ GimpTool *tool)
+{
+ if (bevent->type == GDK_BUTTON_PRESS &&
+ bevent->button == 1)
+ {
+ GtkWidget *event_widget;
+ GimpDisplayShell *shell;
+
+ event_widget = gtk_get_event_widget ((GdkEvent *) bevent);
+ shell = gimp_display_get_shell (tool->progress_display);
+
+ if (shell->canvas == event_widget)
+ {
+ gint x, y;
+
+ gimp_display_shell_unzoom_xy (shell, bevent->x, bevent->y,
+ &x, &y, FALSE);
+
+ if (gimp_canvas_item_hit (tool->progress, x, y))
+ {
+ gimp_progress_cancel (GIMP_PROGRESS (tool));
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gimp_tool_progress_key_press (GtkWidget *widget,
+ const GdkEventKey *kevent,
+ GimpTool *tool)
+{
+ if (kevent->keyval == GDK_KEY_Escape)
+ {
+ gimp_progress_cancel (GIMP_PROGRESS (tool));
+ }
+
+ return TRUE;
+}
+
+static GimpProgress *
+gimp_tool_progress_start (GimpProgress *progress,
+ gboolean cancellable,
+ const gchar *message)
+{
+ GimpTool *tool = GIMP_TOOL (progress);
+ GimpDisplayShell *shell;
+ gint x, y;
+
+ g_return_val_if_fail (GIMP_IS_DISPLAY (tool->display), NULL);
+ g_return_val_if_fail (tool->progress == NULL, NULL);
+
+ shell = gimp_display_get_shell (tool->display);
+
+ x = shell->disp_width / 2;
+ y = shell->disp_height / 2;
+
+ gimp_display_shell_unzoom_xy (shell, x, y, &x, &y, FALSE);
+
+ tool->progress = gimp_canvas_progress_new (shell,
+ GIMP_HANDLE_ANCHOR_CENTER,
+ x, y);
+ gimp_display_shell_add_unrotated_item (shell, tool->progress);
+ g_object_unref (tool->progress);
+
+ gimp_progress_start (GIMP_PROGRESS (tool->progress), FALSE,
+ "%s", message);
+ gimp_widget_flush_expose (shell->canvas);
+
+ tool->progress_display = tool->display;
+
+ if (cancellable)
+ {
+ tool->progress_grab_widget = gtk_invisible_new ();
+ gtk_widget_show (tool->progress_grab_widget);
+ gtk_grab_add (tool->progress_grab_widget);
+
+ g_signal_connect (tool->progress_grab_widget, "button-press-event",
+ G_CALLBACK (gimp_tool_progress_button_press),
+ tool);
+ g_signal_connect (tool->progress_grab_widget, "key-press-event",
+ G_CALLBACK (gimp_tool_progress_key_press),
+ tool);
+ }
+
+ return progress;
+}
+
+static void
+gimp_tool_progress_end (GimpProgress *progress)
+{
+ GimpTool *tool = GIMP_TOOL (progress);
+
+ if (tool->progress)
+ {
+ GimpDisplayShell *shell = gimp_display_get_shell (tool->progress_display);
+
+ gimp_progress_end (GIMP_PROGRESS (tool->progress));
+ gimp_display_shell_remove_unrotated_item (shell, tool->progress);
+
+ tool->progress = NULL;
+ tool->progress_display = NULL;
+
+ if (tool->progress_grab_widget)
+ {
+ gtk_grab_remove (tool->progress_grab_widget);
+ gtk_widget_destroy (tool->progress_grab_widget);
+ tool->progress_grab_widget = NULL;
+ }
+ }
+}
+
+static gboolean
+gimp_tool_progress_is_active (GimpProgress *progress)
+{
+ GimpTool *tool = GIMP_TOOL (progress);
+
+ return tool->progress != NULL;
+}
+
+static void
+gimp_tool_progress_set_text (GimpProgress *progress,
+ const gchar *message)
+{
+ GimpTool *tool = GIMP_TOOL (progress);
+
+ if (tool->progress)
+ {
+ GimpDisplayShell *shell = gimp_display_get_shell (tool->progress_display);
+
+ gimp_progress_set_text_literal (GIMP_PROGRESS (tool->progress), message);
+ gimp_widget_flush_expose (shell->canvas);
+ }
+}
+
+static void
+gimp_tool_progress_set_value (GimpProgress *progress,
+ gdouble percentage)
+{
+ GimpTool *tool = GIMP_TOOL (progress);
+
+ if (tool->progress)
+ {
+ GimpDisplayShell *shell = gimp_display_get_shell (tool->progress_display);
+
+ gimp_progress_set_value (GIMP_PROGRESS (tool->progress), percentage);
+ gimp_widget_flush_expose (shell->canvas);
+ }
+}
+
+static gdouble
+gimp_tool_progress_get_value (GimpProgress *progress)
+{
+ GimpTool *tool = GIMP_TOOL (progress);
+
+ if (tool->progress)
+ return gimp_progress_get_value (GIMP_PROGRESS (tool->progress));
+
+ return 0.0;
+}
+
+static void
+gimp_tool_progress_pulse (GimpProgress *progress)
+{
+}
+
+static gboolean
+gimp_tool_progress_message (GimpProgress *progress,
+ Gimp *gimp,
+ GimpMessageSeverity severity,
+ const gchar *domain,
+ const gchar *message)
+{
+ return FALSE;
+}