SF.net SVN: fclient:[876] trunk/fclient/fclient/impl/SideBarLoadDetails.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <jU...@us...> - 2008-08-09 07:34:30
|
Revision: 876 http://fclient.svn.sourceforge.net/fclient/?rev=876&view=rev Author: jUrner Date: 2008-08-09 07:34:39 +0000 (Sat, 09 Aug 2008) Log Message: ----------- comb over Modified Paths: -------------- trunk/fclient/fclient/impl/SideBarLoadDetails.py Modified: trunk/fclient/fclient/impl/SideBarLoadDetails.py =================================================================== --- trunk/fclient/fclient/impl/SideBarLoadDetails.py 2008-08-09 07:34:24 UTC (rev 875) +++ trunk/fclient/fclient/impl/SideBarLoadDetails.py 2008-08-09 07:34:39 UTC (rev 876) @@ -3,14 +3,11 @@ #TODO: # # x. how to adjust item colors via stylesheet? -# x. assumed we get a networkReplyError() signal when for example an image culd not be loaded. does not happen. check -# x. limit number of requests we keep track off? +# x. limit number of requests we keep track off (performance)? # x. context menu actions for items like ...load in browser ..download key (...) # x. save column widths # #******************************************************************************** - - from __future__ import absolute_import if __name__ == '__main__': # see --> http://bugs.python.org/issue1510172 . works only current dir and below import os; __path__ = [os.path.dirname(__file__)] @@ -28,23 +25,46 @@ _settings_ = ( ('ColorFgItem', 'QColor', QtGui.QColor('black')), ('ColorBgItem', 'QColor', QtGui.QColor('white')), - ('ColorFgItemError', 'QColor', QtGui.QColor('black')), - ('ColorBgItemError', 'QColor', QtGui.QColor('red')), - + ('ColorFgItemError', 'QColor', QtGui.QColor('red')), + ('ColorBgItemError', 'QColor', QtGui.QColor('white')), + ('ColorFgItemComplete', 'QColor', QtGui.QColor('green')), + ('ColorBgItemComplete', 'QColor', QtGui.QColor('white')), ) + +class TreeItem(QtGui.QTreeWidgetItem): + + StatusNone = 0 + StatusLoading = 1 + StatusComplete = 2 + StatusError = 3 + def __init__(self, *args): + QtGui.QTreeWidgetItem.__init__(self, *args) + self.status = self.StatusNone + self.url = None + + + class SideBarLoadDetails(QtGui.QWidget, Ui_SideBarLoadDetails): IdTree = 'tree' IdBtClose = 'btClose' + IndexProgress = 0 + IndexStatus = 1 + IndexName = 2 + def __init__(self, parent=None, closeAction=None): QtGui.QWidget.__init__(self, parent) + self.statusNames = {} # TreeItem.Status* --> displayName + self.setupUi(self) + config.ObjectRegistry.register(self) self.fcSettings = SideBarLoadDetailsSettings(self).restore() - + self.baseKey = None # base key of the page + # setup tree tree = self.controlById(self.IdTree) tree.setUniformRowHeights(True) @@ -56,6 +76,29 @@ bt.setDefaultAction(closeAction) ############################## + ## private methods + ############################## + def _splitBaseKey(self, url): + baseKey = '' + fileName = tmp_fileName = unicode(url.path()) + if tmp_fileName: + tmp_fileName = tmp_fileName.lstrip('/') + if tmp_fileName: + # prep fileName to extract freenetKey + T = tmp_fileName.split('/', 1) + if len(T) == 2: + tmp_baseKey, tmp_fileName = T + else: + tmp_baseKey, tmp_fileName = T[0], '' + # check if baseKey is a freenet key + if config.qStringToFcpKey(tmp_baseKey) is not None: + baseKey = tmp_baseKey + fileName = tmp_fileName + else: + fileName = fileName.lstrip('/') + return baseKey, fileName + + ############################## ## methods ############################## def addNetworkReply(self, indexReply, networkReplyData): @@ -65,42 +108,69 @@ if indexReply < n: return - key = unicode(networkReplyData.url.toString()) - fname = posixpath.basename(posixpath.basename(key)) - if not fname: - fname = '/' + if indexReply == 0: + self.baseKey, fileName = self._splitBaseKey(networkReplyData.url) + else: + #problem: index page may point somewhere deep into a container + # ..so we can not assume all following requests of are lokated deeper + # ..in the age hirarchy. anyways. links to external resources are + # ..always displayed as absolute urls + baseKey, fileName = self._splitBaseKey(networkReplyData.url) + if baseKey != self.baseKey: + fileName = unicode(networkReplyData.url.toString()) + if not fileName: + fileName = '/' - item= QtGui.QTreeWidgetItem(tree) - item.setData( - 0, - QtCore.Qt.DisplayRole, - QtCore.QVariant('0%') - ) - item.setData( - 1, - QtCore.Qt.DisplayRole, - QtCore.QVariant(fname), - ) + item = TreeItem(tree) + item.url = networkReplyData.url + # set progress if networkReplyData.bytesTotal < 1: progress = '0%' else: progress = str(int((float(networkReplyData.bytesReceived) / networkReplyData.bytesTotal * 100))) + '%' - if item is not None: - item.setData( - 0, - QtCore.Qt.DisplayRole, - QtCore.QVariant(progress), - ) - item.setForeground(0, self.fcSettings.value('ColorFgItem')) - item.setBackground(0, self.fcSettings.value('ColorBgItem')) - + item.setData( + self.IndexProgress, + QtCore.Qt.DisplayRole, + QtCore.QVariant(progress), + ) + # set status + if networkReplyData.bytesReceived: + item.status = TreeItem.StatusLoading + if networkReplyData.errorCode is not None: + item.status = TreeItem.StatusError + if networkReplyData.finished: + item.status = TreeItem.StatusComplete + item.setData( + self.IndexStatus, + QtCore.Qt.DisplayRole, + QtCore.QVariant(self.statusNames[item.status]), + ) + # set fileName + item.setData( + self.IndexName, + QtCore.Qt.DisplayRole, + QtCore.QVariant(fileName), + ) + # set vcolors + item.setForeground(self.IndexStatus, self.fcSettings.value('ColorFgItem')) + item.setBackground(self.IndexStatus, self.fcSettings.value('ColorBgItem')) + def controlById(self, idControl): return getattr(self, idControl) + def setCurrent(self, browserWidget, flag): + if flag: + self.setBrowser(browserWidget.currentBrowser()) + else: + tree = self.controlById(self.IdTree) + tree.clear() + self.baseUrl = None + def setBrowser(self, browser): tree = self.controlById(self.IdTree) tree.clear() + self.baseUrl = None # setup browser if browser is not None: self.connect(browser, QtCore.SIGNAL('networkRequestCreated(int, QObject*)'), self.addNetworkReply) @@ -111,23 +181,33 @@ for indexReply, networkReplyData in enumerate(browser.networkGetReplies()): self.addNetworkReply(indexReply, networkReplyData) - def onSetCurrent(self, browserWidget, flag): - if flag: - self.setBrowser(browserWidget.currentBrowser()) - else: - self._items = {} - ########################### - ## + ## overwritten methods ########################### def retranslateUi(self, this): Ui_SideBarLoadDetails.retranslateUi(self, this) tree = self.controlById(self.IdTree) - tree.setHeaderLabels(( - self.trUtf8('Progress'), - self.trUtf8('Name'), - )) - + headerLabels = [ + (self.IndexProgress, self.trUtf8('Progress')), + (self.IndexStatus, self.trUtf8('Status')), + (self.IndexName, self.trUtf8('Name')), + ] + headerLabels.sort() + tree.setHeaderLabels([i[1] for i in headerLabels]) + self.statusNames = { + TreeItem.StatusNone: self.trUtf8('waiting'), + TreeItem.StatusLoading: self.trUtf8('loading'), + TreeItem.StatusComplete: self.trUtf8('complete'), + TreeItem.StatusError: self.trUtf8('error'), + } + root = tree.invisibleRootItem() + for i in xrange(root.childCount()): + item = root.child(i) + item.setData( + self.IndexStatus, + QtCore.Qt.DisplayRole, + QtCore.QVariant(self.statusNames[item.status]), + ) ############################## ## event handlers ############################## @@ -138,26 +218,53 @@ def onBrowserNetworkReplyProgress(self, indexReply, networkReplyData): tree = self.controlById(self.IdTree) item = tree.invisibleRootItem().child(indexReply) - if networkReplyData.bytesTotal < 1: - progress = '0%' - else: - progress = str(int((float(networkReplyData.bytesReceived) / networkReplyData.bytesTotal * 100))) + '%' - if item is not None: + if item is None: + return + if item.status != TreeItem.StatusError: + item.status = item.StatusLoading + if networkReplyData.bytesTotal < 1: + progress = '0%' + else: + progress = str(int((float(networkReplyData.bytesReceived) / networkReplyData.bytesTotal * 100))) + '%' + item.setData( - 0, - QtCore.Qt.DisplayRole, - QtCore.QVariant(progress), - ) + self.IndexProgress, + QtCore.Qt.DisplayRole, + QtCore.QVariant(progress), + ) + item.setData( + self.IndexStatus, + QtCore.Qt.DisplayRole, + QtCore.QVariant(self.statusNames[item.status]), + ) def onBrowserNetworkReplyError(self, indexReply, networkReplyData): tree = self.controlById(self.IdTree) item = tree.invisibleRootItem().child(indexReply) - item.setForeground(0, self.fcSettings.value('ColorFgItemError')) - item.setBackground(0, self.fcSettings.value('ColorBgItemError')) + if item is None: + return + item.setForeground(self.IndexStatus, self.fcSettings.value('ColorFgItemError')) + item.setBackground(self.IndexStatus, self.fcSettings.value('ColorBgItemError')) + item.status = item.StatusError + item.setData( + self.IndexStatus, + QtCore.Qt.DisplayRole, + QtCore.QVariant(self.statusNames[item.status]), + ) def onBrowserNetworkReplyFinished(self, indexReply, networkReplyData): tree = self.controlById(self.IdTree) - item = tree.invisibleRootItem().child(indexReply) - + item = tree.invisibleRootItem().child(indexReply) + if item is None: + return + if item.status != TreeItem.StatusError: + item.status = item.StatusComplete + item.setData( + self.IndexStatus, + QtCore.Qt.DisplayRole, + QtCore.QVariant(self.statusNames[item.status]), + ) + item.setForeground(self.IndexStatus, self.fcSettings.value('ColorFgItemComplete')) + item.setBackground(self.IndexStatus, self.fcSettings.value('ColorBgItemComplete')) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |