Skip to content

Commit a462821

Browse files
committed
uix: new search widget
1 parent 5ff9d0d commit a462821

File tree

6 files changed

+523
-0
lines changed

6 files changed

+523
-0
lines changed

examples/search.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
from kivy.lang import Builder
2+
from kivymd.app import MDApp
3+
from kivymd.uix.list import MDListItem
4+
from examples.common_app import CommonApp
5+
from kivy.properties import StringProperty
6+
from kivymd.icon_definitions import md_icons
7+
8+
class IconItem(MDListItem):
9+
icon = StringProperty()
10+
text = StringProperty()
11+
12+
MAIN_KV = """
13+
#: import images_path kivymd.images_path
14+
15+
<IconItem>
16+
divider: True
17+
MDListItemLeadingIcon:
18+
icon: root.icon
19+
20+
MDListItemSupportingText:
21+
text: root.text
22+
23+
MDScreen:
24+
md_bg_color:app.theme_cls.backgroundColor
25+
BoxLayout:
26+
padding:[dp(10), dp(30), dp(10), dp(10)]
27+
orientation:"vertical"
28+
29+
MDSearchBar:
30+
id: search_bar
31+
supporting_text: "Search in text"
32+
view_root: root
33+
34+
# Search Bar
35+
MDSearchBarLeadingContainer:
36+
MDSearchLeadingIcon:
37+
icon: "menu"
38+
on_release: app.open_menu(self)
39+
40+
MDSearchBarTrailingContainer:
41+
MDSearchTrailingIcon:
42+
icon:"microphone"
43+
MDSearchTrailingAvatar:
44+
source:f"{images_path}/logo/kivymd-icon-128.png"
45+
46+
# Search View
47+
MDSearchViewLeadingContainer:
48+
MDSearchLeadingIcon:
49+
icon:"arrow-left"
50+
on_release: search_bar.close_view()
51+
52+
MDSearchViewTrailingContainer:
53+
MDSearchTrailingIcon:
54+
icon:"window-close"
55+
56+
MDSearchViewContainer:
57+
RecycleView:
58+
id: rv
59+
key_viewclass: 'viewclass'
60+
key_size: 'height'
61+
62+
RecycleBoxLayout:
63+
default_size: None, dp(48)
64+
default_size_hint: 1, None
65+
size_hint_y: None
66+
height: self.minimum_height
67+
orientation: 'vertical'
68+
Widget:
69+
70+
BoxLayout:
71+
size_hint_y:None
72+
height:dp(30)
73+
padding:[dp(50), 0]
74+
spacing:dp(10)
75+
MDLabel:
76+
text:"Bar dock"
77+
halign:"right"
78+
MDSwitch:
79+
on_active:search_bar.docked = args[-1]
80+
"""
81+
82+
class Example(MDApp, CommonApp):
83+
84+
def build(self):
85+
return Builder.load_string(MAIN_KV)
86+
87+
def on_start(self):
88+
self.set_list_md_icons()
89+
90+
def set_list_md_icons(self, text="", search=False):
91+
def add_icon_item(name_icon):
92+
self.root.ids.rv.data.append(
93+
{
94+
"viewclass": "IconItem",
95+
"icon": name_icon,
96+
"text": name_icon,
97+
"callback": lambda x: x,
98+
}
99+
)
100+
101+
self.root.ids.rv.data = []
102+
for name_icon in md_icons.keys():
103+
if search:
104+
if text in name_icon:
105+
add_icon_item(name_icon)
106+
else:
107+
add_icon_item(name_icon)
108+
109+
Example().run()

kivymd/factory_registers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,12 @@
132132
register("MDCircularLayout", module="kivymd.uix.circularlayout")
133133
register("MDHeroFrom", module="kivymd.uix.hero")
134134
register("MDHeroTo", module="kivymd.uix.hero")
135+
register("MDSearchBar", module="kivymd.uix.search")
136+
register("MDSearchTrailingAvatar", module="kivymd.uix.search")
137+
register("MDSearchTrailingIcon", module="kivymd.uix.search")
138+
register("MDSearchLeadingIcon", module="kivymd.uix.search")
139+
register("MDSearchViewContainer", module="kivymd.uix.search")
140+
register("MDSearchBarLeadingContainer", module="kivymd.uix.search")
141+
register("MDSearchBarTrailingContainer", module="kivymd.uix.search")
142+
register("MDSearchViewLeadingContainer", module="kivymd.uix.search")
143+
register("MDSearchViewTrailingContainer", module="kivymd.uix.search")

kivymd/uix/search/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .search import *

kivymd/uix/search/search.kv

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<MDSearchTrailingAvatar>:
2+
size_hint_x: None
3+
width: dp(30)
4+
5+
<MDSearchTrailingIcon>:
6+
size_hint: [None, 1]
7+
width: dp(24)
8+
icon_color: app.theme_cls.onSurfaceColor
9+
10+
<MDSearchLeadingIcon>:
11+
size_hint: [None, 1]
12+
width: dp(24)
13+
icon_color: app.theme_cls.onSurfaceColor
14+
15+
<MDSearchBarTrailingContainer>:
16+
size_hint_x: None
17+
width: self.minimum_width
18+
spacing: dp(16)
19+
20+
<MDSearchBarLeadingContainer>:
21+
size_hint_x: None
22+
width: self.minimum_width
23+
spacing: dp(16)
24+
25+
<MDSearchViewTrailingContainer>:
26+
size_hint_x: None
27+
width: self.minimum_width
28+
spacing: dp(16)
29+
30+
<MDSearchViewLeadingContainer>:
31+
size_hint_x: None
32+
width: self.minimum_width
33+
spacing: dp(16)
34+
35+
<MDSearchViewContainer>:
36+
size_hint_y:None
37+
height:dp(55)
38+
canvas:
39+
Color:
40+
rgba: app.theme_cls.outlineColor
41+
Line:
42+
points:
43+
[[self.x,self.y+self.height],
44+
[self.x+self.width, self.y+self.height]]
45+
46+
<MDSearchWidget>:
47+
size_hint:[1,1]
48+
MDBoxLayout:
49+
id: root_container
50+
orientation: 'vertical'
51+
md_bg_color: app.theme_cls.surfaceContainerHighColor
52+
size_hint: [None, None]
53+
orientation: 'vertical'
54+
# header
55+
BoxLayout:
56+
id: header
57+
padding: [dp(16), 0]
58+
spacing: dp(16)
59+
size_hint_y: None
60+
height: dp(56)
61+
TextInput:
62+
id: text_input
63+
background_color:[0,0,0,0]
64+
foreground_color: app.theme_cls.onSurfaceColor
65+
cursor_color:app.theme_cls.outlineColor
66+
hint_text_color: app.theme_cls.onSurfaceVariantColor
67+
padding: [0, (self.parent.height - self.font_size - dp(3)) / 2]
68+
multiline: False
69+
font_size: root._font_style["font-size"]
70+
on_focus: if args[-1]: root.switch_state("open")
71+
<MDSearchBar>:
72+
size_hint_y: None
73+
height: dp(56)

0 commit comments

Comments
 (0)