source: lliurex-store/trunk/fuentes/lliurex-store-gui/usr/share/lliurex-store/lliurex-store-gui/DetailsBox.py @ 4116

Last change on this file since 4116 was 4116, checked in by hectorgh, 4 years ago

wip

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