made the config_panel self-contained

This commit is contained in:
Daniel Pavel 2013-06-21 15:18:21 +02:00
parent fd35f23af7
commit cdc6da844e
2 changed files with 78 additions and 44 deletions

View File

@ -81,8 +81,9 @@ def _combo_notify(cbbox, setting, spinner):
# return True # return True
def _create_sbox(s): def _create_sbox(s, device_id):
sbox = Gtk.HBox(homogeneous=False, spacing=8) sbox = Gtk.HBox(homogeneous=False, spacing=6)
sbox.set_name(device_id)
sbox.pack_start(Gtk.Label(s.label), False, False, 0) sbox.pack_start(Gtk.Label(s.label), False, False, 0)
spinner = Gtk.Spinner() spinner = Gtk.Spinner()
@ -153,49 +154,58 @@ def _update_setting_item(sbox, value, is_online=True):
# #
# #
# config panel
_box = None
_items = {}
def create(): def create():
b = Gtk.VBox(homogeneous=False, spacing=4) global _box
# b.set_property('margin', 8) assert _box is None
b._last_device = None _box = Gtk.VBox(homogeneous=False, spacing=4)
b._items = {} # _box.set_property('margin', 8)
return b _box._last_device = None
return _box
def update(box, device, is_active): def update(device, is_online):
assert box is not None assert _box is not None
assert device is not None assert device
# if the device changed since last update, clear the box first # if the device changed since last update, clear the box first
if not box._last_device: if device.serial != _box._last_device:
box._last_device = None _box.set_visible(False)
if device.serial != box._last_device: _box._last_device = device.serial
box.set_visible(False)
# if the device just became active, re-read the settings # hide
box.foreach(lambda x, s: x.set_visible(x.get_name() == s), device.serial) _box.foreach(lambda x, s: x.set_visible(x.get_name() == s), device.serial)
if device.serial != box._last_device:
box._last_device = device.serial
box.set_visible(True)
for s in device.settings: for s in device.settings:
k = device.serial + '_' + s.name k = device.serial + '_' + s.name
if k not in box._items: if k in _items:
sbox = _create_sbox(s) sbox = _items[k]
sbox.set_name(device.serial)
box._items[k] = sbox
box.pack_start(sbox, False, False, 0)
else: else:
sbox = box._items[k] sbox = _items[k] = _create_sbox(s, device.serial)
_box.pack_start(sbox, False, False, 0)
if is_active: if is_online:
_apply_queue.put(('read', s, False, sbox)) _apply_queue.put(('read', s, False, sbox))
else: else:
_update_setting_item(sbox, None, False) _update_setting_item(sbox, None, False)
_box.set_visible(True)
def clean(box, device_id): def clean(device_id):
partial_key = device_id + '_' """Remove the controls for a given device serial.
for k in list(box._items.keys()): Needed after the device has been unpaired.
if k.startswith(partial_key): """
del box._items[k] assert _box is not None
for k in list(_items.keys()):
sbox = _items[k]
if sbox.get_name() == device_id:
del _items[k]
def destroy():
global _box
_box = None
_items.clear()

View File

