[modules/scroll] add preliminary version of scrolling module
add a scrolling module that can be used to scroll the whole bar to an arbitrary number of widgets. its parameter is "width", which determines the number of widgets to display. see #921
This commit is contained in:
parent
910b9a8963
commit
21cbbe685d
3 changed files with 81 additions and 1 deletions
|
@ -112,6 +112,15 @@ class Module(core.input.Object):
|
||||||
def hidden(self):
|
def hidden(self):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
"""Override this to show the module even if it normally would be scrolled away
|
||||||
|
|
||||||
|
:return: True if the module should be hidden, False otherwise
|
||||||
|
:rtype: boolean
|
||||||
|
"""
|
||||||
|
|
||||||
|
def scroll(self):
|
||||||
|
return True
|
||||||
|
|
||||||
"""Retrieve CLI/configuration parameters for this module. For example, if
|
"""Retrieve CLI/configuration parameters for this module. For example, if
|
||||||
the module is called "test" and the user specifies "-p test.x=123" on the
|
the module is called "test" and the user specifies "-p test.x=123" on the
|
||||||
commandline, using self.parameter("x") retrieves the value 123.
|
commandline, using self.parameter("x") retrieves the value 123.
|
||||||
|
|
|
@ -146,11 +146,14 @@ class i3(object):
|
||||||
self.__content = {}
|
self.__content = {}
|
||||||
self.__theme = theme
|
self.__theme = theme
|
||||||
self.__config = config
|
self.__config = config
|
||||||
|
self.__offset = 0
|
||||||
self.__lock = threading.Lock()
|
self.__lock = threading.Lock()
|
||||||
core.event.register("update", self.update)
|
core.event.register("update", self.update)
|
||||||
core.event.register("start", self.draw, "start")
|
core.event.register("start", self.draw, "start")
|
||||||
core.event.register("draw", self.draw, "statusline")
|
core.event.register("draw", self.draw, "statusline")
|
||||||
core.event.register("stop", self.draw, "stop")
|
core.event.register("stop", self.draw, "stop")
|
||||||
|
core.event.register("output.scroll-left", self.scroll_left)
|
||||||
|
core.event.register("output.scroll-right", self.scroll_right)
|
||||||
|
|
||||||
def content(self):
|
def content(self):
|
||||||
return self.__content
|
return self.__content
|
||||||
|
@ -182,7 +185,7 @@ class i3(object):
|
||||||
cb = getattr(self, what)
|
cb = getattr(self, what)
|
||||||
data = cb(args) if args else cb()
|
data = cb(args) if args else cb()
|
||||||
if "blocks" in data:
|
if "blocks" in data:
|
||||||
sys.stdout.write(json.dumps(data["blocks"], default=dump_json))
|
sys.stdout.write(json.dumps(data, default=dump_json))
|
||||||
if "suffix" in data:
|
if "suffix" in data:
|
||||||
sys.stdout.write(data["suffix"])
|
sys.stdout.write(data["suffix"])
|
||||||
sys.stdout.write("\n")
|
sys.stdout.write("\n")
|
||||||
|
@ -223,13 +226,29 @@ class i3(object):
|
||||||
blk.set("__state", state)
|
blk.set("__state", state)
|
||||||
return blk
|
return blk
|
||||||
|
|
||||||
|
def scroll_left(self):
|
||||||
|
if self.__offset > 0:
|
||||||
|
self.__offset -= 1
|
||||||
|
|
||||||
|
def scroll_right(self):
|
||||||
|
self.__offset += 1
|
||||||
|
|
||||||
def blocks(self, module):
|
def blocks(self, module):
|
||||||
blocks = []
|
blocks = []
|
||||||
if module.minimized:
|
if module.minimized:
|
||||||
blocks.extend(self.separator_block(module, module.widgets()[0]))
|
blocks.extend(self.separator_block(module, module.widgets()[0]))
|
||||||
blocks.append(self.__content_block(module, module.widgets()[0]))
|
blocks.append(self.__content_block(module, module.widgets()[0]))
|
||||||
|
self.__widgetcount += 1
|
||||||
return blocks
|
return blocks
|
||||||
|
|
||||||
|
width = self.__config.get("output.width", 0)
|
||||||
for widget in module.widgets():
|
for widget in module.widgets():
|
||||||
|
if module.scroll() == True and width > 0:
|
||||||
|
self.__widgetcount += 1
|
||||||
|
if self.__widgetcount-1 < self.__offset:
|
||||||
|
continue
|
||||||
|
if self.__widgetcount-1 >= self.__offset + width:
|
||||||
|
continue
|
||||||
if widget.module and self.__config.autohide(widget.module.name):
|
if widget.module and self.__config.autohide(widget.module.name):
|
||||||
if not any(
|
if not any(
|
||||||
state in widget.state() for state in ["warning", "critical", "no-autohide"]
|
state in widget.state() for state in ["warning", "critical", "no-autohide"]
|
||||||
|
@ -244,6 +263,7 @@ class i3(object):
|
||||||
blocks.extend(self.separator_block(module, widget))
|
blocks.extend(self.separator_block(module, widget))
|
||||||
blocks.append(self.__content_block(module, widget))
|
blocks.append(self.__content_block(module, widget))
|
||||||
core.event.trigger("next-widget")
|
core.event.trigger("next-widget")
|
||||||
|
core.event.trigger("output.done", self.__offset, self.__widgetcount)
|
||||||
return blocks
|
return blocks
|
||||||
|
|
||||||
def update(self, affected_modules=None, redraw_only=False, force=False):
|
def update(self, affected_modules=None, redraw_only=False, force=False):
|
||||||
|
@ -274,6 +294,7 @@ class i3(object):
|
||||||
|
|
||||||
def statusline(self):
|
def statusline(self):
|
||||||
blocks = []
|
blocks = []
|
||||||
|
self.__widgetcount = 0
|
||||||
for module in self.__modules:
|
for module in self.__modules:
|
||||||
blocks.extend(self.blocks(module))
|
blocks.extend(self.blocks(module))
|
||||||
return {"blocks": blocks, "suffix": ","}
|
return {"blocks": blocks, "suffix": ","}
|
||||||
|
|
50
bumblebee_status/modules/core/scroll.py
Normal file
50
bumblebee_status/modules/core/scroll.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
# pylint: disable=C0111,R0903
|
||||||
|
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
import core.module
|
||||||
|
import core.widget
|
||||||
|
import core.input
|
||||||
|
import core.event
|
||||||
|
|
||||||
|
import util.format
|
||||||
|
|
||||||
|
class Module(core.module.Module):
|
||||||
|
def __init__(self, config, theme):
|
||||||
|
super().__init__(config, theme, [])
|
||||||
|
self.__offset = 0
|
||||||
|
self.__widgetcount = 0
|
||||||
|
w = self.add_widget(full_text = "<")
|
||||||
|
core.input.register(w, button=core.input.LEFT_MOUSE, cmd=self.scroll_left)
|
||||||
|
w = self.add_widget(full_text = ">")
|
||||||
|
core.input.register(w, button=core.input.LEFT_MOUSE, cmd=self.scroll_right)
|
||||||
|
self.__width = util.format.asint(self.parameter("width"))
|
||||||
|
config.set("output.width", self.__width)
|
||||||
|
core.event.register("output.done", self.update_done)
|
||||||
|
|
||||||
|
|
||||||
|
def scroll_left(self, _):
|
||||||
|
if self.__offset > 0:
|
||||||
|
core.event.trigger("output.scroll-left")
|
||||||
|
|
||||||
|
def scroll_right(self, _):
|
||||||
|
if self.__offset + self.__width < self.__widgetcount:
|
||||||
|
core.event.trigger("output.scroll-right")
|
||||||
|
|
||||||
|
def update_done(self, offset, widgetcount):
|
||||||
|
self.__offset = offset
|
||||||
|
self.__widgetcount = widgetcount
|
||||||
|
|
||||||
|
def scroll(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def state(self, widget):
|
||||||
|
if widget.id == self.widgets()[0].id:
|
||||||
|
if self.__offset == 0:
|
||||||
|
return ["warning"]
|
||||||
|
if self.__offset + self.__width >= self.__widgetcount:
|
||||||
|
return ["warning"]
|
||||||
|
return []
|
||||||
|
|
||||||
|
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|
Loading…
Reference in a new issue