Revision: 29143
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29143
Author:   damien78
Date:     2010-06-01 22:21:40 +0200 (Tue, 01 Jun 2010)

Log Message:
-----------
Progress indicator in the application icon

Displays a global progress indicator in the application icon reflecting the 
total progress of all running jobs.

Currently fully implemented on OSX (Cocoa).
On other OSes that do not allow to redraw the app icon, this can be implemented 
as a [x%] display in the app title, so to appear in the taskbar.

Thanks to Matt for the windowmanager wrapper.

Modified Paths:
--------------
    trunk/blender/intern/ghost/GHOST_C-api.h
    trunk/blender/intern/ghost/GHOST_IWindow.h
    trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
    trunk/blender/intern/ghost/intern/GHOST_Window.cpp
    trunk/blender/intern/ghost/intern/GHOST_Window.h
    trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.h
    trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
    trunk/blender/source/blender/windowmanager/intern/wm_window.c

Modified: trunk/blender/intern/ghost/GHOST_C-api.h
===================================================================
--- trunk/blender/intern/ghost/GHOST_C-api.h    2010-06-01 19:54:05 UTC (rev 
29142)
+++ trunk/blender/intern/ghost/GHOST_C-api.h    2010-06-01 20:21:40 UTC (rev 
29143)
@@ -264,7 +264,24 @@
 extern GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle,
                                                                                
          GHOST_EventConsumerHandle consumerhandle);
        
+/***************************************************************************************
+ ** Progress bar functionality
+ 
***************************************************************************************/
 
+/**
+ * Sets the progress bar value displayed in the window/application icon
+ * @param windowhandle The handle to the window
+ * @param progress The progress % (0.0 to 1.0)
+ */
+extern GHOST_TSuccess GHOST_SetProgressBar(GHOST_WindowHandle windowhandle, 
float progress);
+
+/**
+ * Hides the progress bar in the icon
+ * @param windowhandle The handle to the window
+ */
+extern GHOST_TSuccess GHOST_EndProgressBar(GHOST_WindowHandle windowhandle);
+       
+       
 
/***************************************************************************************
  ** N-degree of freedom device management functionality
  
***************************************************************************************/

Modified: trunk/blender/intern/ghost/GHOST_IWindow.h
===================================================================
--- trunk/blender/intern/ghost/GHOST_IWindow.h  2010-06-01 19:54:05 UTC (rev 
29142)
+++ trunk/blender/intern/ghost/GHOST_IWindow.h  2010-06-01 20:21:40 UTC (rev 
29143)
@@ -235,6 +235,21 @@
        virtual const GHOST_TabletData* GetTabletData() = 0;
        
        
/***************************************************************************************
+        ** Progress bar functionality
+        
***************************************************************************************/
+       
+       /**
+     * Sets the progress bar value displayed in the window/application icon
+        * @param progress The progress %
+        */
+       virtual GHOST_TSuccess setProgressBar(float progress) = 0;
+       
+       /**
+        * Hides the progress bar in the icon
+        */
+       virtual GHOST_TSuccess endProgressBar() = 0;
+       
+       
/***************************************************************************************
         ** Cursor management functionality
         
***************************************************************************************/
 

Modified: trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_C-api.cpp   2010-06-01 19:54:05 UTC 
(rev 29142)
+++ trunk/blender/intern/ghost/intern/GHOST_C-api.cpp   2010-06-01 20:21:40 UTC 
(rev 29143)
@@ -248,6 +248,21 @@
        return 
system->addEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle);
 }
 
