SF.net SVN: fclient:[849] trunk/fclient/fclient/impl/ViewDownloads.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <jU...@us...> - 2008-08-01 23:58:31
|
Revision: 849
http://fclient.svn.sourceforge.net/fclient/?rev=849&view=rev
Author: jUrner
Date: 2008-08-01 23:58:41 +0000 (Fri, 01 Aug 2008)
Log Message:
-----------
adjust to allow for ProgressBar styling via Css
Modified Paths:
--------------
trunk/fclient/fclient/impl/ViewDownloads.py
Modified: trunk/fclient/fclient/impl/ViewDownloads.py
===================================================================
--- trunk/fclient/fclient/impl/ViewDownloads.py 2008-08-01 23:56:15 UTC (rev 848)
+++ trunk/fclient/fclient/impl/ViewDownloads.py 2008-08-01 23:58:41 UTC (rev 849)
@@ -53,6 +53,7 @@
#
#**********************************************************************************
BLOCK_SIZE = 32768 # from CHKBlock.java
+
#**********************************************************************************
#
#**********************************************************************************
@@ -136,11 +137,17 @@
trigger=parent.onDownloadKey,
)
self.action(
- name='ActionRemoveSelectedRequests',
- text=self.trUtf8('Remove'),
- trigger=parent.onRemoveSelectedRequests,
+ name='ActionRemoveSelectedDownloads',
+ text=self.trUtf8('Remove download'),
+ trigger=parent.onRemoveSelectedDownloads,
isEnabled=False,
)
+ self.action(
+ name='ActionRestartSelectedDownloads',
+ text=self.trUtf8('Restart download'),
+ trigger=parent.onRestartSelectedDownloads,
+ isEnabled=False,
+ )
class DownloadsWidgetSettings(config.SettingsBase):
@@ -159,47 +166,6 @@
#**********************************************************************************
#
#**********************************************************************************
-# from: network/torrent/mainwindow.cpp
-# TorrentViewDelegate is used to draw the progress bars.
-class DownloadTreeDelegate(QtGui.QItemDelegate):
-
- def __init__(self, parent):
- QtGui.QItemDelegate.__init__(self, parent)
-
- def paint(self, painter, option, index):
- if index.column() != self.parent().HeaderIndexProgress:
- return QtGui.QItemDelegate.paint(self, painter, option, index)
-
- application = QtGui.QApplication.instance()
- fcpRequest = self.parent().fcRequests.itemFromIndex(index.row()).fcpRequest
- progress = fcpRequest['ProgressSucceeeded']
- required = fcpRequest['ProgressRequired']
-
- # Set up a QprogressbarOptionProgressBar to precisely mimic the
- # environment of a progress bar.
- progressBarOption = QtGui.QStyleOptionProgressBar()
- progressBarOption.state = QtGui.QStyle.State_Enabled
- progressBarOption.direction = application.layoutDirection()
- progressBarOption.rect = option.rect
- progressBarOption.fontMetrics = application.fontMetrics()
- progressBarOption.minimum = 0
- progressBarOption.maximum = fcpRequest['ProgressRequired']
- progressBarOption.textAlignment = QtCore.Qt.AlignCenter
- progressBarOption.textVisible = True
-
- # Set the progress and text values of the style option.
- progressBarOption.progress = progress
- if required:
- progressBarOption.text = '%s%%' % round(progress * 100 / required, 2)
- else:
- progressBarOption.text = '0%'
-
- # Draw the progress bar onto the view.
- application.style().drawControl(QtGui.QStyle.CE_ProgressBar, progressBarOption, painter)
-
-#**********************************************************************************
-#
-#**********************************************************************************
class TreeItem(QtGui.QTreeWidgetItem):
def __init__(self, fcpRequest, *params):
@@ -207,18 +173,23 @@
self.fcpRequest = fcpRequest
-# can be used to expose properties for stylesheets for example
+# exposes properties for stylesheets
class ProgressBar(QtGui.QProgressBar):
- def __init__(self, parent):
+ def __init__(self, parent, item):
QtGui.QProgressBar.__init__(self, parent)
- # self.__foo = True
+ self.item = item
- #def foo(self):
- # return self.__foo
- #def setFoo(self, value):
- # self.__foo = value
- #foo = QtCore.pyqtProperty("bool",foo, setFoo)
+ def _status(self):
+ if self.item.fcpRequest is not None:
+ if self.item.fcpRequest['RequestStatus'] & fcp2.ConstRequestStatus.Error:
+ return "error"
+ elif self.item.fcpRequest['RequestStatus'] & fcp2.ConstRequestStatus.Completed:
+ return "complete"
+ else:
+ return QtCore.QString("loading")
+ return "notset"
+ status= QtCore.pyqtProperty("QString", _status)
#**********************************************************************************
#
@@ -233,6 +204,7 @@
HeaderIndexMimeType = 2
HeaderIndexStatus = 3
HeaderIndexProgress = 4
+ HeaderIndexElapsed = 5
def __init__(self, parent, idGlobalFeedback=config.IdMainWindow):
QtGui.QWidget.__init__(self, parent)
@@ -254,12 +226,30 @@
(config.fcpClient.events.RequestRemoved, self.onFcpRequestRemoved),
)
config.fcpClient.events += self.fcpEvents
- self.fcHeadeLabels = {}
+ self.fcHeadeLabels = {} # fcpIdentifier --> treeItem
self.fcpRequests = {}
############################
## private methods
############################
+ def _adjustStatusBar(self, item, status):
+ # to take Css styling into account we have to set a new statusBar for each state change
+ oldProgressBar= self.tree.itemWidget(item, self.HeaderIndexProgress)
+ progressBar = ProgressBar(self.tree, item)
+ progressBar.setObjectName('downloadKey')
+ if status == 'loading':
+ progressBar.setRange(0, 0)
+ elif status == 'complete':
+ progressBar.setRange(0, 1)
+ progressBar.setValue(progressBar.maximum())
+ elif status == 'error':
+ progressbar.setMinimum(oldProgressBar.minimum())
+ progressbar.setMaximum(oldProgressBar.maximum())
+ progressbar.setValue(oldProgressBar.value())
+ else:
+ raise ValueError('Unknown status: %r' % status)
+ self.tree.setItemWidget(item, self.HeaderIndexProgress, progressBar)
+
def _createItemFromFcpRequest(self, fcpRequest):
item= TreeItem(fcpRequest, self.tree)
fileName = fcpRequest['Filename']
@@ -275,9 +265,7 @@
QtCore.Qt.DisplayRole,
QtCore.QVariant(os.path.basename(fcpRequest['Filename']))
)
- progressBar = ProgressBar(self)
- progressBar.setRange(0, 0)
- self.tree.setItemWidget(item, self.HeaderIndexProgress, progressBar)
+ self._adjustStatusBar(item, 'loading')
self.fcpRequests[fcpRequest['Identifier']] = item
return item
@@ -293,6 +281,7 @@
self.HeaderIndexMimeType: self.trUtf8('MimeType'),
self.HeaderIndexStatus: self.trUtf8('Status'),
self.HeaderIndexProgress: self.trUtf8('Progress'),
+ self.HeaderIndexElapsed: self.trUtf8('Elapsed'),
}
tree.setHeaderLabels([i[1] for i in sorted(self.fcHeadeLabels.items())])
@@ -333,6 +322,7 @@
fcpKey,
fileName,
persistentUserData=PersistentRequestData(ClientName=unicode(self.objectName())).dump(),
+ #TODO: browser sets this. ok or not?
#handleFilenameCollision=True,
handlePermanentRedirect=True,
**kws
@@ -357,7 +347,7 @@
handleFilenameCollision=True,
)
- def onRemoveSelectedRequests(self, action):
+ def onRemoveSelectedDownloads(self, action):
tree = self.controlById(self.IdTree)
for item in tree.selectedItems():
parent = item.parent()
@@ -371,12 +361,23 @@
tmp_item.fcpRequest = None
parent.removeChild(item)
+ def onRestartSelectedDownloads(self, action):
+ tree = self.controlById(self.IdTree)
+ for item in tree.selectedItems():
+ if item.fcpRequest is None:
+ raise RuntimeError('fcpRequest is None. should not happen')
+ del self.fcpRequests[item.fcpRequest['Identifier']]
+ item.fcpRequest = config.fcpClient.resendRequest(item.fcpRequest)
+ self.fcpRequests[item.fcpRequest['Identifier']] = item
+ self._adjustStatusBar(item, 'loading')
+
def onTreeCustomContextMenuRequested(self, pt):
tree = self.controlById(self.IdTree)
pt = tree.viewport().mapToGlobal(pt)
menu = QtGui.QMenu(self)
- menu.addAction(self.fcActions['ActionRemoveSelectedRequests'])
+ menu.addAction(self.fcActions['ActionRemoveSelectedDownloads'])
+ menu.addAction(self.fcActions['ActionRestartSelectedDownloads'])
menu.exec_(pt)
@@ -384,7 +385,8 @@
tree = self.controlById(self.IdTree)
hasSelectedItems = tree.selectionModel().hasSelection()
- self.fcActions['ActionRemoveSelectedRequests'].setEnabled(hasSelectedItems)
+ self.fcActions['ActionRemoveSelectedDownloads'].setEnabled(hasSelectedItems)
+ self.fcActions['ActionRestartSelectedDownloads'].setEnabled(hasSelectedItems)
#########################################
## fcp event handlers
@@ -394,14 +396,8 @@
def onFcpRequestCompleted(self, fcpEvent, fcpRequest):
- requestIdentifier = fcpRequest['Identifier']
-
- item = self.fcpRequests.get(requestIdentifier, None)
+ item = self.fcpRequests.get(fcpRequest['Identifier'], None)
if item is not None:
- progressBar = self.tree.itemWidget(item, self.HeaderIndexProgress)
- progressBar.setRange(0, 1)
- progressBar.setValue(progressBar.maximum())
-
item.setData(
self.HeaderIndexSize,
QtCore.Qt.DisplayRole,
@@ -412,8 +408,13 @@
QtCore.Qt.DisplayRole,
QtCore.QVariant(fcpRequest['MetadataContentType'])
)
+ self._adjustStatusBar(item, 'complete')
def onFcpRequestFailed(self, fcpEvent, fcpRequest):
+ item = self.fcpRequests.get(rfcpRequest['Identifier'], None)
+ if item is not None:
+ self._adjustStatusBar(item, 'error')
+
pass
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|