Skip to content

Commit

Permalink
feat: add ProgressRingWidget widget
Browse files Browse the repository at this point in the history
  • Loading branch information
sassanh committed Jul 17, 2024
1 parent 287ce87 commit 083e39c
Show file tree
Hide file tree
Showing 11 changed files with 96 additions and 23 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# Changelog

## Version 0.11.18
## Version 0.12.0

- refactor: just change the items of the menu when items are changed, instead of creating a whole new menu widget
- feat: add progress to `ItemWidget`, reflect it in its look and optimize its rendering for rapid re-renders
- feat: add `ProgressRingWidget` widget

## Version 0.11.17

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "ubo-gui"
version = "0.11.18"
version = "0.12.0"
description = "GUI sdk for Ubo Pod"
authors = ["Sassan Haradji <[email protected]>"]
license = "Apache-2.0"
Expand Down
1 change: 1 addition & 0 deletions ubo_gui/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
Factory.register('ItemWidget', module='ubo_gui.menu.widgets.item_widget')
Factory.register('MenuWidget', module='ubo_gui.menu')
Factory.register('NotificationWidget', module='ubo_gui.notification')
Factory.register('ProgressRingWidget', module='ubo_gui.progress_ring')
Factory.register('PromptWidget', module='ubo_gui.prompt')
Factory.register('QRCodeWidget', module='ubo_gui.qrcode')
Factory.register('VolumeWidget', module='ubo_gui.volume')
1 change: 0 additions & 1 deletion ubo_gui/app/app.kv
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

<RootWidget>:
FloatLayout:
id: main_layout
size: root.size
pos: root.pos
orientation: 'vertical'
Expand Down
11 changes: 4 additions & 7 deletions ubo_gui/menu/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -426,10 +426,7 @@ def _menu_items(
items = [previous_item, *items, next_item]
return items

def _render_menu(
self: MenuWidget,
*_: object,
) -> HeaderMenuPageWidget | NormalMenuPageWidget | None:
def _render_menu(self: MenuWidget, *_: object) -> PageWidget | None:
"""Render the items of the current menu."""
self._clear_widget_subscriptions()
if self.page_index >= self.pages:
Expand Down Expand Up @@ -918,11 +915,11 @@ def set_current_menu_items(self: MenuWidget, items: Sequence[Item]) -> bool:
cache=True,
)
render_surroundings = BooleanProperty(
default=False,
defaultvalue=False,
cache=True,
)
padding_bottom = NumericProperty(default=0)
padding_top = NumericProperty(default=0)
padding_bottom = NumericProperty(defaultvalue=0)
padding_top = NumericProperty(defaultvalue=0)