+GHOST_TSuccess GHOST_SetProgressBar(GHOST_WindowHandle windowhandle,float 
progress)
+{
+       GHOST_IWindow* window = (GHOST_IWindow*) windowhandle;
+
+       return window->setProgressBar(progress);
+}
+
+GHOST_TSuccess GHOST_EndProgressBar(GHOST_WindowHandle windowhandle)
+{
+       GHOST_IWindow* window = (GHOST_IWindow*) windowhandle;
+
+       return window->endProgressBar();
+}
+
+
 int GHOST_OpenNDOF(GHOST_SystemHandle systemhandle, GHOST_WindowHandle 
windowhandle,
    GHOST_NDOFLibraryInit_fp setNdofLibraryInit, 
     GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,

Modified: trunk/blender/intern/ghost/intern/GHOST_Window.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_Window.cpp  2010-06-01 19:54:05 UTC 
(rev 29142)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.cpp  2010-06-01 20:21:40 UTC 
(rev 29143)
@@ -53,6 +53,8 @@
        m_isUnsavedChanges = false;
        m_canAcceptDragOperation = false;
        
+       m_progressBarVisible = false;
+       
     m_cursorGrabAccumPos[0] = 0;
     m_cursorGrabAccumPos[1] = 0;
 

Modified: trunk/blender/intern/ghost/intern/GHOST_Window.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_Window.h    2010-06-01 19:54:05 UTC 
(rev 29142)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.h    2010-06-01 20:21:40 UTC 
(rev 29143)
@@ -192,6 +192,17 @@
        virtual GHOST_TSuccess getCursorGrabBounds(GHOST_Rect& bounds);
 
        /**
+     * Sets the progress bar value displayed in the window/application icon
+        * @param progress The progress % (0.0 to 1.0)
+        */
+       virtual GHOST_TSuccess setProgressBar(float progress) {return 
GHOST_kFailure;};
+       
+       /**
+        * Hides the progress bar in the icon
+        */
+       virtual GHOST_TSuccess endProgressBar() {return GHOST_kFailure;};
+       
+       /**
         * Tells if the ongoing drag'n'drop object can be accepted upon mouse 
drop
         */
        virtual void setAcceptDragOperation(bool canAccept);
@@ -313,6 +324,9 @@
        /** The current shape of the cursor */
        GHOST_TStandardCursor m_cursorShape;
     
+       /** The presence of progress indicator with the application icon */
+       bool m_progressBarVisible;
+       
        /** The acceptance of the "drop candidate" of the current drag'n'drop 
operation */
        bool m_canAcceptDragOperation;
        

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.h       2010-06-01 
19:54:05 UTC (rev 29142)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.h       2010-06-01 
20:21:40 UTC (rev 29143)
@@ -226,6 +226,17 @@
 
        GHOST_TabletData& GetCocoaTabletData()
        { return m_tablet; }
+       
+       /**
+        * Sets the progress bar value displayed in the window/application icon
+        * @param progress The progress % (0.0 to 1.0)
+        */
+       virtual GHOST_TSuccess setProgressBar(float progress);
+       
+       /**
+        * Hides the progress bar icon
+        */
+       virtual GHOST_TSuccess endProgressBar();
 protected:
        /**
         * Tries to install a rendering context in this window.
@@ -291,14 +302,6 @@
        NSCursor*       m_customCursor;
 
        GHOST_TabletData m_tablet;
-    
-    /**
-     * The width/height of the size rectangle in the lower right corner of a 
-     * Mac/Carbon window. This is also the height of the gutter area.
-     */
-#ifdef GHOST_DRAW_CARBON_GUTTER
-    static const GHOST_TInt32 s_sizeRectSize;
-#endif // GHOST_DRAW_CARBON_GUTTER
 };
 
 #endif // _GHOST_WINDOW_COCOA_H_

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm      2010-06-01 
19:54:05 UTC (rev 29142)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm      2010-06-01 
20:21:40 UTC (rev 29143)
@@ -1020,6 +1020,66 @@
        return GHOST_kSuccess;
 }
 
