2007-09-16 Don Allingham <don@gramps-project.org>

* src/DataViews/_EventView.py: connect column editor
	* src/ViewManager.py: pylint
	* src/Editors/_EditLdsOrd.py: pylint
	* src/DisplayTabs/_LdsModel.py: pylint
	* src/DisplayState.py: pylint
	* src/GrampsDbUtils/_GedcomParse.py: pylint
	* src/ListModel.py: pylint
	* src/LdsUtils.py: pylint
	* src/PageView.py: fix column editor



svn: r8982
This commit is contained in:
Don Allingham 2007-09-16 18:45:57 +00:00
parent fe5b0aa03d
commit 623c6f81de
10 changed files with 153 additions and 99 deletions

View File

@ -1,3 +1,14 @@
2007-09-16 Don Allingham <don@gramps-project.org>
* src/DataViews/_EventView.py: connect column editor
* src/ViewManager.py: pylint
* src/Editors/_EditLdsOrd.py: pylint
* src/DisplayTabs/_LdsModel.py: pylint
* src/DisplayState.py: pylint
* src/GrampsDbUtils/_GedcomParse.py: pylint
* src/ListModel.py: pylint
* src/LdsUtils.py: pylint
* src/PageView.py: fix column editor
2007-09-16 Benny Malengier <benny.malengier@gramps-project.org>
* src/DisplayModels/_BaseModel.py: Add comments
* src/DisplayModels/_NoteModel.py: Only show unattached notes in note view

View File

@ -169,6 +169,8 @@ class EventView(PageView.ListView):
PageView.ListView.define_actions(self)
self._add_action('FilterEdit', None, _('Event Filter Editor'),
callback=self.filter_editor,)
self._add_action('_Column Editor', None, _('_Column Editor'),
callback=self._column_editor,)
def get_handle_from_gramps_id(self, gid):
obj = self.dbstate.db.get_event_from_gramps_id(gid)

View File

@ -8,7 +8,7 @@
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
@ -64,35 +64,37 @@ DISABLED = -1
#
#-------------------------------------------------------------------------
class History(GrampsDb.GrampsDBCallback):
""" History manages the objects of a certain type that have been viewed,
""" History manages the objects of a certain type that have been viewed,
with ability to go back, or forward.
When accessing an object, it should be pushed on the History.
"""
__signals__ = {
'changed' : (list, ),
'menu-changed' : (list, ),
'changed' : (list, ),
'menu-changed' : (list, ),
}
def __init__(self):
GrampsDb.GrampsDBCallback.__init__(self)
self.history = []
self.mhistory = []
self.index = -1
self.lock = False
self.clear()
def clear(self):
"""
Cleares the history, resetting the values back to their defaults
"""
self.history = []
self.mhistory = []
self.index = -1
self.lock = False
def remove(self, person_handle, old_id=None):
"""Removes a person from the history list"""
def remove(self, handle, old_id=None):
"""
Removes a handle from the history list
"""
if old_id:
del_id = old_id
else:
del_id = person_handle
del_id = handle
history_count = self.history.count(del_id)
for c in range(history_count):
@ -105,38 +107,48 @@ class History(GrampsDb.GrampsDBCallback):
self.emit('changed', (self.history, ))
self.emit('menu-changed', (self.mhistory, ))
def push(self, person_handle):
def push(self, handle):
"""
Pushes the handle on the history stack
"""
self.prune()
if len(self.history) == 0 or person_handle != self.history[-1]:
self.history.append(person_handle)
if person_handle in self.mhistory:
self.mhistory.remove(person_handle)
self.mhistory.append(person_handle)
if len(self.history) == 0 or handle != self.history[-1]:
self.history.append(handle)
if handle in self.mhistory:
self.mhistory.remove(handle)
self.mhistory.append(handle)
self.index += 1
self.emit('menu-changed', (self.mhistory, ))
self.emit('changed', (self.history, ))
def forward(self, step=1):
"""
Moves forward in the history list
"""
self.index += step
person_handle = self.history[self.index]
if person_handle not in self.mhistory:
self.mhistory.append(person_handle)
handle = self.history[self.index]
if handle not in self.mhistory:
self.mhistory.append(handle)
self.emit('menu-changed', (self.mhistory, ))
return str(self.history[self.index])
def back(self, step=1):
"""
Moves backward in the history list
"""
self.index -= step
try:
person_handle = self.history[self.index]
if person_handle not in self.mhistory:
self.mhistory.append(person_handle)
handle = self.history[self.index]
if handle not in self.mhistory:
self.mhistory.append(handle)
self.emit('menu-changed', (self.mhistory, ))
return str(self.history[self.index])
except IndexError:
return u""
def present(self):
'''return the person handle that is now active in the history
'''
return the person handle that is now active in the history
'''
try :
if self.history :
@ -147,12 +159,21 @@ class History(GrampsDb.GrampsDBCallback):
return u""
def at_end(self):
"""
returns True if we are at the end of the history list
"""
return self.index+1 == len(self.history)
def at_front(self):
"""
returns True if we are at the front of the history list
"""
return self.index <= 0
def prune(self):
"""
Truncates the history list at the current object.
"""
if not self.at_end():
self.history = self.history[0:self.index+1]
@ -206,7 +227,7 @@ class RecentDocsMenu:
filename = os.path.basename(item.get_path())
action_id = "RecentMenu%d" % count
buf.write('<menuitem action="%s"/>' % action_id)
actions.append((action_id, None, title, None, None,
actions.append((action_id, None, title, None, None,
make_callback(item, self.load)))
mitem = gtk.MenuItem(title)
mitem.connect('activate', make_callback(item, self.load))
@ -272,10 +293,10 @@ class WarnHandler(RotateHandler):
class DisplayState(GrampsDb.GrampsDBCallback):
__signals__ = {
'filters-changed' : (str, ),
'filter-name-changed' : (str,unicode,unicode),
'nameformat-changed' : None,
'plugins-reloaded' : (list, list),
'filters-changed' : (str, ),
'filter-name-changed' : (str, unicode, unicode),
'nameformat-changed' : None,
'plugins-reloaded' : (list, list),
}
def __init__(self, window, status, progress, warnbtn, uimanager,
@ -302,7 +323,7 @@ class DisplayState(GrampsDb.GrampsDBCallback):
self.rhandler.setLevel(logging.WARNING)
self.log = logging.getLogger()
self.log.addHandler(self.rhandler)
# This call has been moved one level up,
# This call has been moved one level up,
# but this connection is still made!
# self.dbstate.connect('database-changed', self.db_changed)
@ -320,7 +341,7 @@ class DisplayState(GrampsDb.GrampsDBCallback):
pname = name_displayer.display(default_person)
(name, plist) = self.relationship.get_relationship(
dbstate.db,default_person,active)
dbstate.db, default_person, active)
if name:
if plist == None:
@ -330,7 +351,7 @@ class DisplayState(GrampsDb.GrampsDBCallback):
else:
return u""
def clear_history(self,handle=None):
def clear_history(self, handle=None):
'''Clear the history. If handle is given, then the history is
immediately initialized with a first entry
(you'd eg want active person you view there as History contains the
@ -403,13 +424,3 @@ class DisplayState(GrampsDb.GrampsDBCallback):
self.status.push(self.status_id, text)
while gtk.events_pending():
gtk.main_iteration()
if __name__ == "__main__":
import GrampsWidgets
rhandler = WarnHandler(capacity=400, button=GrampsWidgets.WarnButton())
_LOG = logging.getLogger()
_LOG.setLevel(logging.WARN)
_LOG.addHandler(rhandler)

View File

@ -60,7 +60,7 @@ class LdsModel(gtk.ListStore):
lds_ord.type2str(),
DateHandler.get_date(lds_ord),
lds_ord.status2str(),
LdsUtils.Temples.name(lds_ord.get_temple()),
LdsUtils.TEMPLES.name(lds_ord.get_temple()),
self.column_place(lds_ord),
lds_ord,
])

View File

@ -206,7 +206,7 @@ class EditLdsOrd(EditSecondary):
self.top.get_widget('temple'),
self.obj.set_temple,
self.obj.get_temple,
LdsUtils.Temples.name_code_data(),
LdsUtils.TEMPLES.name_code_data(),
self.db.readonly)
self.status_menu = MonitoredMenu(
@ -387,7 +387,7 @@ class EditFamilyLdsOrd(EditSecondary):
self.top.get_widget('temple'),
self.obj.set_temple,
self.obj.get_temple,
LdsUtils.Temples.name_code_data(),
LdsUtils.TEMPLES.name_code_data(),
self.db.readonly)
self.status_menu = MonitoredMenu(

View File

@ -4392,10 +4392,10 @@ class GedcomParser(UpdateCallback):
def __extract_temple(self, line):
def get_code(code):
if LdsUtils.Temples.is_valid_code(code):
if LdsUtils.TEMPLES.is_valid_code(code):
return code
elif LdsUtils.Temples.is_valid_name(code):
return LdsUtils.Temples.code(code)
elif LdsUtils.TEMPLES.is_valid_name(code):
return LdsUtils.TEMPLES.code(code)
code = get_code(line.data)
if code:

View File

@ -120,5 +120,5 @@ class LdsTemples:
"""
self.__tlist.append(data)
Temples = LdsTemples()
TEMPLES = LdsTemples()

