Skip to content

Commit 56e0037

Browse files
committed
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).
1 parent 17486fd commit 56e0037

File tree

4 files changed

+82
-0
lines changed

4 files changed

+82
-0
lines changed

darwin/slider.m

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@ - (NSSize)intrinsicContentSize
2626
NSSlider *slider;
2727
void (*onChanged)(uiSlider *, void *);
2828
void *onChangedData;
29+
bool hasTooltip;
2930
};
3031

32+
static void _uiSliderUpdateTooltip(uiSlider *s);
33+
3134
@interface sliderDelegateClass : NSObject {
3235
uiprivMap *sliders;
3336
}
@@ -58,6 +61,9 @@ - (IBAction)onChanged:(id)sender
5861

5962
s = (uiSlider *) uiprivMapGet(self->sliders, sender);
6063
(*(s->onChanged))(s, s->onChangedData);
64+
65+
if (s->hasTooltip)
66+
_uiSliderUpdateTooltip(s);
6167
}
6268

6369
- (void)registerSlider:(uiSlider *)s
@@ -88,6 +94,26 @@ static void uiSliderDestroy(uiControl *c)
8894
uiFreeControl(uiControl(s));
8995
}
9096

97+
static void _uiSliderUpdateTooltip(uiSlider *s)
98+
{
99+
[s->slider setToolTip:[NSString stringWithFormat:@"%ld", [s->slider integerValue]]];
100+
}
101+
102+
int uiSliderHasTooltip(uiSlider *s)
103+
{
104+
return s->hasTooltip;
105+
}
106+
107+
void uiSliderSetHasTooltip(uiSlider *s, int hasTooltip)
108+
{
109+
s->hasTooltip = hasTooltip;
110+
111+
if (hasTooltip)
112+
_uiSliderUpdateTooltip(s);
113+
else
114+
[s->slider setToolTip:nil];
115+
}
116+
91117
int uiSliderValue(uiSlider *s)
92118
{
93119
return [s->slider integerValue];
@@ -143,5 +169,7 @@ static void defaultOnChanged(uiSlider *s, void *data)
143169
[sliderDelegate registerSlider:s];
144170
uiSliderOnChanged(s, defaultOnChanged, NULL);
145171

172+
uiSliderSetHasTooltip(s, 1);
173+
146174
return s;
147175
}

ui.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ typedef struct uiSlider uiSlider;
209209
#define uiSlider(this) ((uiSlider *) (this))
210210
_UI_EXTERN int uiSliderValue(uiSlider *s);
211211
_UI_EXTERN void uiSliderSetValue(uiSlider *s, int value);
212+
_UI_EXTERN int uiSliderHasTooltip(uiSlider *s);
213+
_UI_EXTERN void uiSliderSetHasTooltip(uiSlider *s, int hasTooltip);
212214
_UI_EXTERN void uiSliderOnChanged(uiSlider *s, void (*f)(uiSlider *s, void *data), void *data);
213215
_UI_EXTERN uiSlider *uiNewSlider(int min, int max);
214216

unix/slider.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
// 11 june 2015
22
#include "uipriv_unix.h"
33

4+
/* Number of digits to represent an n-bit number in decimal: log10(2^n)
5+
* Simplify, truncate & add 1 for full digits, add 1 for negative numbers:
6+
* -> n log10(2) + 2 <= n * 0.302 + 2
7+
*/
8+
#define MAX_STRLEN_FOR_NBITS_IN_DECIMAL(n) ((int)((n) * 302 / 1000) + 2)
9+
410
struct uiSlider {
511
uiUnixControl c;
612
GtkWidget *widget;
@@ -9,15 +15,25 @@ struct uiSlider {
915
void (*onChanged)(uiSlider *, void *);
1016
void *onChangedData;
1117
gulong onChangedSignal;
18+
gchar tooltip[MAX_STRLEN_FOR_NBITS_IN_DECIMAL(sizeof(int) * CHAR_BIT) + 1];
1219
};
1320

1421
uiUnixControlAllDefaults(uiSlider)
1522

23+
static void _uiSliderUpdateTooltip(uiSlider *s)
24+
{
25+
g_snprintf(s->tooltip, sizeof(s->tooltip)/sizeof(s->tooltip[0]), "%d", uiSliderValue(s));
26+
gtk_widget_set_tooltip_text(s->widget, s->tooltip);
27+
}
28+
1629
static void onChanged(GtkRange *range, gpointer data)
1730
{
1831
uiSlider *s = uiSlider(data);
1932

2033
(*(s->onChanged))(s, s->onChangedData);
34+
35+
if (uiSliderHasTooltip(s))
36+
_uiSliderUpdateTooltip(s);
2137
}
2238

2339
static void defaultOnChanged(uiSlider *s, void *data)
@@ -38,6 +54,19 @@ void uiSliderSetValue(uiSlider *s, int value)
3854
g_signal_handler_unblock(s->range, s->onChangedSignal);
3955
}
4056

