Skip to content

Commit d8445b1

Browse files
committed
feat: add widget slider
1 parent 8b8f7db commit d8445b1

File tree

4 files changed

+160
-7
lines changed

4 files changed

+160
-7
lines changed

src/configSchema.json

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,9 @@
324324
"^menubar(#[a-zA-Z0-9_-]{1,}){0,1}?$": {
325325
"$ref": "#/widgets/menubar"
326326
},
327+
"^slider(#[a-zA-Z0-9_-]{1,}){0,1}?$": {
328+
"$ref": "#/widgets/slider"
329+
},
327330
"^volume(#[a-zA-Z0-9_-]{1,}){0,1}?$": {
328331
"$ref": "#/widgets/volume"
329332
},
@@ -446,9 +449,9 @@
446449
"default": ""
447450
},
448451
"active": {
449-
"type": "boolean",
450-
"description": "Wether the toggle button is active as default or not",
451-
"default": false
452+
"type": "boolean",
453+
"description": "Wether the toggle button is active as default or not",
454+
"default": false
452455
}
453456
}
454457
}
@@ -482,13 +485,13 @@
482485
"description": "Animation type for menu",
483486
"enum": ["slide_down", "slide_up", "none"]
484487
},
485-
"animation-duration":{
488+
"animation-duration": {
486489
"type": "integer",
487490
"default": 250,
488491
"description": "Duration of animation in milliseconds"
489492
},
490493
"actions": {
491-
"$ref" : "#/widgets/buttons-grid/properties/actions"
494+
"$ref": "#/widgets/buttons-grid/properties/actions"
492495
}
493496
}
494497
},
@@ -504,12 +507,59 @@
504507
"enum": ["right", "left"]
505508
},
506509
"actions": {
507-
"$ref" : "#/widgets/buttons-grid/properties/actions"
510+
"$ref": "#/widgets/buttons-grid/properties/actions"
508511
}
509512
}
510513
}
511514
}
512515
},
516+
"slider": {
517+
"type": "object",
518+
"description": "Slider to control pulse volume",
519+
"additionalProperties": false,
520+
"properties": {
521+
"label": {
522+
"type": "string",
523+
"description": "Text displayed in front of the slider",
524+
"default": "slider"
525+
},
526+
"cmd_setter": {
527+
"type": "string",
528+
"description": "command to set the value",
529+
"default": ""
530+
},
531+
"cmd_getter": {
532+
"type": "string",
533+
"description": "command to get the actual value",
534+
"default": ""
535+
},
536+
"min": {
537+
"type": "integer",
538+
"description": "minimum value of the slider range",
539+
"default": 0
540+
},
541+
"max": {
542+
"type": "integer",
543+
"description": "maximum value of the slider range",
544+
"default": 100
545+
},
546+
"min_limit": {
547+
"type": "integer",
548+
"description": "limit minimum value of the slider",
549+
"default": 0
550+
},
551+
"max_limit": {
552+
"type": "integer",
553+
"description": "limit maximum value of the slider",
554+
"default": 100
555+
},
556+
"value_scale": {
557+
"type": "integer",
558+
"default": 0,
559+
"description": "scale small value, slider round digits"
560+
}
561+
}
562+
},
513563
"volume": {
514564
"type": "object",
515565
"description": "Slider to control pulse volume",
@@ -561,7 +611,7 @@
561611
"description": "Animation type for menu",
562612
"enum": ["slide_down", "slide_up", "none"]
563613
},
564-
"animation-duration":{
614+
"animation-duration": {
565615
"type": "integer",
566616
"default": 250,
567617
"description": "Duration of animation in milliseconds"

src/controlCenter/widgets/factory.vala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ namespace SwayNotificationCenter.Widgets {
2626
case "buttons-grid":
2727
widget = new ButtonsGrid (suffix, swaync_daemon, noti_daemon);
2828
break;
29+
case "slider":
30+
widget = new Slider (suffix, swaync_daemon, noti_daemon);
31+
break;
2932
#if HAVE_PULSE_AUDIO
3033
case "volume":
3134
widget = new Volume (suffix, swaync_daemon, noti_daemon);
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
namespace SwayNotificationCenter.Widgets {
2+
public class Slider : BaseWidget {
3+
public override string widget_name {
4+
get {
5+
return "slider";
6+
}
7+
}
8+
9+
Gtk.Label label_widget = new Gtk.Label (null);
10+
Gtk.Scale slider = new Gtk.Scale.with_range (Gtk.Orientation.HORIZONTAL, 0, 100, 1);
11+
12+
private double min_limit;
13+
private double max_limit;
14+
private double ? last_set;
15+
16+
private string cmd_setter;
17+
private string cmd_getter;
18+
19+
public Slider (string suffix, SwayncDaemon swaync_daemon, NotiDaemon noti_daemon) {
20+
base (suffix, swaync_daemon, noti_daemon);
21+
22+
int ? round_digits = 0;
23+
24+
Json.Object ? config = get_config (this);
25+
if (config != null) {
26+
string ? label = get_prop<string> (config, "label");
27+
label_widget.set_label (label ?? "Slider");
28+
29+
cmd_setter = get_prop<string> (config, "cmd_setter") ?? "";
30+
cmd_getter = get_prop<string> (config, "cmd_getter") ?? "";
31+
32+
int ? min = get_prop<int> (config, "min");
33+
int ? max = get_prop<int> (config, "max");
34+
int ? maxl = get_prop<int> (config, "max_limit");
35+
int ? minl = get_prop<int> (config, "min_limit");
36+
round_digits = get_prop<int> (config, "value_scale");
37+
38+
if (min == null)min = 0;
39+
if (max == null)max = 100;
40+
if (round_digits == null)round_digits = 0;
41+
42+
max_limit = maxl != null ? double.min (max, maxl) : max;
43+
44+
min_limit = minl != null ? double.max (min, minl) : min;
45+
46+
double scale = Math.pow (10, round_digits);
47+
48+
min_limit /= scale;
49+
max_limit /= scale;
50+
51+
slider.set_range (min / scale, max / scale);
52+
}
53+
54+
slider.set_draw_value (false);
55+
slider.set_round_digits (round_digits);
56+
slider.value_changed.connect (() => {
57+
double value = slider.get_value ();
58+
if (value > max_limit)
59+
value = max_limit;
60+
if (value < min_limit)
61+
value = min_limit;
62+
slider.set_value (value);
63+
64+
string value_str = value.to_string ();
65+
slider.tooltip_text = value_str;
66+
67+
if (cmd_setter != "" && last_set != value) {
68+
last_set = value;
69+
Functions.execute_command.begin (cmd_setter + " " + value_str);
70+
}
71+
});
72+
73+
add (label_widget);
74+
pack_start (slider, true, true, 0);
75+
76+
show_all ();
77+
}
78+
79+
public async void on_update () {
80+
if (cmd_getter == "")
81+
return;
82+
83+
string value_str = "";
84+
yield Functions.execute_command (cmd_getter, {}, out value_str);
85+
86+
double value = double.parse (value_str);
87+
if (value <= max_limit && value >= min_limit) {
88+
last_set = value;
89+
slider.set_value (value);
90+
}
91+
}
92+
93+
public override void on_cc_visibility_change (bool value) {
94+
if (value)
95+
on_update.begin ();
96+
}
97+
}
98+
}

src/meson.build

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ widget_sources = [
4141
'controlCenter/widgets/menubar/menubar.vala',
4242
# Widget: Buttons Grid
4343
'controlCenter/widgets/buttonsGrid/buttonsGrid.vala',
44+
# Widget: Slider
45+
'controlCenter/widgets/slider/slider.vala',
4446
# Widget: Backlight Slider
4547
'controlCenter/widgets/backlight/backlight.vala',
4648
'controlCenter/widgets/backlight/backlightUtil.vala',

0 commit comments

Comments
 (0)