[core] re-enable minimize of widgets

by default, allow toggling the minimized state of a widget via the
middle mouse and draw a single unicode char instead of the actual
widget, maintaining all states.

fixes #661
This commit is contained in:
Tobias Witek 2020-06-23 15:51:14 +02:00
parent 45d8ed23c9
commit 34dadadf90
6 changed files with 48 additions and 14 deletions

View file

@ -19,6 +19,7 @@ import core.module
import core.input import core.input
import core.event import core.event
import util.format
started = False started = False
@ -110,6 +111,10 @@ def main():
modules.reverse() modules.reverse()
output.modules(modules) output.modules(modules)
if util.format.asbool(config.get("engine.collapsible", True)) == True:
core.input.register(None, core.input.MIDDLE_MOUSE, output.toggle_minimize)
core.event.trigger("start") core.event.trigger("start")
started = True started = True
while True: while True:

View file

@ -184,12 +184,14 @@ class Module(core.input.Object):
:rtype: bumblebee_status.widget.Widget :rtype: bumblebee_status.widget.Widget
""" """
def widget(self, name=None): def widget(self, name=None, widget_id=None):
if not name: if not name and not widget_id:
return self.widgets()[0] return self.widgets()[0]
for w in self.widgets(): for w in self.widgets():
if w.name == name: if name and w.name == name:
return w
if w.id == widget_id:
return w return w
return None return None

View file

@ -152,6 +152,12 @@ class i3(object):
return self.__modules return self.__modules
self.__modules = modules if isinstance(modules, list) else [modules] self.__modules = modules if isinstance(modules, list) else [modules]
def toggle_minimize(self, event):
for module in self.__modules:
widget = module.widget(widget_id=event["instance"])
if widget:
widget.minimized = not widget.minimized
def draw(self, what, args=None): def draw(self, what, args=None):
cb = getattr(self, what) cb = getattr(self, what)
data = cb(args) if args else cb() data = cb(args) if args else cb()
@ -187,7 +193,7 @@ class i3(object):
except: except:
blk.set("min-width", minwidth) blk.set("min-width", minwidth)
blk.set("align", widget.theme("align")) blk.set("align", widget.theme("align"))
blk.set("full_text", self.__content[widget]) blk.set("full_text", "\u2026" if widget.minimized else self.__content[widget])
if widget.get("pango", False): if widget.get("pango", False):
blk.set("markup", "pango") blk.set("markup", "pango")
if self.__config.debug(): if self.__config.debug():

View file

@ -15,6 +15,7 @@ class Widget(util.store.Store, core.input.Object):
self.__full_text = full_text self.__full_text = full_text
self.module = None self.module = None
self.name = name self.name = name
self.minimized = False
@property @property
def module(self): def module(self):

View file

@ -129,6 +129,13 @@ def test_get_widget_by_name(empty_config, widget_a, widget_b):
assert module.widget("i-do-not-exist") == None assert module.widget("i-do-not-exist") == None
assert module.widget() == widget_a assert module.widget() == widget_a
def test_get_widget_by_id(empty_config, widget_a, widget_b):
module = SampleModule(config=empty_config, widgets=[widget_a, widget_b])
assert module.widget(widget_id=widget_a.id) == widget_a
assert module.widget(widget_id=widget_b.id) == widget_b
assert module.widget(widget_id="i-do-not-exist") == None
def test_default_thresholds(empty_config, widget_a, widget_b): def test_default_thresholds(empty_config, widget_a, widget_b):
module = SampleModule(config=empty_config, widgets=[widget_a, widget_b]) module = SampleModule(config=empty_config, widgets=[widget_a, widget_b])

View file

@ -25,6 +25,16 @@ def i3():
def module_a(mocker): def module_a(mocker):
widget = mocker.MagicMock() widget = mocker.MagicMock()
widget.full_text.return_value = "test" widget.full_text.return_value = "test"
widget.id = "a"
widget.minimized = False
return SampleModule(config=core.config.Config([]), widgets=[widget, widget, widget])
@pytest.fixture
def module_b(mocker):
widget = mocker.MagicMock()
widget.full_text.return_value = "test"
widget.id = "b"
widget.minimized = False
return SampleModule(config=core.config.Config([]), widgets=[widget, widget, widget]) return SampleModule(config=core.config.Config([]), widgets=[widget, widget, widget])
@ -46,16 +56,6 @@ def block_a(separatorTheme, module_a):
theme=separatorTheme, module=module_a, widget=module_a.widget(), theme=separatorTheme, module=module_a, widget=module_a.widget(),
) )
# def setUp(self):
# self.i3 = core.output.i3()
# widget = unittest.mock.MagicMock()
# widget.full_text.return_value = "test"
# self.someModule = SampleModule(
# config=core.config.Config([]), widgets=[widget, widget, widget]
# )
# self.separator = "***"
#
def test_start(i3): def test_start(i3):
all_data = i3.start() all_data = i3.start()
data = all_data["blocks"] data = all_data["blocks"]
@ -83,6 +83,19 @@ def test_register_multiple_modules(i3, module_a):
i3.modules([module_a, module_a, module_a]) i3.modules([module_a, module_a, module_a])
assert i3.modules() == [module_a, module_a, module_a] assert i3.modules() == [module_a, module_a, module_a]
def test_toggle_module(i3, module_a, module_b):
i3.modules([module_a, module_b])
i3.toggle_minimize({ "instance": module_a.widget().id })
assert module_a.widget().minimized == True
assert module_b.widget().minimized == False
i3.toggle_minimize({ "instance": module_a.widget().id })
i3.toggle_minimize({ "instance": module_b.widget().id })
assert module_a.widget().minimized == False
assert module_b.widget().minimized == True
def test_draw_existing_module(mocker, i3): def test_draw_existing_module(mocker, i3):
i3.test_draw = mocker.MagicMock( i3.test_draw = mocker.MagicMock(