class MainWidget(QWidget, PM, Ui_MainWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.parent = parent self._selectedGroups = [] self._preexceptions = [] self._postexceptions = [] self.state = StateManager(self) self.currentState = None self.completer = None self._updatesCheckedOnce = False # Search Thread self._searchThread = PThread(self, self.startSearch, self.searchFinished) self.statusUpdater = StatusUpdater() self.basket = BasketDialog(self.state, self.parent) self._postexceptions.append(lambda: self.basket.setActionEnabled(True)) self.searchButton.setIcon(KIcon(("edit-find", "find"))) self.initializeUpdateTypeList() model = PackageModel(self) proxy = PackageProxy(self) proxy.setSourceModel(model) self.packageList.setModel(proxy) self.packageList.setItemDelegate(PackageDelegate(self, self.parent)) self.packageList.setColumnWidth(0, 32) self.packageList.model().dataChanged.connect(self.statusChanged) self.packageList.updateRequested.connect(self.initialize) self.updateSettings() self.setActionButton() self.operation = OperationManager(self.state) self.progressDialog = ProgressDialog(self.state, self.parent) self._preexceptions.append(self.progressDialog._hide) self.progressDialog.registerFunction( FINISHED, lambda: self.parent.statusBar().setVisible( not self.progressDialog.isVisible())) self.progressDialog.registerFunction( OUT, lambda: self.parent.statusBar().show()) self.summaryDialog = SummaryDialog() self.connectOperationSignals() self.pdsMessageBox = PMessageBox(self.content) def connectMainSignals(self): self.actionButton.clicked.connect(self.showBasket) self.checkUpdatesButton.clicked.connect(self.state.updateRepoAction) self.searchButton.clicked.connect(self.searchActivated) self.searchLine.textEdited.connect(self.searchLineChanged) self.searchLine.returnPressed.connect(self.searchActivated) self.searchLine.clearButtonClicked.connect(self.groupFilter) self.typeCombo.activated.connect(self.typeFilter) self.stateTab.currentChanged.connect(self.switchState) self.groupList.groupChanged.connect(self.groupFilter) self.groupList.groupChanged.connect( lambda: self.searchButton.setEnabled(False)) self.packageList.select_all.clicked.connect(self.toggleSelectAll) self.statusUpdater.selectedInfoChanged.connect(self.emitStatusBarInfo) self.statusUpdater.selectedInfoChanged.connect( lambda message: self.selectionStatusChanged.emit(message)) self.statusUpdater.finished.connect(self.statusUpdated) def initialize(self): waitCursor() self.searchLine.clear() self._started = False self._last_packages = None self.state.reset() self.initializePackageList() self.initializeGroupList() self.initializeStatusUpdater() self.statusChanged() self._selectedGroups = [] self.packageList.select_all.setChecked(False) self.initializeBasket() self.searchLine.setFocus(True) if self.currentState == self.state.UPGRADE: if self.groupList.count() == 0: QTimer.singleShot(0, \ lambda: self.pdsMessageBox.showMessage(self.tr("All packages are up to date"), icon = "info")) if self.groupList.count() > 0: if self.state.inUpgrade(): self.pdsMessageBox.hideMessage(force=True) restoreCursor() def initializeStatusUpdater(self): self.statusUpdater.calculate_deps = not self.state.state == self.state.ALL self.statusUpdater.setModel(self.packageList.model().sourceModel()) def initializeBasket(self): waitCursor() self.basket.setModel(self.packageList.model().sourceModel()) restoreCursor() def initializePackageList(self): self.packageList.model().reset() self.packageList.setPackages(self.state.packages()) if self.completer: self.completer.deleteLater() del self.completer self.completer = QCompleter(self.state.packages(), self) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.searchLine.setCompleter(self.completer) def selectComponent(self, component): if not self.state.iface.operationInProgress(): if self.basket.isVisible(): self.basket._hide() self.stateTab.setCurrentIndex(1) self.switchState(self.state.INSTALL) if component in self.groupList._list: self.groupList.setCurrentItem(self.groupList._list[component]) self.groupFilter() def updateSettings(self): self.packageList.showComponents = PMConfig().showComponents() self.packageList.showIsA = PMConfig().showIsA() self.packageList.setFocus() def searchLineChanged(self, text): self.searchButton.setEnabled(bool(text)) if text == '': self.searchActivated() def statusUpdated(self): if self.statusUpdater.needsUpdate: self.statusUpdater.needsUpdate = False self.statusChanged() updatingStatus = pyqtSignal() def statusChanged(self): self.setActionEnabled() if self.statusUpdater.isRunning(): self.statusUpdater.needsUpdate = True else: self.updatingStatus.emit() self.statusUpdater.start() def initializeGroupList(self): self.groupList.clear() self.groupList._list = {} self.groupList.setAlternatingRowColors(True) self.groupList.setIconSize(QSize(32, 32)) 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() 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): waitCursor() self.packageList.resetMoreInfoRow() packages = self.state.groupPackages(self.groupList.currentGroup()) self.packageList.model().setFilterRole(GroupRole) self.packageList.model().setFilterPackages(packages) self.packageList.scrollToTop() self.packageList.select_all.setChecked( self.groupList.currentGroup() in self._selectedGroups) restoreCursor() def searchActivated(self): if self.currentState == self.state.UPGRADE: if self.groupList.count() == 0 and not self.searchUsed: return if not self.searchLine.text() == '': self.pdsMessageBox.showMessage(self.tr("Searching..."), busy=True) self.groupList.lastSelected = None self._searchThread.start() self.searchUsed = True else: self.state.cached_packages = None self.state.packages() self.searchUsed = False self.searchFinished() def searchFinished(self): if self.state.cached_packages == []: self.pdsMessageBox.showMessage(self.tr("No results found."), "dialog-information") else: self.pdsMessageBox.hideMessage() self.initializeGroupList() def startSearch(self): searchText = str(self.searchLine.text()).split() sourceModel = self.packageList.model().sourceModel() self.state.cached_packages = sourceModel.search(searchText) def setActionButton(self): self.actionButton.setEnabled(False) if self.state.state == self.state.ALL: menu = QMenu(self.actionButton) self.__install_action = menu.addAction( self.state.getActionIcon(self.state.INSTALL), self.state.getActionName(self.state.INSTALL), self.showBasket) self.__remove_action = menu.addAction( self.state.getActionIcon(self.state.REMOVE), self.state.getActionName(self.state.REMOVE), self.showBasket) self.actionButton.setMenu(menu) else: self.actionButton.setMenu(None) self.actionButton.setIcon(self.state.getActionIcon()) self.actionButton.setText(self.state.getActionName()) def actionStarted(self, operation): self.pdsMessageBox.hideMessage() self.progressDialog.reset() if not operation in [ "System.Manager.updateRepository", "System.Manager.updateAllRepositories" ]: 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() if self.basket.isVisible(): self.basket._hide() QTimer.singleShot(0, self.progressDialog._show) else: self.progressDialog._show() if not self._started: self.progressDialog.disableCancel() else: self.progressDialog.enableCancel() repositoriesUpdated = pyqtSignal() def actionFinished(self, operation): if operation in ("System.Manager.installPackage", "System.Manager.removePackage", "System.Manager.updatePackage"): self.notifyFinished() if operation == "System.Manager.installPackage" and self._started: KIconLoader.updateAvailableIcons() self.summaryDialog.setDesktopFiles(self.operation.desktopFiles) self.summaryDialog.showSummary() if operation in ("System.Manager.updateRepository", "System.Manager.updateAllRepositories"): self.repositoriesUpdated.emit() self.searchLine.clear() self.state.reset() self.progressDialog._hide() if not self.currentState == self.state.UPGRADE: self.switchState(self.currentState) self.initialize() def actionCancelled(self): self.progressDialog._hide() self.progressDialog.reset() self.switchState(self.currentState) self.groupFilter() def setActionEnabled(self): enabled = self.packageList.isSelected() self.actionButton.setEnabled(enabled) self.basket.setActionEnabled(enabled) def switchState(self, state): self.pdsMessageBox.hideMessage() self._states[state][1].setChecked(True) self.state.setState(state) self.currentState = state self._selectedGroups = [] if not state == self.state.HISTORY: self.setActionButton() self.state.cached_packages = None if state == self.state.UPGRADE or (state == self.state.INSTALL and self.groupList.count() == 1): if not self._updatesCheckedOnce: self._updatesCheckedOnce = self.state.updateRepoAction( silence=True) self.checkUpdatesButton.setHidden(not state == self.state.UPGRADE) self.initialize() def emitStatusBarInfo(self, packages, packagesSize, extraPackages, extraPackagesSize): self.selectionStatusChanged.emit( 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) self.packageList.setFocus() self.statusChanged() def showBasket(self): if self.basket.isVisible(): return waitCursor() self.statusUpdater.wait() if self.currentState == self.state.ALL: action = { self.__remove_action: self.state.REMOVE, self.__install_action: self.state.INSTALL }.get(self.sender(), self.state.INSTALL) if action: if action == self.state.REMOVE: installed_packages = self.state.iface.getInstalledPackages( ) filtered_packages = filter( lambda x: x not in installed_packages, self.basket.model.selectedPackages()) if filtered_packages == self.basket.model.selectedPackages( ): restoreCursor() QMessageBox( self.tr("Select packages"), self. tr("You must select at least one installed package" ), QMessageBox.Information, QMessageBox.Ok, 0, 0).exec_() return self.packageList.model().sourceModel().selectPackages( filtered_packages, state=False) self.state.state = action self.basket._show() restoreCursor() def initializeUpdateTypeList(self): self.typeCombo.clear() UPDATE_TYPES = [[ 'normal', self.tr('All Updates'), ('system-software-update', 'ledgreen') ], [ 'security', self.tr('Security Updates'), ('security-medium', 'ledyellow') ], [ 'critical', self.tr('Critical Updates'), ('security-low', 'ledred') ]] for type in UPDATE_TYPES: self.typeCombo.addItem(KIcon(type[2]), type[1], QVariant(type[0]))
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()