Check-in [50c68197c7]
Overview
Comment: | Enable `list`/`array`/`table` config schemes in addition to `dict`. Currently unused, just added because it's little more code. No custom value="x,x,x|y,y,y" parser yet. Not for `dict` either, as it's only used by specbuttons with a predefined list. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
50c68197c7f3427db8ce244557332a31 |
User & Date: | mario on 2016-10-28 23:12:11 |
Other Links: | manifest | tags |
Context
2016-10-28
| ||
23:18 | bump minor versions check-in: 1478740ada user: mario tags: trunk | |
23:12 | Enable `list`/`array`/`table` config schemes in addition to `dict`. Currently unused, just added because it's little more code. No custom value="x,x,x|y,y,y" parser yet. Not for `dict` either, as it's only used by specbuttons with a predefined list. check-in: 50c68197c7 user: mario tags: trunk | |
23:08 | Fix add_default=False logic. check-in: 87a6d5ac96 user: mario tags: trunk | |
Changes
Modified channels/configwin.py from [834ef930af] to [f3a2a25e57].
︙ | ︙ | |||
62 63 64 65 66 67 68 | # dropdown elif isinstance(w, ComboBoxText): w.set_default(val) # number elif isinstance(w, gtk.SpinButton): w.set_value(int(val)) # list | | > | | | > > > > > > | 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 | # dropdown elif isinstance(w, ComboBoxText): w.set_default(val) # number elif isinstance(w, gtk.SpinButton): w.set_value(int(val)) # list elif isinstance(w, gtk.ListStore): w.clear() if isinstance(val, dict): for k,v in val.items(): w.append([k, v, uikit.app_bin_check(v)]) w.append(["", "", gtk.STOCK_NEW]) elif isinstance(val, list): for row in val: log.DATA(row) w.append([str(e) for e in row]) if len(val): w.append(["" for e in val[0]]) #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: |
︙ | ︙ | |||
88 89 90 91 92 93 94 | elif isinstance(w, gtk.CheckButton): config[key] = w.get_active() # int elif isinstance(w, gtk.SpinButton): config[key] = int(w.get_value(val)) # dict elif isinstance(w, gtk.ListStore): | > > > > > | | | | | 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | elif isinstance(w, gtk.CheckButton): config[key] = w.get_active() # int elif isinstance(w, gtk.SpinButton): config[key] = int(w.get_value(val)) # dict elif isinstance(w, gtk.ListStore): if key in config and isinstance(config[key], list): config[key] = [] for row in w: config[key].append([str(e) for e in row]) else: 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): |
︙ | ︙ |
Modified channels/specbuttons.py from [19182e61c1] to [0939200c7c].
1 2 3 4 5 6 7 8 9 | # encoding: utf-8 # title: Spec buttons for apps # description: Adds configurable mini toolbar buttons # version: 0.7 # depends: streamtuner2 >= 2.2.0 # type: feature # category: ui # config: # { name: specbutton_rows, value: 2, max: 4, type: int, description: "Number of rows to arrange buttons in." } | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # encoding: utf-8 # title: Spec buttons for apps # description: Adds configurable mini toolbar buttons # version: 0.7 # depends: streamtuner2 >= 2.2.0 # type: feature # category: ui # config: # { name: specbutton_rows, value: 2, max: 4, type: int, description: "Number of rows to arrange buttons in." } # { name: specbuttons, type: dict, columns: "Icon,Command", description: "Icons can be `<a href='http://www.pygtk.org/pygtk2reference/gtk-stock-items.html'>gtk-xyz</a>` internal names. Else use `/usr/share/icon/*.png` file names. Icon file basenames will be expanded into full paths. "} # doc: # http://fossil.include-once.org/streamtuner2/info/43b36ed35b1488d5 # # Adds the mini/extra buttons in the toolbar, which allow to control your # audio player or run other system commands. The configuration list is in # the Settings → Options tab. # |
︙ | ︙ |
Modified help/specbuttons.page from [3b72d31b24] to [76c3d65779].
1 2 3 4 5 6 7 8 9 10 11 | <page xmlns="http://projectmallard.org/1.0/" type="guide" id="specbuttons"> <info> <link type="guide" xref="index#extra"/> <link type="guide" xref="configuration#apps"/> <link type="guide" xref="configuration#gui"/> <desc>Toolbar application short cuts.</desc> </info> | | | | | > | | 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 | <page xmlns="http://projectmallard.org/1.0/" type="guide" id="specbuttons"> <info> <link type="guide" xref="index#extra"/> <link type="guide" xref="configuration#apps"/> <link type="guide" xref="configuration#gui"/> <desc>Toolbar application short cuts.</desc> </info> <title>Special extra/mini buttons</title> <p>Using the specbuttons plugin, you can define additional shortcuts. This is meant as convenience - allows to start other audio apps or system ontrols from within streamtuner2.</p> <p>The settings list can be found with th plugin options in the <key>🔌 Features</key> tab. It follows the layout of the player/recording configuration. Except that it lists icons and their according action commands:</p> <table shade="rows" rules="rows cols"> <tr><td><p><em>Icon</em></p></td> <td><p><em>Cmd</em></p></td> </tr> <tr><td><p><app>gtk-media-forward</app></p></td> <td><p><cmd>vlc next</cmd></p></td> </tr> <tr><td><p><app>terminal</app></p></td> <td><p><cmd>xterm</cmd></p></td> </tr> <tr><td><p><app>volume</app></p></td> <td><p><cmd>pavucontrol</cmd></p></td> </tr> <tr><td><p><app>database</app></p></td> <td><p><cmd>./myscript "%url" "%title"</cmd></p></td> </tr> <tr><td><p><app>./import.png</app></p></td> <td><p><cmd>audacity %pls</cmd></p></td> </tr> </table> <section id="gtk-icons"> <title>gtk-icons</title> <p>Note that the icon name can also be that of a Gtk-builtin icon. Their names always start with "<app>gtk-</app>", for example "<app>gtk-cancel</app>". You can find a list of all available builtins under <link href="http://www.pygtk.org/pygtk2reference/gtk-stock-items.html">http://www.pygtk.org/pygtk2reference/gtk-stock-items.html</link>.</p> </section> <section id="png-icons"> <title>PNG icons</title> |
︙ | ︙ | |||
54 55 56 57 58 59 60 61 | <p>Placeholders like %title and %url or %pls and %m3u are supported for all commands as well. So you can have additional play/record shortcuts.</p> </section> <section> <note style="bug"><p>The icon list isn't ordered. So you cannot | > > > > > | > > | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | <p>Placeholders like %title and %url or %pls and %m3u are supported for all commands as well. So you can have additional play/record shortcuts.</p> </section> <section> <title>icon rows</title> <p>With the "number of rows" setting, more buttons can be packed together. It looks okay with up to 3 rows - when using the large sized main toolbar. The defined icon shortcuts will always be packed column-wise.</p> <note style="bug"><p>The icon list isn't ordered. So you cannot define which button appears first. (Albeit the plugin config definition can be changed from 'dict' to 'table' now, and the plugin required just a little editing then.)</p></note> </section> </page> |
Modified pluginconf.py from [3b562696a0] to [25ef6eb532].
︙ | ︙ | |||
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 | if "name" in opt and "value" in opt: if opt["name"] not in conf_options: # typemap "bool" and "int" here if opt["type"] in ("bool", "boolean"): val = opt["value"].lower() in ("1", "true", "yes", "on") elif opt["type"] in ("int", "integer", "numeric"): val = int(opt["value"]) else: val = str(opt["value"]) conf_options[opt["name"]] = val # Initial plugin activation status if module and module not in conf_plugins: conf_plugins[module] = meta.get("priority") in ( "core", "builtin", "always", "default", "standard" ) | > > > > | 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 | if "name" in opt and "value" in opt: if opt["name"] not in conf_options: # typemap "bool" and "int" here if opt["type"] in ("bool", "boolean"): val = opt["value"].lower() in ("1", "true", "yes", "on") elif opt["type"] in ("int", "integer", "numeric"): val = int(opt["value"]) elif opt["type"] in ("array", "table", "list"): val = [ opt["value"].split(",") ] elif opt["type"] in ("dict"): val = dict(opt["value"].split(",")) else: val = str(opt["value"]) conf_options[opt["name"]] = val # Initial plugin activation status if module and module not in conf_plugins: conf_plugins[module] = meta.get("priority") in ( "core", "builtin", "always", "default", "standard" ) |
Modified uikit.py from [1647517a84] to [26d04e8c56].
︙ | ︙ | |||
508 509 510 511 512 513 514 | w.show_all() return w # Config win table (editable dictionary, two columns w/ executable indicator pixbuf) @staticmethod def config_treeview(opt, columns=["Icon", "Command"]): | > > | > > < | | 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 | w.show_all() return w # Config win table (editable dictionary, two columns w/ executable indicator pixbuf) @staticmethod def config_treeview(opt, columns=["Icon", "Command"]): lno = len(columns) if lno == 2: liststore = gtk.ListStore(str, str, str) else: liststore = gtk.ListStore(*[str for i in range(0, lno)]) w = gtk.TreeView(liststore) # 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(int(430/lno)) 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) |
︙ | ︙ | |||
538 539 540 541 542 543 544 545 546 547 | 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 | > | | | | | 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 | 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) row = int(row) liststore, column = user_data liststore[row][column] = text # update executable-indicator pixbuf if column == 1 and len(liststore[0]) == 3 and liststore[row][2].startswith("gtk-"): liststore[row][2] = uikit.app_bin_check(text) # add new row when editing last one if len(text) and (row + 1) == len(liststore): liststore.append(["", "", "gtk-new"]) # 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] |
︙ | ︙ |