13
class ExecutionTime(object):
15
Helper that can be used in with statements to have a simple
16
measure of the timming of a particular block of code, e.g.
17
with ExecutinTime("db flush"):
20
def __init__(self, info=""):
23
self.now = time.time()
24
def __exit__(self, type, value, stack):
25
print "%s: %s" % (self.info, time.time() - self.now)
27
class AppStore(gtk.GenericTreeModel):
35
def __init__(self, db, icons, search_term=""):
36
gtk.GenericTreeModel.__init__(self)
41
for m in db.postlist(""):
42
doc = db.get_document(m.docid)
43
self.appnames.append(doc.get_data())
46
parser = xapian.QueryParser()
47
user_query = parser.parse_query(search_term)
48
#cat_query = xapian.Query("XCgame")
49
#query = xapian.Query(xapian.Query.OP_AND, cat_query, user_query)
50
enquire = xapian.Enquire(db)
51
enquire.set_weighting_scheme(xapian.BoolWeight())
52
enquire.set_query(user_query)
53
matches = enquire.get_mset(0, 400)
54
logging.debug("found ~%i matches" % matches.get_matches_estimated())
56
doc = m[xapian.MSET_DOCUMENT]
58
self.appnames.append(name)
59
def on_get_flags(self):
60
return (gtk.TREE_MODEL_LIST_ONLY|
61
gtk.TREE_MODEL_ITERS_PERSIST)
62
def on_get_n_columns(self):
63
return len(self.column_type)
64
def on_get_column_type(self, index):
65
return self.column_type[index]
66
def on_get_iter(self, path):
67
logging.debug("on_get_iter: %s" % path)
70
def on_get_path(self, rowref):
71
logging.debug("on_get_path: %s" % rowref)
73
def on_get_value(self, rowref, column):
74
#logging.debug("on_get_value: %s %s" % (rowref, column))
75
if (not self.appnames or rowref > len(self.appnames)):
77
appname = self.appnames[rowref]
78
if column == self.COL_NAME:
80
elif column == self.COL_ICON:
83
for post in self.xapiandb.postlist("XA"+appname):
84
doc = db.get_document(post.docid)
85
icon_name = doc.get_value(XAPIAN_DATA_ICON)
86
icon_name = os.path.splitext(icon_name)[0]
89
icon = self.icons.load_icon(icon_name, 24,0)
92
if not str(e).endswith("not present in theme"):
93
logging.exception("get_icon")
95
def on_iter_next(self, rowref):
96
#logging.debug("on_iter_next: %s" % rowref)
97
new_rowref = rowref + 1
98
if new_rowref >= len(self.appnames):
101
def on_iter_children(self, parent):
104
return self.appnames[0]
105
def on_iter_has_child(self, rowref):
107
def on_iter_n_children(self, rowref):
108
logging.debug("on_iter_n_children: %s (%i)" % (rowref, len(self.cache)))
111
return len(self.appnames)
112
def on_iter_nth_child(self, parent, n):
113
logging.debug("on_iter_nth_child: %s %i" % (parent, n))
117
return self.appnames[n]
118
except IndexError, e:
120
def on_iter_parent(self, child):
123
def on_entry_changed(widget, data):
124
new_text = widget.get_text()
125
print "on_entry_changed: ", new_text
126
#if len(new_text) < 3:
129
view.set_model(AppStore(db, icons, new_text))
131
if __name__ == "__main__":
132
logging.basicConfig(level=logging.DEBUG)
134
# FIXME: use the apt-xapian-index database too as a additinal
135
# source (to avoid duplicating data)
136
xapian_base_path = "/var/cache/app-install"
137
pathname = os.path.join(xapian_base_path, "xapian")
138
db = xapian.Database(pathname)
140
# xapian is really cool!
141
#docs = db.get_postlist("XPapt")
142
#section = db.get_postlist("XSdevel")
144
# additional icons come from app-install-data
145
icons = gtk.icon_theme_get_default()
146
icons.append_search_path("/usr/share/app-install/icons/")
149
store = AppStore(db, icons)
152
scroll = gtk.ScrolledWindow()
154
view = gtk.TreeView()
155
view.set_model(store)
156
view.set_fixed_height_mode(True)
158
tp = gtk.CellRendererPixbuf()
159
column = gtk.TreeViewColumn("Icon", tp, pixbuf=store.COL_ICON)
160
column.set_fixed_width(32)
161
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
162
view.append_column(column)
164
tr = gtk.CellRendererText()
165
column = gtk.TreeViewColumn("Name", tr, markup=store.COL_NAME)
166
column.set_fixed_width(200)
167
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
168
view.append_column(column)
171
entry.connect("changed", on_entry_changed, (db, view))
174
box.pack_start(entry, expand=False)
175
box.pack_start(scroll)
180
win.set_size_request(400,400)