Skip to content

Commit 1664ed9

Browse files
committed
Persona, ComboBox controls, Dropdown new props
1 parent 965d462 commit 1664ed9

6 files changed

Lines changed: 463 additions & 4 deletions

File tree

examples/combobox.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import pglet
2+
from pglet import ComboBox, combobox
3+
4+
page = pglet.page("combobox-test")
5+
page.horizontal_align = "stretch"
6+
page.add(
7+
ComboBox(
8+
label="Your favorite color",
9+
value="c",
10+
options=[
11+
combobox.Option("RGB", item_type="header"),
12+
combobox.Option("red"),
13+
combobox.Option("green"),
14+
combobox.Option("blue"),
15+
combobox.Option("div1", item_type="divider"),
16+
combobox.Option("CMYK", item_type="header"),
17+
combobox.Option("c", "Cyan"),
18+
combobox.Option("m", "Magenta"),
19+
combobox.Option("y", "Yellow"),
20+
combobox.Option("k", "Black"),
21+
],
22+
),
23+
ComboBox(
24+
label="Your favorite car makers",
25+
multi_select=True,
26+
value="BMW, Volkswagen",
27+
width="50%",
28+
options=[
29+
combobox.Option("Select all", item_type="select_all"),
30+
combobox.Option("div1", item_type="divider"),
31+
combobox.Option("BMW"),
32+
combobox.Option("Toyota"),
33+
combobox.Option("Volkswagen"),
34+
combobox.Option("Mercedes-Benz"),
35+
],
36+
),
37+
)

examples/persona.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import pglet
2+
from pglet import Persona
3+
4+
page = pglet.page("persona-test")
5+
page.add(Persona("Jack Reacher", secondary_text="Designed", size=8))
6+
page.add(Persona("John Smith", secondary_text="Student", size=24))
7+
page.add(Persona("Marry Poppins", size=32, presence="busy", hide_details=True))
8+
page.add(
9+
Persona(
10+
"Feodor",
11+
size=32,
12+
image_url="https://avatars.githubusercontent.com/u/5041459?s=88&v=4",
13+
presence="online",
14+
)
15+
)
16+
page.add(Persona("Alice", size=72, secondary_text="Wonderer"))

pglet/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from pglet.callout import Callout
44
from pglet.checkbox import Checkbox
55
from pglet.choicegroup import ChoiceGroup
6+
from pglet.combobox import ComboBox
67
from pglet.control import Control
78
from pglet.datepicker import DatePicker
89
from pglet.dialog import Dialog
@@ -18,8 +19,11 @@
1819
from pglet.nav import Nav
1920
from pglet.page import Page
2021
from pglet.panel import Panel
22+
from pglet.persona import Persona
23+
from pglet.pglet import *
2124
from pglet.piechart import PieChart
2225
from pglet.progress import Progress
26+
from pglet.reconnecting_websocket import *
2327
from pglet.searchbox import SearchBox
2428
from pglet.slider import Slider
2529
from pglet.spinbutton import SpinButton
@@ -31,5 +35,3 @@
3135
from pglet.toggle import Toggle
3236
from pglet.toolbar import Toolbar
3337
from pglet.verticalbarchart import VerticalBarChart
34-
from pglet.pglet import *
35-
from pglet.reconnecting_websocket import *

