[gimp] app: add an on-canvas progress facility to GimpTool



commit e9dd30127ac4eb44a6504c80e4dc38bcdc926635
Author: Michael Natterer <mitch gimp org>
Date:   Fri Mar 25 09:48:26 2011 +0100

    app: add an on-canvas progress facility to GimpTool
    
    and use it in GimpCageTool.

 app/tools/gimpcagetool.c |   49 +++++++++-------------------------
 app/tools/gimptool.c     |   66 ++++++++++++++++++++++++++++++++++++++++++++++
 app/tools/gimptool.h     |   11 +++++++
 3 files changed, 90 insertions(+), 36 deletions(-)
---
diff --git a/app/tools/gimpcagetool.c b/app/tools/gimpcagetool.c
index a69e278..178e233 100644
--- a/app/tools/gimpcagetool.c
+++ b/app/tools/gimpcagetool.c
@@ -40,18 +40,14 @@
 #include "core/gimpimage.h"
 #include "core/gimpimagemap.h"
 #include "core/gimplayer.h"
-#include "core/gimpprogress.h"
 #include "core/gimpprojection.h"
 
 #include "gegl/gimpcageconfig.h"
 
 #include "widgets/gimphelp-ids.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 "gimpcagetool.h"
@@ -944,33 +940,17 @@ static void
 gimp_cage_tool_compute_coef (GimpCageTool *ct,
                              GimpDisplay  *display)
 {
-  GimpDisplayShell *shell  = gimp_display_get_shell (display);
-  GimpCageConfig   *config = ct->config;
-  Babl             *format;
-  GeglNode         *gegl;
-  GeglNode         *input;
-  GeglNode         *output;
-  GeglProcessor    *processor;
-  GimpCanvasItem   *p;
-  GimpProgress     *progress;
-  GeglBuffer       *buffer;
-  gdouble           value;
-
-  {
-    gint x, y, w, h;
-
-    gimp_display_shell_untransform_viewport (shell, &x, &y, &w, &h);
-
-    p = gimp_canvas_progress_new (shell, GIMP_HANDLE_ANCHOR_CENTER,
-                                  x + w / 2, y + h / 2);
-    gimp_display_shell_add_item (shell, p);
-    g_object_unref (p);
-  }
-
-  progress = gimp_progress_start (GIMP_PROGRESS (p),
-                                  _("Coefficient computation"),
-                                  FALSE);
-  gimp_widget_flush_expose (shell->canvas);
+  GimpCageConfig *config = ct->config;
+  Babl           *format;
+  GeglNode       *gegl;
+  GeglNode       *input;
+  GeglNode       *output;
+  GeglProcessor  *processor;
+  GeglBuffer     *buffer;
+  gdouble         value;
+
+  gimp_tool_progress_start (GIMP_TOOL (ct), display,
+                            _("Coefficient computation..."));
 
   if (ct->coef)
     {
@@ -1002,11 +982,10 @@ gimp_cage_tool_compute_coef (GimpCageTool *ct,
 
   while (gegl_processor_work (processor, &value))
     {
-      gimp_progress_set_value (progress, value);
-      gimp_widget_flush_expose (shell->canvas);
+      gimp_tool_progress_set_value (GIMP_TOOL (ct), value);
     }
 
-  gimp_progress_end (progress);
+  gimp_tool_progress_end (GIMP_TOOL (ct));
 
   gegl_processor_destroy (processor);
 
@@ -1014,8 +993,6 @@ gimp_cage_tool_compute_coef (GimpCageTool *ct,
   g_object_unref (gegl);
 
   ct->dirty_coef = FALSE;
-
-  gimp_display_shell_remove_item (shell, p);
 }
 
 static void
diff --git a/app/tools/gimptool.c b/app/tools/gimptool.c
index e8b19fc..8b2237b 100644
--- a/app/tools/gimptool.c
+++ b/app/tools/gimptool.c
@@ -27,11 +27,17 @@
 #include "core/gimp.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpimage.h"
+#include "core/gimpprogress.h"
 #include "core/gimptoolinfo.h"
 
+#include "widgets/gimpwidgets-utils.h"
+
+#include "display/gimpcanvasprogress.h"
 #include "display/gimpdisplay.h"
 #include "display/gimpdisplayshell.h"
 #include "display/gimpdisplayshell-cursor.h"
+#include "display/gimpdisplayshell-items.h"
+#include "display/gimpdisplayshell-transform.h"
 #include "display/gimpstatusbar.h"
 
 #include "gimptool.h"
@@ -1127,6 +1133,66 @@ gimp_tool_set_cursor (GimpTool           *tool,
                                  cursor, tool_cursor, modifier);
 }
 
+void
+gimp_tool_progress_start (GimpTool    *tool,
+                          GimpDisplay *display,
+                          const gchar *text)
+{
+  GimpDisplayShell *shell;
+  gint              x, y, w, h;
+
+  g_return_if_fail (GIMP_IS_TOOL (tool));
+  g_return_if_fail (GIMP_IS_DISPLAY (display));
+  g_return_if_fail (tool->progress == NULL);
+
+  shell = gimp_display_get_shell (display);
+
+  gimp_display_shell_untransform_viewport (shell, &x, &y, &w, &h);
+
+  tool->progress = gimp_canvas_progress_new (shell, GIMP_HANDLE_ANCHOR_CENTER,
+                                             x + w / 2, y + h / 2);
+  gimp_display_shell_add_item (shell, tool->progress);
+  g_object_unref (tool->progress);
+
+  gimp_progress_start (GIMP_PROGRESS (tool->progress),
+                       text, FALSE);
+  gimp_widget_flush_expose (shell->canvas);
+
+  tool->progress_display = display;
+}
+
+void
+gimp_tool_progress_set_value (GimpTool *tool,
+                              gdouble  value)
+{
+  GimpDisplayShell *shell;
+
+  g_return_if_fail (GIMP_IS_TOOL (tool));
+  g_return_if_fail (GIMP_IS_PROGRESS (tool->progress));
+
+  shell = gimp_display_get_shell (tool->progress_display);
+
+  gimp_progress_set_value (GIMP_PROGRESS (tool->progress), value);
+  gimp_widget_flush_expose (shell->canvas);
+}
+
+void
+gimp_tool_progress_end (GimpTool *tool)
+{
+  GimpDisplayShell *shell;
+
+  g_return_if_fail (GIMP_IS_TOOL (tool));
+  g_return_if_fail (GIMP_IS_PROGRESS (tool->progress));
+
+  shell = gimp_display_get_shell (tool->progress_display);
+
+  gimp_progress_end (GIMP_PROGRESS (tool->progress));
+  gimp_display_shell_remove_item (shell, tool->progress);
+
+  tool->progress         = NULL;
+  tool->progress_display = NULL;
+}
+
 
 /*  private functions  */
 
diff --git a/app/tools/gimptool.h b/app/tools/gimptool.h
index b7d932b..af10ce2 100644
--- a/app/tools/gimptool.h
+++ b/app/tools/gimptool.h
@@ -67,6 +67,10 @@ struct _GimpTool
   /*  private list of displays which have a status message from this tool
    */
   GList           *status_displays;
+
+  /*  on-canvas progress  */
+  GimpCanvasItem  *progress;
+  GimpDisplay     *progress_display;
 };
 
 struct _GimpToolClass
@@ -247,5 +251,12 @@ void          gimp_tool_set_cursor          (GimpTool            *tool,
                                              GimpToolCursorType   tool_cursor,
                                              GimpCursorModifier   modifier);
 
+void          gimp_tool_progress_start      (GimpTool            *tool,
+                                             GimpDisplay         *display,
+                                             const gchar         *text);
+void          gimp_tool_progress_set_value  (GimpTool            *tool,
+                                             gdouble              value);
+void          gimp_tool_progress_end        (GimpTool            *tool);
+
 
 #endif  /*  __GIMP_TOOL_H__  */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]