SF.net SVN: fclient:[948] trunk/fclient/fclient/impl/lib/qt4ex/dlgbookmarks .py
Status: Pre-Alpha
Brought to you by:
jurner
From: <jU...@us...> - 2008-08-22 08:01:26
|
Revision: 948 http://fclient.svn.sourceforge.net/fclient/?rev=948&view=rev Author: jUrner Date: 2008-08-22 08:01:33 +0000 (Fri, 22 Aug 2008) Log Message: ----------- bit of a rewrite of bookmak file handling ++ some helper methods for clients Modified Paths: -------------- trunk/fclient/fclient/impl/lib/qt4ex/dlgbookmarks.py Modified: trunk/fclient/fclient/impl/lib/qt4ex/dlgbookmarks.py =================================================================== --- trunk/fclient/fclient/impl/lib/qt4ex/dlgbookmarks.py 2008-08-21 11:09:03 UTC (rev 947) +++ trunk/fclient/fclient/impl/lib/qt4ex/dlgbookmarks.py 2008-08-22 08:01:33 UTC (rev 948) @@ -21,6 +21,19 @@ from . import treewidgetwrap from .tpls.Ui_DlgBookmarks import Ui_DlgBookmarks #********************************************************************* +# helpers +#********************************************************************* +def UINT(value): + try: + n = int(value) + except ValueError: + pass + else: + if n > -1: + return n + return 0 + +#********************************************************************* # #********************************************************************* class Actions(object): @@ -66,7 +79,7 @@ ItemTypeFolder = 0 ItemTypeItem = 1 - def __init__(self, parent=None, rootElem=None): + def __init__(self, parent=None, bookmarksFile=None): QtGui.QDialog.__init__(self, parent) self.isCreated = False @@ -91,8 +104,8 @@ # init bookmarks if desired #TODO: move to a better place to speed up dlg show - if rootElem is not None: - self.restoreBookmarks(rootElem) + if bookmarksFile is not None: + self.restoreBookmarks(bookmarksFile) ################## ## private methods @@ -113,6 +126,72 @@ return item ################## + ## class methods + ################## + #TODO: in depth error checks + + @classmethod + def appendBookmark(clss, bookmarksFile, name, target, encoding='utf-8'): + """appends a bookmark to the specified bookmarks file + @param bookmarksFile: anything ElementTree.parse() can deal with + @param name: (str) name of the bookmark + @param target: (str) target of the bookmark + @note: make shure to pass name and target as properly encoded strings + """ + try: + tree = ET.parse(bookmarksFile) + except IOError: + pass + except SyntaxError: + pass + else: + rootElem = tree.getroot() + elem = ET.SubElement(rootElem, 'bookmark') + elemName = ET.SubElement(elem, 'name') + elemName.text = name + elemTarget = ET.SubElement(elem, 'target') + elemTarget.text = target + tree = ET.ElementTree(rootElem) + tree.write(bookmarksFile, encoding=encoding) + return True + return False + + @classmethod + def walkBookmarks(clss, bookmarksFile): + """walks bookmarks + @param bookmarksFile: anything ElementTree.iterparse can deal with + @return: tuple(event, paramsDict) for the next item in turn. event can + be: 'bookmarks', 'beginfolder', 'endfolder', 'bookmark'. paramsDict will + contain parameters of the event. + """ + enum = ET.iterparse(bookmarksFile, ('start', 'end')) + for event, elem in enum: + + if elem.tag == 'bookmarks': + if event == 'start': + columnWidthName = UINT(elem.get('columnWidthName', 0)) + yield 'bookmarks', {'columnWidthName': columnWidthName} + + elif elem.tag == 'folder': + if event == 'start': + selected = bool(elem.get('selected', False)) + expanded = bool(elem.get('expanded', False)) + name = elem.find('name') + name = '' if name is None else name.text + yield 'beginfolder', {'name': name, 'expanded': expanded, 'selected': selected} + else: + yield 'endfolder', {} + + elif elem.tag == 'bookmark': + if event == 'start': + selected = bool(elem.get('selected', False)) + name = elem.find('name') + name = '' if name is None else name.text + target = elem.find('target') + target = '' if target is None else target.text + yield 'bookmark', {'name': name, 'target': target, 'selected': selected} + + ################## ## methods ################## def retranslateUi(self, this): @@ -133,7 +212,7 @@ return True return False - def saveBookmarks(self): + def saveBookmarks(self, bookmarksFile, encoding='utf-8'): """saves the bookmarks @return: (ElementTree.Element) root """ @@ -147,13 +226,14 @@ selectedItem = selectedItems[0] if selectedItems else None for item in enum: + # clear parents from stack + parent = item.parent() + if parent is None: + parent = rootItem + while parent != stack[-1][1]: + stack.pop() + if item.type() == self.ItemTypeFolder: - # clear parents from stack - parent = item.parent() - if parent is None: - parent = rootItem - while parent != stack[-1][1]: - stack.pop() elem = ET.SubElement(stack[-1][0], 'folder', expanded=str(item.isExpanded()), selected=str(item is selectedItem)) stack.append((elem, item)) elemName = ET.SubElement(elem, 'name') @@ -165,11 +245,10 @@ elemTarget = ET.SubElement(elem, 'target') elemTarget.text = unicode(item.text(1)) - return ET.ElementTree(rootElem) - - - #TODO: in depth error checks - def restoreBookmarks(self, rootElem): + tree = ET.ElementTree(rootElem) + tree.write(bookmarksFile, encoding=encoding) + + def restoreBookmarks(self, bookmarksFile): """sets the bookmarks of the dialog @param rootElem: (ElementTree.Element) root @return: (bool) True if errors occured, False otherwise @@ -177,52 +256,27 @@ tree = self.controlById(self.IdTree) tree.clear() rootItem = tree.invisibleRootItem() - enum = rootElem.getiterator() - rootElem = enum.next() - parentMap = dict((c, p) for p in rootElem.getiterator() for c in p) + seletedItem = None + stack = [rootItem, ] ok = True - stack = [(rootElem, rootItem), ] - selectedItem = None - - if rootElem.tag != 'bookmarks': + try: + for event, params in self.walkBookmarks(bookmarksFile): + if event == 'bookmarks': + tree.setColumnWidth(0, params['columnWidthName']) + elif event == 'beginfolder': + item = self._addFolder(stack[-1], params['name']) + stack.append(item) + item.setExpanded(params['expanded']) + selectedItem = item if params['selected'] else selectedItem + elif event == 'endfolder': + stack.pop() + elif event == 'bookmark': + item = self._addBookmark(stack[-1], params['name'], params['target']) + selectedItem = item if params['selected'] else selectedItem + except SyntaxError: ok = False - else: - - # restore properties... - columnWidthName = rootElem.get('columnWidthName', None) - try: - tree.setColumnWidth(0, int(columnWidthName)) - except ValueError: - pass - - # restore elems.. - for elem in enum: - if elem.tag == 'folder': - # clear parents from stack - parent= parentMap[elem] - while parent != stack[-1][0]: - stack.pop() - name = elem.find('name') - if name is None: - ok = False - continue - item = self._addFolder(stack[-1][1], name.text) - stack.append((elem, item)) - if elem.get('expanded', 'False').lower() == 'true': - item.setExpanded(True) - selectedItem = item if elem.get('selected', 'False').lower() == 'true' else selectedItem - - elif elem.tag == 'bookmark': - name = elem.find('name') - if name is None: - ok = False - continue - target = elem.find('target') - if target is None: - ok = False - continue - item = self._addBookmark(stack[-1][1], name.text, target.text) - selectedItem = item if elem.get('selected', 'False').lower() == 'true' else selectedItem + except IOError: + ok = False if selectedItem is not None: tree.scrollToItem(selectedItem) @@ -339,28 +393,21 @@ #********************************************************************* # #********************************************************************* - if __name__ == '__main__': import sys, os # try to restore saved bookmarks - rootElem = None - fpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'bookmarks.xml') - try: - tree = ET.parse(fpath) - except IOError: - pass - else: - rootElem = tree.getroot() - + bookmarksFile = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'bookmarks.xml') + # show dialog app = QtGui.QApplication(sys.argv) - w = DlgBookmarks(None, rootElem=rootElem) + w = DlgBookmarks(None, bookmarksFile=bookmarksFile) w.show() res = app.exec_() # save bookmarks - rootElem = w.saveBookmarks() - rootElem.write(fpath, encoding='utf-8') - - sys.exit(res) \ No newline at end of file + w.saveBookmarks(bookmarksFile) + + sys.exit(res) + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |