Hans Leidekker : msi: Add support for running the progress bar backwards.

Alexandre Julliard julliard at winehq.org
Thu Jun 23 04:10:10 CDT 2011


Module: wine
Branch: master
Commit: ebf323cfcb00376e0133255aecb563851d5ae150
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ebf323cfcb00376e0133255aecb563851d5ae150

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu Jun 23 09:08:04 2011 +0200

msi: Add support for running the progress bar backwards.

---

 dlls/msi/dialog.c |   46 ++++++++++++++++++++++++++++++++++------------
 1 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c
index 08694bc..a6e33e2 100644
--- a/dlls/msi/dialog.c
+++ b/dlls/msi/dialog.c
@@ -66,6 +66,7 @@ struct msi_control_tag
     HMODULE hDll;
     float progress_current;
     float progress_max;
+    BOOL  progress_backwards;
     DWORD attributes;
     WCHAR name[1];
 };
@@ -431,6 +432,7 @@ static msi_control *msi_dialog_create_window( msi_dialog *dialog,
     control->type = strdupW( MSI_RecordGetString( rec, 3 ) );
     control->progress_current = 0;
     control->progress_max = 100;
+    control->progress_backwards = FALSE;
 
     x = MSI_RecordGetInteger( rec, 4 );
     y = MSI_RecordGetInteger( rec, 5 );
@@ -635,28 +637,47 @@ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control,
     }
     else if( !strcmpW( attribute, szProgress ) )
     {
-        DWORD func, val;
+        DWORD func, val1, val2;
 
-        func = MSI_RecordGetInteger( rec , 1 );
-        val = MSI_RecordGetInteger( rec , 2 );
+        func = MSI_RecordGetInteger( rec, 1 );
+        val1 = MSI_RecordGetInteger( rec, 2 );
+        val2 = MSI_RecordGetInteger( rec, 3 );
 
-        TRACE("progress: func %u, val %u\n", func, val);
+        TRACE("progress: func %u val1 %u val2 %u\n", func, val1, val2);
 
         switch (func)
         {
         case 0: /* init */
-            ctrl->progress_max = val;
-            ctrl->progress_current = 0;
-            SendMessageW(ctrl->hwnd, PBM_SETRANGE, 0, MAKELPARAM(0,100));
-            SendMessageW(ctrl->hwnd, PBM_SETPOS, 0, 0);
+            SendMessageW( ctrl->hwnd, PBM_SETRANGE, 0, MAKELPARAM(0,100) );
+            if (val2)
+            {
+                ctrl->progress_max = val1 ? val1 : 100;
+                ctrl->progress_current = val1;
+                ctrl->progress_backwards = TRUE;
+                SendMessageW( ctrl->hwnd, PBM_SETPOS, 100, 0 );
+            }
+            else
+            {
+                ctrl->progress_max = val1 ? val1 : 100;
+                ctrl->progress_current = 0;
+                ctrl->progress_backwards = FALSE;
+                SendMessageW( ctrl->hwnd, PBM_SETPOS, 0, 0 );
+            }
             break;
         case 1: /* FIXME: not sure what this is supposed to do */
             break;
         case 2: /* move */
-            ctrl->progress_current += val;
-            if (ctrl->progress_current > ctrl->progress_max)
-                ctrl->progress_current = ctrl->progress_max;
-            SendMessageW(ctrl->hwnd, PBM_SETPOS, MulDiv(100, ctrl->progress_current, ctrl->progress_max), 0);
+            if (ctrl->progress_backwards)
+            {
+                if (val1 >= ctrl->progress_current) ctrl->progress_current -= val1;
+                else ctrl->progress_current = 0;
+            }
+            else
+            {
+                if (ctrl->progress_current + val1 < ctrl->progress_max) ctrl->progress_current += val1;
+                else ctrl->progress_current = ctrl->progress_max;
+            }
+            SendMessageW( ctrl->hwnd, PBM_SETPOS, MulDiv(100, ctrl->progress_current, ctrl->progress_max), 0 );
             break;
         default:
             FIXME("Unknown progress message %u\n", func);
@@ -1128,6 +1149,7 @@ static UINT msi_dialog_line_control( msi_dialog *dialog, MSIRECORD *rec )
     control->type = strdupW( MSI_RecordGetString( rec, 3 ) );
     control->progress_current = 0;
     control->progress_max = 100;
+    control->progress_backwards = FALSE;
 
     x = MSI_RecordGetInteger( rec, 4 );
     y = MSI_RecordGetInteger( rec, 5 );




More information about the wine-cvs mailing list