Merge d7b1ecef0e
into fea45b2d5b
This commit is contained in:
commit
17fa6d97de
|
@ -26,8 +26,11 @@ struct uiSlider {
|
||||||
NSSlider *slider;
|
NSSlider *slider;
|
||||||
void (*onChanged)(uiSlider *, void *);
|
void (*onChanged)(uiSlider *, void *);
|
||||||
void *onChangedData;
|
void *onChangedData;
|
||||||
|
bool hasTooltip;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void _uiSliderUpdateTooltip(uiSlider *s);
|
||||||
|
|
||||||
@interface sliderDelegateClass : NSObject {
|
@interface sliderDelegateClass : NSObject {
|
||||||
uiprivMap *sliders;
|
uiprivMap *sliders;
|
||||||
}
|
}
|
||||||
|
@ -58,6 +61,9 @@ struct uiSlider {
|
||||||
|
|
||||||
s = (uiSlider *) uiprivMapGet(self->sliders, sender);
|
s = (uiSlider *) uiprivMapGet(self->sliders, sender);
|
||||||
(*(s->onChanged))(s, s->onChangedData);
|
(*(s->onChanged))(s, s->onChangedData);
|
||||||
|
|
||||||
|
if (s->hasTooltip)
|
||||||
|
_uiSliderUpdateTooltip(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)registerSlider:(uiSlider *)s
|
- (void)registerSlider:(uiSlider *)s
|
||||||
|
@ -88,6 +94,26 @@ static void uiSliderDestroy(uiControl *c)
|
||||||
uiFreeControl(uiControl(s));
|
uiFreeControl(uiControl(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _uiSliderUpdateTooltip(uiSlider *s)
|
||||||
|
{
|
||||||
|
[s->slider setToolTip:[NSString stringWithFormat:@"%ld", [s->slider integerValue]]];
|
||||||
|
}
|
||||||
|
|
||||||
|
int uiSliderHasTooltip(uiSlider *s)
|
||||||
|
{
|
||||||
|
return s->hasTooltip;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiSliderSetHasTooltip(uiSlider *s, int hasTooltip)
|
||||||
|
{
|
||||||
|
s->hasTooltip = hasTooltip;
|
||||||
|
|
||||||
|
if (hasTooltip)
|
||||||
|
_uiSliderUpdateTooltip(s);
|
||||||
|
else
|
||||||
|
[s->slider setToolTip:nil];
|
||||||
|
}
|
||||||
|
|
||||||
int uiSliderValue(uiSlider *s)
|
int uiSliderValue(uiSlider *s)
|
||||||
{
|
{
|
||||||
return [s->slider integerValue];
|
return [s->slider integerValue];
|
||||||
|
@ -143,5 +169,7 @@ uiSlider *uiNewSlider(int min, int max)
|
||||||
[sliderDelegate registerSlider:s];
|
[sliderDelegate registerSlider:s];
|
||||||
uiSliderOnChanged(s, defaultOnChanged, NULL);
|
uiSliderOnChanged(s, defaultOnChanged, NULL);
|
||||||
|
|
||||||
|
uiSliderSetHasTooltip(s, 1);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
28
test/page4.c
28
test/page4.c
|
@ -4,6 +4,7 @@
|
||||||
static uiSpinbox *spinbox;
|
static uiSpinbox *spinbox;
|
||||||
static uiSlider *slider;
|
static uiSlider *slider;
|
||||||
static uiProgressBar *pbar;
|
static uiProgressBar *pbar;
|
||||||
|
static uiCheckbox *checkbox;
|
||||||
|
|
||||||
#define CHANGED(what) \
|
#define CHANGED(what) \
|
||||||
static void on ## what ## Changed(ui ## what *this, void *data) \
|
static void on ## what ## Changed(ui ## what *this, void *data) \
|
||||||
|
@ -75,6 +76,18 @@ static void selectNone(uiButton *b, void *data)
|
||||||
uiRadioButtonsSetSelected(rb, -1);
|
uiRadioButtonsSetSelected(rb, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sliderEnableTooltip(uiButton *b, void *data)
|
||||||
|
{
|
||||||
|
uiSliderSetHasTooltip(uiSlider(data), 1);
|
||||||
|
uiCheckboxSetChecked(checkbox, uiSliderHasTooltip(uiSlider(data)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sliderDisableTooltip(uiButton *b, void *data)
|
||||||
|
{
|
||||||
|
uiSliderSetHasTooltip(uiSlider(data), 0);
|
||||||
|
uiCheckboxSetChecked(checkbox, uiSliderHasTooltip(uiSlider(data)));
|
||||||
|
}
|
||||||
|
|
||||||
uiBox *makePage4(void)
|
uiBox *makePage4(void)
|
||||||
{
|
{
|
||||||
uiBox *page4;
|
uiBox *page4;
|
||||||
|
@ -93,6 +106,21 @@ uiBox *makePage4(void)
|
||||||
uiSliderOnChanged(slider, onSliderChanged, NULL);
|
uiSliderOnChanged(slider, onSliderChanged, NULL);
|
||||||
uiBoxAppend(page4, uiControl(slider), 0);
|
uiBoxAppend(page4, uiControl(slider), 0);
|
||||||
|
|
||||||
|
hbox = newHorizontalBox();
|
||||||
|
slider = uiNewSlider(0, 100);
|
||||||
|
uiBoxAppend(hbox, uiControl(slider), 1);
|
||||||
|
b = uiNewButton("Enable Tooltip");
|
||||||
|
uiButtonOnClicked(b, sliderEnableTooltip, slider);
|
||||||
|
uiBoxAppend(hbox, uiControl(b), 0);
|
||||||
|
b = uiNewButton("Disable Tooltip");
|
||||||
|
uiButtonOnClicked(b, sliderDisableTooltip, slider);
|
||||||
|
uiBoxAppend(hbox, uiControl(b), 0);
|
||||||
|
checkbox = uiNewCheckbox("Has Tooltip");
|
||||||
|
uiControlDisable(uiControl(checkbox));
|
||||||
|
uiCheckboxSetChecked(checkbox, uiSliderHasTooltip(slider));
|
||||||
|
uiBoxAppend(hbox, uiControl(checkbox), 0);
|
||||||
|
uiBoxAppend(page4, uiControl(hbox), 0);
|
||||||
|
|
||||||
pbar = uiNewProgressBar();
|
pbar = uiNewProgressBar();
|
||||||
uiBoxAppend(page4, uiControl(pbar), 0);
|
uiBoxAppend(page4, uiControl(pbar), 0);
|
||||||
|
|
||||||
|
|
2
ui.h
2
ui.h
|
@ -209,6 +209,8 @@ typedef struct uiSlider uiSlider;
|
||||||
#define uiSlider(this) ((uiSlider *) (this))
|
#define uiSlider(this) ((uiSlider *) (this))
|
||||||
_UI_EXTERN int uiSliderValue(uiSlider *s);
|
_UI_EXTERN int uiSliderValue(uiSlider *s);
|
||||||
_UI_EXTERN void uiSliderSetValue(uiSlider *s, int value);
|
_UI_EXTERN void uiSliderSetValue(uiSlider *s, int value);
|
||||||
|
_UI_EXTERN int uiSliderHasTooltip(uiSlider *s);
|
||||||
|
_UI_EXTERN void uiSliderSetHasTooltip(uiSlider *s, int hasTooltip);
|
||||||
_UI_EXTERN void uiSliderOnChanged(uiSlider *s, void (*f)(uiSlider *s, void *data), void *data);
|
_UI_EXTERN void uiSliderOnChanged(uiSlider *s, void (*f)(uiSlider *s, void *data), void *data);
|
||||||
_UI_EXTERN uiSlider *uiNewSlider(int min, int max);
|
_UI_EXTERN uiSlider *uiNewSlider(int min, int max);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
// 11 june 2015
|
// 11 june 2015
|
||||||
#include "uipriv_unix.h"
|
#include "uipriv_unix.h"
|
||||||
|
|
||||||
|
/* Number of digits to represent an n-bit number in decimal: log10(2^n)
|
||||||
|
* Simplify, truncate & add 1 for full digits, add 1 for negative numbers:
|
||||||
|
* -> n log10(2) + 2 <= n * 0.302 + 2
|
||||||
|
*/
|
||||||
|
#define MAX_STRLEN_FOR_NBITS_IN_DECIMAL(n) ((int)((n) * 302 / 1000) + 2)
|
||||||
|
|
||||||
struct uiSlider {
|
struct uiSlider {
|
||||||
uiUnixControl c;
|
uiUnixControl c;
|
||||||
GtkWidget *widget;
|
GtkWidget *widget;
|
||||||
|
@ -9,15 +15,25 @@ struct uiSlider {
|
||||||
void (*onChanged)(uiSlider *, void *);
|
void (*onChanged)(uiSlider *, void *);
|
||||||
void *onChangedData;
|
void *onChangedData;
|
||||||
gulong onChangedSignal;
|
gulong onChangedSignal;
|
||||||
|
gchar tooltip[MAX_STRLEN_FOR_NBITS_IN_DECIMAL(sizeof(int) * CHAR_BIT) + 1];
|
||||||
};
|
};
|
||||||
|
|
||||||
uiUnixControlAllDefaults(uiSlider)
|
uiUnixControlAllDefaults(uiSlider)
|
||||||
|
|
||||||
|
static void _uiSliderUpdateTooltip(uiSlider *s)
|
||||||
|
{
|
||||||
|
g_snprintf(s->tooltip, sizeof(s->tooltip)/sizeof(s->tooltip[0]), "%d", uiSliderValue(s));
|
||||||
|
gtk_widget_set_tooltip_text(s->widget, s->tooltip);
|
||||||
|
}
|
||||||
|
|
||||||
static void onChanged(GtkRange *range, gpointer data)
|
static void onChanged(GtkRange *range, gpointer data)
|
||||||
{
|
{
|
||||||
uiSlider *s = uiSlider(data);
|
uiSlider *s = uiSlider(data);
|
||||||
|
|
||||||
(*(s->onChanged))(s, s->onChangedData);
|
(*(s->onChanged))(s, s->onChangedData);
|
||||||
|
|
||||||
|
if (uiSliderHasTooltip(s))
|
||||||
|
_uiSliderUpdateTooltip(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void defaultOnChanged(uiSlider *s, void *data)
|
static void defaultOnChanged(uiSlider *s, void *data)
|
||||||
|
@ -38,6 +54,19 @@ void uiSliderSetValue(uiSlider *s, int value)
|
||||||
g_signal_handler_unblock(s->range, s->onChangedSignal);
|
g_signal_handler_unblock(s->range, s->onChangedSignal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int uiSliderHasTooltip(uiSlider *s)
|
||||||
|
{
|
||||||
|
return gtk_widget_get_has_tooltip(s->widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiSliderSetHasTooltip(uiSlider *s, int hasTooltip)
|
||||||
|
{
|
||||||
|
gtk_widget_set_has_tooltip(s->widget, hasTooltip);
|
||||||
|
|
||||||
|
if (hasTooltip)
|
||||||
|
_uiSliderUpdateTooltip(s);
|
||||||
|
}
|
||||||
|
|
||||||
void uiSliderOnChanged(uiSlider *s, void (*f)(uiSlider *, void *), void *data)
|
void uiSliderOnChanged(uiSlider *s, void (*f)(uiSlider *, void *), void *data)
|
||||||
{
|
{
|
||||||
s->onChanged = f;
|
s->onChanged = f;
|
||||||
|
@ -61,6 +90,10 @@ uiSlider *uiNewSlider(int min, int max)
|
||||||
s->range = GTK_RANGE(s->widget);
|
s->range = GTK_RANGE(s->widget);
|
||||||
s->scale = GTK_SCALE(s->widget);
|
s->scale = GTK_SCALE(s->widget);
|
||||||
|
|
||||||
|
// do not draw value, show tooltip instead
|
||||||
|
gtk_scale_set_draw_value(s->scale, 0);
|
||||||
|
uiSliderSetHasTooltip(s, 1);
|
||||||
|
|
||||||
// ensure integers, just to be safe
|
// ensure integers, just to be safe
|
||||||
gtk_scale_set_digits(s->scale, 0);
|
gtk_scale_set_digits(s->scale, 0);
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ struct uiSlider {
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
void (*onChanged)(uiSlider *, void *);
|
void (*onChanged)(uiSlider *, void *);
|
||||||
void *onChangedData;
|
void *onChangedData;
|
||||||
|
HWND hwndTooltip;
|
||||||
};
|
};
|
||||||
|
|
||||||
static BOOL onWM_HSCROLL(uiControl *c, HWND hwnd, WORD code, LRESULT *lResult)
|
static BOOL onWM_HSCROLL(uiControl *c, HWND hwnd, WORD code, LRESULT *lResult)
|
||||||
|
@ -21,6 +22,9 @@ static void uiSliderDestroy(uiControl *c)
|
||||||
{
|
{
|
||||||
uiSlider *s = uiSlider(c);
|
uiSlider *s = uiSlider(c);
|
||||||
|
|
||||||
|
// ensure TRACKBAR_CLASSW takes care of destroying the tooltip
|
||||||
|
uiSliderSetHasTooltip(s, 1);
|
||||||
|
|
||||||
uiWindowsUnregisterWM_HSCROLLHandler(s->hwnd);
|
uiWindowsUnregisterWM_HSCROLLHandler(s->hwnd);
|
||||||
uiWindowsEnsureDestroyWindow(s->hwnd);
|
uiWindowsEnsureDestroyWindow(s->hwnd);
|
||||||
uiFreeControl(uiControl(s));
|
uiFreeControl(uiControl(s));
|
||||||
|
@ -46,6 +50,19 @@ static void uiSliderMinimumSize(uiWindowsControl *c, int *width, int *height)
|
||||||
*height = y;
|
*height = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int uiSliderHasTooltip(uiSlider *s)
|
||||||
|
{
|
||||||
|
return ((HWND) SendMessage(s->hwnd, TBM_GETTOOLTIPS, 0, 0) == s->hwndTooltip);
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiSliderSetHasTooltip(uiSlider *s, int hasTooltip)
|
||||||
|
{
|
||||||
|
if (hasTooltip)
|
||||||
|
SendMessage(s->hwnd, TBM_SETTOOLTIPS, (WPARAM) s->hwndTooltip, 0);
|
||||||
|
else
|
||||||
|
SendMessage(s->hwnd, TBM_SETTOOLTIPS, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void defaultOnChanged(uiSlider *s, void *data)
|
static void defaultOnChanged(uiSlider *s, void *data)
|
||||||
{
|
{
|
||||||
// do nothing
|
// do nothing
|
||||||
|
@ -94,5 +111,7 @@ uiSlider *uiNewSlider(int min, int max)
|
||||||
SendMessageW(s->hwnd, TBM_SETRANGEMAX, (WPARAM) TRUE, (LPARAM) max);
|
SendMessageW(s->hwnd, TBM_SETRANGEMAX, (WPARAM) TRUE, (LPARAM) max);
|
||||||
SendMessageW(s->hwnd, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) min);
|
SendMessageW(s->hwnd, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) min);
|
||||||
|
|
||||||
|
s->hwndTooltip = (HWND) SendMessage(s->hwnd, TBM_GETTOOLTIPS, 0, 0);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue