Skip to content

Commit e05de45

Browse files
committed
2010-02-09 Thomas M. Hinkle <tom@grenville>
* src/lib/GourmetRecipeManager.py (RecGui): Make delete-key-deletes-recipe behavior a callback on keypresses only in treeview. This prevents users using the delete key in the search box from accidentally deleting recipes. Also, let backspace delete recipes as well for convenience. * src/lib/backends/db.py (RecData.get_criteria): Make sure search strings are proper unicode objects. Fixes bug #2948135.
1 parent b5c6b31 commit e05de45

3 files changed

Lines changed: 36 additions & 10 deletions

File tree

ChangeLog

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
2010-02-09 Thomas M. Hinkle <tom@grenville>
2+
3+
* src/lib/GourmetRecipeManager.py (RecGui): Make
4+
delete-key-deletes-recipe behavior a callback on keypresses only
5+
in treeview. This prevents users using the delete key in the
6+
search box from accidentally deleting recipes. Also, let backspace
7+
delete recipes as well for convenience.
8+
9+
* src/lib/backends/db.py (RecData.get_criteria): Make sure search
10+
strings are proper unicode objects. Fixes bug #2948135.
11+
112
2010-01-16 Thomas M. Hinkle <tom@grenville>
213

314
* src/lib/version.py Version->0.15.4

src/lib/GourmetRecipeManager.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ def setup_main_window (self):
574574
{'size':(600,800)}),
575575
show=False))
576576
self.window.connect('response',self.response_cb)
577+
# So we can let delete key delete recipe when treeview is focused
577578

578579
def response_cb (self, dialog, response):
579580
if response==self.RESPONSE_DELETE_PERMANENTLY:
@@ -1019,7 +1020,12 @@ def popcb (tv, event):
10191020
if event.button==3:
10201021
self.rectree_popup(tv,event)
10211022
return True
1023+
# Set up popup menu in treeview
10221024
self.rectree.connect('button-press-event',popcb)
1025+
# Set up delete key in recipe treeview
1026+
self.rectree.connect('key-press-event',self.rec_tree_keypress_cb)
1027+
1028+
10231029
self.main.show()
10241030

10251031
def rectree_popup (self, tv, event, *args):
@@ -1035,8 +1041,11 @@ def setup_actions (self):
10351041
self.onSelectedActionGroup.add_actions([
10361042
('OpenRec','recipe-box',_('Open recipe'),
10371043
'<Control>O',_('Open selected recipe'),self.rec_tree_select_rec),
1044+
# We no longer bind "Delete" here -- instead, we'll do it
1045+
# at the TreeView level to prevent the delete key
1046+
# elsewhere (e.g. in search box) from muddling up users.
10381047
('DeleteRec',gtk.STOCK_DELETE,_('Delete recipe'),
1039-
'Delete',_('Delete selected recipes'),self.rec_tree_delete_rec_cb),
1048+
None,_('Delete selected recipes'),self.rec_tree_delete_rec_cb),
10401049
('ExportSelected',None,_('E_xport selected recipes'),
10411050
None,_('Export selected recipes to file'),
10421051
lambda *args: self.do_export(export_all=False)),
@@ -1166,14 +1175,21 @@ def show_deleted_recs (self, *args):
11661175
else:
11671176
self.recTrash.show()
11681177

1178+
def rec_tree_keypress_cb (self, widget, event):
1179+
print 'Keypress callback!'
1180+
keyname = gtk.gdk.keyval_name(event.keyval)
1181+
print 'User pressed ',keyname
1182+
if keyname == 'Delete' or keyname == 'BackSpace':
1183+
self.rec_tree_delete_rec_cb()
1184+
return True
11691185

1170-
def rec_tree_delete_rec_cb (self, *args):
1186+
def rec_tree_delete_rec_cb (self, *args,**kwargs):
11711187
"""Make a watch show up (this can be slow
11721188
if lots of recs are selected!"""
11731189
self.rec_tree_delete_recs(
11741190
self.get_selected_recs_from_rec_tree()
11751191
)
1176-
1192+
11771193
def delete_open_card_carefully (self, rec):
11781194
"""Delete any open card windows, confirming if the card is edited.
11791195

src/lib/backends/db.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,10 @@ def get_criteria (self,crit):
749749
else:
750750
subtable = None
751751
col = getattr(self.recipe_table.c,crit['column'])
752+
# Make sure we're using unicode!
753+
if (type(crit.get('search',u'')) != unicode
754+
and type(crit.get('search',u'')) in types.StringTypes):
755+
crit['search'] = unicode(crit['search'])
752756
if crit.get('operator','LIKE')=='LIKE':
753757
retval = (col.like(crit['search']))
754758
elif crit['operator']=='REGEXP':
@@ -759,6 +763,7 @@ def get_criteria (self,crit):
759763
retval = self.recipe_table.c.id.in_(
760764
sqlalchemy.select([subtable.c.recipe_id],retval)
761765
)
766+
762767
return retval
763768

764769
def search_recipes (self, searches, sort_by=[]):
@@ -773,6 +778,7 @@ def search_recipes (self, searches, sort_by=[]):
773778
d = (sort_by[i][1]==1 and -1 or 1)
774779
sort_by[i] = ('rating',d)
775780
criteria = self.get_criteria((searches,'and'))
781+
debug('backends.db.search_recipes - search criteria are %s'%searches,2)
776782
if 'category' in [s[0] for s in sort_by]:
777783
return sqlalchemy.select([c for c in self.recipe_table.c],# + [self.categories_table.c.category],
778784
criteria,distinct=True,
@@ -785,13 +791,6 @@ def search_recipes (self, searches, sort_by=[]):
785791
order_by=make_order_by(sort_by,self.recipe_table,),
786792
).execute().fetchall()
787793

788-
def filter (self, table, func):
789-
"""Return a table representing filtered with func.
790-
791-
func is called with each row of the table.
792-
"""
793-
raise NotImplementedError
794-
795794
def get_unique_values (self, colname,table=None,**criteria):
796795
"""Get list of unique values for column in table."""
797796
if not table: table=self.recipe_table

0 commit comments

Comments
 (0)