comparison cagou/plugins/plugin_wid_blog.kv @ 488:beedff600d2b

blog: blog widget implementation: this patch implements a basic blog widget. The search bare can be used to change node (only node for now, will be improved to do search and all). Publication on current node can be done by pressing the pencil icon. A checkbox can be activated to use end-to-end encryption. No pagination or comments are supported for now. Due to lack of HTML rendering in Kivy, only simple formatting is supported. If item is end-2-end encrypted, a green closed locker is shown next to publication date. rel 380
author Goffi <goffi@goffi.org>
date Sat, 15 Oct 2022 20:20:10 +0200
parents
children
comparison
equal deleted inserted replaced
487:38ca44d96752 488:beedff600d2b
1 # desktop/mobile frontend for Libervia XMPP client
2 # Copyright (C) 2016-2022 Jérôme Poisson (goffi@goffi.org)
3
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
13
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 #:import date_fmt sat.tools.common.date_utils.date_fmt
18
19 <SearchButton>:
20 size_hint: None, 1
21 symbol: "search"
22 width: dp(30)
23 font_size: dp(25)
24 color: 0.4, 0.4, 0.4, 1
25
26
27 <NewPostButton>:
28 size_hint: None, 1
29 symbol: "pencil"
30 width: dp(30)
31 font_size: dp(25)
32 color: 0.4, 0.4, 0.4, 1
33
34 <NewPosttMenu>:
35 padding: dp(20)
36 spacing: dp(10)
37 e2ee: e2ee_checkbox
38 Label:
39 size_hint: 1, None
40 color: 1, 1, 1, 1
41 text: _("Publish a new post on {node} node of {service}").format(node=root.blog.node or "personal blog", service=root.blog.service or root.blog.profile)
42 text_size: root.width, None
43 size: self.texture_size
44 halign: "center"
45 bold: True
46 TextInput:
47 id: title
48 size_hint: 1, None
49 height: sp(30)
50 hint_text: _("title of your post (optional)")
51 TextInput:
52 id: content
53 size_hint: 1, None
54 height: sp(300)
55 hint_text: _("body of your post (markdown syntax allowed)")
56 BoxLayout
57 id: e2ee
58 size_hint: 1, None
59 padding_y: None
60 height: dp(25)
61 Widget:
62 CheckBox:
63 id: e2ee_checkbox
64 size_hint: None, 1
65 width: dp(20)
66 active: False
67 color: 1, 1, 1, 1
68 Label:
69 size_hint: None, None
70 text: _("encrypt post")
71 text_size: None, None
72 size: self.texture_size
73 padding_x: dp(10)
74 font_size: sp(15)
75 color: 1, 1, 1, 1
76 Widget:
77 Button:
78 size_hint: 1, None
79 height: sp(50)
80 text: _("publish")
81 on_release: root.publish(title.text, content.text, e2ee=e2ee_checkbox.active)
82 Widget:
83
84
85 <BlogPostAvatar>:
86 size_hint: None, None
87 size: dp(30), dp(30)
88 canvas.before:
89 Color:
90 rgba: (0.87,0.87,0.87,1)
91 RoundedRectangle:
92 radius: [dp(5)]
93 pos: self.pos
94 size: self.size
95
96 <BlogPostWidget>:
97 size_hint: 1, None
98 avatar: avatar
99 header_box: header_box
100 height: self.minimum_height
101 orientation: "vertical"
102 Label:
103 color: 0, 0, 0, 1
104 bold: True
105 font_size: root.title_font_size
106 text_size: None, None
107 size_hint: None, None
108 size: self.texture_size[0], self.texture_size[1] if root.blog_data.get("title") else 0
109 opacity: 1 if root.blog_data.get("title") else 0
110 padding: dp(5), 0
111 text: root.blog_data.get("title", "")
112 BoxLayout:
113 id: header_box
114 size_hint: 1, None
115 height: dp(40)
116 BoxLayout:
117 orientation: 'vertical'
118 width: avatar.width
119 size_hint: None, 1
120 BlogPostAvatar:
121 id: avatar
122 source: app.default_avatar
123 Label:
124 id: created_ts
125 color: (0, 0, 0, 1)
126 font_size: root.font_size
127 text_size: None, None
128 size_hint: None, None
129 size: self.texture_size
130 padding: dp(5), 0
131 markup: True
132 valign: 'middle'
133 text: f"published on [b]{date_fmt(root.blog_data.get('published', 0), 'auto_day')}[/b]"
134 Symbol:
135 size_hint: None, None
136 height: created_ts.height
137 width: self.height
138 id: encrypted
139 symbol: 'lock-filled' if root.blog_data.get("encrypted") else 'lock-open'
140 font_size: created_ts.height
141 opacity: 1 if root.blog_data.get("encrypted") else 0
142 color: 0.29,0.87,0.0,1
143 SimpleXHTMLWidget:
144 size_hint: 1, None
145 height: self.minimum_height
146 xhtml: root.blog_data.get("content_xhtml") or self.escape(root.blog_data.get("content", ""))
147 color: (0, 0, 0, 1)
148 padding: dp(5), dp(5)
149
150
151 <Blog>:
152 float_layout: float_layout
153 orientation: 'vertical'
154 posts_widget: posts_widget
155 FloatLayout:
156 id: float_layout
157 ScrollView:
158 size_hint: 1, 1
159 pos_hint: {'x': 0, 'y': 0}
160 do_scroll_x: False
161 scroll_type: ['bars', 'content']
162 bar_width: dp(6)
163 BoxLayout:
164 id: posts_widget
165 orientation: "vertical"
166 size_hint: 1, None
167 height: self.minimum_height
168 spacing: dp(10)