From e07a7b3d0541b152e3d5d1d269b6fcc7e44ff1a7 Mon Sep 17 00:00:00 2001 From: emersion Date: Wed, 15 Jun 2016 18:51:12 +0200 Subject: [PATCH 1/5] Adds uiProgressBarValue() in unix --- ui.h | 4 +++- unix/progressbar.c | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ui.h b/ui.h index 85c2d302..0131fe0d 100644 --- a/ui.h +++ b/ui.h @@ -187,8 +187,10 @@ _UI_EXTERN uiSlider *uiNewSlider(int min, int max); typedef struct uiProgressBar uiProgressBar; #define uiProgressBar(this) ((uiProgressBar *) (this)) -// TODO uiProgressBarValue() +_UI_EXTERN int uiProgressBarValue(uiProgressBar *p); _UI_EXTERN void uiProgressBarSetValue(uiProgressBar *p, int n); +_UI_EXTERN int uiProgressBarIndeterminate(uiProgressBar *p); +_UI_EXTERN void uiProgressBarSetindeterminate(uiProgressBar *p, int indeterminate); _UI_EXTERN uiProgressBar *uiNewProgressBar(void); typedef struct uiSeparator uiSeparator; diff --git a/unix/progressbar.c b/unix/progressbar.c index 40306e6c..725a6f5f 100644 --- a/unix/progressbar.c +++ b/unix/progressbar.c @@ -9,6 +9,11 @@ struct uiProgressBar { uiUnixControlAllDefaults(uiProgressBar) +int uiProgressBarValue(uiProgressBar *p) +{ + return (int) (gtk_progress_bar_get_fraction(p->pbar) * 100); +} + void uiProgressBarSetValue(uiProgressBar *p, int value) { if (value < 0 || value > 100) From 560cca5bc990dc413cd50ba5f759a0771dede206 Mon Sep 17 00:00:00 2001 From: emersion Date: Wed, 15 Jun 2016 21:51:08 +0200 Subject: [PATCH 2/5] Adds uiProgressBar(Set)Indeterminate for unix --- test/page13.c | 13 +++++++++++++ ui.h | 2 +- unix/progressbar.c | 23 +++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/test/page13.c b/test/page13.c index 0f3f358c..7908b780 100644 --- a/test/page13.c +++ b/test/page13.c @@ -75,6 +75,12 @@ static void showHide(uiButton *b, void *data) uiControlShow(c); } +static void setIndeterminate(uiButton *b, void *data) +{ + uiProgressBar *p = uiProgressBar(data); + uiProgressBarSetIndeterminate(p, !uiProgressBarIndeterminate(p)); +} + static void deleteFirst(uiButton *b, void *data) { uiForm *f = uiForm(data); @@ -89,6 +95,7 @@ uiBox *makePage13(void) uiButton *b; uiForm *f; uiEntry *e; + uiProgressBar *p; page13 = newVerticalBox(); @@ -123,6 +130,12 @@ uiBox *makePage13(void) uiFormAppend(f, "MLE", uiControl(uiNewMultilineEntry()), 1); + p = uiNewProgressBar(); + uiBoxAppend(page13, uiControl(p), 0); + b = uiNewButton("Toggle indeterminate"); + uiButtonOnClicked(b, setIndeterminate, p); + uiBoxAppend(page13, uiControl(b), 0); + b = uiNewButton("Show/Hide"); uiButtonOnClicked(b, showHide, e); uiBoxAppend(page13, uiControl(b), 0); diff --git a/ui.h b/ui.h index 0131fe0d..42370453 100644 --- a/ui.h +++ b/ui.h @@ -190,7 +190,7 @@ typedef struct uiProgressBar uiProgressBar; _UI_EXTERN int uiProgressBarValue(uiProgressBar *p); _UI_EXTERN void uiProgressBarSetValue(uiProgressBar *p, int n); _UI_EXTERN int uiProgressBarIndeterminate(uiProgressBar *p); -_UI_EXTERN void uiProgressBarSetindeterminate(uiProgressBar *p, int indeterminate); +_UI_EXTERN void uiProgressBarSetIndeterminate(uiProgressBar *p, int indeterminate); _UI_EXTERN uiProgressBar *uiNewProgressBar(void); typedef struct uiSeparator uiSeparator; diff --git a/unix/progressbar.c b/unix/progressbar.c index 725a6f5f..4d502f34 100644 --- a/unix/progressbar.c +++ b/unix/progressbar.c @@ -5,6 +5,7 @@ struct uiProgressBar { uiUnixControl c; GtkWidget *widget; GtkProgressBar *pbar; + int indeterminate; }; uiUnixControlAllDefaults(uiProgressBar) @@ -21,6 +22,28 @@ void uiProgressBarSetValue(uiProgressBar *p, int value) gtk_progress_bar_set_fraction(p->pbar, ((gdouble) value) / 100); } +int uiProgressBarIndeterminate(uiProgressBar *p) +{ + return p->indeterminate; +} + +gboolean uiProgressBarPulse(uiProgressBar *p) +{ + if (!GTK_IS_WIDGET(p->pbar) || !p->indeterminate) + return 0; + + gtk_progress_bar_pulse(p->pbar); + return 1; +} + +void uiProgressBarSetIndeterminate(uiProgressBar *p, int indeterminate) +{ + p->indeterminate = indeterminate; + + if (indeterminate) + g_timeout_add(100, uiProgressBarPulse, p); +} + uiProgressBar *uiNewProgressBar(void) { uiProgressBar *p; From 983a53d3c3b5b163d003851be5bb7c6c71a7901a Mon Sep 17 00:00:00 2001 From: emersion Date: Wed, 15 Jun 2016 23:17:23 +0200 Subject: [PATCH 3/5] Replaces uiProgressBar(Set)Indeterminate() by value=-1 --- test/page13.c | 10 +++++++++- ui.h | 2 -- unix/progressbar.c | 34 ++++++++++++++++++---------------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/test/page13.c b/test/page13.c index 7908b780..6eb19f29 100644 --- a/test/page13.c +++ b/test/page13.c @@ -78,7 +78,15 @@ static void showHide(uiButton *b, void *data) static void setIndeterminate(uiButton *b, void *data) { uiProgressBar *p = uiProgressBar(data); - uiProgressBarSetIndeterminate(p, !uiProgressBarIndeterminate(p)); + + int value = uiProgressBarValue(p); + if (value == -1) { + value = 0; + } else { + value = -1; + } + + uiProgressBarSetValue(p, value); } static void deleteFirst(uiButton *b, void *data) diff --git a/ui.h b/ui.h index 42370453..696140f1 100644 --- a/ui.h +++ b/ui.h @@ -189,8 +189,6 @@ typedef struct uiProgressBar uiProgressBar; #define uiProgressBar(this) ((uiProgressBar *) (this)) _UI_EXTERN int uiProgressBarValue(uiProgressBar *p); _UI_EXTERN void uiProgressBarSetValue(uiProgressBar *p, int n); -_UI_EXTERN int uiProgressBarIndeterminate(uiProgressBar *p); -_UI_EXTERN void uiProgressBarSetIndeterminate(uiProgressBar *p, int indeterminate); _UI_EXTERN uiProgressBar *uiNewProgressBar(void); typedef struct uiSeparator uiSeparator; diff --git a/unix/progressbar.c b/unix/progressbar.c index 4d502f34..9e3fd4a4 100644 --- a/unix/progressbar.c +++ b/unix/progressbar.c @@ -12,23 +12,16 @@ uiUnixControlAllDefaults(uiProgressBar) int uiProgressBarValue(uiProgressBar *p) { + if (p->indeterminate) + return -1; + return (int) (gtk_progress_bar_get_fraction(p->pbar) * 100); } -void uiProgressBarSetValue(uiProgressBar *p, int value) +gboolean uiProgressBarPulse(void* data) { - if (value < 0 || value > 100) - userbug("Value %d is out of range for a uiProgressBar.", value); - gtk_progress_bar_set_fraction(p->pbar, ((gdouble) value) / 100); -} + uiProgressBar *p = (uiProgressBar*) data; -int uiProgressBarIndeterminate(uiProgressBar *p) -{ - return p->indeterminate; -} - -gboolean uiProgressBarPulse(uiProgressBar *p) -{ if (!GTK_IS_WIDGET(p->pbar) || !p->indeterminate) return 0; @@ -36,12 +29,21 @@ gboolean uiProgressBarPulse(uiProgressBar *p) return 1; } -void uiProgressBarSetIndeterminate(uiProgressBar *p, int indeterminate) +void uiProgressBarSetValue(uiProgressBar *p, int value) { - p->indeterminate = indeterminate; + if (value == -1) { + if (!p->indeterminate) { + p->indeterminate = 1; + g_timeout_add(100, uiProgressBarPulse, p); + } + return; + } - if (indeterminate) - g_timeout_add(100, uiProgressBarPulse, p); + if (value < 0 || value > 100) + userbug("Value %d is out of range for a uiProgressBar.", value); + + p->indeterminate = 0; + gtk_progress_bar_set_fraction(p->pbar, ((gdouble) value) / 100); } uiProgressBar *uiNewProgressBar(void) From 7770b5c85043dbc030985fc544f7483c96a6bd95 Mon Sep 17 00:00:00 2001 From: emersion Date: Thu, 16 Jun 2016 09:32:13 +0200 Subject: [PATCH 4/5] Adds indeterminate progressbar to windows --- windows/progressbar.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/windows/progressbar.cpp b/windows/progressbar.cpp index d16569ad..2d155de1 100644 --- a/windows/progressbar.cpp +++ b/windows/progressbar.cpp @@ -26,14 +26,40 @@ static void uiProgressBarMinimumSize(uiWindowsControl *c, int *width, int *heigh *height = y; } +int uiProgressBarValue(uiProgressBar *p) +{ + LONG_PTR style = GetWindowLongPtr(p->hwnd, GWL_STYLE); + if ((style & PBS_MARQUEE) != 0) { + return -1; + } + + return (int) SendMessage(p->hwnd, PBM_GETPOS, 0, 0); +} + // unfortunately, as of Vista progress bars have a forced animation on increase // we have to set the progress bar to value + 1 and decrease it back to value if we want an "instant" change // see http://stackoverflow.com/questions/2217688/windows-7-aero-theme-progress-bar-bug // it's not ideal/perfect, but it will have to do void uiProgressBarSetValue(uiProgressBar *p, int value) { + LONG_PTR style = GetWindowLongPtr(p->hwnd, GWL_STYLE); + + if (value == -1) { + if ((style & PBS_MARQUEE) == 0) { + SetWindowLongPtr(p->hwnd, GWL_STYLE, style | PBS_MARQUEE); + SendMessage(p->hwnd, PBM_SETMARQUEE, 1, 0); + } + return; + } + + if ((style & PBS_MARQUEE) != 0) { + SetWindowLongPtr(p->hwnd, GWL_STYLE, style ^ PBS_MARQUEE); + SendMessage(p->hwnd, PBM_SETMARQUEE, 0, 0); + } + if (value < 0 || value > 100) userbug("Value %d is out of range for uiProgressBars.", value); + if (value == 100) { // because we can't 101 SendMessageW(p->hwnd, PBM_SETRANGE32, 0, 101); SendMessageW(p->hwnd, PBM_SETPOS, 101, 0); From cff5dcf9c91d2ce35eec0709e8f89ae2e18fa61b Mon Sep 17 00:00:00 2001 From: emersion Date: Thu, 16 Jun 2016 09:45:08 +0200 Subject: [PATCH 5/5] Adds indeterminate progressbar to darwin (not yet tested) --- darwin/progressbar.m | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/darwin/progressbar.m b/darwin/progressbar.m index a26874f1..87a9c8d2 100644 --- a/darwin/progressbar.m +++ b/darwin/progressbar.m @@ -27,10 +27,31 @@ struct uiProgressBar { uiDarwinControlAllDefaults(uiProgressBar, pi) +int uiProgressBarValue(uiProgressBar *p) +{ + if ([p->pi getIndeterminate]) { + return -1; + } + + return (int) [p->pi getDoubleValue]; +} + void uiProgressBarSetValue(uiProgressBar *p, int value) { + if (value == -1) { + [p->pi setIndeterminate:YES]; + [p->pi startAnimation:p->pi]; + return; + } + + if ([p->pi getIndeterminate]) { + [p->pi setIndeterminate:NO]; + [p->pi stopAnimation:p->pi]; + } + if (value < 0 || value > 100) userbug("Value %d out of range for a uiProgressBar.", value); + // on 10.8 there's an animation when the progress bar increases, just like with Aero if (value == 100) { [p->pi setMaxValue:101];