Check-in [1a034aeac0]
Overview
| Comment: | Allow for subcategories in bookmarks. |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
1a034aeac0f9eebffa8bcc00a831d28c |
| User & Date: | mario on 2018-12-18 22:40:04 |
| Other Links: | manifest | tags |
Context
|
2018-12-18
| ||
| 22:40 | Optional toolbar button for search dialog. check-in: 4beef0ad4d user: mario tags: trunk | |
| 22:40 | Allow for subcategories in bookmarks. check-in: 1a034aeac0 user: mario tags: trunk | |
|
2018-12-17
| ||
| 22:19 | Added crude support for binding internal calls `object.func()` to buttons. check-in: bbb93d412c user: mario tags: trunk | |
Changes
Modified channels/bookmarks.py from [557d39309e] to [0b438ee149].
| ︙ | ︙ | |||
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
"search": [],
"scripts": [],
"timer": [],
"history": []
}
default = "favourite"
fixed_size = [32,24]
# cache list, to determine if a PLS url is bookmarked
urls = []
def gui(self, parent):
parent.notebook_channels.set_menu_label_text(parent.v_bookmarks, "bookmarks")
GenericChannel.gui(self, parent)
uikit.tree_column(self.gtk_cat, "Group")
| > > | | > > > < | 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 |
"search": [],
"scripts": [],
"timer": [],
"history": []
}
default = "favourite"
fixed_size = [32,24]
reserved_names = ["favourite", "radiotray", "scripts", "search", "timer", "history", "links", "themes"] #+ self.parent.features.keys()
# cache list, to determine if a PLS url is bookmarked
urls = []
def gui(self, parent):
parent.notebook_channels.set_menu_label_text(parent.v_bookmarks, "bookmarks")
self.update_categories()
GenericChannel.gui(self, parent)
uikit.tree_column(self.gtk_cat, "Group")
# custom categories are shown as subfolder below `favourite`
def update_categories(self):
cust_cats = list(set(self.streams.keys()) - set(self.reserved_names))
if len(self.categories) < 2 or type(self.categories[1]) is not list:
self.categories.insert(1, [])
self.categories[1] = cust_cats
# but category sub-plugins might provide a hook
category_plugins = {}
def update_streams(self, cat):
if cat in self.category_plugins:
return self.category_plugins[cat].update_streams(cat) or []
else:
return self.streams.get(cat, [])
# streams are already loaded at instantiation
|
| ︙ | ︙ | |||
102 103 104 105 106 107 108 |
if (not self.urls):
self.urls = [str(row.get("url","urn:x-streamtuner2:no")) for row in self.streams["favourite"]]
return str(url) in self.urls
# called from main window / menu / context menu,
# when bookmark is to be added for a selected stream entry
| | | | 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 |
if (not self.urls):
self.urls = [str(row.get("url","urn:x-streamtuner2:no")) for row in self.streams["favourite"]]
return str(url) in self.urls
# called from main window / menu / context menu,
# when bookmark is to be added for a selected stream entry
def add(self, row, target="favourite"):
# Add / copy some row attributes
row["favourite"] = 1
if not row.get("favicon"):
pass# row["favicon"] = favicon.file(row.get("homepage"))
if not row.get("listformat"):
row["listformat"] = self.parent.channel().listformat
if not len(row.get("extra", "")):
row["extra"] = self.parent.channel().module
# append to storage
self.streams[target].append(row)
self.save()
self.load(self.default)
self.urls.append(row["url"])
# simplified gtk TreeStore display logic (just one category for the moment, always rebuilt)
def load(self, category, force=False, y=None):
|
| ︙ | ︙ |
Added contrib/new_favourite_cat.py version [f1bb6d76fa].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
# encoding: utf-8
# api: streamtuner2
# title: New favourite category
# description: Introduces new bookmarks categories
# version: 0.2
# type: feature
# category: ui
# config: -
# priority: optional
#
# Adds a "New favourite category..." under Station > Extensions menu.
# New categories will show up in the bookmarks channel under favourite.
#
from uikit import *
from config import *
#
class new_favourite_cat (object):
plugin = "new_favourite_cat"
meta = plugin_meta()
parent = None
w = None
# hook up menu entry
def __init__(self, parent):
self.parent = parent
uikit.add_menu([parent.extensions], "New favourite categoryβ¦", self.win, insert=3)
self.create_submenu(parent)
self.update_submenu()
# show input window
def win(self, *w):
w = self.w = gtk.Dialog(
'New bookmark category',
self.parent.win_streamtuner2,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
(gtk.STOCK_OK, gtk.RESPONSE_APPLY)
)
input = gtk.Entry(35)
w.vbox.pack_start(input)
log.UI(w.vbox.get_children())
w.show_all()
self.add(self.w, w.run(), input.get_text())
# add category
def add(self, w, r, title):
bm = self.parent.bookmarks
have = bm.streams.has_key(title)
w.destroy()
if r == gtk.RESPONSE_APPLY:
log.NEW(title)
if not have:
bm.streams[title] = {}
if r == gtk.RESPONSE_DELETE_EVENT:
if have:
bm.streams.remove(title)
self.update_submenu()
bm.update_categories()
bm.display_categories()
# introduce MenuItem+Menu
def create_submenu(self, parent):
self.submenu = gtk.Menu()
for title, target, i in [("Bookmark to", parent.streammenu, 1), ("Add bookmark to", parent.streamactions, 3)]:
mi = gtk.ImageMenuItem(gtk.STOCK_INDENT)
mi.set_submenu(self.submenu)
mi.set_label(title)
mi.show_all()
target.insert(mi, i)
# bookmark to > β¦ submenu w/ custom categories
def update_submenu(self):
bmc = self.parent.bookmarks.categories
[self.submenu.remove(w) for w in self.submenu.get_children()]
if len(bmc) >= 2 and type(bmc[1]) is list:
for label in bmc[1]:
uikit.add_menu([self.submenu], label, lambda w,target=label: self.parent.bookmark(w, target))
self.submenu.show_all()
|
Modified gtk3.xml.gz from [22b92b2dc9] to [1691d2599f].
cannot compute difference between binary files
Modified st2.py from [9e34a20f96] to [0aae622bbd].
1 2 3 4 5 6 | #!/usr/bin/env python # encoding: UTF-8 # api: python # type: application # title: streamtuner2 # description: Directory browser for internet radio, audio and video streams | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/usr/bin/env python
# encoding: UTF-8
# api: python
# type: application
# title: streamtuner2
# description: Directory browser for internet radio, audio and video streams
# version: 2.2.1-dev20181218
# state: stable
# author: Mario Salzer <mario@include-once.org>
# license: Public Domain
# url: http://freshcode.club/projects/streamtuner2
# config:
# { type: env, name: HTTP_PROXY, description: proxy for HTTP access }
# { type: env, name: XDG_CONFIG_HOME, description: relocates user .config subdirectory }
|
| ︙ | ︙ | |||
319 320 321 322 323 324 325 |
def on_category_clicked(self, widget, event, *more):
category = self.channel().currentcat()
log.UI("on_category_clicked", category, self.current_channel)
self.on_reload_clicked(None, reload=0)
pass
# Add current selection to bookmark store
| | | | 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 |
def on_category_clicked(self, widget, event, *more):
category = self.channel().currentcat()
log.UI("on_category_clicked", category, self.current_channel)
self.on_reload_clicked(None, reload=0)
pass
# Add current selection to bookmark store
def bookmark(self, widget, target="favourite"):
self.bookmarks.add(self.row(), target)
self.channel().row_icon(gtk.STOCK_ABOUT)
# refresh bookmarks tab
self.bookmarks.load(self.bookmarks.default)
# Reload category tree
def update_categories(self, widget):
self.thread(self.channel().reload_categories)
|
| ︙ | ︙ |