Skip to content

Commit 20f7a0b

Browse files
committed
day 1 progress
1 parent 5ff9d0d commit 20f7a0b

File tree

5 files changed

+202
-0
lines changed

5 files changed

+202
-0
lines changed

Diff for: examples/search.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from kivy.lang import Builder
2+
from kivymd.app import MDApp
3+
from examples.common_app import CommonApp
4+
from faker import Faker
5+
6+
MAIN_KV = """
7+
#: import images_path kivymd.images_path
8+
9+
MDScreen:
10+
md_bg_color:app.theme_cls.backgroundColor
11+
BoxLayout:
12+
padding:[dp(10), dp(10)]
13+
orientation:"vertical"
14+
15+
MDSearchBar:
16+
id:bar
17+
supporting_text: "Search in text"
18+
# if you want it to be of fixed size
19+
# adaptive_width:True
20+
MDSearchTrailingIcon:
21+
icon:"microphone"
22+
MDSearchTrailingAvatar:
23+
source:f"{images_path}/logo/kivymd-icon-128.png"
24+
25+
Widget:
26+
MDSwitch:
27+
on_active:app.theme_cls.theme_style = "Dark" if app.theme_cls.theme_style == "Light" else "Light"
28+
Widget:
29+
30+
31+
"""
32+
33+
class Example(MDApp, CommonApp):
34+
fake = Faker()
35+
def build(self):
36+
return Builder.load_string(MAIN_KV)
37+
38+
Example().run()

Diff for: kivymd/factory_registers.py

+4
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,7 @@
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("MDSearchView", module="kivymd.uix.search")
137+
register("MDSearchTrailingAvatar", module="kivymd.uix.search")
138+
register("MDSearchTrailingIcon", module="kivymd.uix.search")

Diff for: kivymd/uix/search/__init__.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from .search import (
2+
MDSearchBar,
3+
MDSearchTrailingAvatar,
4+
MDSearchTrailingIcon,
5+
MDSearchView,
6+
)

Diff for: kivymd/uix/search/search.kv

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#: import images_path kivymd.images_path
2+
3+
<MDSearchTrailingAvatar>:
4+
size_hint_x: None
5+
width: dp(30)
6+
7+
<MDSearchTrailingIcon>:
8+
size_hint: [None, 1]
9+
width: dp(24)
10+
theme_icon_color: "Custom"
11+
icon_color: app.theme_cls.onSurfaceColor
12+
13+
<MDSearchView>:
14+
overlay_color: [0] * 4
15+
background: f"{images_path}/transparent.png"
16+
boder: [0] * 4
17+
_anim_duration: 0
18+
FloatLayout
19+
MDBoxLayout:
20+
id: root_container
21+
orientation: 'vertical'
22+
md_bg_color: app.theme_cls.surfaceContainerHighColor
23+
adaptive_height: True
24+
size_hint_x: None
25+
canvas:
26+
Color:
27+
rgba: app.theme_cls.outlineColor
28+
Line:
29+
points:
30+
[[self.x,self.y-root._header_height+self.height],
31+
[self.x+self.width, self.y-root._header_height+self.height]]
32+
BoxLayout:
33+
size_hint_y: None
34+
height: root._header_height
35+
spacing: dp(16)
36+
padding: [dp(16), 0]
37+
MDIconButton:
38+
icon: "arrow-left"
39+
size_hint: [None, 1]
40+
width: dp(24)
41+
on_release: root.close_view()
42+
theme_icon_color: "Custom"
43+
icon_color: app.theme_cls.onSurfaceColor
44+
45+
BoxLayout:
46+
size_hint: [None, None]
47+
size:[ dp(360), dp(240)]
48+
49+
<MDSearchBar>:
50+
size_hint_y: None
51+
height: dp(56)
52+
md_bg_color: app.theme_cls.surfaceContainerHighColor
53+
radius: dp(28)
54+
spacing: dp(16)
55+
padding: [dp(16), 0]
56+
adaptive_width: False
57+
on_release: self._search_view.open_view()
58+
MDIconButton:
59+
icon: root.leading_icon
60+
size_hint: [None, 1]
61+
width: dp(24)
62+
on_release: root.on_leading_icon_release()
63+
on_press: root.on_leading_icon_press()
64+
theme_icon_color: "Custom"
65+
icon_color: app.theme_cls.onSurfaceColor
66+
MDLabel:
67+
text: root.supporting_text
68+
theme_text_color: "Custom"
69+
text_color: app.theme_cls.onSurfaceVariantColor
70+
theme_font_size: "Custom"
71+
font_style: "Title"
72+
role: "medium"
73+
size_hint_x: None
74+
padding: root._supporting_text_padding if root.adaptive_width else 0
75+
adaptive_width:root.adaptive_width
76+
size_hint_x: 1 if not root.adaptive_width else None

Diff for: kivymd/uix/search/search.py

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
from __future__ import annotations
2+
3+
__all__ = (
4+
"MDSearchView",
5+
"MDSearchBar",
6+
"MDSearchTrailingIcon",
7+
"MDSearchTrailingAvatar",
8+
)
9+
10+
import os
11+
12+
from kivy.lang import Builder
13+
from kivy.metrics import dp
14+
from kivy.properties import StringProperty, ListProperty
15+
from kivy.uix.behaviors import ButtonBehavior
16+
from kivy.uix.image import Image
17+
from kivy.uix.modalview import ModalView
18+
19+
from kivymd import uix_path
20+
from kivymd.uix.behaviors import RectangularRippleBehavior
21+
from kivymd.uix.boxlayout import MDBoxLayout
22+
from kivymd.uix.button import MDIconButton
23+
24+
with open(
25+
os.path.join(uix_path, "search", "search.kv"), encoding="utf-8"
26+
) as kv_file:
27+
Builder.load_string(kv_file.read())
28+
29+
30+
class MDSearchTrailingAvatar(ButtonBehavior, Image):
31+
pass
32+
33+
34+
class MDSearchTrailingIcon(MDIconButton):
35+
pass
36+
37+
class MDSearchView(ModalView):
38+
39+
_header_height = dp(70)
40+
def __init__(self, search_bar, *args, **kwargs):
41+
super().__init__(*args, **kwargs)
42+
self.search_bar = search_bar
43+
44+
def open_view(self):
45+
self.ids.root_container.width = self.search_bar.width
46+
self.ids.root_container.pos = [
47+
self.search_bar.pos[0],
48+
self.search_bar.pos[1] - self.ids.root_container.height + self.search_bar.height
49+
]
50+
# TODO: make it like animating from that view
51+
self.open()
52+
53+
def close_view(self):
54+
self.dismiss()
55+
56+
57+
class MDSearchBar(ButtonBehavior, MDBoxLayout):
58+
59+
leading_icon = StringProperty("magnify")
60+
supporting_text = StringProperty("Hinted search text")
61+
62+
# internal
63+
_supporting_text_padding = ListProperty([0, 0, dp(30), 0])
64+
_search_view = None
65+
def __init__(self, *args, **kwargs):
66+
super().__init__(*args, **kwargs)
67+
self.register_event_type("on_leading_icon_release")
68+
self.register_event_type("on_leading_icon_press")
69+
self._search_view = MDSearchView(self)
70+
71+
def on_leading_icon_release(self):
72+
pass
73+
74+
def on_leading_icon_press(self):
75+
pass
76+
77+
def on_release(self):
78+
pass

0 commit comments

Comments
 (0)