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

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