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