~dpm/qreator/snap

« back to all changes in this revision

Viewing changes to qreator/qrcodes/QRCodeSoftwareCenterAppGtk.py

  • Committer: Stefan Schwarzburg
  • Date: 2012-11-12 16:10:34 UTC
  • Revision ID: stefan.schwarzburg@googlemail.com-20121112161034-dnmupzg2mqklcv3h
recreate the icon and appname cache everytime qreator is launched

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2
2
### BEGIN LICENSE
3
3
# Copyright (C) 2012 David Planella <david.planella@ubuntu.com>
4
 
# This program is free software: you can redistribute it and/or modify it 
5
 
# under the terms of the GNU General Public License version 3, as published 
 
4
# This program is free software: you can redistribute it and/or modify it
 
5
# under the terms of the GNU General Public License version 3, as published
6
6
# by the Free Software Foundation.
7
 
8
 
# This program is distributed in the hope that it will be useful, but 
9
 
# WITHOUT ANY WARRANTY; without even the implied warranties of 
10
 
# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR 
 
7
#
 
8
# This program is distributed in the hope that it will be useful, but
 
9
# WITHOUT ANY WARRANTY; without even the implied warranties of
 
10
# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11
11
# PURPOSE.  See the GNU General Public License for more details.
12
 
13
 
# You should have received a copy of the GNU General Public License along 
 
12
#
 
13
# You should have received a copy of the GNU General Public License along
14
14
# with this program.  If not, see <http://www.gnu.org/licenses/>.
15
15
### END LICENSE
16
16
 
57
57
 
58
58
    def on_activated(self):
59
59
        pass
60
 
 
 
60
    # handle changes to the entry
 
61
    def on_usc_apps_complete_icon_pressed(self, widget, icon, mouse_button):
 
62
        clear_text_entry(widget, icon)
 
63
 
 
64
    def on_usc_apps_complete_changed(self, widget, data=None):
 
65
        show_clear_icon(widget)
 
66
        USC_APPS_BASE_URL = 'https://apps.ubuntu.com/cat/applications/'
 
67
        self.qr_code_update_func(USC_APPS_BASE_URL + widget.get_text())
 
68
 
 
69
    # handle autocompletion with deferred calls
61
70
    def on_prepared(self):
62
71
        if not self.softwarecenter_apps_init:
63
72
            GObject.idle_add(self.init_softwarecenter_apps)
67
76
        deferred.add_callback(self.on_get_softwarecenterapps)
68
77
        self.softwarecenter_apps_init = True
69
78
 
70
 
    def on_usc_apps_complete_icon_pressed(self, widget, icon, mouse_button):
71
 
        clear_text_entry(widget, icon)
72
 
 
73
 
    def on_usc_apps_complete_changed(self, widget, data=None):
74
 
        show_clear_icon(widget)
75
 
        USC_APPS_BASE_URL = 'https://apps.ubuntu.com/cat/applications/'
76
 
        self.qr_code_update_func(USC_APPS_BASE_URL + widget.get_text())
 
79
    def on_get_softwarecenterapps(self, result):
 
80
        # gets called when the icons and app names are ready
 
81
        self.usc_apps_complete.add(self.softwarecenterapps)
77
82
 
78
83
    def get_softwarecenterapps(self):
79
 
        print 'Task STARTED!'
 
84
        # actually gets the icons and names
80
85
        db = softwarecenter.db.database.StoreDatabase()
81
86
        db._aptcache.open()
82
87
        db.open(use_axi=False, use_agent=False)
89
94
        self.softwarecenterapps = apps
90
95
        return apps
91
96
 
92
 
    def on_get_softwarecenterapps(self, result):
93
 
        print 'Task FINISHED!'
94
 
        self.usc_apps_complete.add(self.softwarecenterapps)
95
97
 
96
98
 
97
99
class App(object):
124
126
            _('[Wait a few seconds to enable autocompletion...]'))
125
127
 
126
128
    def add(self, apps):
127
 
        self.loadthread = threading.Thread(target=self.load_pixbuf_sprites, args=(apps,)).start()
 
129
        self.loadthread = threading.Thread(target=self.load_pixbuf_sprites,
 
130
                                           args=(apps,)).start()
 
131
 
 
132
    def load_pixbuf_sprites(self, apps):
 
133
        icontheme = IconThemeSprite(apps, 16)
 
134
        icons = [icontheme[app.name] for app in apps]
 
135
        GObject.idle_add(self._finished, apps, icons)
128
136
 
129
137
    def _finished(self, apps, pixbufs):
130
138
        '''Add a value to the list of strings to suggest'''
133
141
        self.completion.set_model(self.model)
134
142
        self.set_placeholder_text(
135
143
            _('[Type the name of an app]'))
 
144
        GObject.idle_add(self._recreate_cache, apps)
136
145
 
137
 
    def load_pixbuf_sprites(self, apps):
 
146
    def _recreate_cache(self, apps):
 
147
        print "recreate cache"
 
148
        # after everything is done:
 
149
        # recreate the sprite map for the next time
138
150
        icontheme = IconThemeSprite(apps, 16)
139
 
        icons = [icontheme[app.name] for app in apps]
140
 
        GObject.idle_add(self._finished, apps, icons)
 
151
        icontheme.create_sprite(apps)
141
152
 
142
153
 
143
154
class IconThemeSprite(object):
144
 
 
 
155
    """The sprite is divided into two parts,
 
156
    the actual icons in one png file (-> sprite) and
 
157
    the position of the icons based on the appname in a
 
158
    text file (-> spritemap).
 
159
    """
145
160
    @property
146
161
    def spritepath(self):
147
162
        return get_cache_file("sprite_{}.png".format(self.size))
157
172
            self._spritemap = dict((l.strip(), n) for n, l in enumerate(
158
173
                open(self.spritemappath).readlines()))
159
174
        except:
 
175
            # FIXME actually check the exception type
160
176
            self.create_sprite(apps)
161
177
 
162
178
    def __getitem__(self, item):
170
186
                self.size,
171
187
                self.size)
172
188
        except KeyError:
 
189
            # sprite is not found in the spritemap
 
190
            # so we have to replace it with a default
173
191
            icontheme = Gtk.IconTheme.get_default()
174
192
            return icontheme.load_icon(
175
193
                "stock_not",
210
228
            for n, app in enumerate(apps):
211
229
                spritemap.write(app.name + "\n")
212
230
                self._spritemap[app.name] = n
213