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.
|