Check-in [d90db23c73]
Overview
Comment: | Move liststore_edit() and app_bin_check() from configwin. to uikit.
Allow ListStore for config_play/_record/_specbuttons without `editable` row [2], which is now a property of the CellRenderers (instead of a cell-attribute). Specialized uikit.config_treeview() builds a custom two-column TreeView now. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
d90db23c73ed95d4734a9e5ba794702a |
User & Date: | mario on 2016-10-28 18:11:30 |
Other Links: | manifest | tags |
Context
2016-10-28
| ||
18:13 | Update config_play/_record and their TreeViews for the slimmer ListStore without row[2] `editable` bool, and the more generic uikit.liststore_edit callback (still requires lambda handlers for column and liststore as user_data). check-in: bca80ec8af user: mario tags: trunk | |
18:11 |
Move liststore_edit() and app_bin_check() from configwin. to uikit.
Allow ListStore for config_play/_record/_specbuttons without `editable` row [2], which is now a property of the CellRenderers (instead of a cell-attribute). Specialized uikit.config_treeview() builds a custom two-column TreeView now. check-in: d90db23c73 user: mario tags: trunk | |
2016-10-27
| ||
16:42 | Introduce `dict` configuration type, prepare TreeView in uikit (similar to record/play config table). check-in: 095de3353f user: mario tags: trunk | |
Changes
Modified channels/configwin.py from [0227a222a4] to [834ef930af].
1 2 3 4 5 6 7 | # api: streamtuner2 # title: Config dialog # description: Allows to configure players, options, and plugins # version: 2.5 # type: feature # category: ui # config: - | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # api: streamtuner2 # title: Config dialog # description: Allows to configure players, options, and plugins # version: 2.5 # type: feature # category: ui # config: - # priority: core # # Configuration dialog for audio applications, # general settings, and plugin activaiton and # their options. |
︙ | ︙ | |||
66 67 68 69 70 71 72 | # number elif isinstance(w, gtk.SpinButton): w.set_value(int(val)) # list elif isinstance(w, gtk.ListStore) and isinstance(val, dict): w.clear() for k,v in val.items(): | | | | 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | # number elif isinstance(w, gtk.SpinButton): w.set_value(int(val)) # list elif isinstance(w, gtk.ListStore) and isinstance(val, dict): w.clear() for k,v in val.items(): w.append([k, v, uikit.app_bin_check(v)]) w.append(["", "", gtk.STOCK_NEW]) #log.CONF("config load", prefix+key, val, type(w)) # Store gtk widget valus back into conf. dict def save_config(self, config, prefix="config_", save=0): for key,val in config.items(): w = self.main.get_widget(prefix + key) if w: |
︙ | ︙ | |||
95 96 97 98 99 100 101 | elif isinstance(w, gtk.ListStore): config[key] = {} for row in w: if row[0] and row[1]: config[key][row[0]] = row[1] log.CONF("config save", prefix+key, val) | < < < < < < < < < < < < < < < < < < < < < | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | elif isinstance(w, gtk.ListStore): config[key] = {} for row in w: if row[0] and row[1]: config[key][row[0]] = row[1] log.CONF("config save", prefix+key, val) # iterate over channel and feature plugins def add_plugins(self): ls = all_plugin_meta() for name,meta in sorted(ls.items(), key=lambda e: e[1]["type"]+e[1]["title"].lower(), reverse=False): if not name in conf.plugins: conf.plugins[name] = False |
︙ | ︙ | |||
175 176 177 178 179 180 181 | else: cb = gtk.SpinButton() cb.set_adjustment(adj) cb.set_digits(0) # ListView elif opt["type"] in ("list", "table", "array", "dict"): | | > | 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | else: cb = gtk.SpinButton() cb.set_adjustment(adj) cb.set_digits(0) # ListView elif opt["type"] in ("list", "table", "array", "dict"): cb, ls = uikit.config_treeview(opt, opt.get("columns", "Key,Value").split(",")) add_("cfgui_tv", cb, "", None) self.widgets["config_" + opt["name"]] = ls add_({}, uikit.label("<small>%s</small>" % description, markup=True, size=455)) continue # text field else: cb = gtk.Entry() add_( "config_"+opt["name"], cb, description, color ) |
︙ | ︙ |
Modified uikit.py from [22fa63b417] to [1647517a84].
︙ | ︙ | |||
505 506 507 508 509 510 511 | a.set_padding(0, 0, align, 0) a.add(w) w = a w.show_all() return w | | | > | > > > > > > > > > > > > > > > > > > > | < < < < < < < < < < < < < < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 | a.set_padding(0, 0, align, 0) a.add(w) w = a w.show_all() return w # Config win table (editable dictionary, two columns w/ executable indicator pixbuf) @staticmethod def config_treeview(opt, columns=["Icon", "Command"]): liststore = gtk.ListStore(str, str, str) w = gtk.TreeView(liststore) lno = len(columns) # two text columns and renderers for i in range(0, lno): c = gtk.TreeViewColumn(columns[i]) c.set_resizable(True) c.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) c.set_fixed_width(150 + 75*i) r = gtk.CellRendererText() c.pack_end(r, expand=True) r.set_property("editable", True) r.connect("edited", uikit.liststore_edit, (liststore, i)) c.add_attribute(r, "text", i) #c.add_attribute(r, "editable", 2) w.append_column(c) # add pixbuf holder to last column if lno < 3: r = gtk.CellRendererPixbuf() c.pack_start(r, expand=False) c.add_attribute(r, "stock_id", 2) w.set_property("width_request", 450) w.set_property("height_request", 115) return w, liststore # Generic Gtk callback to update ListStore when entries get edited. # where user_data = (liststore, column #id) @staticmethod def liststore_edit(cell, row, text, user_data): #log.EDIT(cell, row, text, user_data) liststore, column = user_data liststore[row][column] = text # update executable-indicator pixbuf if column == 1 and len(liststore) == 3 and liststore[row][2].startswith("gtk."): liststore[row][2] = uikit.app_bin_check(text) # add new row if editing last if row == len(liststore) -1: liststore.append(*["" for c in liststore[column]]) # return OK or CANCEL depending on availability of app @staticmethod def app_bin_check(v): bin = re.findall(r"(?<![$(`%-;/$])\b(\w+(?:-\w+)*)", v) if bin: bin = [find_executable(bin) for bin in bin] if not None in bin: return gtk.STOCK_MEDIA_PLAY else: return gtk.STOCK_CANCEL else: return gtk.STOCK_NEW # Attach textual menu entry and callback @staticmethod def add_menu(menuwidget, label, action, insert=None): for where in list(menuwidget): m = gtk.MenuItem(label) |
︙ | ︙ |