Check-in [303e1c8e48]
Overview
| Comment: | Introduce Gtk theme switching again. |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
303e1c8e489f0ad1b5071e15575a416c |
| User & Date: | mario on 2016-12-03 14:47:25 |
| Other Links: | manifest | tags |
Context
|
2016-12-03
| ||
| 21:23 | Removed plugin option background colors. check-in: 9520bc51a3 user: mario tags: trunk | |
| 14:47 | Introduce Gtk theme switching again. check-in: 303e1c8e48 user: mario tags: trunk | |
| 14:47 | Prevent crash on absent opt["select"] field. check-in: 2e9f6d9a19 user: mario tags: trunk | |
Changes
Modified channels/pluginmanager2.py from [7a64df83b9] to [5a7e32371d].
| ︙ | ︙ | |||
106 107 108 109 110 111 112 |
self.add_(uikit.label("You can update existing plugins, or install new contrib/ channels. User plugins reside in ~/.config/streamtuner2/plugins/ and can even be modified there (such as setting a custom # color: entry).\n", size=520, markup=1))
self.add_(self.button("Refresh", stock="gtk-refresh", cb=self.refresh), "Show available plugins from repository\nhttp://fossil.include-once.org/streamtuner2/")
self.add_(gtk.image_new_from_stock("gtk-info", gtk.ICON_SIZE_LARGE_TOOLBAR), "While plugins are generally compatible across releases, newer versions may also require to update the streamtuner2 core setup.")
for i in range(1,10):
self.add_(uikit.label(""))
| < < < < < | 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
self.add_(uikit.label("You can update existing plugins, or install new contrib/ channels. User plugins reside in ~/.config/streamtuner2/plugins/ and can even be modified there (such as setting a custom # color: entry).\n", size=520, markup=1))
self.add_(self.button("Refresh", stock="gtk-refresh", cb=self.refresh), "Show available plugins from repository\nhttp://fossil.include-once.org/streamtuner2/")
self.add_(gtk.image_new_from_stock("gtk-info", gtk.ICON_SIZE_LARGE_TOOLBAR), "While plugins are generally compatible across releases, newer versions may also require to update the streamtuner2 core setup.")
for i in range(1,10):
self.add_(uikit.label(""))
# Create button, connect click signal
def button(self, label, stock=None, cb=None):
b = gtk.Button(label, stock=stock)
b.connect("clicked", cb)
return b
|
| ︙ | ︙ | |||
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
if dep.valid(newpl) and dep.depends(newpl):
self.add_plugin(newpl)
# Readd some filler labels
_ = [self.add_(uikit.label("")) for i in range(1,3)]
# Entry for plugin list
def add_plugin(self, p):
b = self.button("Install", stock="gtk-save", cb=lambda *w:self.install(p))
p = self.update_p(p)
text = "<b>$title</b>, "\
"<small>version:</small> <span weight='bold' color='orange'>$version</span>, "\
"<small>type: <i><span color='#559'>$type</span></i> "\
"category: <i><span color='blue'>$category</span></i></small>\n"\
"<span size='smaller' color='#364'>$description</span>\n"\
"<span size='small' color='#532' weight='ultralight'>$extras, <a href='$file'>view src</a></span>"
| > > > > > | | 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
if dep.valid(newpl) and dep.depends(newpl):
self.add_plugin(newpl)
# Readd some filler labels
_ = [self.add_(uikit.label("")) for i in range(1,3)]
# Append to vbox
def add_(self, w, label=None, markup=0, align=10, label_size=400):
w = uikit.wrap(w=w, label=label, align=align, label_size=label_size, label_markup=markup)
self.vbox.add(w)
# Entry for plugin list
def add_plugin(self, p):
b = self.button("Install", stock="gtk-save", cb=lambda *w:self.install(p))
p = self.update_p(p)
text = "<b>$title</b>, "\
"<small>version:</small> <span weight='bold' color='orange'>$version</span>, "\
"<small>type: <i><span color='#559'>$type</span></i> "\
"category: <i><span color='blue'>$category</span></i></small>\n"\
"<span size='smaller' color='#364'>$description</span>\n"\
"<span size='small' color='#532' weight='ultralight'>$extras, <a href='$file'>view src</a></span>"
self.add_(b, label=safe_format(text, **p), markup=1, align=10, label_size=375)
# Add placeholder fields
def update_p(self, p):
fields = ("status", "priority", "support", "author", "depends")
extras = ["{}: <b>{}</b>".format(n, html_escape(p[n])) for n in fields if p.get(n)]
p["extras"] = " ".join(["💁"] + extras)
|
| ︙ | ︙ |
Added contrib/gtk_theme.py version [72deb69630].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# api: streamtuner2
# title: Gtk theme setting
# description: Gtk theme switching in Streamtuner2. (Beware of crashes!)
# type: feature
# category: ui
# version: 0.2
# config:
# { name: theme, type: select, select: "default=default", description: "Theme name" }
# { name: theme_instant, type: bool, value=0, description: "Activate on the fly." }
# priority: experimental
#
# Brings back the theme switching option - for Gtk2 + Gtk3 now.
#
# Note that not all themes can be loaded on the fly. And may hang
# streamtuner2 even. Most require an application restart still.
# Which is why this is not a built-in feature anymore.
#
# Btw, you could alternatively use GTK2_RC_FILES= or GTK_THEME=
# environment variables for this.
import os
from config import *
import uikit
from compat2and3 import *
# register a key
class gtk_theme(object):
# plugin info
module = "gtk_theme"
meta = plugin_meta()
theme_dirs = [uikit.gtk.rc_get_theme_dir(), conf.dir + "/themes", conf.share + "/themes"]
# register
def __init__(self, parent):
self.parent = parent
parent.hooks["config_load"].append(self.list_themes)
parent.hooks["config_save"].append(self.apply_theme)
self.apply_theme(True)
# gtk.rc_parse() called on configwin.save and ST2 startup
def apply_theme(self, now=False):
if conf.theme == "default":
return
# path depends on version
if uikit.ver == 2:
rc = "gtk-2.0/gtkrc"
else:
rc = "gtk-3.0/gtk.css"
# look if theme exists
for fn in ["%s/%s/%s" % (dir, conf.theme, rc) for dir in self.theme_dirs]:
if not os.path.exists(fn):
continue
log.GTK_THEME_FILE(fn)
# .GTKRC/Gtk2
if uikit.ver == 2:
uikit.gtk.rc_parse(fn)
if now or conf.theme_instant:
uikit.gtk.rc_reparse_all()
# .CSS/Gtk3
elif now or conf.theme_instant:
#ctx = uikit.gtk.StyleContext # global
ctx = self.parent.win_streamtuner2.get_style_context() # main window
screen = uikit.gtk.gdk.Screen.get_default()
style = uikit.gtk.CssProvider()
style.load_from_file(fn)
ctx.add_provider_for_screen(screen, style, uikit.gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
# list Gtk themes, append to existing dropdown box
def list_themes(self):
# get ComboBoxText widget (wrapper object)
cb = self.parent.widgets["config_theme"]
cb.ls.clear()
# search themes
themes = []
for dir in self.theme_dirs:
if os.path.exists(dir):
for fn in os.listdir(dir):
if os.path.exists("%s/%s/gtk-%s.0" % (dir, fn, uikit.ver)):
themes.append(fn)
themes = ["default"] + sorted(themes)
# add to list
for t in themes:
cb.ls.append([t, t])
if conf.theme in themes:
cb.set_default(conf.theme)
else:
cb.set_default("default")
|
Modified uikit.py from [ce679bb712] to [bb85fd7f1b].
| ︙ | ︙ | |||
473 474 475 476 477 478 479 |
#######label.set_property("visible", True)
label.set_line_wrap(True)
label.set_size_request(size, -1)
return label
# Wrap two widgets in horizontal box
@staticmethod
| | | | | 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 |
#######label.set_property("visible", True)
label.set_line_wrap(True)
label.set_size_request(size, -1)
return label
# Wrap two widgets in horizontal box
@staticmethod
def hbox(w1, w2, exr=True, spacing=5):
b = gtk.HBox(homogeneous=False, spacing=spacing)
######b.set_property("visible", True)
b.pack_start(w1, expand=not exr, fill=not exr)
b.pack_start(w2, expand=exr, fill=exr)
return b
# Wrap entries/checkboxes with extra label, background, images, etc.
@staticmethod
def wrap(widgetstore=None, id=None, w=None, label=None, color=None, image=None, align=1, label_size=305, label_markup=0):
if id:
widgetstore[id] = w
if label:
if type(w) is gtk.Entry:
w.set_width_chars(11)
w = uikit.hbox(w, uikit.label(label, size=label_size, markup=label_markup), exr=True)
if image:
pix = gtk.image_new_from_pixbuf(uikit.pixbuf(image))
if pix:
w = uikit.hbox(w, pix, exr=False)
if color:
w = uikit.bg(w, color)
if align:
|
| ︙ | ︙ |