+#pragma mark Progress bar
+
+GHOST_TSuccess GHOST_WindowCocoa::setProgressBar(float progress)
+{
+       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+       
+       if ((progress >=0.0) && (progress <=1.0)) {
+               NSImage* dockIcon = [[NSImage alloc] 
initWithSize:NSMakeSize(128,128)];
+               
+               [dockIcon lockFocus];
+        NSRect progressBox = {{4, 4}, {120, 16}};
+
+        [[NSImage imageNamed:@"NSApplicationIcon"] dissolveToPoint:NSZeroPoint 
fraction:1.0];
+        
+        // Track & Outline
+        [[NSColor blackColor] setFill];
+        NSRectFill(progressBox);
+        
+        [[NSColor whiteColor] set];
+        NSFrameRect(progressBox);
+        
+        // Progress fill
+        progressBox = NSInsetRect(progressBox, 1, 1);
+        [[NSColor knobColor] setFill];
+        progressBox.size.width = progressBox.size.width * progress;
+               NSRectFill(progressBox);
+               
+               [dockIcon unlockFocus];
+               
+               [NSApp setApplicationIconImage:dockIcon];
+               [dockIcon release];
+               
+               m_progressBarVisible = true;
+       }
+       
+       [pool drain];
+       return GHOST_kSuccess;
+}
+
+
+GHOST_TSuccess GHOST_WindowCocoa::endProgressBar()
+{
+       if (!m_progressBarVisible) return GHOST_kFailure;
+       m_progressBarVisible = false;
+       
+       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+       
+       NSImage* dockIcon = [[NSImage alloc] initWithSize:NSMakeSize(128,128)];
+       [dockIcon lockFocus];
+       [[NSImage imageNamed:@"NSApplicationIcon"] dissolveToPoint:NSZeroPoint 
fraction:1.0];
+       [dockIcon unlockFocus];
+       [NSApp setApplicationIconImage:dockIcon];
+       [dockIcon release];
+       
+       [pool drain];
+       return GHOST_kSuccess;
+}
+
+
+
 #pragma mark Cursor handling
 
 void GHOST_WindowCocoa::loadCursor(bool visible, GHOST_TStandardCursor cursor) 
const

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h 2010-06-01 19:54:05 UTC 
(rev 29142)
+++ trunk/blender/source/blender/windowmanager/WM_api.h 2010-06-01 20:21:40 UTC 
(rev 29143)
@@ -324,5 +324,9 @@
 char           *WM_clipboard_text_get(int selection);
 void           WM_clipboard_text_set(char *buf, int selection);
 
+                       /* progress */
+void           WM_progress_set(struct wmWindow *win, float progress);
+void           WM_progress_clear(struct wmWindow *win);
+
 #endif /* WM_API_H */
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_jobs.c 2010-06-01 
19:54:05 UTC (rev 29142)
+++ trunk/blender/source/blender/windowmanager/intern/wm_jobs.c 2010-06-01 
20:21:40 UTC (rev 29143)
@@ -381,7 +381,10 @@
 void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
 {
        wmJob *steve= wm->jobs.first, *stevenext;
+       float total_progress= 0.f;
+       float jobs_progress=0;
        
+       
        for(; steve; steve= stevenext) {
                stevenext= steve->next;
                
@@ -434,6 +437,10 @@
                                                BLI_remlink(&wm->jobs, steve);
                                                MEM_freeN(steve);
                                        }
+                               } else if (steve->flag & WM_JOB_PROGRESS) {
+                                       /* accumulate global progress for 
running jobs */
+                                       jobs_progress++;
+                                       total_progress += steve->progress;
                                }
                        }
                        else if(steve->suspended) {
@@ -441,5 +448,13 @@
                        }
                }
        }
+       
+       /* if there are running jobs, set the global progress indicator */
+       if (jobs_progress > 0) {
+               float progress = total_progress / (float)jobs_progress;
+               WM_progress_set(wm->winactive, progress);
+       } else {
+               WM_progress_clear(wm->winactive);
+       }
 }
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_window.c       
2010-06-01 19:54:05 UTC (rev 29142)

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to