Make slider tooltip default on all platforms and add enable/disable functions.
Introduce two new API functions uiSliderHasTooltip and uiSliderSetHasTooltip to query and set uiSlider tooltip state. Fix inconsistency between windows (tooltip), unix (value over slider) and darwin (no value displayed at all).
This commit is contained in:
parent
17486fd175
commit
56e0037d46
|
@ -26,8 +26,11 @@ struct uiSlider {
|
|||
NSSlider *slider;
|
||||
void (*onChanged)(uiSlider *, void *);
|
||||
void *onChangedData;
|
||||
bool hasTooltip;
|
||||
};
|
||||
|
||||
static void _uiSliderUpdateTooltip(uiSlider *s);
|
||||
|
||||
@interface sliderDelegateClass : NSObject {
|
||||
uiprivMap *sliders;
|
||||
}
|
||||
|
@ -58,6 +61,9 @@ struct uiSlider {
|
|||
|
||||
s = (uiSlider *) uiprivMapGet(self->sliders, sender);
|
||||
(*(s->onChanged))(s, s->onChangedData);
|
||||
|
||||
if (s->hasTooltip)
|
||||
_uiSliderUpdateTooltip(s);
|
||||
}
|
||||
|
||||
- (void)registerSlider:(uiSlider *)s
|
||||
|
@ -88,6 +94,26 @@ static void uiSliderDestroy(uiControl *c)
|
|||
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)
|
||||
{
|
||||
return [s->slider integerValue];
|
||||
|
@ -143,5 +169,7 @@ uiSlider *uiNewSlider(int min, int max)
|
|||
[sliderDelegate registerSlider:s];
|
||||
uiSliderOnChanged(s, defaultOnChanged, NULL);
|
||||
|
||||
uiSliderSetHasTooltip(s, 1);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
|
2
ui.h
2
ui.h
|
@ -209,6 +209,8 @@ typedef struct uiSlider uiSlider;
|
|||
#define uiSlider(this) ((uiSlider *) (this))
|
||||
_UI_EXTERN int uiSliderValue(uiSlider *s);
|
||||
_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 uiSlider *uiNewSlider(int min, int max);
|
||||
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
// 11 june 2015
|
||||
#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 {
|
||||
uiUnixControl c;
|
||||
GtkWidget *widget;
|
||||
|
@ -9,15 +15,25 @@ struct uiSlider {
|
|||
void (*onChanged)(uiSlider *, void *);
|
||||
void *onChangedData;
|
||||
gulong onChangedSignal;
|
||||
gchar tooltip[MAX_STRLEN_FOR_NBITS_IN_DECIMAL(sizeof(int) * CHAR_BIT) + 1];
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
uiSlider *s = uiSlider(data);
|
||||
|
||||
(*(s->onChanged))(s, s->onChangedData);
|
||||
|
||||
if (uiSliderHasTooltip(s))
|
||||
_uiSliderUpdateTooltip(s);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
s->onChanged = f;
|
||||
|
@ -61,6 +90,10 @@ uiSlider *uiNewSlider(int min, int max)
|
|||
s->range = GTK_RANGE(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
|
||||
gtk_scale_set_digits(s->scale, 0);
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ struct uiSlider {
|
|||
HWND hwnd;
|
||||
void (*onChanged)(uiSlider *, void *);
|
||||
void *onChangedData;
|
||||
HWND hwndTooltip;
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
// ensure TRACKBAR_CLASSW takes care of destroying the tooltip
|
||||
uiSliderSetHasTooltip(s, 1);
|
||||
|
||||
uiWindowsUnregisterWM_HSCROLLHandler(s->hwnd);
|
||||
uiWindowsEnsureDestroyWindow(s->hwnd);
|
||||
uiFreeControl(uiControl(s));
|
||||
|
@ -46,6 +50,19 @@ static void uiSliderMinimumSize(uiWindowsControl *c, int *width, int *height)
|
|||
*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)
|
||||
{
|
||||
// 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_SETPOS, (WPARAM) TRUE, (LPARAM) min);
|
||||
|
||||
s->hwndTooltip = (HWND) SendMessage(s->hwnd, TBM_GETTOOLTIPS, 0, 0);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue