2007-07-11 Don Allingham <don@gramps-project.org>

* src/DbManager.py (DbManager.__button_press): check for node == None



svn: r8713
This commit is contained in:
Don Allingham 2007-07-12 04:24:44 +00:00
parent 5984415471
commit 576c4b705f
5 changed files with 292 additions and 261 deletions

View File

@ -1,3 +1,6 @@
2007-07-11 Don Allingham <don@gramps-project.org>
* src/DbManager.py (DbManager.__button_press): check for node == None
2007-07-10 Alex Roitman <shura@gramps-project.org> 2007-07-10 Alex Roitman <shura@gramps-project.org>
* src/GrampsDb/_GrampsDbWriteXML.py (write_date): Write datespan. * src/GrampsDb/_GrampsDbWriteXML.py (write_date): Write datespan.
* src/GrampsDbUtils/_ReadXML.py: (start_compound_date): Add new * src/GrampsDbUtils/_ReadXML.py: (start_compound_date): Add new

View File

@ -70,6 +70,7 @@ import GrampsDb
import GrampsDbUtils import GrampsDbUtils
import Config import Config
import Mime import Mime
from DdTargets import DdTargets
IMPORT_TYPES = (const.app_gramps_xml, const.app_gedcom, IMPORT_TYPES = (const.app_gramps_xml, const.app_gedcom,
const.app_gramps_package, const.app_geneweb, const.app_gramps_package, const.app_geneweb,
@ -144,22 +145,20 @@ class DbManager:
""" """
Connects the signals to the buttons on the interface. Connects the signals to the buttons on the interface.
""" """
ddtargets = [ DdTargets.URI_LIST.target() ]
self.top.drag_dest_set(gtk.DEST_DEFAULT_ALL, ddtargets, ACTION_COPY)
self.remove.connect('clicked', self.__remove_db) self.remove.connect('clicked', self.__remove_db)
self.new.connect('clicked', self.__new_db) self.new.connect('clicked', self.__new_db)
self.rename.connect('clicked', self.__rename_db) self.rename.connect('clicked', self.__rename_db)
self.repair.connect('clicked', self.__repair_db) self.repair.connect('clicked', self.__repair_db)
if RCS_FOUND:
self.rcs.connect('clicked', self.__rcs)
self.selection.connect('changed', self.__selection_changed) self.selection.connect('changed', self.__selection_changed)
self.dblist.connect('button-press-event', self.__button_press) self.dblist.connect('button-press-event', self.__button_press)
self.top.drag_dest_set(
gtk.DEST_DEFAULT_ALL,
(('text/plain', 0, 1),
('text/uri-list', 0, 2)),
ACTION_COPY)
self.top.connect('drag_data_received', self.__drag_data_received) self.top.connect('drag_data_received', self.__drag_data_received)
if RCS_FOUND:
self.rcs.connect('clicked', self.__rcs)
def __button_press(self, obj, event): def __button_press(self, obj, event):
""" """
Checks for a double click event. In the tree view, we want to Checks for a double click event. In the tree view, we want to
@ -168,6 +167,8 @@ class DbManager:
""" """
if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1:
store, node = self.selection.get_selected() store, node = self.selection.get_selected()
if not node:
return
# don't open a locked file # don't open a locked file
if store.get_value(node, STOCK_COL) == 'gramps-lock': if store.get_value(node, STOCK_COL) == 'gramps-lock':
self.__ask_to_break_lock(store, node) self.__ask_to_break_lock(store, node)
@ -658,6 +659,7 @@ class DbManager:
# Check for Thunar # Check for Thunar
uris = selection.get_uris() uris = selection.get_uris()
if uris: # Thunar if uris: # Thunar
drag_value = uris[0] drag_value = uris[0]
elif selection.get_text(): # Nautilus elif selection.get_text(): # Nautilus

View File

@ -18,6 +18,10 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# #
"""
Provides the basic functionality for a list view
"""
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# GTK # GTK
@ -26,7 +30,6 @@
import gtk import gtk
import pango import pango
import const import const
gtk26 = gtk.pygtk_version >= (2,6,0)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -48,19 +51,22 @@ NOSORT = -1
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class ListModel: class ListModel:
def __init__(self,tree,dlist,select_func=None, def __init__(self, tree, dlist, select_func=None, event_func=None,
event_func=None,mode=gtk.SELECTION_SINGLE): mode=gtk.SELECTION_SINGLE):
self.tree = tree self.tree = tree
self.tree.set_fixed_height_mode(True) self.tree.set_fixed_height_mode(True)
self.mylist = [] self.mylist = []
self.data_index = 0 self.data_index = 0
for l in dlist: self.sel_iter = None
if len(l)>3:
if l[3] == TOGGLE: for info in dlist:
if len(info) > 3:
if info[3] == TOGGLE:
self.mylist.append(bool) self.mylist.append(bool)
elif l[3] == IMAGE: elif info[3] == IMAGE:
self.mylist.append(gtk.gdk.Pixbuf) self.mylist.append(gtk.gdk.Pixbuf)
elif l[3] == INTEGER: elif info[3] == INTEGER:
self.mylist.append(int) self.mylist.append(int)
else: else:
self.mylist.append(str) self.mylist.append(str)
@ -78,10 +84,22 @@ class ListModel:
self.cids = [] self.cids = []
self.idmap = {} self.idmap = {}
self.__build_columns(dlist)
self.__connect_model()
if select_func:
self.selection.connect('changed', select_func)
if event_func:
self.double_click = event_func
self.tree.connect('event', self.__button_press)
def __build_columns(self, dlist):
"""
Builds the columns based of the data in dlist
"""
cnum = 0 cnum = 0
for name in dlist:
if not name[2]: for name in [ item for item in dlist if item[2]]:
continue
if len(name) == 3: if len(name) == 3:
name = (name[0], name[1], name[2], TEXT, False, None) name = (name[0], name[1], name[2], TEXT, False, None)
@ -97,27 +115,13 @@ class ListModel:
column = gtk.TreeViewColumn(name[0], renderer) column = gtk.TreeViewColumn(name[0], renderer)
column.add_attribute(renderer, 'pixbuf', cnum) column.add_attribute(renderer, 'pixbuf', cnum)
renderer.set_property('height', const.thumbScale/2) renderer.set_property('height', const.thumbScale/2)
elif gtk26 and name[3] == COMBO:
store = gtk.ListStore(str)
model = gtk.ListStore(str, object)
for val in name[4]:
model.append((val,store))
self.function[cnum] = name[5]
renderer = gtk.CellRendererCombo()
renderer.set_property('model',model)
renderer.set_property('text_column',0)
renderer.set_fixed_height_from_font(True)
renderer.set_property('editable',True)
renderer.connect('edited',self.edited_cb, cnum)
column = gtk.TreeViewColumn(name[0],renderer,text=cnum)
column.set_reorderable(True)
else: else:
renderer = gtk.CellRendererText() renderer = gtk.CellRendererText()
renderer.set_fixed_height_from_font(True) renderer.set_fixed_height_from_font(True)
renderer.set_property('ellipsize', pango.ELLIPSIZE_END) renderer.set_property('ellipsize', pango.ELLIPSIZE_END)
if name[5]: if name[5]:
renderer.set_property('editable', True) renderer.set_property('editable', True)
renderer.connect('edited',self.edited_cb, cnum) renderer.connect('edited', self.__edited_cb, cnum)
self.function[cnum] = name[5] self.function[cnum] = name[5]
else: else:
renderer.set_property('editable', False) renderer.set_property('editable', False)
@ -143,26 +147,30 @@ class ListModel:
if name[0] != '': if name[0] != '':
self.tree.append_column(column) self.tree.append_column(column)
self.connect_model() def __edited_cb(self, cell, path, new_text, col):
"""
if select_func: Callback executed when the text of the cell renderer has changed
self.selection.connect('changed',select_func) """
if event_func:
self.double_click = event_func
self.tree.connect('event',self.button_press)
def edited_cb(self, cell, path, new_text, col):
self.model[path][col] = new_text self.model[path][col] = new_text
if self.function.has_key(col): if self.function.has_key(col):
self.function[col](int(path), new_text) self.function[col](int(path), new_text)
def unselect(self): def unselect(self):
"""
Removes the selection from the view
"""
self.selection.unselect_all() self.selection.unselect_all()
def set_reorderable(self, order): def set_reorderable(self, order):
"""
Enables or disables reordering of data
"""
self.tree.set_reorderable(order) self.tree.set_reorderable(order)
def new_model(self): def new_model(self):
"""
Creates a new model instance
"""
if self.model: if self.model:
self.cid = self.model.get_sort_column_id() self.cid = self.model.get_sort_column_id()
del self.model del self.model
@ -174,7 +182,10 @@ class ListModel:
self.selection.set_mode(self.mode) self.selection.set_mode(self.mode)
self.sel_iter = None self.sel_iter = None
def connect_model(self): def __connect_model(self):
"""
Connects the model to the associated tree
"""
self.tree.set_model(self.model) self.tree.set_model(self.model)
if self.sel_iter: if self.sel_iter:
self.selection.select_iter(self.sel_iter) self.selection.select_iter(self.sel_iter)
@ -188,6 +199,9 @@ class ListModel:
self.sort() self.sort()
def sort(self): def sort(self):
"""
Sorts the current view
"""
val = self.model.get_sort_column_id() val = self.model.get_sort_column_id()
col = val[0] col = val[0]
if col < 0: if col < 0:
@ -199,16 +213,25 @@ class ListModel:
self.model.sort_column_changed() self.model.sort_column_changed()
def get_selected(self): def get_selected(self):
"""
Returns the selected items
"""
return self.selection.get_selected() return self.selection.get_selected()
def get_row_at(self,x,y): def get_row_at(self, xpos, ypos):
path = self.tree.get_path_at_pos(x,y) """
Returns the row at the specified (x,y) coordinates
"""
path = self.tree.get_path_at_pos(xpos, ypos)
if path == None: if path == None:
return self.count -1 return self.count -1
else: else:
return path[0][0]-1 return path[0][0]-1
def get_selected_row(self): def get_selected_row(self):
"""
Gets the selected row number
"""
store, node = self.selection.get_selected() store, node = self.selection.get_selected()
if node: if node:
rows = store.get_path(node) rows = store.get_path(node)
@ -240,8 +263,8 @@ class ListModel:
path = self.model.get_path(mlist[0]) path = self.model.get_path(mlist[0])
return self.tree.create_row_drag_icon(path) return self.tree.create_row_drag_icon(path)
def blist(self,store,path,node,list): def blist(self, store, path, node, dlist):
list.append(self.model.get_value(node,self.data_index)) dlist.append(self.model.get_value(node, self.data_index))
def clear(self): def clear(self):
self.count = 0 self.count = 0
@ -326,7 +349,10 @@ class ListModel:
path = model.get_path(node) path = model.get_path(node)
self.tree.scroll_to_cell(path, None, True, 0.5, 0.5) self.tree.scroll_to_cell(path, None, True, 0.5, 0.5)
def button_press(self,obj,event): def __button_press(self, obj, event):
"""
Called when a button press is executed
"""
if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1:
self.double_click(obj) self.double_click(obj)
return True return True