class PmWindow(QDialog, PM, Ui_PmWindow): def __init__(self, app = None, packages = [], hide_summary = False): QDialog.__init__(self, None) self.setupUi(self) self.hide_summary = hide_summary self.state = StateManager(self) self.iface = self.state.iface self.state._selected_packages = packages self._packages = packages[:] self._started = False self._postexceptions = [lambda: sys.exit(1)] # Check if another pisi instance already running if isPisiRunning(): self.exceptionCaught("ALREADY RUNNING", block = True) # Check given package names available in repositories if not any(package.endswith('.pisi') for package in packages): available_packages = self.state.packages() for package in packages: if package not in available_packages: self.exceptionCaught('HTTP Error 404', package, block = True) # Check if local/remote packages mixed with repo packages # which pisi does not support to handle these at the same time else: if not all(package.endswith('.pisi') for package in packages): self.exceptionCaught('MIXING PACKAGES', block = True) # Check given local packages if exists for package in get_real_paths(packages): if '://' not in package and package.endswith('.pisi'): if not os.path.exists(package): self.exceptionCaught('FILE NOT EXISTS', package, block = True) self.state.state = StateManager.INSTALL # Get a list of package names from given args. # It may include a path to local package, a path to remote package # or just a package name; following crypted code will remove # remote paths, appends package name as is and uses the pisi.api # to get package name from given local package path. # # Example: # input : ['/tmp/ax-2.3-1.pisi', 'http://pardus.org.tr/tt-2.3.pisi', 'yali'] # output: ['ax', 'yali'] _pkgs = map(lambda x: pisi.api.info_file(x)[0].package.name \ if x.endswith('.pisi') \ else x, filter(lambda x: '://' not in x, get_real_paths(self.state._selected_packages))) _pkgs = filter(lambda x: self.iface.pdb.has_package(x), _pkgs) extras = self.state.iface.getExtras(_pkgs, self.state.state) if extras: self.state._selected_packages.extend(extras) self.model = PackageModel(self) self.model.setCheckable(False) proxy = PackageProxy(self) proxy.setSourceModel(self.model) self.packageList.setModel(proxy) self.packageList.setPackages(packages) self.packageList.selectAll(packages) self.packageList.setItemDelegate(PackageDelegate(self, self, showDetailsButton=False)) self.packageList.setColumnWidth(0, 32) self.packageList.hideSelectAll() self.operation = OperationManager(self.state) self.progressDialog = ProgressDialog(self.state, self) self.summaryDialog = SummaryDialog() self.connectOperationSignals() self.button_install.clicked.connect(self.installPackages) self.button_install.setIcon(KIcon("list-add")) self.button_cancel.clicked.connect(self.actionCancelled) self.button_cancel.setIcon(KIcon("dialog-cancel")) self.rejected.connect(self.actionCancelled) def reject(self): if self.iface.operationInProgress() and self._started: return QDialog.reject(self) def installPackages(self): reinstall = False answer = True self.button_install.setEnabled(False) actions = self.state.checkInstallActions(self.model.selectedPackages()) if actions: answer = askForActions(actions, i18n("Selected packages are already installed.<br>" "If you continue, the packages will be reinstalled"), i18n("Already Installed Packages"), i18n("Installed Packages")) if not answer: self.button_install.setEnabled(True) return if actions: reinstall = True connection_required = True if isAllLocal(self.model.selectedPackages()): connection_required = False operation = self.state.operationAction(self._packages, reinstall = reinstall, silence = True, connection_required = connection_required) self._started = True if operation == False: sys.exit(1) def actionStarted(self, operation): totalPackages = len(self.state._selected_packages) self.progressDialog.reset() if not operation in ["System.Manager.updateRepository", "System.Manager.updateAllRepositories"]: self.operation.setTotalPackages(totalPackages) self.progressDialog.updateStatus(0, totalPackages, self.state.toBe()) self.progressDialog._show() if not self._started: self.progressDialog.disableCancel() else: self.progressDialog.enableCancel() def actionFinished(self, operation): if operation in ("System.Manager.installPackage", "System.Manager.removePackage", "System.Manager.updatePackage"): self.notifyFinished() if operation == "System.Manager.installPackage" and not self.hide_summary: self.summaryDialog.setDesktopFiles(self.operation.desktopFiles) self.summaryDialog.showSummary() self.hide() if not self.summaryDialog.hasApplication(): # Package install succesfull return value is 0 QTimer.singleShot(10, lambda: sys.exit(0)) def actionCancelled(self): # Package install failed with user cancel, return value is 3 sys.exit(3)
class PmWindow(QDialog, PM, Ui_PmWindow): def __init__(self, app=None, packages=[], hide_summary=False): QDialog.__init__(self, None) self.setupUi(self) self.hide_summary = hide_summary self.state = StateManager(self) self.iface = self.state.iface self.state._selected_packages = packages self._packages = packages[:] self._started = False self._postexceptions = [lambda: sys.exit(1)] # Check if another pisi instance already running if isPisiRunning(): self.exceptionCaught("ALREADY RUNNING", block=True) # Check given package names available in repositories if not any(package.endswith('.pisi') for package in packages): available_packages = self.state.packages() for package in packages: if package not in available_packages: self.exceptionCaught('HTTP Error 404', package, block=True) # Check if local/remote packages mixed with repo packages # which pisi does not support to handle these at the same time else: if not all(package.endswith('.pisi') for package in packages): self.exceptionCaught('MIXING PACKAGES', block=True) # Check given local packages if exists for package in get_real_paths(packages): if '://' not in package and package.endswith('.pisi'): if not os.path.exists(package): self.exceptionCaught('FILE NOT EXISTS', package, block=True) self.state.state = StateManager.INSTALL # Get a list of package names from given args. # It may include a path to local package, a path to remote package # or just a package name; following crypted code will remove # remote paths, appends package name as is and uses the pisi.api # to get package name from given local package path. # # Example: # input : ['/tmp/ax-2.3-1.pisi', 'http://pardus.org.tr/tt-2.3.pisi', 'yali'] # output: ['ax', 'yali'] _pkgs = map(lambda x: pisi.api.info_file(x)[0].package.name \ if x.endswith('.pisi') \ else x, filter(lambda x: '://' not in x, get_real_paths(self.state._selected_packages))) _pkgs = filter(lambda x: self.iface.pdb.has_package(x), _pkgs) extras = self.state.iface.getExtras(_pkgs, self.state.state) if extras: self.state._selected_packages.extend(extras) self.model = PackageModel(self) self.model.setCheckable(False) proxy = PackageProxy(self) proxy.setSourceModel(self.model) self.packageList.setModel(proxy) self.packageList.setPackages(packages) self.packageList.selectAll(packages) self.packageList.setItemDelegate( PackageDelegate(self, self, showDetailsButton=False)) self.packageList.setColumnWidth(0, 32) self.packageList.hideSelectAll() self.operation = OperationManager(self.state) self.progressDialog = ProgressDialog(self.state, self) self.summaryDialog = SummaryDialog() self.connectOperationSignals() self.button_install.clicked.connect(self.installPackages) self.button_install.setIcon(KIcon(("list-add", "add"))) self.button_cancel.clicked.connect(self.actionCancelled) self.button_cancel.setIcon(KIcon("cancel")) self.rejected.connect(self.actionCancelled) def reject(self): if self.iface.operationInProgress() and self._started: return QDialog.reject(self) def installPackages(self): reinstall = False answer = True self.button_install.setEnabled(False) actions = self.state.checkInstallActions(self.model.selectedPackages()) if actions: answer = askForActions( actions, i18n("Selected packages are already installed.<br>" "If you continue, the packages will be reinstalled"), i18n("Already Installed Packages"), i18n("Installed Packages")) if not answer: self.button_install.setEnabled(True) return if actions: reinstall = True connection_required = True if isAllLocal(self.model.selectedPackages()): connection_required = False operation = self.state.operationAction( self._packages, reinstall=reinstall, silence=True, connection_required=connection_required) self._started = True if operation == False: sys.exit(1) def actionStarted(self, operation): totalPackages = len(self.state._selected_packages) self.progressDialog.reset() if not operation in [ "System.Manager.updateRepository", "System.Manager.updateAllRepositories" ]: self.operation.setTotalPackages(totalPackages) self.progressDialog.updateStatus(0, totalPackages, self.state.toBe()) self.progressDialog._show() if not self._started: self.progressDialog.disableCancel() else: self.progressDialog.enableCancel() def actionFinished(self, operation): if operation in ("System.Manager.installPackage", "System.Manager.removePackage", "System.Manager.updatePackage"): self.notifyFinished() if operation == "System.Manager.installPackage" and not self.hide_summary: self.summaryDialog.setDesktopFiles(self.operation.desktopFiles) self.summaryDialog.showSummary() self.hide() if not self.summaryDialog.hasApplication(): # Package install succesfull return value is 0 QTimer.singleShot(10, lambda: sys.exit(0)) def actionCancelled(self): # Package install failed with user cancel, return value is 3 sys.exit(3)
class MainWidget(QtGui.QWidget, Ui_MainWidget): def __init__(self, parent=None, silence = False): QtGui.QWidget.__init__(self, parent) self.setupUi(self) self.parent = parent self._selectedGroups = [] self.state = StateManager(self) self.lastState = self.state.state self.state.silence = silence if not silence: self.searchButton.setIcon(KIcon("edit-find")) self.statusUpdater = StatusUpdater() self.basket = BasketDialog(self.state) self.searchUsed = False self.initializeInfoBox() self.initialize() self.updateSettings() self.actionButton.setIcon(self.state.getActionIcon()) self.connectMainSignals() self.operation = OperationManager(self.state) self.progressDialog = ProgressDialog(self.state) self.summaryDialog = SummaryDialog() self.connectOperationSignals() def initializeInfoBox(self): # An info label to show a proper information, # if there is no updates available. self.info = QtGui.QLabel(self) self.info.setText(i18n("All Packages are up to date")) self.info.setAlignment(Qt.AlignVCenter | Qt.AlignCenter) self.info.setStyleSheet("background-color:rgba(0,0,0,220); \ color:white; \ border: 1px solid white; \ border-radius: 10px; \ ") self.info.resize(QSize(340, 80)) self.info.hide() def resizeEvent(self, event): # info label should be resized automatically, # if the mainwindow resized. self.info.move(self.width() / 2 - 170, self.height() / 2 - 40) def connectMainSignals(self): self.connect(self.actionButton, SIGNAL("clicked()"), self.showBasket) self.connect(self.searchButton, SIGNAL("clicked()"), self.searchActivated) self.connect(self.searchLine, SIGNAL("textEdited(const QString&)"), self.searchLineChanged) self.connect(self.searchLine, SIGNAL("returnPressed()"), self.searchActivated) self.connect(self.searchLine, SIGNAL("clearButtonClicked()"), self.groupFilter) self.connect(self.typeCombo, SIGNAL("activated(int)"), self.typeFilter) self.connect(self.groupList, SIGNAL("groupChanged()"), self.groupFilter) self.connect(self.groupList, SIGNAL("groupChanged()"), lambda:self.searchButton.setEnabled(False)) self.connect(self.selectAll, SIGNAL("clicked(bool)"), self.toggleSelectAll) self.connect(self.statusUpdater, SIGNAL("selectedInfoChanged(int, QString, int, QString)"), self.emitStatusBarInfo) self.connect(self.statusUpdater, SIGNAL("selectedInfoChanged(QString)"), lambda message: self.emit(SIGNAL("selectionStatusChanged(QString)"), message)) self.connect(self.statusUpdater, SIGNAL("finished()"), self.statusUpdated) def connectOperationSignals(self): self.connect(self.operation, SIGNAL("exception(QString)"), self.exceptionCaught) self.connect(self.operation, SIGNAL("finished(QString)"), self.actionFinished) self.connect(self.operation, SIGNAL("started(QString)"), self.actionStarted) self.connect(self.operation, SIGNAL("started(QString)"), self.progressDialog.updateActionLabel) self.connect(self.operation, SIGNAL("operationCancelled()"), self.actionCancelled) self.connect(self.operation, SIGNAL("progress(int)"), self.progressDialog.updateProgress) self.connect(self.operation, SIGNAL("operationChanged(QString,QString)"), self.progressDialog.updateOperation) self.connect(self.operation, SIGNAL("packageChanged(int, int, QString)"), self.progressDialog.updateStatus) self.connect(self.operation, SIGNAL("elapsedTime(QString)"), self.progressDialog.updateRemainingTime) self.connect(self.operation, SIGNAL("downloadInfoChanged(QString, QString, QString)"), self.progressDialog.updateCompletedInfo) def initialize(self): waitCursor() self._last_packages = None self.state.reset() self.initializeUpdateTypeList() self.initializePackageList() self.initializeGroupList() self.initializeStatusUpdater() self.statusChanged() self._selectedGroups = [] self.selectAll.setChecked(False) restoreCursor() QTimer.singleShot(1, self.initializeBasket) def initializeUpdateTypeList(self): self.typeCombo.clear() UPDATE_TYPES = [['normal', i18n('All Updates'), 'system-software-update'], ['security', i18n('Security Updates'), 'security-medium'], ['critical', i18n('Critical Updates'), 'security-low']] for type in UPDATE_TYPES: self.typeCombo.addItem(KIcon(type[2], KIconLoader.SizeSmallMedium), type[1], QVariant(type[0])) def initializeStatusUpdater(self): self.statusUpdater.setModel(self.packageList.model().sourceModel()) def initializeBasket(self): waitCursor() self.basket.setModel(self.packageList.model().sourceModel()) restoreCursor() def initializePackageList(self): model = PackageModel(self) proxy = PackageProxy(self) proxy.setSourceModel(model) self.packageList.setModel(proxy) self.packageList.setItemDelegate(PackageDelegate(self)) self.packageList.setColumnWidth(0, 32) self.packageList.setPackages(self.state.packages()) self.connect(self.packageList.model(), SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.statusChanged) def updateSettings(self): self.packageList.showComponents = config.PMConfig().showComponents() self.packageList.setFocus() def searchLineChanged(self, text): self.searchButton.setEnabled(bool(text)) if text == '' and self.searchUsed: self.searchActivated() def statusUpdated(self): if self.statusUpdater.needsUpdate: self.statusUpdater.needsUpdate = False self.statusChanged() def statusChanged(self): self.setActionEnabled() if self.statusUpdater.isRunning(): self.statusUpdater.needsUpdate = True else: self.emit(SIGNAL("updatingStatus()")) self.statusUpdater.start() def initializeGroupList(self): self.groupList.clear() self.groupList.setAlternatingRowColors(True) self.groupList.setIconSize(QSize(KIconLoader.SizeLarge, KIconLoader.SizeLarge)) self.groupList.setState(self.state) self.groupList.addGroups(self.state.groups()) if self.state.state == self.state.UPGRADE: self.typeCombo.show() else: self.typeCombo.hide() self.state._typeFilter = 'normal' self.groupFilter() # Show the info label if there are updates available # otherwise hide it. if self.state.inUpgrade() and self.groupList.count() == 0: self.info.show() else: self.info.hide() def packageFilter(self, text): self.packageList.model().setFilterRole(Qt.DisplayRole) self.packageList.model().setFilterRegExp(QRegExp(unicode(text), Qt.CaseInsensitive, QRegExp.FixedString)) def typeFilter(self, index): if self.state.state == self.state.UPGRADE: filter = self.typeCombo.itemData(index).toString() if not self.state._typeFilter == filter: self.state._typeFilter = filter self.initializeGroupList() def groupFilter(self): self.packageList.resetMoreInfoRow() packages = self.state.groupPackages(self.groupList.currentGroup()) self.packageList.model().setFilterRole(GroupRole) waitCursor() self.packageList.model().setFilterPackages(packages) self.packageList.scrollToTop() self.selectAll.setChecked(self.groupList.currentGroup() in self._selectedGroups) restoreCursor() def searchActivated(self): self.packageList.resetMoreInfoRow() waitCursor() searchText = str(self.searchLine.text()).split() if searchText: sourceModel = self.packageList.model().sourceModel() self.state.cached_packages = sourceModel.search(searchText) self.groupList.lastSelected = None self.searchUsed = True else: self.state.cached_packages = None self.state.packages() self.searchUsed = False self.initializeGroupList() restoreCursor() def setActionButton(self): self.actionButton.setEnabled(False) self.actionButton.setText(self.state.getActionName()) self.actionButton.setIcon(self.state.getActionIcon()) def actionStarted(self, operation): if self.state.silence: totalPackages = len(self.state._selected_packages) if not any(package.endswith('.pisi') for package in self.state._selected_packages): totalPackages += len(self.state.iface.getExtras(self.state._selected_packages)) self.progressDialog.reset() if not operation in ["System.Manager.updateRepository", "System.Manager.updateAllRepositories"]: if not self.state.silence: totalPackages = self.packageList.packageCount() self.operation.setTotalPackages(totalPackages) self.progressDialog.updateStatus(0, totalPackages, self.state.toBe()) if self.isVisible(): if operation in ["System.Manager.updateRepository", "System.Manager.updateAllRepositories"]: self.progressDialog.repoOperationView() self.progressDialog.show() self.progressDialog.enableCancel() def exceptionCaught(self, message): self.progressDialog.hide() if any(warning in message for warning in ('urlopen error','Socket Error', 'PYCURL ERROR')): errorTitle = i18n("Network Error") errorMessage = i18n("Please check your network connections and try again.") elif "Access denied" in message or "tr.org.pardus.comar.Comar.PolicyKit" in message: errorTitle = i18n("Authorization Error") errorMessage = i18n("You are not authorized for this operation.") elif "HTTP Error 404" in message: errorTitle = i18n("Pisi Error") errorMessage = i18n("Package not found. It may be upgraded in or removed from the repository. Please try upgrading repository informations.") else: errorTitle = i18n("Pisi Error") errorMessage = message self.messageBox = QtGui.QMessageBox(errorTitle, errorMessage, QtGui.QMessageBox.Critical, QtGui.QMessageBox.Ok, 0, 0) self.messageBox.show() if self.state.state == self.state.UPGRADE: {self.state.INSTALL:self.parent.showInstallAction, self.state.REMOVE :self.parent.showRemoveAction}[self.lastState].setChecked(True) self.switchState(self.lastState) def actionFinished(self, operation): if operation == "System.Manager.installPackage": self.showSummary() if operation in ("System.Manager.installPackage", "System.Manager.removePackage", "System.Manager.updatePackage"): self.notifyFinished() if not self.state.silence: self.searchLine.clear() self.state.reset() self.progressDialog.hide() if operation in ("System.Manager.updateRepository", "System.Manager.updateAllRepositories"): self.emit(SIGNAL("repositoriesUpdated()")) self.initialize() else: QtGui.qApp.exit() def actionCancelled(self): self.progressDialog.hide() if self.state.silence: QtGui.qApp.exit() else: self.groupFilter() def notifyFinished(self): if not self.operation.totalPackages: return if self.state.silence: Pds.notify(i18n('Package Manager'), self.state.getSummaryInfo(self.operation.totalPackages)) elif Pds.session == pds.Kde4: from PyKDE4.kdeui import KNotification from PyKDE4.kdecore import KComponentData KNotification.event("Summary", self.state.getSummaryInfo(self.operation.totalPackages), QtGui.QPixmap(), None, KNotification.CloseOnTimeout, KComponentData("package-manager", "package-manager", KComponentData.SkipMainComponentRegistration) ) else: Pds.notify(i18n('Package Manager'), self.state.getSummaryInfo(self.operation.totalPackages)) def showSummary(self): self.summaryDialog.setDesktopFiles(self.operation.desktopFiles) if self.summaryDialog.hasApplication(): self.summaryDialog.show() def setActionEnabled(self): enabled = self.packageList.isSelected() self.actionButton.setEnabled(enabled) self.basket.setActionEnabled(enabled) def switchState(self, state, action=True): self.searchLine.clear() self.lastState = self.state.state self.state.setState(state) self._selectedGroups = [] self.setActionButton() if action: self.state.stateAction() self.initialize() def emitStatusBarInfo(self, packages, packagesSize, extraPackages, extraPackagesSize): self.emit(SIGNAL("selectionStatusChanged(QString)"), self.state.statusText(packages, packagesSize, extraPackages, extraPackagesSize)) def setSelectAll(self, packages=None): if packages: self.packageList.reverseSelection(packages) def setReverseAll(self, packages=None): if packages: self.packageList.selectAll(packages) def toggleSelectAll(self, toggled): self._last_packages = self.packageList.model().getFilteredPackages() if toggled: if self.groupList.currentGroup() not in self._selectedGroups: self._selectedGroups.append(self.groupList.currentGroup()) self.setReverseAll(self._last_packages) else: if self.groupList.currentGroup() in self._selectedGroups: self._selectedGroups.remove(self.groupList.currentGroup()) self.setSelectAll(self._last_packages) # A hacky solution to repaint the list to take care of selection changes # FIXME Later self.packageList.setFocus() self.statusChanged() def showBasket(self): waitCursor() self.statusUpdater.wait() self.basket.show() restoreCursor()
class MainWidget(QtGui.QWidget, Ui_MainWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setupUi(self) self.searchButton.setIcon(KIcon("edit-find")) self.statusUpdater = StatusUpdater() self.state = StateManager(self) self.basket = BasketDialog(self.state) self.initialize() self.setSelectAll() self.actionButton.setIcon(self.state.getActionIcon()) self.operation = OperationManager(self.state) self.progressDialog = ProgressDialog(self.state) self.summaryDialog = SummaryDialog() self.connectMainSignals() self.connectOperationSignals() def connectMainSignals(self): self.connect(self.actionButton, SIGNAL("clicked()"), self.showBasket) self.connect(self.searchButton, SIGNAL("clicked()"), self.searchActivated) self.connect(self.searchLine, SIGNAL("textEdited(const QString&)"), self.searchLineChanged) self.connect(self.searchLine, SIGNAL("returnPressed()"), self.searchActivated) self.connect(self.searchLine, SIGNAL("clearButtonClicked()"), self.groupFilter) self.connect(self.groupList, SIGNAL("groupChanged()"), self.groupFilter) self.connect(self.groupList, SIGNAL("groupChanged()"), self.searchLine.clear) self.connect(self.groupList, SIGNAL("groupChanged()"), lambda:self.searchButton.setEnabled(False)) self.connect(self.selectAll, SIGNAL("leftClickedUrl(const QString&)"), self.toggleSelectAll) self.connect(self.statusUpdater, SIGNAL("selectedInfoChanged(int, QString, int, QString)"), self.emitStatusBarInfo) self.connect(self.statusUpdater, SIGNAL("finished()"), self.statusUpdated) def connectOperationSignals(self): self.connect(self.operation, SIGNAL("exception(QString)"), self.exceptionCaught) self.connect(self.operation, SIGNAL("finished(QString)"), self.actionFinished) self.connect(self.operation, SIGNAL("started(QString)"), self.actionStarted) self.connect(self.operation, SIGNAL("started(QString)"), self.progressDialog.updateActionLabel) self.connect(self.operation, SIGNAL("operationCancelled()"), self.progressDialog.hide) self.connect(self.operation, SIGNAL("progress(int)"), self.progressDialog.updateProgress) self.connect(self.operation, SIGNAL("operationChanged(QString,QString)"), self.progressDialog.updateOperation) self.connect(self.operation, SIGNAL("packageChanged(int, int, QString)"), self.progressDialog.updateStatus) self.connect(self.operation, SIGNAL("elapsedTime(QString)"), self.progressDialog.updateRemainingTime) self.connect(self.operation, SIGNAL("downloadInfoChanged(QString, QString, QString)"), self.progressDialog.updateCompletedInfo) def initialize(self): waitCursor() self.state.reset() self.initializePackageList() self.initializeGroupList() self.initializeBasket() self.initializeStatusUpdater() self.statusChanged() restoreCursor() def initializeStatusUpdater(self): self.statusUpdater.setModel(self.packageList.model().sourceModel()) def initializeBasket(self): self.basket.setModel(self.packageList.model().sourceModel()) def initializePackageList(self): self.packageList.setModel(PackageProxy(self)) self.packageList.model().setSourceModel(PackageModel(self)) self.packageList.setItemDelegate(PackageDelegate(self)) self.packageList.setColumnWidth(0, 32) self.packageList.setAlternatingRowColors(True) self.packageList.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) self.packageList.setPackages(self.state.packages()) self.connect(self.packageList.model(), SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.statusChanged) def searchLineChanged(self, text): self.searchButton.setEnabled(bool(text)) def statusUpdated(self): if self.statusUpdater.needsUpdate: self.statusUpdater.needsUpdate = False self.statusChanged() def statusChanged(self): self.setActionEnabled() if self.statusUpdater.isRunning(): self.statusUpdater.needsUpdate = True else: self.emit(SIGNAL("updatingStatus()")) self.statusUpdater.start() def initializeGroupList(self): self.groupList.clear() self.groupList.setAlternatingRowColors(True) self.groupList.setIconSize(QSize(KIconLoader.SizeLarge, KIconLoader.SizeLarge)) self.groupList.setState(self.state) self.groupList.addGroups(self.state.groups()) self.groupFilter() def packageFilter(self, text): self.packageList.model().setFilterRole(Qt.DisplayRole) self.packageList.model().setFilterRegExp(QRegExp(unicode(text), Qt.CaseInsensitive, QRegExp.FixedString)) def groupFilter(self): self.setSelectAll() self.packageList.resetMoreInfoRow() packages = self.state.groupPackages(self.groupList.currentGroup()) self.packageList.model().setFilterRole(GroupRole) waitCursor() self.packageList.model().setFilterPackages(packages) restoreCursor() def searchActivated(self): self.setSelectAll() self.packageList.resetMoreInfoRow() waitCursor() packages = self.packageList.search(str(self.searchLine.text()).split()) self.packageList.model().setFilterRole(GroupRole) self.packageList.model().setFilterPackages(packages) restoreCursor() def setActionButton(self): self.actionButton.setEnabled(False) self.actionButton.setText(self.state.getActionName()) self.actionButton.setIcon(self.state.getActionIcon()) def actionStarted(self, operation): totalPackages = self.packageList.packageCount() self.operation.setTotalPackages(totalPackages) self.progressDialog.reset() self.progressDialog.updateStatus(0, totalPackages, self.state.toBe()) if self.isVisible(): if operation in ["System.Manager.updateRepository", "System.Manager.updateAllRepositories"]: self.progressDialog.repoOperationView() self.progressDialog.show() self.progressDialog.enableCancel() def exceptionCaught(self, message): self.progressDialog.hide() if "urlopen error" in message or "Socket Error" in message: errorTitle = i18n("Network Error") errorMessage = i18n("Please check your network connections and try again.") elif "Access denied" in message or "tr.org.pardus.comar.Comar.PolicyKit" in message: errorTitle = i18n("Authorization Error") errorMessage = i18n("You are not authorized for this operation.") elif "HTTP Error 404": errorTitle = i18n("Pisi Error") errorMessage = i18n("Package not found. It may be upgraded in or removed from the repository. Please try upgrading repository informations.") else: errorTitle = i18n("Pisi Error") errorMessage = message self.messageBox = QtGui.QMessageBox(errorTitle, errorMessage, QtGui.QMessageBox.Critical, QtGui.QMessageBox.Ok, 0, 0) self.messageBox.show() def actionFinished(self, operation): self.searchLine.clear() self.state.reset() self.progressDialog.hide() if operation == "System.Manager.installPackage": self.showSummary() if operation in ["System.Manager.installPackage", "System.Manager.removePackage", "System.Manager.updatePackage"]: self.notifyFinished() self.initialize() def notifyFinished(self): # Since we can not identify the caller yet if not self.operation.totalPackages: return KNotification.event("Summary", self.state.getSummaryInfo(self.operation.totalPackages), QtGui.QPixmap(), None, KNotification.CloseOnTimeout, KComponentData("package-manager", "package-manager", KComponentData.SkipMainComponentRegistration) ) def showSummary(self): self.summaryDialog.setDesktopFiles(self.operation.desktopFiles) if self.summaryDialog.hasApplication(): self.summaryDialog.show() def setActionEnabled(self): enabled = self.packageList.isSelected() self.actionButton.setEnabled(enabled) self.basket.setActionEnabled(enabled) def switchState(self, state, action=True): self.setSelectAll() self.searchLine.clear() self.state.setState(state) self.setActionButton() if action: self.state.stateAction() def emitStatusBarInfo(self, packages, packagesSize, extraPackages, extraPackagesSize): self.emit(SIGNAL("selectionStatusChanged(QString)"), self.state.statusText(packages, packagesSize, extraPackages, extraPackagesSize)) def setSelectAll(self, packages=None): if packages: self.packageList.reverseSelection(packages) self.selectAll.setText(i18n("Select all packages in this group")) self.selectAll.setUrl("All") def setReverseAll(self, packages=None): if packages: self.packageList.selectAll(packages) self.selectAll.setText(i18n("Reverse package selections")) self.selectAll.setUrl("Reverse") def toggleSelectAll(self, text): packages = self.packageList.model().getFilteredPackages() if text == "All": self.setReverseAll(packages) else: self.setSelectAll(packages) self.statusChanged() def showBasket(self): waitCursor() self.statusUpdater.wait() self.basket.show() restoreCursor()
class MainWidget(QtGui.QWidget, Ui_MainWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setupUi(self) self.searchButton.setIcon(KIcon("edit-find")) self.statusUpdater = StatusUpdater() self.state = StateManager(self) self.session = SessionManager() self.basket = BasketDialog(self.state) self.initialize() self.setSelectAll() self.actionButton.setIcon(self.state.getActionIcon()) self.operation = OperationManager(self.state) self.progressDialog = ProgressDialog(self.state) self.summaryDialog = SummaryDialog() self.connectMainSignals() self.connectOperationSignals() def connectMainSignals(self): self.connect(self.actionButton, SIGNAL("clicked()"), self.showBasket) self.connect(self.searchButton, SIGNAL("clicked()"), self.searchActivated) self.connect(self.searchLine, SIGNAL("textEdited(const QString&)"), self.searchLineChanged) self.connect(self.searchLine, SIGNAL("returnPressed()"), self.searchActivated) self.connect(self.searchLine, SIGNAL("clearButtonClicked()"), self.groupFilter) self.connect(self.groupList, SIGNAL("groupChanged()"), self.groupFilter) self.connect(self.groupList, SIGNAL("groupChanged()"), self.searchLine.clear) self.connect(self.groupList, SIGNAL("groupChanged()"), lambda: self.searchButton.setEnabled(False)) self.connect(self.selectAll, SIGNAL("leftClickedUrl(const QString&)"), self.toggleSelectAll) self.connect(self.statusUpdater, SIGNAL("selectedInfoChanged(int, QString, int, QString)"), self.emitStatusBarInfo) self.connect(self.statusUpdater, SIGNAL("finished()"), self.statusUpdated) def connectOperationSignals(self): self.connect(self.operation, SIGNAL("exception(QString)"), self.exceptionCaught) self.connect(self.operation, SIGNAL("finished(QString)"), self.actionFinished) self.connect(self.operation, SIGNAL("started(QString)"), self.actionStarted) self.connect(self.operation, SIGNAL("started(QString)"), self.progressDialog.updateActionLabel) self.connect(self.operation, SIGNAL("operationCancelled()"), self.progressDialog.hide) self.connect(self.operation, SIGNAL("progress(int)"), self.progressDialog.updateProgress) self.connect(self.operation, SIGNAL("operationChanged(QString,QString)"), self.progressDialog.updateOperation) self.connect(self.operation, SIGNAL("packageChanged(int, int, QString)"), self.progressDialog.updateStatus) self.connect(self.operation, SIGNAL("elapsedTime(QString)"), self.progressDialog.updateRemainingTime) self.connect(self.operation, SIGNAL("downloadInfoChanged(QString, QString, QString)"), self.progressDialog.updateCompletedInfo) def initialize(self): waitCursor() self.state.reset() self.initializePackageList() self.initializeGroupList() self.initializeBasket() self.initializeStatusUpdater() self.statusChanged() restoreCursor() def initializeStatusUpdater(self): self.statusUpdater.setModel(self.packageList.model().sourceModel()) def initializeBasket(self): self.basket.setModel(self.packageList.model().sourceModel()) def initializePackageList(self): self.packageList.setModel(PackageProxy(self)) self.packageList.model().setSourceModel(PackageModel(self)) self.packageList.setItemDelegate(PackageDelegate(self)) self.packageList.setColumnWidth(0, 32) self.packageList.setAlternatingRowColors(True) self.packageList.setSelectionMode( QtGui.QAbstractItemView.MultiSelection) self.packageList.setPackages(self.state.packages()) self.connect(self.packageList.model(), SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.statusChanged) def searchLineChanged(self, text): self.searchButton.setEnabled(bool(text)) def statusUpdated(self): if self.statusUpdater.needsUpdate: self.statusUpdater.needsUpdate = False self.statusChanged() def statusChanged(self): self.setActionEnabled() if self.statusUpdater.isRunning(): self.statusUpdater.needsUpdate = True else: self.emit(SIGNAL("updatingStatus()")) self.statusUpdater.start() def initializeGroupList(self): self.groupList.clear() self.groupList.setAlternatingRowColors(True) self.groupList.setIconSize( QSize(KIconLoader.SizeLarge, KIconLoader.SizeLarge)) self.groupList.setState(self.state) self.groupList.addGroups(self.state.groups()) self.groupFilter() def packageFilter(self, text): self.packageList.model().setFilterRole(Qt.DisplayRole) self.packageList.model().setFilterRegExp( QRegExp(unicode(text), Qt.CaseInsensitive, QRegExp.FixedString)) def groupFilter(self): self.setSelectAll() self.packageList.resetMoreInfoRow() packages = self.state.groupPackages(self.groupList.currentGroup()) self.packageList.model().setFilterRole(GroupRole) waitCursor() self.packageList.model().setFilterPackages(packages) restoreCursor() def searchActivated(self): self.setSelectAll() self.packageList.resetMoreInfoRow() waitCursor() packages = self.packageList.search(str(self.searchLine.text()).split()) self.packageList.model().setFilterRole(GroupRole) self.packageList.model().setFilterPackages(packages) restoreCursor() def setActionButton(self): self.actionButton.setEnabled(False) self.actionButton.setText(self.state.getActionName()) self.actionButton.setIcon(self.state.getActionIcon()) def actionStarted(self, operation): totalPackages = self.packageList.packageCount() self.operation.setTotalPackages(totalPackages) self.progressDialog.reset() self.progressDialog.updateStatus(0, totalPackages, self.state.toBe()) if self.isVisible(): if operation in [ "System.Manager.updateRepository", "System.Manager.updateAllRepositories" ]: self.progressDialog.repoOperationView() self.progressDialog.show() self.progressDialog.enableCancel() def exceptionCaught(self, message): self.progressDialog.hide() if "urlopen error" in message or "Socket Error" in message: errorTitle = i18n("Network Error") errorMessage = i18n( "Please check your network connections and try again.") elif "Access denied" in message or "tr.org.pardus.comar.Comar.PolicyKit" in message: errorTitle = i18n("Authorization Error") errorMessage = i18n("You are not authorized for this operation.") elif "HTTP Error 404": errorTitle = i18n("Pisi Error") errorMessage = i18n( "Package not found. It may be upgraded in or removed from the repository. Please try upgrading repository informations." ) else: errorTitle = i18n("Pisi Error") errorMessage = message self.messageBox = QtGui.QMessageBox(errorTitle, errorMessage, QtGui.QMessageBox.Critical, QtGui.QMessageBox.Ok, 0, 0) self.messageBox.show() def actionFinished(self, operation): self.searchLine.clear() self.state.reset() self.progressDialog.hide() if operation == "System.Manager.installPackage": self.showSummary() if operation in [ "System.Manager.installPackage", "System.Manager.removePackage", "System.Manager.updatePackage" ]: self.notifyFinished() self.initialize() def notifyFinished(self): # Since we can not identify the caller yet if not self.operation.totalPackages: return KNotification.event( "Summary", self.state.getSummaryInfo(self.operation.totalPackages), QtGui.QPixmap(), None, KNotification.CloseOnTimeout, KComponentData("package-manager", "package-manager", KComponentData.SkipMainComponentRegistration)) def showSummary(self): self.summaryDialog.setDesktopFiles(self.operation.desktopFiles) if self.summaryDialog.hasApplication(): self.summaryDialog.show() def setActionEnabled(self): enabled = self.packageList.isSelected() self.actionButton.setEnabled(enabled) self.basket.setActionEnabled(enabled) def switchState(self, state, action=True): self.setSelectAll() self.searchLine.clear() self.state.setState(state) self.setActionButton() if action: self.state.stateAction() def emitStatusBarInfo(self, packages, packagesSize, extraPackages, extraPackagesSize): self.emit( SIGNAL("selectionStatusChanged(QString)"), self.state.statusText(packages, packagesSize, extraPackages, extraPackagesSize)) def setSelectAll(self, packages=None): if packages: self.packageList.reverseSelection(packages) self.selectAll.setText(i18n("Select all packages in this group")) self.selectAll.setUrl("All") def setReverseAll(self, packages=None): if packages: self.packageList.selectAll(packages) self.selectAll.setText(i18n("Reverse package selections")) self.selectAll.setUrl("Reverse") def toggleSelectAll(self, text): packages = self.packageList.model().getFilteredPackages() if text == "All": self.setReverseAll(packages) else: self.setSelectAll(packages) self.statusChanged() def showBasket(self): waitCursor() self.statusUpdater.wait() self.basket.show() restoreCursor() def switchSession(self, session): self.session.setSession(session) waitCursor() self.searchLine.clear() self.progressDialog.hide() self.state.setState(StateManager.INSTALL) self.setActionButton() restoreCursor()