-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathMixerElementSelectorWindow.vala
More file actions
130 lines (107 loc) · 4.59 KB
/
MixerElementSelectorWindow.vala
File metadata and controls
130 lines (107 loc) · 4.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
* brickman -- Brick Manager for LEGO MINDSTORMS EV3/ev3dev
*
* Copyright (C) 2016 Kaelin Laundry <wasabifan@outlook.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* MixerElementSelectorWindow.vala - Lists ALSA mixer elements
*/
using Ev3devKit;
using Ev3devKit.Ui;
namespace BrickManager {
public class MixerElementSelectorWindow : BrickManagerWindow {
Ui.Menu element_menu;
public signal void mixer_element_selected (IMixerElementViewModel selected_element);
public MixerElementSelectorWindow () {
title = "Volume Controls";
element_menu = new Ui.Menu ();
content_vbox.add (element_menu);
}
protected string get_element_label_text (IMixerElementViewModel element) {
var builder = new StringBuilder ();
builder.append (element.name);
if (element.index != 0) {
builder.append_printf ("[%u]", element.index);
}
if (element.can_mute && element.is_muted) {
builder.append (" (muted)");
} else {
builder.append_printf (" (%ld%%)", element.volume);
}
return builder.str;
}
protected void sort_element_menu () {
// TODO: we would get much better performance if we just inserted
// the item in the correct place instead of sorting the entire list
// each time an item is inserted.
element_menu.sort_menu_items ((a, b) => {
var element_a = a.represented_object as IMixerElementViewModel;
var element_b = b.represented_object as IMixerElementViewModel;
// Group by name, and sort by index within the same name
if (element_a.name == element_b.name) {
return (int)element_a.index - (int)element_b.index;
} else {
return element_a.name.ascii_casecmp (element_b.name);
}
});
}
public void add_element (IMixerElementViewModel element) {
var menu_item = new Ui.MenuItem (get_element_label_text (element)) {
represented_object = (Object)element
};
weak IMixerElementViewModel weak_element = element;
// Update the menu item whenever the represented element changes
weak_element.notify.connect ((sender, property) => {
menu_item.label.text = get_element_label_text (weak_element);
sort_element_menu ();
});
// Emit a selection signal for this element when its menu item is selected
menu_item.button.pressed.connect (() =>
mixer_element_selected (weak_element));
element_menu.add_menu_item (menu_item);
}
protected void remove_menu_item (Ui.MenuItem menu_item) {
if (menu_item != null) {
element_menu.remove_menu_item (menu_item);
}
}
public void remove_element (IMixerElementViewModel element) {
var item = element_menu.find_menu_item<IMixerElementViewModel> (element, (menu_item, target_element) => {
return target_element == (menu_item.represented_object as IMixerElementViewModel);
});
remove_menu_item (item);
}
public void clear_elements () {
var iter = element_menu.menu_item_iter ();
while (iter.size > 0) {
remove_menu_item (iter[0]);
}
}
public bool has_single_element {
get {
return element_menu.menu_item_iter ().size == 1;
}
}
public IMixerElementViewModel? first_element {
get {
if (element_menu.menu_item_iter ().size <= 0) {
return null;
}
return element_menu.menu_item_iter ().get (0).represented_object as IMixerElementViewModel;
}
}
}
}