@ -4,7 +4,7 @@
from __future__ import absolute_import, division, print_function, unicode_literals from __future__ import absolute_import, division, print_function, unicode_literals
from logging import getLogger from logging import getLogger, DEBUG as _DEBUG
_log = getLogger(__name__) _log = getLogger(__name__)
del getLogger del getLogger
@ -229,8 +229,12 @@ def _create_tree(model):
tree.set_size_request(240, 0) tree.set_size_request(240, 0)
tree.set_headers_visible(False) tree.set_headers_visible(False)
tree.set_show_expanders(False) tree.set_show_expanders(False)
tree.set_level_indentation(16) tree.set_level_indentation(20)
# tree.set_fixed_height_mode(True)
tree.set_enable_tree_lines(True) tree.set_enable_tree_lines(True)
tree.set_reorderable(False)
tree.set_activate_on_single_click(True)
tree.set_enable_search(False)
# tree.set_rules_hint(True) # tree.set_rules_hint(True)
tree.set_model(model) tree.set_model(model)
@ -355,21 +359,32 @@ def _device_selected(selection):
def _receiver_row(receiver_path, receiver=None): def _receiver_row(receiver_path, receiver=None):
assert receiver_path
item = _model.get_iter_first() item = _model.get_iter_first()
while item: while item:
if _model.get_value(item, _COLUMN.ID) == receiver_path: if _model.get_value(item, _COLUMN.ID) == receiver_path:
return item return item
item = _model.iter_next(item) item = _model.iter_next(item)
if not item and receiver is not None: if not item and receiver:
row_data = (receiver_path, True, receiver.name, _icons.device_icon_name(receiver.name), '', receiver) icon_name = _icons.device_icon_name(receiver.name)
pairing_icon_name = ''
row_data = (receiver_path, True, receiver.name, icon_name, pairing_icon_name, receiver)
if _log.isEnabledFor(_DEBUG):
_log.debug("new receiver row %s", row_data)
# _log.debug("receiver %s", receiver)
item = _model.append(None, row_data) item = _model.append(None, row_data)
_model.append(None, _TREE_SEPATATOR) if _TREE_SEPATATOR:
_model.append(None, _TREE_SEPATATOR)
return item or None return item or None
def _device_row(receiver_path, device_serial, device=None): def _device_row(receiver_path, device_serial, device=None):
assert receiver_path
assert device_serial
receiver_row = _receiver_row(receiver_path, None if device is None else device.receiver) receiver_row = _receiver_row(receiver_path, None if device is None else device.receiver)
item = _model.iter_children(receiver_row) item = _model.iter_children(receiver_row)
while item: while item:
@ -377,9 +392,13 @@ def _device_row(receiver_path, device_serial, device=None):
return item return item
item = _model.iter_next(item) item = _model.iter_next(item)
if not item and device is not None: if not item and device:
# print ("new device row", device) icon_name = _icons.device_icon_name(device.name, device.kind)
row_data = (device_serial, bool(device.status), device.codename, _icons.device_icon_name(device.name, device.kind), '', device) battery_icon_name = ''
row_data = (device_serial, bool(device.online), device.codename, icon_name, battery_icon_name, device)
if _log.isEnabledFor(_DEBUG):
_log.debug("new device row %s", row_data)
# _log.debug("device %s", device)
item = _model.append(receiver_row, row_data) item = _model.append(receiver_row, row_data)
return item or None return item or None
@ -398,6 +417,8 @@ def select(receiver_path, device_id=None):
if item: if item:
selection = _tree.get_selection() selection = _tree.get_selection()
selection.select_iter(item) selection.select_iter(item)
else:
_log.warn("select(%s, %s) failed to find an item", receiver_path, device_id)
def _hide(w, _=None): def _hide(w, _=None):
@ -434,7 +455,7 @@ def _update_details(button):
assert device assert device
if visible: if visible:
_details._text.set_markup('<small>reading...</small>') # _details._text.set_markup('<small>reading...</small>')
def _details_items(device): def _details_items(device):
if device.kind is None: if device.kind is None:
@ -566,6 +587,7 @@ def _update_device_panel(device, panel, buttons, full=False):
def _update_info_panel(device, full=False): def _update_info_panel(device, full=False):
if device is None: if device is None:
# no selected device, show the 'empty' panel
_details.set_visible(False) _details.set_visible(False)
_info.set_visible(False) _info.set_visible(False)
_empty.set_visible(True) _empty.set_visible(True)
@ -633,6 +655,7 @@ def destroy():
w, _window = _window, None w, _window = _window, None
w.destroy() w.destroy()
w = None w = None
_config_panel.destroy()
_empty = None _empty = None
_info = None _info = None
@ -657,6 +680,7 @@ def update(device, need_popup=False):
is_alive = bool(device) is_alive = bool(device)
item = _receiver_row(device.path, device if is_alive else None) item = _receiver_row(device.path, device if is_alive else None)
assert item assert item
if is_alive and item: if is_alive and item:
_model.set_value(item, _COLUMN.ACTIVE, True) _model.set_value(item, _COLUMN.ACTIVE, True)
is_pairing = is_alive and device.status.lock_open is_pairing = is_alive and device.status.lock_open
@ -666,10 +690,10 @@ def update(device, need_popup=False):
_update_info_panel(device, need_popup) _update_info_panel(device, need_popup)
elif item: elif item:
separator = _model.iter_next(item) if _TREE_SEPATATOR:
_model.remove(separator) separator = _model.iter_next(item)
_model.remove(separator)
_model.remove(item) _model.remove(item)
# _config_panel.clean(device.path)
else: else:
# peripheral # peripheral