source: lliurex-store/trunk/fuentes/lliurex-store-gui/usr/share/lliurex-store/lliurex-store-gui/SearchBox.py @ 7440

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

fixing scrolled windows and character width limit in pkg results when searching

File size: 5.2 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3from gi.repository import Gtk,GdkPixbuf,GLib,GObject, Pango, Gdk
4
5import os
6import ImageManager
7import Core
8import Screenshot
9
10import gettext
11gettext.textdomain('lliurex-store')
12_ = gettext.gettext
13
14
15class SearchBox(Gtk.VBox):
16
17        def __init__(self):
18               
19                Gtk.VBox.__init__(self)
20               
21                self.core=Core.Core.get_core()
22                ui_path=self.core.ui_path
23                builder=Gtk.Builder()
24                builder.set_translation_domain('lliurex-store')
25                builder.add_from_file(ui_path)
26                       
27                self.label_max_width=1
28               
29                self.description_label_ratio=0.091
30               
31                self.current_category=""
32                self.current_pkg_list=[]
33               
34                self.search_box=builder.get_object("search_box2")
35                self.search_box.set_name("DETAILS_BOX")
36                self.results_search_box=builder.get_object("search_results_box")
37                self.search_sw=builder.get_object("results_scrolledwindow")
38                self.search_categories_box=builder.get_object("search_categories_box")
39                self.categories_sw=builder.get_object("categories_scrolledwindow")
40               
41                self.add(self.search_box)
42                self.show_all()
43               
44        #def init
45       
46       
47        def populate_search_results(self,pkg_list,categories=None):
48               
49
50                for child in self.results_search_box.get_children():
51                        self.results_search_box.remove(child)
52       
53                for child in self.search_categories_box.get_children():
54                        self.search_categories_box.remove(child)
55                       
56                # restore scroll bar to top
57                self.search_sw.get_vadjustment().set_value(0)
58                self.core.main_window.main_scroll.get_vadjustment().set_value(0)
59               
60                self.current_pkg_list=pkg_list
61       
62                if categories!=None:
63                       
64                        found_categories=set()
65       
66                        for pkg in pkg_list:
67                                for category in categories:
68                                        if category in pkg["categories"]:
69                                                found_categories.add(category)
70                                                break
71               
72                        found_categories=list(sorted(found_categories))
73                        found_categories.insert(0,_("All"))
74                       
75                        counter=0
76               
77                        for c in found_categories:
78                       
79                                hbox=Gtk.HBox()
80                                hbox.set_name("PKG_BOX")
81                               
82                                label=Gtk.Label(_(c))
83                                label.set_name("SHORT_DESCRIPTION")
84                               
85                                hbox.pack_start(label,True,True,5)
86                               
87                               
88                                b=Gtk.Button()
89                                b.set_name("RELATED_BUTTON")
90                                b.add(hbox)
91                                b.show_all()
92                               
93                                b.set_halign(Gtk.Align.FILL)
94                               
95                                if counter==0:
96                                        c=None
97                               
98                                b.connect("clicked",self.filter_by,c)
99                               
100                                self.search_categories_box.pack_start(b,False,False,3)
101                                counter+=1
102                       
103                        self.categories_sw.show()
104                       
105                else:
106                        self.categories_sw.hide()
107               
108                connect_size_request=True
109               
110                for pkg in pkg_list:
111                       
112                        self.add_pkg_to_list(pkg,connect_size_request)
113                        connect_size_request=False
114                       
115                self.results_search_box.set_halign(Gtk.Align.FILL)
116                self.results_search_box.show_all()
117               
118        #def populate_search_results
119       
120       
121        def add_pkg_to_list(self,pkg,connect_size_request=False):
122               
123                item_box=Gtk.HBox()
124                item_box.set_name("PKG_BOX")
125                       
126                i={}
127                i["x"]=64
128                i["y"]=64
129                i["aspect_ratio"]=True
130                i["image_path"]=pkg["icon_uri"]
131                i["name"]=pkg["name"]
132                i["image_id"]=pkg["package"]+"_icon"
133                s=Screenshot.ScreenshotNeo()
134                s.set_from_file(i)
135                       
136                vbox=Gtk.VBox()
137                       
138                label=Gtk.Label(pkg["name"])
139                label.set_name("RELATED_LABEL")
140                label.set_valign(Gtk.Align.END)
141                label.set_halign(Gtk.Align.START)
142                label.set_ellipsize(Pango.EllipsizeMode.END)
143                label.set_max_width_chars(self.label_max_width)
144                       
145                description=Gtk.Label(pkg["summary"])
146                description.set_name("SHORT_DESCRIPTION")
147                description.set_valign(Gtk.Align.START)
148                description.set_halign(Gtk.Align.START)
149                description.set_ellipsize(Pango.EllipsizeMode.END)
150                description.set_max_width_chars(self.label_max_width)
151                       
152                vbox.pack_start(label,True,True,1)
153                vbox.pack_start(description,True,True,1)
154                vbox.set_halign(Gtk.Align.START)
155                       
156                item_box.pack_start(s,False,False,5)
157                item_box.pack_start(vbox,True,True,5)
158                       
159                b=Gtk.Button()
160                b.add(item_box)
161                b.set_name("RELATED_BUTTON")
162                b.set_valign(Gtk.Align.START)
163                b.connect("clicked",self.result_clicked,pkg)
164                       
165                b.set_size_request(0,80)
166               
167                if connect_size_request:
168                        b.connect("draw",self.search_item_size_request)
169                       
170                self.results_search_box.pack_start(b,False,False,3)
171                self.results_search_box.queue_draw()
172               
173               
174        #def create_item
175       
176        def search_item_size_request(self,widget,data=None):
177               
178                allocation=widget.get_allocation()
179                self.label_max_width=int(allocation.width*self.description_label_ratio)
180               
181                for child in self.results_search_box.get_children():
182                        child.get_child().get_children()[1].get_children()[0].set_max_width_chars(self.label_max_width*0.77)
183                        child.get_child().get_children()[1].get_children()[1].set_max_width_chars(self.label_max_width)
184                       
185                if type(data)!=Gdk.Rectangle:
186                        widget.disconnect_by_func(self.search_item_size_request)
187                        widget.connect("size-allocate",self.search_item_size_request)
188               
189        #def search_item_size_request
190       
191       
192        def filter_by(self,widget,filter):
193               
194                for child in self.results_search_box.get_children():
195                        self.results_search_box.remove(child)
196               
197                connect_size_request=True
198                for pkg in self.current_pkg_list:
199                       
200                        if filter==None:
201                                self.add_pkg_to_list(pkg)
202                                continue
203                        if filter in pkg["categories"]:
204                               
205                                self.add_pkg_to_list(pkg,connect_size_request)
206                                connect_size_request=False
207                       
208                self.results_search_box.show_all()
209                       
210        #def filter_by
211       
212       
213        def result_clicked(self,widget,pkg_data):
214               
215                a=widget.get_allocation()
216                self.core.main_window.load_pkg_data(pkg_data["package"])
217               
218        #def result_clicked
219
220
221#class SearchBox
Note: See TracBrowser for help on using the repository browser.