View File

@ -50,6 +50,9 @@ NOSORT = -1
#
#-------------------------------------------------------------------------
class ListModel:
"""
Simple model for lists in smaller dialogs (not DataViews).
"""
def __init__(self, tree, dlist, select_func=None, event_func=None,
mode=gtk.SELECTION_SINGLE):
@ -240,6 +243,9 @@ class ListModel:
return -1
def get_selected_objects(self):
"""
Returns the list of selected objects in the list
"""
if self.count == 0:
return []
elif self.mode == gtk.SELECTION_SINGLE:
@ -250,44 +256,72 @@ class ListModel:
return []
else:
mlist = []
self.selection.selected_foreach(self.blist, mlist)
self.selection.selected_foreach(self.__build_select_list, mlist)
return mlist
def get_icon(self):
"""
Returns an icond to be used for Drag and drop.
"""
if self.mode == gtk.SELECTION_SINGLE:
store, node = self.selection.get_selected()
path = self.model.get_path(node)
else:
mlist = []
self.selection.selected_foreach(self.blist, mlist)
self.selection.selected_foreach(self.__build_select_list, mlist)
path = self.model.get_path(mlist[0])
return self.tree.create_row_drag_icon(path)
def blist(self, store, path, node, dlist):
def __build_select_list(self, store, path, node, dlist):
"""
GTK callback function for waliking a select list
"""
dlist.append(self.model.get_value(node, self.data_index))
def clear(self):
"""
Clears all data in the list
"""
self.count = 0
self.model.clear()
def remove(self, node):
"""
Removes the item from the model
"""
self.model.remove(node)
self.count -= 1
def get_row(self, node):
"""
Returns the row associated with the selected node
"""
row = self.model.get_path(node)
return row[0]
def select_row(self, row):
"""
Selects the item based on path
"""
self.selection.select_path((row))
def select_iter(self, node):
"""
Selects the item based on iter
"""
self.selection.select_iter(node)
def get_object(self, node):
"""
Returns the object associated with the node. This is controlled
by extracting the data from the associated data index
"""
return self.model.get_value(node, self.data_index)
def insert(self, position, data, info=None, select=0):
"""
Inserts the item at the specified position in the model.
"""
self.count += 1
node = self.model.insert(position)
col = 0
@ -302,9 +336,15 @@ class ListModel:
return node
def get_data(self, node, cols):
"""
Returns a list of data from the model associated with the node
"""
return [ self.model.get_value(node, c) for c in cols ]
def add(self, data, info=None, select=0):
"""
Adds the data to the model at the end of the model
"""
self.count += 1
node = self.model.append()
col = 0
@ -320,6 +360,10 @@ class ListModel:
return node
def set(self, node, data, info=None, select=0):
"""
Changes the data associated with the specific node. It does not
add any data, just alters an existing row.
"""
col = 0
for obj in data:
self.model.set_value(node, col, obj)
@ -331,24 +375,6 @@ class ListModel:
self.sel_iter = node
return node
def add_and_select(self, data, info=None):
self.count += 1
node = self.model.append()
col = 0
for obj in data:
self.model.set_value(node, col, obj)
col += 1
if info:
self.idmap[str(info)] = node
self.model.set_value(node, col, info)
self.selection.select_iter(node)
def center_selected(self):
model, node = self.selection.get_selected()
if node:
path = model.get_path(node)
self.tree.scroll_to_cell(path, None, True, 0.5, 0.5)
def __button_press(self, obj, event):
"""
Called when a button press is executed
@ -359,6 +385,9 @@ class ListModel:
return False
def find(self, info):
"""
Selects the item associated with the pass information.
"""
if info in self.idmap.keys():
node = self.idmap[str(info)]
self.selection.select_iter(node)

View File

@ -921,8 +921,6 @@ class ListView(BookMarkView):
self.ADD_MSG, self.add),
('Remove', gtk.STOCK_REMOVE, _("_Remove"), "<control>Delete",
self.DEL_MSG, self.remove),
('ColumnEdit', gtk.STOCK_PROPERTIES, _('_Column Editor'),
None, None, self._column_editor),
('ExportTab', None, _('Export view'), None, None, self.export),
])
@ -941,7 +939,7 @@ class ListView(BookMarkView):
Causes the View to display a column editor. This should be overridden
by any class that provides columns (such as a list based view)
"""
return
raise NotImplemented
def _button_press(self, obj, event):
from QuickReports import create_quickreport_menu

