searching in history is in. not yet 100% functionality
This commit is contained in:
parent
dfb9d92619
commit
e542fff69f
|
@ -320,7 +320,31 @@ class Logger:
|
|||
|
||||
results = cur.fetchall()
|
||||
return results
|
||||
|
||||
|
||||
def get_search_results_for_query(self, jid, query):
|
||||
'''returns contact_name, time, kind, show, message
|
||||
for each row in a list of tupples,
|
||||
returns list with empty tupple if we found nothing to meet our demands'''
|
||||
jid = jid.lower()
|
||||
jid_id = self.get_jid_id(jid)
|
||||
if False: #query.startswith('SELECT '): # it's SQL query
|
||||
try:
|
||||
cur.execute(query)
|
||||
except sqlite.OperationalError, e:
|
||||
results = [('', '', '', '', str(e))]
|
||||
return results
|
||||
|
||||
else: # user just typed something, we search in message column
|
||||
like_sql = '%' + query + '%'
|
||||
cur.execute('''
|
||||
SELECT contact_name, time, kind, show, message FROM logs
|
||||
WHERE jid_id = ? AND message LIKE ?
|
||||
ORDER BY time
|
||||
''', (jid_id,like_sql))
|
||||
|
||||
results = cur.fetchall()
|
||||
return results
|
||||
|
||||
def date_has_logs(self, jid, year, month, day):
|
||||
'''returns True if we have logs for given day, else False'''
|
||||
jid = jid.lower()
|
||||
|
|
211
src/gtkgui.glade
211
src/gtkgui.glade
|
@ -9070,11 +9070,218 @@ Custom</property>
|
|||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkExpander" id="search_expander">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="expanded">False</property>
|
||||
<property name="spacing">0</property>
|
||||
<signal name="activate" handler="on_search_expander_activate" last_modification_time="Tue, 29 Nov 2005 13:43:41 GMT"/>
|
||||
|
||||
<child>
|
||||
<widget class="GtkVBox" id="expander_vbox">
|
||||
<property name="visible">True</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="spacing">6</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkHBox" id="query_hbox">
|
||||
<property name="visible">True</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="spacing">6</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkEntry" id="query_entry">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="editable">True</property>
|
||||
<property name="visibility">True</property>
|
||||
<property name="max_length">0</property>
|
||||
<property name="text" translatable="yes"></property>
|
||||
<property name="has_frame">True</property>
|
||||
<property name="invisible_char">*</property>
|
||||
<property name="activates_default">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkButton" id="search_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="has_default">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||
<property name="focus_on_click">True</property>
|
||||
<signal name="clicked" handler="on_search_button_clicked" last_modification_time="Tue, 29 Nov 2005 11:40:15 GMT"/>
|
||||
|
||||
<child>
|
||||
<widget class="GtkAlignment" id="alignment97">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xscale">0</property>
|
||||
<property name="yscale">0</property>
|
||||
<property name="top_padding">0</property>
|
||||
<property name="bottom_padding">0</property>
|
||||
<property name="left_padding">0</property>
|
||||
<property name="right_padding">0</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkHBox" id="hbox3002">
|
||||
<property name="visible">True</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="spacing">2</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkImage" id="image1325">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-find</property>
|
||||
<property name="icon_size">4</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label369">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">Search</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkButton" id="query_builder_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="tooltip" translatable="yes">Build custom query</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="label" translatable="yes">Query Builder...</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
||||
<property name="focus_on_click">True</property>
|
||||
<signal name="clicked" handler="on_query_builder_button_clicked" last_modification_time="Tue, 29 Nov 2005 11:40:18 GMT"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkScrolledWindow" id="results_scrolledwindow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
|
||||
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
|
||||
<property name="shadow_type">GTK_SHADOW_IN</property>
|
||||
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkTreeView" id="results_treeview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="headers_visible">True</property>
|
||||
<property name="rules_hint">True</property>
|
||||
<property name="reorderable">False</property>
|
||||
<property name="enable_search">True</property>
|
||||
<property name="fixed_height_mode">False</property>
|
||||
<property name="hover_selection">False</property>
|
||||
<property name="hover_expand">False</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label368">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">_Search</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_markup">False</property>
|
||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="selectable">False</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
||||
<property name="width_chars">-1</property>
|
||||
<property name="single_line_mode">False</property>
|
||||
<property name="angle">0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="type">label_item</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkHButtonBox" id="hbuttonbox">
|
||||
<property name="visible">True</property>
|
||||
<property name="layout_style">GTK_BUTTONBOX_END</property>
|
||||
<property name="spacing">0</property>
|
||||
<property name="spacing">6</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkButton" id="close_button">
|
||||
|
@ -9092,7 +9299,7 @@ Custom</property>
|
|||
<packing>
|
||||
<property name="padding">0</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="fill">False</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
|
|
|
@ -41,6 +41,15 @@ gtk.glade.textdomain(APP)
|
|||
|
||||
GTKGUI_GLADE = 'gtkgui.glade'
|
||||
|
||||
# contact_name, time, kind, show, message
|
||||
(
|
||||
C_CONTACT_NAME,
|
||||
C_TIME,
|
||||
C_KIND,
|
||||
C_SHOW,
|
||||
C_MESSAGE
|
||||
) = range(5)
|
||||
|
||||
class HistoryWindow:
|
||||
'''Class for browsing logs of conversations with contacts'''
|
||||
|
||||
|
@ -51,6 +60,42 @@ class HistoryWindow:
|
|||
|
||||
xml = gtk.glade.XML(GTKGUI_GLADE, 'history_window', APP)
|
||||
self.window = xml.get_widget('history_window')
|
||||
self.query_entry = xml.get_widget('query_entry')
|
||||
self.expander_vbox = xml.get_widget('expander_vbox')
|
||||
self.results_treeview = xml.get_widget('results_treeview')
|
||||
# contact_name, time, kind, show, message
|
||||
model = gtk.ListStore(str, str, str, str, str)
|
||||
self.results_treeview.set_model(model)
|
||||
|
||||
col = gtk.TreeViewColumn(_('Name'))
|
||||
self.results_treeview.append_column(col)
|
||||
renderer = gtk.CellRendererText()
|
||||
col.pack_start(renderer)
|
||||
col.set_attributes(renderer, text = C_CONTACT_NAME)
|
||||
|
||||
col = gtk.TreeViewColumn(_('Date'))
|
||||
self.results_treeview.append_column(col)
|
||||
renderer = gtk.CellRendererText()
|
||||
col.pack_start(renderer)
|
||||
col.set_attributes(renderer, text = C_TIME)
|
||||
|
||||
col = gtk.TreeViewColumn(_('Kind'))
|
||||
self.results_treeview.append_column(col)
|
||||
renderer = gtk.CellRendererText()
|
||||
col.pack_start(renderer)
|
||||
col.set_attributes(renderer, text = C_KIND)
|
||||
|
||||
col = gtk.TreeViewColumn(_('Status'))
|
||||
self.results_treeview.append_column(col)
|
||||
renderer = gtk.CellRendererText()
|
||||
col.pack_start(renderer)
|
||||
col.set_attributes(renderer, text = C_SHOW)
|
||||
|
||||
col = gtk.TreeViewColumn(_('Message'))
|
||||
self.results_treeview.append_column(col)
|
||||
renderer = gtk.CellRendererText()
|
||||
col.pack_start(renderer)
|
||||
col.set_attributes(renderer, text = C_MESSAGE)
|
||||
|
||||
if account and gajim.contacts[account].has_key(jid):
|
||||
contact = gajim.get_first_contact_instance_from_jid(account, jid)
|
||||
|
@ -212,3 +257,30 @@ class HistoryWindow:
|
|||
buf.insert_with_tags_by_name(end_iter, message, tag_msg)
|
||||
else:
|
||||
buf.insert(end_iter, message)
|
||||
|
||||
def set_unset_expand_on_expander(self, widget):
|
||||
'''expander has to have expand to TRUE so scrolledwindow resizes properly
|
||||
and does not have a static size. when expander is not expanded we set
|
||||
expand property (note the Box one) to FALSE
|
||||
to do this, we first get the box and then apply to expander widget
|
||||
the True/False thingy depending if it's expanded or not
|
||||
this function is called in a timeout just after expanded state changes'''
|
||||
parent = widget.get_parent() # vbox
|
||||
parent.child_set_property(widget, 'expand', widget.get_expanded())
|
||||
|
||||
def on_search_expander_activate(self, widget):
|
||||
if widget.get_expanded(): # it's the OPPOSITE!, it's not expanded
|
||||
gobject.timeout_add(200, self.set_unset_expand_on_expander, widget)
|
||||
else:
|
||||
gobject.timeout_add(200, self.set_unset_expand_on_expander, widget)
|
||||
|
||||
def on_search_button_clicked(self, widget):
|
||||
text = self.query_entry.get_text()
|
||||
# contact_name, time, kind, show, message
|
||||
results = gajim.logger.get_search_results_for_query(self.jid, text)
|
||||
model = self.results_treeview.get_model()
|
||||
model.clear()
|
||||
for row in results:
|
||||
iter = model.append((row[0], row[1], row[2], row[3], row[4]))
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue