[core] Add ability to "hide" a module with all its widgets

* A module can override the method "hidden" to specify when all it's
widgets should be hidden.
* Implement hidden for cmus and spotify
* Fix problem that cmus widgets were not displayed correctly

fixes #157
This commit is contained in:
Tobias Witek 2017-08-12 17:03:04 +02:00
parent 8376e406e5
commit 9f69cc6ae9
4 changed files with 15 additions and 2 deletions

View file

@ -56,6 +56,9 @@ class Module(object):
"""Return the widgets to draw for this module"""
return self._widgets
def hidden(self):
return False
def widget(self, name):
for widget in self._widgets:
if widget.name == name:

View file

@ -49,6 +49,9 @@ class Module(bumblebee.engine.Module):
self._repeat = False
self._tags = defaultdict(lambda: '')
def hidden(self):
return self._status == None
@scrollable
def description(self, widget):
return string.Formatter().vformat(self._fmt, (), self._tags)
@ -72,6 +75,7 @@ class Module(bumblebee.engine.Module):
try:
info = bumblebee.util.execute("cmus-remote -Q")
except RuntimeError:
self._status = None
pass
self._tags = defaultdict(lambda: '')
for line in info.split("\n"):

View file

@ -40,6 +40,9 @@ class Module(bumblebee.engine.Module):
def spotify(self, widget):
return str(self._song)
def hidden(self):
return str(self._song) == ""
def update(self, widgets):
try:
bus = dbus.SessionBus()

View file

@ -11,6 +11,7 @@ import bumblebee.store
def scrollable(func):
def wrapper(module, widget):
text = func(module, widget)
if not text: return text
width = widget.get("theme.width", module.parameter("width", 30))
widget.set("theme.minwidth", "A"*width)
if len(text) <= width:
@ -39,6 +40,9 @@ class Widget(bumblebee.store.Store):
self.name = name
self.id = str(uuid.uuid4())
def get_module(self):
return self._module
def link_module(self, module):
"""Set the module that spawned this widget
@ -93,8 +97,7 @@ class I3BarOutput(object):
def draw(self, widget, module=None, engine=None):
"""Draw a single widget"""
full_text = widget.full_text()
"""Don't draw it when we only have an empty text"""
if full_text == "":
if widget.get_module() and widget.get_module().hidden():
return
padding = self._theme.padding(widget)
prefix = self._theme.prefix(widget, padding)