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