pglet/combobox.py

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
from typing import Literal, Optional
2+
3+
from beartype import beartype
4+
5+
from pglet.control import Control
6+
7+
ITEM_TYPE = Literal[None, "normal", "divider", "header", "selectAll", "select_all"]
8+
9+
10+
class ComboBox(Control):
11+
def __init__(
12+
self,
13+
label=None,
14+
id=None,
15+
value=None,
16+
placeholder=None,
17+
error_message=None,
18+
on_change=None,
19+
options=None,
20+
width=None,
21+
height=None,
22+
padding=None,
23+
margin=None,
24+
visible=None,
25+
disabled=None,
26+
focused=None,
27+
multi_select=None,
28+
allow_free_form=None,
29+
auto_complete=None,
30+
data=None,
31+
):
32+
Control.__init__(
33+
self,
34+
id=id,
35+
width=width,
36+
height=height,
37+
padding=padding,
38+
margin=margin,
39+
visible=visible,
40+
disabled=disabled,
41+
data=data,
42+
)
43+
self.label = label
44+
self.value = value
45+
self.placeholder = placeholder
46+
self.error_message = error_message
47+
self.focused = focused
48+
self.multi_select = multi_select
49+
self.allow_free_form = allow_free_form
50+
self.auto_complete = auto_complete
51+
self.on_change = on_change
52+
self.__options = []
53+
if options != None:
54+
for option in options:
55+
self.__options.append(option)
56+
57+
def _get_control_name(self):
58+
return "combobox"
59+
60+
# options
61+
@property
62+
def options(self):
63+
return self.__options
64+
65+
@options.setter
66+
def options(self, value):
67+
self.__options = value
68+
69+
# on_change
70+
@property
71+
def on_change(self):
72+
return self._get_event_handler("change")
73+
74+
@on_change.setter
75+
def on_change(self, handler):
76+
self._add_event_handler("change", handler)
77+
78+
# label
79+
@property
80+
def label(self):
81+
return self._get_attr("label")
82+
83+
@label.setter
84+
def label(self, value):
85+
self._set_attr("label", value)
86+
87+
# value
88+
@property
89+
def value(self):
90+
return self._get_attr("value")
91+
92+
@value.setter
93+
def value(self, value):
94+
self._set_attr("value", value)
95+
96+
# placeholder
97+
@property
98+
def placeholder(self):
99+
return self._get_attr("placeholder")
100+
101+
@placeholder.setter
102+
def placeholder(self, value):
103+
self._set_attr("placeholder", value)
104+
105+
# error_message
106+
@property
107+
def error_message(self):
108+
return self._get_attr("errorMessage")
109+
110+
@error_message.setter
111+
def error_message(self, value):
112+
self._set_attr("errorMessage", value)
113+
114+
def _get_children(self):
115+
return self.__options
116+
117+
# focused
118+
@property
119+
def focused(self):
120+
return self._get_attr("focused")
121+
122+
@focused.setter
123+
@beartype
124+
def focused(self, value: Optional[bool]):
125+
self._set_attr("focused", value)
126+
127+
# multi_select
128+
@property
129+
def multi_select(self):
130+
return self._get_attr("multiselect")
131+
132+
@multi_select.setter
133+
@beartype
134+
def multi_select(self, value: Optional[bool]):
135+
self._set_attr("multiselect", value)
136+
137+
# allow_free_form
138+
@property
139+
def allow_free_form(self):
140+
return self._get_attr("allowfreeform")
141+
142+
@allow_free_form.setter
143+
@beartype
144+
def allow_free_form(self, value: Optional[bool]):
145+
self._set_attr("allowfreeform", value)
146+
147+
# auto_complete
148+
@property
149+
def auto_complete(self):
150+
return self._get_attr("autocomplete")
151+
152+
@auto_complete.setter
153+
@beartype
154+
def auto_complete(self, value: Optional[bool]):
155+
self._set_attr("autocomplete", value)
156+
157+
158+
class Option(Control):
159+
def __init__(self, key=None, text=None, item_type: ITEM_TYPE = None, disabled=None):
160+
Control.__init__(self)
161+
assert key != None or text != None, "key or text must be specified"
162+
self.key = key
163+
self.text = text
164+
self.item_type = item_type
165+
self.disabled = disabled
166+
167+
def _get_control_name(self):
168+
return "option"
169+
170+
# key
171+
@property
172+
def key(self):
173+
return self._get_attr("key")
174+
175+
@key.setter
176+
def key(self, value):
177+
self._set_attr("key", value)
178+
179+
# text
180+
@property
181+
def text(self):
182+
return self._get_attr("text")
183+
184+
@text.setter
185+
def text(self, value):
186+
self._set_attr("text", value)
187+
188+
# item_type
189+
@property
190+
def item_type(self):
191+
return self._get_attr("itemtype")
192+
193+
@item_type.setter
194+
@beartype
195+
def item_type(self, value: ITEM_TYPE):
196+
self._set_attr("itemtype", value)
197+
198+
# disabled
199+
@property
200+
def disabled(self):
201+
return self._get_attr("disabled")
202+
203+
@disabled.setter
204+
@beartype
205+
def disabled(self, value: Optional[bool]):
206+
self._set_attr("disabled", value)

pglet/dropdown.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
from typing import Optional
1+
from typing import Literal, Optional
2+
23
from beartype import beartype
4+
35
from pglet.control import Control
46

7+
ITEM_TYPE = Literal[None, "normal", "divider", "header"]
8+
59

610
class Dropdown(Control):
711
def __init__(
@@ -116,11 +120,13 @@ def focused(self, value: Optional[bool]):
116120

117121

118122
class Option(Control):
119-
def __init__(self, key=None, text=None):
123+
def __init__(self, key=None, text=None, item_type: ITEM_TYPE = None, disabled=None):
120124
Control.__init__(self)
121125
assert key != None or text != None, "key or text must be specified"
122126
self.key = key
123127
self.text = text
128+
self.item_type = item_type
129+
self.disabled = disabled
124130

125131
def _get_control_name(self):
126132
return "option"
@@ -142,3 +148,23 @@ def text(self):
142148
@text.setter
143149
def text(self, value):
144150
self._set_attr("text", value)
151+
152+
# item_type
153+
@property
154+
def item_type(self):
155+
return self._get_attr("itemtype")
156+
157+
@item_type.setter
158+
@beartype
159+
def item_type(self, value: ITEM_TYPE):
160+
self._set_attr("itemtype", value)
161+
162+
# disabled
163+
@property
164+
def disabled(self):
165+
return self._get_attr("disabled")
166+
167+
@disabled.setter
168+
@beartype
169+
def disabled(self, value: Optional[bool]):
170+
self._set_attr("disabled", value)

0 commit comments

Comments
 (0)