Index: channels/specbuttons.py ================================================================== --- channels/specbuttons.py +++ channels/specbuttons.py @@ -1,21 +1,34 @@ # encoding: utf-8 # title: Extra buttons for apps # description: Adds configurable mini toolbar buttons -# version: 0.5 +# version: 0.7 # depends: streamtuner2 >= 2.2.0 # type: feature # category: ui # config: -# { name: specbutton_rows, value: 2, type: int, description: "Number of rows to arrange buttons in (default 2, looks ok with up to 3 rows)" } +# { name: specbutton_rows, value: 2, max: 4, type: int, description: "Number of rows to arrange buttons in." } +# doc: +# http://fossil.include-once.org/streamtuner2/info/43b36ed35b1488d5 # -# Shows the mini extra buttons in the toolbar, which allow to control your +# 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. # # Icons can either be gtk-xyz icon names, or load /usr/share/icon/*.png -# pixmaps. +# pixmaps. Enter a shortcut like "firefox" as icon name for it be looked up. +# Then specify an external command to start. For example: +# +# Icon Cmd +# ------ ------ +# volume pavucontrol +# mute amixer -c 0 set Front 50DB +# up amixer -D pulse sset Master 5%+ +# kill pkill vlc +# +# The commands can be pretty much any shell command, but still allow for +# streamtuner2 placeholders like %g or %url and $title. import os.path import subprocess import math @@ -23,11 +36,11 @@ from config import conf, log import action from uikit import gtk -# Channel Homepage in Toolbar +# Extra/mini buttons in toolbar class specbuttons(object): module = __name__ # Hook toolbar label def __init__(self, parent): @@ -40,29 +53,33 @@ # Extra buttons def update_buttons(self, parent): # define table width (2 rows default) - y = min(int(conf.specbutton_rows), 4) + y = max(min(int(conf.specbutton_rows), 4), 1) # 1 <= y <= 4 self.specbuttons.resize(y, int(math.ceil(len(conf.specbuttons) / y))) # clean up for widget in self.specbuttons.get_children(): widget.destroy() - xy = 0 # add icon buttons - for btn, cmd in conf.specbuttons.items(): + for xy, (btn, cmd) in enumerate(conf.specbuttons.items()): #log.IN(btn, cmd) w_btn = gtk.Button() w_btn.set_image(self.icon(btn)) - w_btn.connect("clicked", lambda x0, cmd=cmd, *x: action.run(cmd) ) + w_btn.connect("clicked", lambda x0, cmd=cmd, *x: self.action(cmd)) self.specbuttons.attach( - w_btn, - int(xy / y), int(xy / y) + 1, xy % y, (xy % y) + 1, - gtk.EXPAND, gtk.EXPAND, 1, 1 + child = w_btn, + left_attach = int(xy / y), + right_attach = int(xy / y) + 1, + top_attach = xy % y, + bottom_attach = (xy % y) + 1, + xoptions = gtk.EXPAND, + yoptions = gtk.EXPAND, + xpadding = 1, + ypadding = 1 ) - xy = xy + 1 self.specbuttons.show_all() # Instantiate Image from gtk-* string or path def icon(self, btn): wi = gtk.Image() @@ -76,11 +93,11 @@ wi.set_from_file(btn) else: wi.set_from_stock("gtk-image-missing", gtk.ICON_SIZE_SMALL_TOOLBAR) return wi - # Look for image basename "play" in /usr/share/icons/*.* + # Look for image basename (e.g. "play") in /usr/share/icons/*.* and /pixmaps/* def locate(self, btn): f = subprocess.Popen(["locate", "/usr/share/[pi]*s/*%s*.*" % btn], stdout=subprocess.PIPE) path, err = f.communicate() if not err: return path.split("\n")[0] @@ -100,6 +117,13 @@ else: log.WARN("Extra button icon '%s' could not be found" % btn) r[btn] = cmd conf.specbuttons = r self.update_buttons(self.parent) + + # Button callback, allow for %url/%title placeholders + def action(self, cmd): + if re.search("[%$]", cmd): + row = self.parent.channel().row() + cmd = action.interpol(cmd, row=row, add_default=False) + action.run(cmd) ADDED help/specbuttons.page Index: help/specbuttons.page ================================================================== --- help/specbuttons.page +++ help/specbuttons.page @@ -0,0 +1,65 @@ + + + + + + + Toolbar application short cuts. + + + Extra/mini buttons + +

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.

+ +

The settings list can be found in the Settings → Options tab. It + follows the layout of the player/recording configuration. Except + that it lists icons and their according action commands:

+ + + + + + + + +

Icon

Cmd

gtk-media-forward

vlc next

terminal

xterm

volume

pavucontrol

database

./myscript "%url" "%title"

./import.png

audacity %pls

+ +
+ gtk-icons +

Note that the icon name can either be Gtk-builtin icon. Their + names always start with "gtk-", for example "gtk-cancel". You can + find a list of all available builtins under + http://www.pygtk.org/pygtk2reference/gtk-stock-items.html.

+
+ +
+ PNG icons +

In case you enter something like "player", the icon name will be + searched for and expanded to an absolute PNG filename. For example + "totem" might become /usr/share/icons/HighContrast/16x16/apps/totem.png.

+ +

This won't always yield the exact icon / theme / or size you wanted. So it's + sometimes necessary to look up the complete path yourself.

+
+ +
+ Commands +

You can define any graphical or commandline application to be + invoked by your custom toolbar button. Foremost you want to invoke + audio controls of course, or start/stop players.

+ +

Placeholders like %title and %url or %pls and %m3u are supported + for all commands as well. So you can have additional play/record + shortcuts.

+
+ +
+

The icon list isn't ordered. So you cannot + define which button appears first.

+
+ +