View File

@ -218,14 +218,23 @@ class ViewManager:
"""
def __init__(self, state):
self.page_is_changing = False
self.state = state
self.active_page = None
self.views = []
self.pages = []
self.button_handlers = []
self.buttons = []
self.merge_ids = []
self.tips = gtk.Tooltips()
self._key = None
self.file_loaded = False
self.show_sidebar = Config.get(Config.VIEW)
self.show_toolbar = Config.get(Config.TOOLBAR_ON)
self.show_filter = Config.get(Config.FILTER)
self.__build_main_window()
self.__connect_signals()
self.__do_load_plugins()
@ -248,16 +257,10 @@ class ViewManager:
hbox = gtk.HBox()
self.ebox = gtk.EventBox()
self.bbox = gtk.VBox()
self.buttons = []
self.button_handlers = []
self.ebox.add(self.bbox)
hbox.pack_start(self.ebox, False)
hbox.show_all()
self.show_sidebar = Config.get(Config.VIEW)
self.show_toolbar = Config.get(Config.TOOLBAR_ON)
self.show_filter = Config.get(Config.FILTER)
self.notebook = gtk.Notebook()
self.notebook.set_show_tabs(False)
self.notebook.show()
@ -296,7 +299,7 @@ class ViewManager:
self._navigation_type[PageView.NAVIGATION_PERSON] = (self.person_nav,
None)
self.recent_manager = DisplayState.RecentDocsMenu(
self.uistate, self.state, self.read_recent_file)
self.uistate, self.state, self.__read_recent_file)
self.recent_manager.build()
self.db_loader = DbLoader(self.state, self.uistate)
@ -413,7 +416,7 @@ class ViewManager:
self._readonly_action_list = [
('SaveAs', gtk.STOCK_SAVE_AS, _('_Save As'), "<control><shift>s",
None, self.save_as_activate),
None, self.__save_as_activate),
('Export', 'gramps-export', _('_Export'), "<control>e", None,
self.export_data),
('Abandon', gtk.STOCK_REVERT_TO_SAVED,
@ -453,7 +456,6 @@ class ViewManager:
('Tools', 'gramps-tools', _('_Tools'), None,
_("Open the tools dialog"), self.tools_clicked),
('EditMenu', None, _('_Edit')),
('ColumnEdit', gtk.STOCK_PROPERTIES, _('_Column Editor')),
('BookMenu', None, _('_Bookmarks')),
('ToolsMenu', None, _('_Tools')),
]
@ -496,7 +498,7 @@ class ViewManager:
name = action.get_name()
try:
self.active_page.call_function(name)
except:
except Exception:
self.uistate.push_message(self.state,
_("Key %s is not bound") % name)
@ -674,7 +676,6 @@ class ViewManager:
"""
Builds the UIManager, and the associated action groups
"""
self.merge_ids = []
self.uimanager = gtk.UIManager()
accelgroup = self.uimanager.get_accel_group()
@ -1032,7 +1033,7 @@ class ViewManager:
self.read_file(filename, 'x-directory/normal')
try:
os.chdir(os.path.dirname(filename))
except:
except (IOError, OSError):
pass
self.__post_load_newdb(filename, 'x-directory/normal', title)
@ -1089,7 +1090,7 @@ class ViewManager:
self.state.db.set_save_path(filename)
try:
os.chdir(os.path.dirname(filename))
except:
except (OSError, IOError):
print "could not change directory"
except Errors.DbError, msg:
QuestionDialog.DBErrorDialog(str(msg.value))
@ -1099,7 +1100,7 @@ class ViewManager:
return True
def save_as_activate(self, obj):
def __save_as_activate(self, obj):
"""
Called when the SaveAs button is clicked
"""
@ -1107,7 +1108,7 @@ class ViewManager:
(filename, filetype) = self.db_loader.save_as()
self.__post_load_newdb(filename, filetype)
def read_recent_file(self, filename):
def __read_recent_file(self, filename):
"""
Called when the recent file is loaded
"""
@ -1136,17 +1137,19 @@ class ViewManager:
self.uistate.clear_history(None)
self.uistate.progress.hide()
self.state.db.undo_callback = self.change_undo_label
self.state.db.redo_callback = self.change_redo_label
self.change_undo_label(None)
self.change_redo_label(None)
self.state.db.undo_callback = self.__change_undo_label
self.state.db.redo_callback = self.__change_redo_label
self.__change_undo_label(None)
self.__change_redo_label(None)
self.state.db.undo_history_callback = self.undo_history_update
self.undo_history_close()
self.uistate.window.window.set_cursor(None)
def __post_load_newdb(self, filename, filetype, title=None):
"""
Called after a new database is loaded.
"""
if not filename:
return
@ -1206,7 +1209,7 @@ class ViewManager:
# Call common __post_load
self.__post_load()
def change_undo_label(self, label):
def __change_undo_label(self, label):
"""
Changes the UNDO label
"""
@ -1222,7 +1225,7 @@ class ViewManager:
self.undoactions.set_sensitive(False)
self.uimanager.insert_action_group(self.undoactions, 1)
def change_redo_label(self, label):
def __change_redo_label(self, label):
"""
Changes the REDO label
"""
@ -1371,11 +1374,11 @@ class ViewManager:
Builds a new tools menu
"""
self.toolactions = gtk.ActionGroup('ToolWindow')
(ui, actions) = self.build_plugin_menu(
(uidef, actions) = self.build_plugin_menu(
'ToolsMenu', tool_menu_list, Tool.tool_categories,
make_tool_callback)
self.toolactions.add_actions(actions)
self.uistate.uimanager.add_ui_from_string(ui)
self.uistate.uimanager.add_ui_from_string(uidef)
self.uimanager.insert_action_group(self.toolactions, 1)
self.uistate.uimanager.ensure_update()
@ -1384,11 +1387,11 @@ class ViewManager:
Builds a new reports menu
"""
self.reportactions = gtk.ActionGroup('ReportWindow')
(ui, actions) = self.build_plugin_menu(
(uidef, actions) = self.build_plugin_menu(
'ReportsMenu', report_menu_list, ReportBase.standalone_categories,
make_report_callback)
self.reportactions.add_actions(actions)
self.uistate.uimanager.add_ui_from_string(ui)
self.uistate.uimanager.add_ui_from_string(uidef)
self.uimanager.insert_action_group(self.reportactions, 1)
self.uistate.uimanager.ensure_update()