57+
int uiSliderHasTooltip(uiSlider *s)
58+
{
59+
return gtk_widget_get_has_tooltip(s->widget);
60+
}
61+
62+
void uiSliderSetHasTooltip(uiSlider *s, int hasTooltip)
63+
{
64+
gtk_widget_set_has_tooltip(s->widget, hasTooltip);
65+
66+
if (hasTooltip)
67+
_uiSliderUpdateTooltip(s);
68+
}
69+
4170
void uiSliderOnChanged(uiSlider *s, void (*f)(uiSlider *, void *), void *data)
4271
{
4372
s->onChanged = f;
@@ -61,6 +90,10 @@ uiSlider *uiNewSlider(int min, int max)
6190
s->range = GTK_RANGE(s->widget);
6291
s->scale = GTK_SCALE(s->widget);
6392

93+
// do not draw value, show tooltip instead
94+
gtk_scale_set_draw_value(s->scale, 0);
95+
uiSliderSetHasTooltip(s, 1);
96+
6497
// ensure integers, just to be safe
6598
gtk_scale_set_digits(s->scale, 0);
6699

windows/slider.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ struct uiSlider {
66
HWND hwnd;
77
void (*onChanged)(uiSlider *, void *);
88
void *onChangedData;
9+
HWND hwndTooltip;
910
};
1011

1112
static BOOL onWM_HSCROLL(uiControl *c, HWND hwnd, WORD code, LRESULT *lResult)
@@ -21,6 +22,9 @@ static void uiSliderDestroy(uiControl *c)
2122
{
2223
uiSlider *s = uiSlider(c);
2324

25+
// ensure TRACKBAR_CLASSW takes care of destroying the tooltip
26+
uiSliderSetHasTooltip(s, 1);
27+
2428
uiWindowsUnregisterWM_HSCROLLHandler(s->hwnd);
2529
uiWindowsEnsureDestroyWindow(s->hwnd);
2630
uiFreeControl(uiControl(s));
@@ -46,6 +50,19 @@ static void uiSliderMinimumSize(uiWindowsControl *c, int *width, int *height)
4650
*height = y;
4751
}
4852

53+
int uiSliderHasTooltip(uiSlider *s)
54+
{
55+
return ((HWND) SendMessage(s->hwnd, TBM_GETTOOLTIPS, 0, 0) == s->hwndTooltip);
56+
}
57+
58+
void uiSliderSetHasTooltip(uiSlider *s, int hasTooltip)
59+
{
60+
if (hasTooltip)
61+
SendMessage(s->hwnd, TBM_SETTOOLTIPS, (WPARAM) s->hwndTooltip, 0);
62+
else
63+
SendMessage(s->hwnd, TBM_SETTOOLTIPS, 0, 0);
64+
}
65+
4966
static void defaultOnChanged(uiSlider *s, void *data)
5067
{
5168
// do nothing
@@ -94,5 +111,7 @@ uiSlider *uiNewSlider(int min, int max)
94111
SendMessageW(s->hwnd, TBM_SETRANGEMAX, (WPARAM) TRUE, (LPARAM) max);
95112
SendMessageW(s->hwnd, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) min);
96113

114+
s->hwndTooltip = (HWND) SendMessage(s->hwnd, TBM_GETTOOLTIPS, 0, 0);
115+
97116
return s;
98117
}

0 commit comments

Comments
 (0)