File: choosers.py

package info (click to toggle)
lirc 0.10.2-0.10
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 8,268 kB
  • sloc: ansic: 26,981; cpp: 9,187; sh: 5,875; python: 4,507; makefile: 1,049; xml: 63
file content (250 lines) | stat: -rw-r--r-- 9,409 bytes parent folder | download | duplicates (4)
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
'''
 Simple lirc setup tool - choosers.

Classes to select device and remote, part of the MVC view
'''

import os
import gi
from gi.repository import Gtk         # pylint: disable=no-name-in-module

import mvc_model
import baseview

gi.require_version('Gtk', '3.0')

_DEBUG = 'LIRC_DEBUG' in os.environ


def on_window_delete_event_cb(window, event):
    ''' Generic window close event. '''
    window.hide()
    return True


class RemoteSelector(baseview.Baseview):
    ''' Select remote, possibly using a dialog. '''

    def __init__(self, controller, on_select_cb):
        baseview.Baseview.__init__(self, controller.view)
        self.view = controller.view
        self.controller = controller
        self.on_select_cb = on_select_cb
        self.prev_window = \
            self.view.builder.get_object('preconfig_select_window')
        self.next_window = \
            self.view.builder.get_object('main_window')

    def select(self, remotes):
        ''' Select a remote with a driver attribute 'driver' '''

        def build_treeview(remotes):
            ''' Construct the remotes liststore treeview. '''
            treeview = self._create_treeview('drv_select_remote_view',
                                             ['Remote'])
            treeview.get_model().clear()
            for l in sorted(remotes):
                treeview.get_model().append([l])
            return treeview

        def on_select_next_cb(button, data=None):
            ''' User pushed 'Next' button. '''
            lbl = self.view.builder.get_object('drv_select_remote_lbl')
            self.on_select_cb(lbl.get_text())
            button.get_toplevel().hide()
            self.next_window.show()

        def on_select_back_cb(button, data=None):
            ''' User pushed 'Back' button. '''
            button.get_toplevel().hide()
            self.prev_window.show()

        def on_treeview_change_cb(selection, data=None):
            ''' User selected a row i. e., a remote. '''
            (model, iter_) = selection.get_selected()
            if not iter_:
                return
            label = self.view.builder.get_object('drv_select_remote_lbl')
            label.set_text(model[iter_][0])
            b = self.view.builder.get_object('drv_select_remote_next_btn')
            b.set_sensitive(True)

        l = self.view.builder.get_object('drv_select_remote_main_lbl')
        l.set_text("Select remote configuration for driver")
        w = self.view.builder.get_object('drv_select_remote_window')
        treeview = build_treeview(remotes)
        if not self.test_and_set_connected('drv_select_remote_window'):
            w.connect('delete-event', on_window_delete_event_cb)
            treeview.get_selection().connect('changed',
                                             on_treeview_change_cb)
            b = self.view.builder.get_object('drv_select_remote_next_btn')
            b.connect('clicked', on_select_next_cb)
            b = self.view.builder.get_object('drv_select_remote_back_btn')
            b.connect('clicked', on_select_back_cb)
            b.set_sensitive(True)
        w.show_all()


