source: lliurex-store/trunk/fuentes/lliurex-store-gui/DetailsBox.py @ 3807

Last change on this file since 3807 was 3807, checked in by hectorgh, 3 years ago

wip

File size: 12.9 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3
4from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio,GLib
5import Screenshot
6import ImageManager
7
8import Core
9
10import signal
11signal.signal(signal.SIGINT, signal.SIG_DFL)
12
13import gettext
14import time
15import threading
16
17_=gettext.gettext
18
19class DetailsBox(Gtk.VBox):
20
21        def __init__(self):
22               
23                Gtk.VBox.__init__(self)
24               
25                self.core=Core.Core.get_core()
26               
27                self.banner_full_size=250
28                self.screenshot_small=100
29                self.banner_small=150
30                self.icon_size=64
31               
32                self.details_max_width=25
33                self.app_max_width=8
34                self.short_description_max_width=10
35               
36                self.full_info_box=Gtk.HBox()
37                self.pack_start(self.full_info_box,True,True,5)
38               
39                # ####### LEFT SIDE ######
40               
41                self.app_details=Gtk.VBox()
42                self.app_details.set_margin_left(10)
43                self.app_details.set_margin_bottom(10)
44                self.app_details.set_margin_top(5)
45                self.full_info_box.pack_start(self.app_details,False,False,0)
46
47                self.app_banner=Screenshot.ScreenshotNeo()
48                self.app_banner.set_size_request(self.banner_full_size,self.banner_full_size)
49
50                self.app_details.pack_start(self.app_banner,False,False,0)
51                self.install_button=Gtk.Button()
52                self.install_button_label=Gtk.Label("Install")
53                self.install_button.add(self.install_button_label)
54                self.install_stack=Gtk.Stack()
55                self.install_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
56                self.install_stack.set_transition_duration(500)
57                self.install_stack.add_titled(self.install_button,"button","Install")
58                vbox=Gtk.VBox()
59                self.install_label=Gtk.Label("Installing...")
60                self.install_label.set_name("DETAILS_LABEL")
61                vbox.pack_start(self.install_label,False,False,0)
62                vbox.set_valign(Gtk.Align.FILL)
63                vbox.set_halign(Gtk.Align.FILL)
64               
65                self.install_label.set_halign(Gtk.Align.START)
66                self.install_pbar=Gtk.ProgressBar()
67                self.install_pbar.set_valign(Gtk.Align.FILL)
68                self.install_pbar.set_halign(Gtk.Align.FILL)
69                vbox.pack_start(self.install_pbar,True,True,0)
70               
71                self.install_stack.add_titled(vbox,"progress","Progress")
72                self.install_button.connect("clicked",self.install_clicked)
73               
74               
75               
76                self.app_details.pack_start(self.install_stack,False,False,10)
77               
78                self.details_label=Gtk.Label("Details")
79                self.details_label.set_alignment(0,0.5)
80                self.details_label.set_margin_left(0)
81                self.app_details.pack_start(self.details_label,False,False,0)
82               
83                self.details_divider=Gtk.HBox()
84                self.details_divider.set_size_request(0,1)
85                self.app_details.pack_start(self.details_divider,False,False,5)
86               
87                self.version_label=Gtk.Label(_("Version"))
88                self.version_label.set_alignment(0,0.5)
89                self.category_label=Gtk.Label(_("Category"))
90                self.category_label.set_alignment(0,0.5)
91                self.license_label=Gtk.Label(_("License"))
92                self.license_label.set_alignment(0,0.5)
93                self.size_label=Gtk.Label(_("Size"))
94                self.size_label.set_alignment(0,0.5)
95                self.website_label=Gtk.Label(_("Website"))
96                self.website_label.set_alignment(0,0.5)
97               
98
99                self.version_value_label=Gtk.Label()
100                self.version_value_label.set_alignment(1,0.5)
101                self.version_value_label.set_max_width_chars(self.details_max_width)
102                self.version_value_label.set_ellipsize(Pango.EllipsizeMode.END)
103                self.category_value_label=Gtk.Label()
104                self.category_value_label.set_alignment(1,0.5)
105                self.category_value_label.set_max_width_chars(self.details_max_width)
106                self.category_value_label.set_ellipsize(Pango.EllipsizeMode.END)
107                self.license_value_label=Gtk.Label()
108                self.license_value_label.set_alignment(1,0.5)
109                self.license_value_label.set_max_width_chars(self.details_max_width)
110                self.license_value_label.set_ellipsize(Pango.EllipsizeMode.END)
111                self.size_value_label=Gtk.Label()
112                self.size_value_label.set_alignment(1,0.5)
113                self.size_value_label.set_max_width_chars(self.details_max_width)
114                self.size_value_label.set_ellipsize(Pango.EllipsizeMode.END)
115                self.website_value_label=Gtk.Label()
116                self.website_value_label.set_alignment(1,0.5)
117                self.website_value_label.set_max_width_chars(self.details_max_width)
118                self.website_value_label.set_ellipsize(Pango.EllipsizeMode.END)
119               
120               
121                hbox=Gtk.HBox()
122                hbox.pack_start(self.version_label,False,False,0)
123                hbox.pack_end(self.version_value_label,False,False,0)
124                self.app_details.pack_start(hbox,False,False,0)
125                hbox=Gtk.HBox()
126                hbox.pack_start(self.category_label,False,False,0)
127                hbox.pack_end(self.category_value_label,False,False,0)
128                self.app_details.pack_start(hbox,False,False,0)
129                hbox=Gtk.HBox()
130                hbox.pack_start(self.license_label,False,False,0)
131                hbox.pack_end(self.license_value_label,False,False,0)
132                self.app_details.pack_start(hbox,False,False,0)
133                hbox=Gtk.HBox()
134                hbox.pack_start(self.size_label,False,False,0)
135                hbox.pack_end(self.size_value_label,False,False,0)
136                self.app_details.pack_start(hbox,False,False,0)
137                hbox=Gtk.HBox()
138                hbox.pack_start(self.website_label,False,False,0)
139                hbox.pack_end(self.website_value_label,False,False,0)
140                self.app_details.pack_start(hbox,False,False,0)
141               
142               
143                # ############# #
144               
145                # ####### RIGHT SIDE ######
146               
147                self.app_details_r=Gtk.VBox()
148                self.app_details_r.set_margin_top(5)
149                self.full_info_box.pack_start(self.app_details_r,True,True,20)
150               
151                hbox=Gtk.HBox()
152                self.app_icon=Screenshot.ScreenshotNeo()
153                self.app_icon.set_size_request(64,64)
154               
155                hbox.pack_start(self.app_icon,False,False,0)
156               
157                self.app_name_label=Gtk.Label("")
158                self.app_name_label.set_max_width_chars(self.app_max_width)
159                self.app_name_label.set_ellipsize(Pango.EllipsizeMode.END)
160                self.app_name_label.set_alignment(0,1)
161                self.short_description_label=Gtk.Label("")
162                self.short_description_label.set_alignment(0,0)
163                self.short_description_label.set_max_width_chars(self.short_description_max_width)
164                self.short_description_label.set_ellipsize(Pango.EllipsizeMode.END)
165               
166                vbox=Gtk.VBox()
167                vbox.pack_start(self.app_name_label,True,True,0)
168                vbox.pack_start(self.short_description_label,True,True,0)
169                hbox.pack_start(vbox,True,True,5)
170               
171                self.app_details_r.pack_start(hbox,False,False,0)
172               
173                self.full_description_label=Gtk.Label()
174                self.full_description_label.set_margin_right(10)
175                self.full_description_label.set_alignment(0,1)
176                self.full_description_label.set_justify(Gtk.Justification.FILL)
177                self.full_description_label.set_line_wrap(True)
178               
179               
180                sw=Gtk.ScrolledWindow()
181                sw.set_shadow_type(Gtk.ShadowType.NONE)
182                sw.set_overlay_scrolling(True)
183                sw.set_kinetic_scrolling(True)
184                vp=Gtk.Viewport()
185                sw.add(vp)
186                vp.add(self.full_description_label)
187               
188                self.app_details_r.pack_start(sw,True,True,10)
189               
190               
191                self.description_divider=Gtk.HBox()
192                self.description_divider.set_size_request(0,1)
193                self.app_details_r.pack_start(self.description_divider,False,False,5)
194               
195                ss_sw=Gtk.ScrolledWindow()
196                ss_sw.set_shadow_type(Gtk.ShadowType.NONE)
197                ss_vp=Gtk.Viewport()
198               
199                ss_sw.add(ss_vp)
200               
201                self.screenshots_box=Gtk.HBox()
202               
203                ss_sw.set_size_request(0,130)
204                vbox=Gtk.VBox()
205                vbox.pack_start(self.screenshots_box,True,False,0)
206                ss_vp.add(vbox)
207                self.app_details_r.pack_start(ss_sw,False,False,5)
208               
209               
210               
211                # ####################### #
212               
213                # ## RELATED #######
214               
215                related_vbox=Gtk.VBox()
216                related_vbox.set_margin_left(10)
217               
218                self.related_label=Gtk.Label(_("Related"))
219                self.related_label.set_alignment(0,1)
220               
221                related_vbox.pack_start(self.related_label,False,False,0)
222                               
223                self.related_divider=Gtk.HBox()
224                self.related_divider.set_size_request(0,1)
225                self.related_divider.set_margin_right(20)
226                related_vbox.pack_start(self.related_divider,False,False,5)
227               
228                related_sw=Gtk.ScrolledWindow()
229                related_sw.set_shadow_type(Gtk.ShadowType.NONE)
230                related_sw.set_size_request(0,self.banner_small+40)
231                related_sw.set_margin_right(20)
232                related_vp=Gtk.Viewport()
233                related_sw.add(related_vp)
234               
235                self.related_box=Gtk.HBox()
236                self.related_box.set_margin_bottom(10)
237               
238                related_vp.add(self.related_box)
239               
240                related_vbox.pack_start(related_sw,False,False,5)
241                self.pack_start(related_vbox,True,True,0)
242               
243                # #################
244
245                self.set_css_info()
246               
247        #def
248       
249        def set_package_info(self,pkg):
250               
251                info={}
252                info["image_url"]=pkg.banner_url
253                info["image_id"]=pkg.banner_id
254                info["x"]=self.banner_full_size
255                info["y"]=self.banner_full_size
256                info["aspect_ratio"]=False
257                info["pkg_name"]=pkg.name
258               
259               
260                if pkg.banner_url !=None:
261                        #self.app_banner.download_image(pkg.banner_url,pkg.banner_id,self.banner_full_size,self.banner_full_size,False)
262                        self.app_banner.download_image(info)
263                else:
264                        info["image_url"]=pkg.icon_url
265                        self.app_banner.download_image(info)
266                        #self.app_banner.create_banner_from_url(pkg.icon_url,pkg.banner_id,self.banner_full_size,self.banner_full_size,pkg.name)
267               
268                self.version_value_label.set_text(pkg.version)
269                self.category_value_label.set_text(pkg.category)
270                self.license_value_label.set_text(pkg.license)
271                self.size_value_label.set_text(pkg.size)
272                self.website_value_label.set_markup("<a href=\"%s\">%s</a>"%(pkg.website,pkg.website))
273                self.app_name_label.set_text(pkg.name)
274                self.short_description_label.set_text(pkg.short_description)
275                self.full_description_label.set_text(pkg.full_description)
276                self.core.main_window.location_label.set_text(pkg.section)
277               
278                info["image_url"]=pkg.icon_url
279                info["image_id"]=pkg.icon_id
280                info["x"]=self.icon_size
281                info["y"]=self.icon_size
282               
283                self.app_icon.download_image(info)
284               
285               
286                for s in self.screenshots_box.get_children():
287                        self.screenshots_box.remove(s)
288               
289                for v in pkg.videos:
290                       
291                        image=Screenshot.ScreenshotNeo()
292                        info["video_url"]=v.video_url
293                        info["image_url"]=v.video_preview_image
294                        info["image_id"]=v.video_id
295                        info["x"]=self.screenshot_small
296                        info["y"]=self.screenshot_small
297                       
298                        image.set_video_info(info)
299                       
300                        b=Gtk.Button()
301                        b.set_name("RELATED_BUTTON")
302                        b.add(image)
303                        self.screenshots_box.pack_start(b,False,False,5)
304                       
305                for s in pkg.screenshots:
306                       
307                        image=Screenshot.ScreenshotNeo()
308                       
309                        info["image_url"]=s.screenshot_url
310                        info["image_id"]=s.screenshot_id
311                        info["x"]=self.screenshot_small
312                        info["y"]=self.screenshot_small
313                        info["aspect_ratio"]=False
314                                               
315                        image.download_image(info)
316                        b=Gtk.Button()
317                        b.set_name("RELATED_BUTTON")
318                        b.add(image)
319                        self.screenshots_box.pack_start(b,False,False,5)
320               
321                self.screenshots_box.show_all()
322                       
323                       
324                for p in self.related_box.get_children():
325                        self.related_box.remove(p)
326                       
327                for p in pkg.related_packages:
328                       
329                        image=Screenshot.ScreenshotNeo()
330                       
331                        info["image_url"]=p.banner_url
332                        info["image_id"]=p.banner_id
333                        info["x"]=self.banner_small
334                        info["y"]=self.banner_small
335                        info["pkg_name"]=p.name
336                        info["custom_frame"]=False
337                       
338                       
339                        if p.banner_url !=None:
340                                image.download_image(info)
341                        else:
342                                info["image_url"]=p.icon_url
343                                info["custom_frame"]=True
344                                image.create_banner_from_url(info)
345                       
346                        b=Gtk.Button()
347                        b.add(image)
348                        b.set_size_request(self.banner_small,self.banner_small)
349                        b.set_margin_top(10)
350                        b.connect("clicked",self.related_app_clicked,p)
351                        b.set_name("RELATED_BUTTON")
352                        b.set_valign(Gtk.Align.CENTER)
353                       
354                        self.related_box.pack_start(b,False,False,5)
355                       
356                self.related_box.show_all()
357               
358                for x in self.screenshots_box.get_children():
359                        x.connect("clicked",self.core.main_window.screenshot_clicked)
360               
361               
362        #def set_values
363       
364       
365        def set_css_info(self):
366               
367                self.style_provider=Gtk.CssProvider()
368                f=Gio.File.new_for_path("lliurex-store.css")
369                self.style_provider.load_from_file(f)
370                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
371               
372                self.set_name("DETAILS_BOX")
373               
374                self.details_divider.set_name("DIVIDER")
375                self.description_divider.set_name("DIVIDER")
376                self.related_divider.set_name("DIVIDER")
377               
378                self.details_label.set_name("DETAILS_LABEL")
379                self.version_label.set_name("DETAILS_OPTIONS")
380                self.category_label.set_name("DETAILS_OPTIONS")
381                self.license_label.set_name("DETAILS_OPTIONS")
382                self.size_label.set_name("DETAILS_OPTIONS")
383                self.website_label.set_name("DETAILS_OPTIONS")
384               
385                self.version_value_label.set_name("DETAILS_VALUES")
386                self.category_value_label.set_name("DETAILS_VALUES")
387                self.license_value_label.set_name("DETAILS_VALUES")
388                self.size_value_label.set_name("DETAILS_VALUES")
389                self.website_value_label.set_name("DETAILS_VALUES")
390               
391                self.app_name_label.set_name("TITLE")
392                self.short_description_label.set_name("SHORT_DESCRIPTION")
393                self.full_description_label.set_name("FULL_DESCRIPTION")
394               
395                self.related_label.set_name("RELATED_LABEL")
396               
397                self.install_button.set_name("INSTALL_BUTTON")
398               
399        #def set-css_info
400       
401        def related_app_clicked(self,widget,app):
402               
403                self.core.main_window.load_pkg_data(app.debian_name)
404               
405        #def related_app_clicked
406       
407        def install_clicked(self,widget):
408               
409                self.install_stack.set_visible_child_name("progress")
410                self.install_pbar.set_text("HOLA")
411                t=threading.Thread(target=self.install_pkg)
412                t.daemon=True
413                t.start()
414                GLib.timeout_add(100,self.pulse_pbar,t)
415               
416               
417        #def install_clicked
418       
419        def pulse_pbar(self,t):
420               
421                if t.is_alive():
422                        self.install_pbar.pulse()
423                        return True
424               
425                self.install_button_label.set_text("Installed")
426                self.install_stack.set_visible_child_name("button")
427               
428                return False
429               
430        #def pulse_pbar
431       
432        def install_pkg(self):
433               
434                time.sleep(3)
435               
436        #def
437       
438
Note: See TracBrowser for help on using the repository browser.