Builder.load_file(
Expand Down
16 changes: 10 additions & 6 deletions ubo_gui/menu/widgets/header_menu_page_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,27 +40,31 @@ def __init__(
`Screen`.
"""
self.bind(on_count=self.adjust_item_widgets)
super().__init__(items, **kwargs)
self.item_widgets: list[ItemWidget] = []
self.bind(on_kv_post=self.adjust_item_widgets)
super().__init__(items, **kwargs)
self.bind(on_count=self.adjust_item_widgets)
self.bind(items=self.render)

def adjust_item_widgets(self: HeaderMenuPageWidget, *args: object) -> None:
"""Initialize the widget."""
_ = args
for _ in range(len(self.item_widgets), self.count - 2):
self.item_widgets.append(ItemWidget())
self.item_widgets.append(ItemWidget(size_hint=(1, None)))
self.ids.layout.add_widget(self.item_widgets[-1])
for _ in range(self.count - 2, len(self.item_widgets)):
self.ids.layout.remove_widgeT(self.item_widgets[-1])
self.ids.layout.remove_widget(self.item_widgets[-1])
del self.item_widgets[-1]
self.render()

def render(self: HeaderMenuPageWidget, *_: object) -> None:
"""Render the widget."""
if not self.item_widgets:
return
for i in range(self.count - 2):
self.item_widgets[i].item = self.items[i] if i < len(self.items) else None
self.item_widgets[i].item = (
self.items[i + 1] if i <= len(self.items) else None
)

def get_item(self: HeaderMenuPageWidget, index: int) -> Item | None:
"""Get the item at the given index."""
Expand All @@ -72,7 +76,7 @@ def get_item(self: HeaderMenuPageWidget, index: int) -> Item | None:
)
return None
try:
return self.items[index - PAGE_SIZE + 1]
return self.items[index - PAGE_SIZE]
except IndexError:
return None

Expand Down
4 changes: 2 additions & 2 deletions ubo_gui/menu/widgets/item_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ class ItemWidget(BoxLayout):
icon: str = StringProperty(defaultvalue='')
is_short: bool = BooleanProperty(defaultvalue=False)
item: Item | None = ObjectProperty(allownone=True)
opacity: float = NumericProperty(default=1, min=0, max=1)
progress: float = NumericProperty(default=1, min=0, max=1)
opacity: float = NumericProperty(defaultvalue=1, min=0, max=1)
progress: float = NumericProperty(defaultvalue=1, min=0, max=1)

_width: float = NumericProperty()
_progress: int = NumericProperty()
Expand Down
3 changes: 1 addition & 2 deletions ubo_gui/menu/widgets/normal_menu_page_widget.kv
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@

Label:
text: ('Nothing here yet' if root.placeholder is None else root.placeholder) if root.is_empty else ''
text_size: self.texture_size if root.is_empty else (0, 0)
size_hint_y: self.texture_size[1] if root.is_empty else 0
text_size: self.size
font_size: dp(20)
halign: 'center'
valign: 'middle'
Expand Down
6 changes: 3 additions & 3 deletions ubo_gui/page/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ class PageWidget(Screen):
offset: int = NumericProperty(defaultvalue=0)
placeholder: str | None = StringProperty(allownone=True)
render_surroundings: bool = BooleanProperty(
default=False,
defaultvalue=False,
cache=True,
)
padding_top: int = NumericProperty(default=0)
padding_bottom: int = NumericProperty(default=0)
padding_top: int = NumericProperty(defaultvalue=0)
padding_bottom: int = NumericProperty(defaultvalue=0)

def get_is_empty(self: PageWidget) -> bool:
"""Check if there is no item in items or all of them are `None`."""
Expand Down
29 changes: 29 additions & 0 deletions ubo_gui/progress_ring/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""Notification widget."""

from __future__ import annotations

import pathlib

from kivy.lang.builder import Builder
from kivy.metrics import dp
from kivy.properties import ColorProperty, NumericProperty
from kivy.uix.widget import Widget


class ProgressRingWidget(Widget):
"""renders a progress ring."""

progress: float = NumericProperty(defaultvalue=0, min=0, max=1)
band_width: int = NumericProperty(defaultvalue=dp(4))
background_color = ColorProperty()
color = ColorProperty()

_progress: int = NumericProperty()


Builder.load_file(
pathlib.Path(__file__)
.parent.joinpath('progress_ring_widget.kv')
.resolve()
.as_posix(),
)
43 changes: 43 additions & 0 deletions ubo_gui/progress_ring/progress_ring_widget.kv
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#:kivy 2.3.0

<ProgressRingWidget>:
_progress: int(self.progress * 360)
width: min(*self.size)
height: min(*self.size)

canvas.before:
Color:
rgba: self.background_color

Ellipse:
pos: self.pos
size: self.size
angle_start: 0
angle_end: 360

Color:
rgba: self.color

Ellipse:
pos: [i + dp(1) for i in self.pos]
size: [i - dp(2) for i in self.size]
angle_start: 0
angle_end: self._progress

Color:
rgba: self.background_color

Ellipse:
pos: [i + dp(1) + self.band_width for i in self.pos]
size: [i - dp(2) - 2 * self.band_width for i in self.size]
angle_start: 0
angle_end: 360

Color:
rgb: 0, 0 ,0

Ellipse:
pos: [i + dp(2) + self.band_width for i in self.pos]
size: [i - dp(4) - 2 * self.band_width for i in self.size]
angle_start: 0
angle_end: 360

0 comments on commit 083e39c

Please sign in to comment.