class DeviceSelector(baseview.Baseview):
    ''' Base class for selecting lircd  --device option setup. '''

    help_label = None
    device_label = 'default driver on %device'
    intro_label = 'Select device for the TBD driver.'

    def __init__(self, device_list, view, on_select_cb):
        baseview.Baseview.__init__(self, view)
        self.label_by_device = device_list.label_by_device
        self.driver_id = device_list.driver_id
        self.view = view
        self.group = None
        self.view.load_configs()
        self.on_select_cb = on_select_cb
        w = view.builder.get_object('select_dev_window')
        self.reconnect(w, 'delete-event', on_window_delete_event_cb)
        b = view.builder.get_object('select_dev_ok_btn')
        self.reconnect(b, 'clicked', self.on_ok_btn_clicked_cb)

    def on_option_btn_toggled_cb(self, button, device):
        ''' User selected a device. '''
        self.view.model.set_device('/dev/' + device)

    def on_help_clicked_cb(self, button, device):
        ''' Display dmesg output for given device. '''
        lines = mvc_model.get_dmesg_help(device)
        if lines:
            self.view.show_text('\n'.join(lines))
        else:
            self.view.show_text(
                'No dmesg info found for ' + device)

    def on_ok_btn_clicked_cb(self, button, data=None):
        ''' User clicked OK, go ahead and select active device. '''
        for b in self.group.get_group():
            if b.get_active():
                self.on_select_cb(self.driver_id, b.lirc_name)
                break
        else:
            if _DEBUG:
                print("No active button?!")
        button.get_toplevel().hide()
        return True

    def get_dialog_widget(self):
        ''' Return a grid with radio buttons selectable options. '''
        # pylint: disable=not-callable
        grid = Gtk.Grid()
        grid.set_column_spacing(10)
        radio_buttons = {}
        help_buttons = {}
        group = None
        for device, label in self.label_by_device.items():
            if len(radio_buttons) == 0:
                radio_buttons[device] = Gtk.RadioButton(label)
                group = radio_buttons[device]
            else:
                radio_buttons[device] = \
                    Gtk.RadioButton.new_with_label_from_widget(group,
                                                               label)
            self.reconnect(radio_buttons[device],
                           'toggled',
                           self.on_option_btn_toggled_cb,
                           device)
            size = len(radio_buttons)
            grid.attach(radio_buttons[device], 0, size, 1, 1)
            radio_buttons[device].lirc_name = device
            if self.help_label:
                help_buttons[device] = Gtk.Button(self.help_label)
                self.reconnect(help_buttons[device],
                               'clicked',
                               self.on_help_clicked_cb,
                               device)
                grid.attach(help_buttons[device], 1, size, 1, 1)

        self.group = group
        l = self.view.builder.get_object('select_dev_label')
        l.set_text(self.intro_label)
        return grid

    def show_dialog(self):
        ''' Add the dialog widget (default options) '''
        parent = self.view.builder.get_object('select_dev_list_port')
        childs = parent.get_children()
        if childs:
            parent.remove(childs[0])
        widget = self.get_dialog_widget()
        parent.add(widget)
        self.view.builder.get_object('select_dev_window').show_all()


class EventDeviceSelector(DeviceSelector):
    ''' Let user select an event device. '''

    intro_label = 'Select /dev/input device for the devinput driver.'
    device_label = 'Devinput driver on %device'


class LircDeviceSelector(DeviceSelector):
    ''' Let user select a /dev/lirc? device. '''

    help_label = 'dmesg info'
    intro_label = 'Select /dev/lirc device for the default driver.'
    device_label = 'Default driver on %device'


class SerialDeviceSelector(DeviceSelector):
    ''' Let user select a device for a userspace driver. '''

    def __init__(self, device_list, view, on_select_cb):
        DeviceSelector.__init__(self, device_list, view, on_select_cb)
        self.intro_label = 'Select %s device for the %s driver.' \
            % (device_list.device_pattern, device_list.driver_id)
        self.device_label = '%s driver on %s' \
            % (device_list.device_pattern, device_list.driver_id)


class GenericDeviceSelector(DeviceSelector):
    ''' Let user select a device for a generic userspace driver. '''

    def __init__(self, device_list, view, on_select_cb):
        DeviceSelector.__init__(self, device_list, view, on_select_cb)
        self.intro_label = 'Select %s device for the %s driver.' \
            % (device_list.device_pattern, device_list.driver_id)
        self.device_label = '%s driver on %s' \
            % (device_list.device_pattern, device_list.driver_id)


class UdpPortSelector(DeviceSelector):
    ''' Let user select a udp port  for a udp driver. '''

    def show_dialog(self):
        ''' No options, just run the dialog.... '''
        self.view.show_select_udp_port_window()


class AutoDeviceSelector(DeviceSelector):
    ''' Show a message for automatically selected devices. '''

    def show_dialog(self):
        ''' No options, just display the message.... '''
        self.view.show_info("Driver sets device automatically.")


def factory(device_list, view, on_select_cb):
    ''' Return a DeviceSelector handling device_list (a DeviceList).'''
    pattern = device_list.device_pattern
    if 'tty' in pattern:
        return SerialDeviceSelector(device_list, view, on_select_cb)
    elif 'lirc' in pattern:
        return LircDeviceSelector(device_list, view, on_select_cb)
    elif 'event' in pattern:
        return EventDeviceSelector(device_list, view, on_select_cb)
    elif pattern == 'udp_port':
        return UdpPortSelector(device_list, view, on_select_cb)
    elif pattern == 'auto':
        return AutoDeviceSelector(device_list, view, on_select_cb)
    else:
        return GenericDeviceSelector(device_list, view, on_select_cb)


# vim: set expandtab ts=4 sw=4: