Skip to content

Commit 01c8b3e

Browse files
committed
libs/m5ui/bar.py: Add warning prompts.
Signed-off-by: lbuque <[email protected]>
1 parent 5a173d3 commit 01c8b3e

File tree

3 files changed

+89
-38
lines changed

3 files changed

+89
-38
lines changed

docs/en/m5ui/bar.rst

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -55,24 +55,6 @@ M5Bar
5555
.. autoclass:: m5ui.bar.M5Bar
5656
:members:
5757

58-
.. py:method:: set_value(value, anim_enable)
59-
60-
Set the current value of the bar.
61-
62-
:param int value: The value to set.
63-
:param bool anim_enable: Whether to enable animation when changing the value.
64-
:return: None
65-
66-
UiFlow2 Code Block:
67-
68-
|set_value.png|
69-
70-
MicroPython Code Block:
71-
72-
.. code-block:: python
73-
74-
bar.set_value(75, True)
75-
7658
.. py:method:: get_value()
7759
7860
Get the current value of the bar.
@@ -90,24 +72,6 @@ M5Bar
9072
9173
current_value = bar.get_value()
9274
93-
.. py:method:: set_range(min_value, max_value)
94-
95-
Set the value range of the bar.
96-
97-
:param int min_value: The minimum value.
98-
:param int max_value: The maximum value.
99-
:return: None
100-
101-
UiFlow2 Code Block:
102-
103-
|set_range.png|
104-
105-
MicroPython Code Block:
106-
107-
.. code-block:: python
108-
109-
bar.set_range(0, 200)
110-
11175
.. py:method:: get_min_value()
11276
11377
Get the minimum value of the bar range.

m5stack/libs/m5ui/bar.py

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from .base import M5Base
66
import lvgl as lv
7+
import warnings
78

89

910
class M5Bar(lv.bar):
@@ -53,16 +54,65 @@ def __init__(
5354

5455
self.set_pos(x, y)
5556
self.set_size(w, h)
56-
self.set_range(min_value, max_value)
57+
super().set_range(min_value, max_value)
5758
self.set_bg_color(
5859
bg_c, 51, lv.PART.MAIN | lv.STATE.DEFAULT
5960
) # default opacity is 51 (20% opacity)
6061
self.set_bg_color(color, lv.OPA.COVER, lv.PART.INDICATOR | lv.STATE.DEFAULT)
61-
self.set_value(value, True)
62+
super().set_value(value, True)
6263

6364
if is_show_value:
6465
self.add_event_cb(self._draw_cb, lv.EVENT.DRAW_MAIN_END, None)
6566

67+
def set_value(self, value: int, anim: bool = False) -> None:
68+
"""Set the current value of the bar.
69+
70+
:param int value: The value to set.
71+
:param bool anim_enable: Whether to enable animation when changing the value.
72+
:return: None
73+
74+
UiFlow2 Code Block:
75+
76+
|set_value.png|
77+
78+
MicroPython Code Block:
79+
80+
.. code-block:: python
81+
82+
bar.set_value(75, True)
83+
"""
84+
if not isinstance(value, int):
85+
raise ValueError("Value must be an integer.")
86+
if value < self.get_min_value():
87+
warnings.warn(f"Value is less than min_value, setting to {self.get_min_value()}.")
88+
value = self.get_min_value()
89+
if value > self.get_max_value():
90+
warnings.warn(f"Value is greater than max_value, setting to {self.get_max_value()}.")
91+
value = self.get_max_value()
92+
super().set_value(value, anim)
93+
94+
def set_range(self, min_value: int, max_value: int) -> None:
95+
"""Set the value range of the bar.
96+
97+
:param int min_value: The minimum value.
98+
:param int max_value: The maximum value.
99+
:return: None
100+
101+
UiFlow2 Code Block:
102+
103+
|set_range.png|
104+
105+
MicroPython Code Block:
106+
107+
.. code-block:: python
108+
109+
bar.set_range(0, 200)
110+
"""
111+
if not isinstance(min_value, int) or not isinstance(max_value, int):
112+
raise ValueError("min_value and max_value must be integers.")
113+
super().set_range(min_value, max_value)
114+
self.set_value(self.get_value(), False)
115+
66116
def _draw_cb(self, event_struct):
67117
label_dsc = lv.draw_label_dsc_t()
68118
label_dsc.init()

tests/m5ui/test_bar.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
import lvgl as lv
6+
import sys
7+
import time
8+
9+
sys.path.append("../../m5stack/libs")
10+
import m5ui
11+
import unittest
12+
13+
14+
class Test(unittest.TestCase):
15+
def __init__(self) -> None:
16+
super().__init__()
17+
m5ui.init()
18+
page0 = m5ui.M5Page()
19+
self.bar0 = m5ui.M5Bar(value=25, parent=page0)
20+
page0.screen_load()
21+
22+
def test_set_range(self):
23+
self.bar0.set_range(40, 50)
24+
self.assertEqual(self.bar0.get_value(), 40)
25+
26+
def test_set_value(self):
27+
self.bar0.set_value(60)
28+
self.assertEqual(self.bar0.get_value(), 50)
29+
self.bar0.set_value(30)
30+
self.assertEqual(self.bar0.get_value(), 40)
31+
32+
def tearDown(self):
33+
time.sleep(3)
34+
35+
36+
if __name__ == "__main__":
37+
unittest.main()

0 commit comments

Comments
 (0)