Skip to content

Commit 17c7ab5

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

File tree

8 files changed

+722
-12
lines changed

8 files changed

+722
-12
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,4 @@ temp
6868
/kivymd/tools/release/*.zip
6969
/kivymd/tools/release/temp
7070
.idea/
71+
docs/sources

examples/search.py

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

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,7 @@
88
# Divider.
99
canvas.after:
1010
Color:
11-
rgba:
12-
( \
13-
( \
14-
self.theme_cls.surfaceVariantColor \
15-
if not self.disabled else \
16-
self.theme_cls.onSurfaceColor \
17-
) \
18-
if self.theme_divider_color == "Primary" else \
19-
self.divider_color
20-
) \
21-
22-
if self.divider else self.theme_cls.transparentColor
11+
rgba:self.theme_cls.transparentColor
2312
Line:
2413
width: 1
2514
points: self.x ,self.y, self.x + self.width, self.y

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: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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+
on_text: root.root.text = args[-1]
72+
<MDSearchBar>:
73+
size_hint_y: None
74+
height: dp(56)

0 commit comments

Comments
 (0)