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

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

wip

File size: 14.5 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
16import html2text
17
18_=gettext.gettext
19
20class DetailsBox(Gtk.VBox):
21
22        def __init__(self):
23               
24                Gtk.VBox.__init__(self)
25               
26                self.core=Core.Core.get_core()
27               
28                self.banner_full_size=250
29                self.screenshot_small=100
30                self.banner_small=150
31                self.icon_size=64
32               
33                self.details_max_width=25
34                self.app_max_width=8
35                self.short_description_max_width=10
36               
37                self.full_info_box=Gtk.HBox()
38                self.pack_start(self.full_info_box,True,True,5)
39               
40                # ####### LEFT SIDE ######
41               
42                self.app_details=Gtk.VBox()
43                self.app_details.set_margin_left(10)
44                self.app_details.set_margin_bottom(10)
45                self.app_details.set_margin_top(5)
46                self.full_info_box.pack_start(self.app_details,False,False,0)
47
48                self.app_banner=Screenshot.ScreenshotNeo()
49                self.app_banner.set_size_request(self.banner_full_size,self.banner_full_size)
50
51                self.app_details.pack_start(self.app_banner,False,False,0)
52                self.install_button=Gtk.Button()
53                self.install_button_label=Gtk.Label("Install")
54                self.install_button.add(self.install_button_label)
55                self.install_button.connect("clicked",self.install_clicked)
56               
57                vbox=Gtk.VBox()
58                self.install_label=Gtk.Label("Installing...")
59                vbox.pack_start(self.install_label,False,False,0)
60                vbox.set_valign(Gtk.Align.FILL)
61                vbox.set_halign(Gtk.Align.FILL)
62               
63                self.install_label.set_halign(Gtk.Align.START)
64                self.install_pbar=Gtk.ProgressBar()
65                self.install_pbar.set_valign(Gtk.Align.FILL)
66                self.install_pbar.set_halign(Gtk.Align.FILL)
67                vbox.pack_start(self.install_pbar,True,True,0)
68
69                hbox=Gtk.HBox()
70                self.uninstall_button=Gtk.Button("Uninstall")
71                self.uninstall_button.connect("clicked",self.uninstall_clicked)
72                self.open_button=Gtk.Button("Open")
73                self.open_button.connect("clicked",self.open_clicked)
74                self.open_button.set_margin_right(10)
75                hbox.pack_start(self.open_button,True,True,0)
76                hbox.pack_start(self.uninstall_button,True,True,0)
77               
78               
79               
80                self.install_stack=Gtk.Stack()
81                self.install_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
82                self.install_stack.set_transition_duration(500)
83                self.install_stack.add_titled(self.install_button,"install","Install")
84                self.install_stack.add_titled(vbox,"progress","Progress")
85                self.install_stack.add_titled(hbox,"installed","Open/Uninstall")
86               
87               
88                self.app_details.pack_start(self.install_stack,False,False,10)
89               
90                self.details_label=Gtk.Label("Details")
91                self.details_label.set_alignment(0,0.5)
92                self.details_label.set_margin_left(0)
93                self.app_details.pack_start(self.details_label,False,False,0)
94               
95                self.details_divider=Gtk.HBox()
96                self.details_divider.set_size_request(0,1)
97                self.app_details.pack_start(self.details_divider,False,False,5)
98               
99                self.version_label=Gtk.Label(_("Version"))
100                self.version_label.set_alignment(0,0.5)
101                self.category_label=Gtk.Label(_("Category"))
102                self.category_label.set_alignment(0,0.5)
103                self.license_label=Gtk.Label(_("License"))
104                self.license_label.set_alignment(0,0.5)
105                self.size_label=Gtk.Label(_("Size"))
106                self.size_label.set_alignment(0,0.5)
107                self.website_label=Gtk.Label(_("Website"))
108                self.website_label.set_alignment(0,0.5)
109               
110
111                self.version_value_label=Gtk.Label()
112                self.version_value_label.set_alignment(1,0.5)
113                self.version_value_label.set_max_width_chars(self.details_max_width)
114                self.version_value_label.set_ellipsize(Pango.EllipsizeMode.END)
115                self.category_value_label=Gtk.Label()
116                self.category_value_label.set_alignment(1,0.5)
117                self.category_value_label.set_max_width_chars(self.details_max_width)
118                self.category_value_label.set_ellipsize(Pango.EllipsizeMode.END)
119                self.license_value_label=Gtk.Label()
120                self.license_value_label.set_alignment(1,0.5)
121                self.license_value_label.set_max_width_chars(self.details_max_width)
122                self.license_value_label.set_ellipsize(Pango.EllipsizeMode.END)
123                self.size_value_label=Gtk.Label()
124                self.size_value_label.set_alignment(1,0.5)
125                self.size_value_label.set_max_width_chars(self.details_max_width)
126                self.size_value_label.set_ellipsize(Pango.EllipsizeMode.END)
127                self.website_value_label=Gtk.Label()
128                self.website_value_label.set_alignment(1,0.5)
129                self.website_value_label.set_max_width_chars(self.details_max_width)
130                self.website_value_label.set_ellipsize(Pango.EllipsizeMode.END)
131               
132               
133                hbox=Gtk.HBox()
134                hbox.pack_start(self.version_label,False,False,0)
135                hbox.pack_end(self.version_value_label,False,False,0)
136                self.app_details.pack_start(hbox,False,False,0)
137                hbox=Gtk.HBox()
138                hbox.pack_start(self.category_label,False,False,0)
139                hbox.pack_end(self.category_value_label,False,False,0)
140                self.app_details.pack_start(hbox,False,False,0)
141                hbox=Gtk.HBox()
142                hbox.pack_start(self.license_label,False,False,0)
143                hbox.pack_end(self.license_value_label,False,False,0)
144                self.app_details.pack_start(hbox,False,False,0)
145                hbox=Gtk.HBox()
146                hbox.pack_start(self.size_label,False,False,0)
147                hbox.pack_end(self.size_value_label,False,False,0)
148                self.app_details.pack_start(hbox,False,False,0)
149                hbox=Gtk.HBox()
150                hbox.pack_start(self.website_label,False,False,0)
151                hbox.pack_end(self.website_value_label,False,False,0)
152                self.app_details.pack_start(hbox,False,False,0)
153               
154               
155                # ############# #
156               
157                # ####### RIGHT SIDE ######
158               
159                self.app_details_r=Gtk.VBox()
160                self.app_details_r.set_margin_top(5)
161                self.full_info_box.pack_start(self.app_details_r,True,True,20)
162               
163                hbox=Gtk.HBox()
164                self.app_icon=Screenshot.ScreenshotNeo()
165                self.app_icon.set_size_request(64,64)
166               
167                hbox.pack_start(self.app_icon,False,False,0)
168               
169                self.app_name_label=Gtk.Label("")
170                self.app_name_label.set_max_width_chars(self.app_max_width)
171                self.app_name_label.set_ellipsize(Pango.EllipsizeMode.END)
172                self.app_name_label.set_alignment(0,1)
173                self.short_description_label=Gtk.Label("")
174                self.short_description_label.set_alignment(0,0)
175                self.short_description_label.set_max_width_chars(self.short_description_max_width)
176                self.short_description_label.set_ellipsize(Pango.EllipsizeMode.END)
177               
178                vbox=Gtk.VBox()
179                vbox.pack_start(self.app_name_label,True,True,0)
180                vbox.pack_start(self.short_description_label,True,True,0)
181                hbox.pack_start(vbox,True,True,5)
182               
183                self.app_details_r.pack_start(hbox,False,False,0)
184               
185                self.full_description_label=Gtk.Label()
186                self.full_description_label.set_margin_right(10)
187                self.full_description_label.set_alignment(0,1)
188                self.full_description_label.set_justify(Gtk.Justification.FILL)
189                self.full_description_label.set_line_wrap(True)
190                self.full_description_label.set_valign(Gtk.Align.START)
191               
192               
193                sw=Gtk.ScrolledWindow()
194                sw.set_shadow_type(Gtk.ShadowType.NONE)
195                sw.set_overlay_scrolling(True)
196                sw.set_kinetic_scrolling(True)
197                vp=Gtk.Viewport()
198                sw.add(vp)
199                vp.add(self.full_description_label)
200               
201                self.app_details_r.pack_start(sw,True,True,10)
202               
203               
204                self.description_divider=Gtk.HBox()
205                self.description_divider.set_size_request(0,1)
206                self.app_details_r.pack_start(self.description_divider,False,False,5)
207               
208                ss_sw=Gtk.ScrolledWindow()
209                ss_sw.set_shadow_type(Gtk.ShadowType.NONE)
210                ss_vp=Gtk.Viewport()
211               
212                ss_sw.add(ss_vp)
213               
214                self.screenshots_box=Gtk.HBox()
215               
216                ss_sw.set_size_request(0,130)
217                vbox=Gtk.VBox()
218                vbox.pack_start(self.screenshots_box,True,False,0)
219                ss_vp.add(vbox)
220                self.app_details_r.pack_start(ss_sw,False,False,5)
221               
222               
223               
224                # ####################### #
225               
226                # ## RELATED #######
227               
228                related_vbox=Gtk.VBox()
229                related_vbox.set_margin_left(10)
230               
231                self.related_label=Gtk.Label(_("Related"))
232                self.related_label.set_alignment(0,1)
233               
234                related_vbox.pack_start(self.related_label,False,False,0)
235                               
236                self.related_divider=Gtk.HBox()
237                self.related_divider.set_size_request(0,1)
238                self.related_divider.set_margin_right(20)
239                related_vbox.pack_start(self.related_divider,False,False,5)
240               
241                related_sw=Gtk.ScrolledWindow()
242                related_sw.set_shadow_type(Gtk.ShadowType.NONE)
243                related_sw.set_size_request(0,self.banner_small+40)
244                related_sw.set_margin_right(20)
245                related_vp=Gtk.Viewport()
246                related_sw.add(related_vp)
247               
248                self.related_box=Gtk.HBox()
249                self.related_box.set_margin_bottom(10)
250               
251                related_vp.add(self.related_box)
252               
253                related_vbox.pack_start(related_sw,False,False,5)
254                self.pack_start(related_vbox,True,True,0)
255               
256                # #################
257
258                self.set_css_info()
259               
260        #def
261       
262        def set_package_info(self,pkg):
263               
264                info={}
265               
266                info["image_url"]=pkg["banner_small"]
267                info["image_id"]=pkg["package"]+"_banner_small"
268                info["x"]=self.banner_full_size
269                info["y"]=self.banner_full_size
270                info["aspect_ratio"]=False
271                info["name"]=pkg["package"].capitalize()
272                info["installed"]=True if pkg["state"]=="installed" else False
273               
274               
275                if pkg["banner_small"] !=None:
276                        self.app_banner.download_image(info)
277                else:
278                       
279                        info["image_path"]=self.core.resources.get_icon(pkg)
280                        info["name"]=None
281                        #self.app_banner.set_from_file(info)
282                        self.app_banner.create_banner_from_file(info)
283               
284                self.version_value_label.set_text(pkg["version"])
285                self.category_value_label.set_text(pkg["category"])
286                self.license_value_label.set_text(pkg["license"])
287                self.size_value_label.set_text(pkg["size"])
288                self.website_value_label.set_markup("<a href=\"%s\">%s</a>"%(pkg["homepage"],pkg["homepage"]))
289                self.app_name_label.set_text(pkg["name"])
290                self.short_description_label.set_text(pkg["summary"])
291                h=html2text.HTML2Text()
292                self.full_description_label.set_text(h.handle(pkg["description"]))
293                self.core.main_window.location_label.set_text(pkg["category"])
294               
295                if info["installed"]:
296                        self.install_stack.set_visible_child_name("installed")
297                else:
298                        self.install_stack.set_visible_child_name("install")
299                       
300               
301               
302               
303                info["image_path"]=self.core.resources.get_icon(pkg)
304                info["image_id"]=pkg["icon"]+"_icon"
305                info["x"]=self.icon_size
306                info["y"]=self.icon_size
307               
308                self.app_icon.set_from_file(info)
309               
310               
311                for s in self.screenshots_box.get_children():
312                        self.screenshots_box.remove(s)
313               
314                count=0
315               
316                for v in pkg["videos"]:
317                       
318                        image=Screenshot.ScreenshotNeo()
319                        info["video_url"]=v["url"].replace("http://metadata.tanglu.org/appstream/media/xenial/","").replace("https://www.youtube.com/watch?v=","https://www.youtube.com/embed/")
320                        info["image_url"]=v["preview"]
321                        info["image_id"]=pkg["package"]+"_video_"+str(count)
322                        info["x"]=self.screenshot_small
323                        info["y"]=self.screenshot_small
324                       
325                        image.set_video_info(info)
326                       
327                        b=Gtk.Button()
328                        b.set_name("RELATED_BUTTON")
329                        b.add(image)
330                        self.screenshots_box.pack_start(b,False,False,5)
331                       
332                        count+=1
333                       
334                count=0
335                       
336                for s in pkg["screenshots"]:
337                       
338                        image=Screenshot.ScreenshotNeo()
339                       
340                        i={}
341                       
342                        i["image_url"]=s.replace("http://metadata.tanglu.org/appstream/media/xenial/","")
343                        i["image_id"]=pkg["package"]+"_screenshot_"+str(count)
344                        i["x"]=self.screenshot_small
345                        i["y"]=self.screenshot_small
346                        i["aspect_ratio"]=False
347                                               
348                        image.download_image(i)
349                        b=Gtk.Button()
350                        b.set_name("RELATED_BUTTON")
351                        b.add(image)
352                        self.screenshots_box.pack_start(b,False,False,5)
353                        count+=1
354               
355                self.screenshots_box.show_all()
356                       
357                       
358                for p in self.related_box.get_children():
359                        self.related_box.remove(p)
360                       
361                for p in pkg["related_packages"]:
362                       
363                        image=Screenshot.ScreenshotNeo()
364
365                        i={}
366                        i["image_id"]=p["package"]+"_banner_small"
367                        i["x"]=self.banner_small
368                        i["y"]=self.banner_small
369                        i["name"]=p["name"]
370                        i["package"]=p["package"]
371                        i["icon"]=p["icon"]
372                        i["component"]=p["component"]
373                       
374                       
375
376                        if p["banner"]!=None:
377                                i["image_url"]=p["banner"]
378                                i["custom_frame"]=False
379                        else:
380                                i["image_path"]=self.core.resources.get_icon(p)
381                                i["custom_frame"]=True
382                               
383                        if not i["custom_frame"]:
384                                image.download_image(i)
385                        else:
386                                i["force_text"]=True
387                                image.create_banner_from_file(i)
388                       
389                        b=Gtk.Button()
390                        b.add(image)
391                        b.set_size_request(self.banner_small,self.banner_small)
392                        b.set_margin_top(10)
393                        b.connect("clicked",self.related_app_clicked,p)
394                        b.set_name("RELATED_BUTTON")
395                        b.set_valign(Gtk.Align.CENTER)
396                       
397                        self.related_box.pack_start(b,False,False,5)
398                       
399                self.related_box.show_all()
400               
401                for x in self.screenshots_box.get_children():
402                        x.connect("clicked",self.core.main_window.screenshot_clicked)
403               
404               
405        #def set_values
406       
407       
408        def set_css_info(self):
409               
410                self.style_provider=Gtk.CssProvider()
411                f=Gio.File.new_for_path("lliurex-store.css")
412                self.style_provider.load_from_file(f)
413                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
414               
415                self.set_name("DETAILS_BOX")
416               
417                self.details_divider.set_name("DIVIDER")
418                self.description_divider.set_name("DIVIDER")
419                self.related_divider.set_name("DIVIDER")
420               
421                self.details_label.set_name("DETAILS_LABEL")
422                self.version_label.set_name("DETAILS_OPTIONS")
423                self.category_label.set_name("DETAILS_OPTIONS")
424                self.license_label.set_name("DETAILS_OPTIONS")
425                self.size_label.set_name("DETAILS_OPTIONS")
426                self.website_label.set_name("DETAILS_OPTIONS")
427               
428                self.version_value_label.set_name("DETAILS_VALUES")
429                self.category_value_label.set_name("DETAILS_VALUES")
430                self.license_value_label.set_name("DETAILS_VALUES")
431                self.size_value_label.set_name("DETAILS_VALUES")
432                self.website_value_label.set_name("DETAILS_VALUES")
433               
434                self.app_name_label.set_name("TITLE")
435                self.short_description_label.set_name("SHORT_DESCRIPTION")
436                self.full_description_label.set_name("FULL_DESCRIPTION")
437               
438                self.related_label.set_name("RELATED_LABEL")
439               
440                self.install_button.set_name("INSTALL_BUTTON")
441                self.install_label.set_name("DETAILS_LABEL")
442                self.uninstall_button.set_name("UNINSTALL_BUTTON")
443                self.open_button.set_name("INSTALL_BUTTON")
444               
445        #def set-css_info
446       
447        def related_app_clicked(self,widget,app):
448               
449                self.core.main_window.load_pkg_data(app.debian_name)
450               
451        #def related_app_clicked
452       
453        def install_clicked(self,widget):
454               
455                self.install_label.set_text("Installing...")
456                self.install_stack.set_visible_child_name("progress")
457               
458                t=threading.Thread(target=self.install_pkg)
459                t.daemon=True
460                t.start()
461                GLib.timeout_add(100,self.pulse_pbar,t,"installed")
462               
463               
464        #def install_clicked
465       
466        def uninstall_clicked(self,widget):
467               
468                self.install_label.set_text("Uninstalling...")
469                self.install_stack.set_visible_child_name("progress")
470               
471                t=threading.Thread(target=self.uninstall_pkg)
472                t.daemon=True
473                t.start()
474                GLib.timeout_add(100,self.pulse_pbar,t,"install")
475               
476               
477        #def install_clicked
478       
479               
480        def pulse_pbar(self,t,target):
481               
482                if t.is_alive():
483                        self.install_pbar.pulse()
484                        return True
485               
486                self.install_stack.set_visible_child_name(target)
487               
488                return False
489               
490        #def pulse_pbar
491       
492        def install_pkg(self):
493               
494                time.sleep(2)
495               
496        #def
497       
498       
499        def uninstall_pkg(self):
500               
501                time.sleep(2)
502               
503        #def
504       
505       
506       
507        def open_clicked(self,widget):
508               
509                print("Opening...")
510               
511        #def open_clicked
512       
513
Note: See TracBrowser for help on using the repository browser.