Exemplo n.º 1
0
 def test_push(self):
     mgr = StateManager()
     for _ in range(10):
         mgr.push_state(State())
     for _ in range(10):
         mgr.pop_state()
     self.assertTrue(mgr.states == [])
Exemplo n.º 2
0
def start_state_manager(bad_things_queue, state_queue, runtime_pipe):
    try:
        state_manager = StateManager(bad_things_queue, state_queue,
                                     runtime_pipe)
        state_manager.start()
    except Exception as e:
        bad_things_queue.put(
            BadThing(sys.exc_info(),
                     str(e),
                     event=BAD_EVENTS.STATE_MANAGER_CRASH))
Exemplo n.º 3
0
    def __init__(self, parent=None):
        #super(MainWidget,self).__init__()
        QWidget.__init__(self, parent)  # burada bir hata var

        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)

        #burada hata alabilirim
        self.packageList.model().dataChanged[QModelIndex, QModelIndex].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)
Exemplo n.º 4
0
 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()
Exemplo n.º 5
0
    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

        #set style
        self._style = "/usr/share/kde4/apps/package-manager/data/style.qss"
        self.setStyleSheet(file(self._style).read())

        # 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"))
        self.initializeUpdateTypeList()

        self.morewidgets = MoreWidgets(self.state, self.parent)
        self._postexceptions.append(lambda: self.morewidgets.setActionEnabled(True))
        self.morewidgets._show()

        self.webdialog = WebDialog(self.state, self.parent)

        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.connect(self.packageList.model(), SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.statusChanged)
        self.connect(self.packageList, SIGNAL("updateRequested()"), self.initialize)
        self.connect(self.morewidgets.randomPackageList, SIGNAL("itemDoubleClicked(QListWidgetItem*)"), self.showWebdialog)

        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)
Exemplo n.º 6
0
 def test_push(self):
     mgr = StateManager()
     for _ in range(10):
         mgr.push_state(State())
     for _ in range(10):
         mgr.pop_state()
     self.assertTrue(mgr.states == [])
Exemplo n.º 7
0
    def __init__(self, parent = None):
        super(MainWidget, self).__init__(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.dataChanged[QModelIndex,QModelIndex].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)
Exemplo n.º 8
0
 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()
Exemplo n.º 9
0
def test_dynamic():
    """Test the state manager's LTL generation."""
    global TEST_WORLD_MAP
    orders = eval(
        """[('search', {'Theme': 'user_1', 'Location': 'library'}), ('search', {'Theme': 'user_1', 'Location': 'classroom'}), ('retrieve', {'Source': 'user_1', 'Theme': 'defuser'}), ('go', {'Theme': '*', 'Location': 'hall'})]"""
    )

    smgr = StateManager()
    smgr.set_basedir(LTLGEN_BASE_DIR)
    smgr.set_publisher(FakePublisher)
    smgr.location = INIT_ROOM

    # Add some rooms and synthesize
    new_rooms = ["room" + str(num) for num in range(15)]
    new_world_map = (TEST_WORLD_MAP[0] + new_rooms,
                     TEST_WORLD_MAP[1] + [("hall", room)
                                          for room in new_rooms])
    # Sneakily replace this under the tester's nose
    TEST_WORLD_MAP = new_world_map
    smgr.process_orders(orders, None, True, new_world_map)
    test_smgr(smgr)
Exemplo n.º 10
0
def test_dynamic():
    """Test the state manager's LTL generation."""
    global TEST_WORLD_MAP    
    orders = eval("""[('search', {'Theme': 'user_1', 'Location': 'library'}), ('search', {'Theme': 'user_1', 'Location': 'classroom'}), ('retrieve', {'Source': 'user_1', 'Theme': 'defuser'}), ('go', {'Theme': '*', 'Location': 'hall'})]""")

    smgr = StateManager()
    smgr.set_basedir(LTLGEN_BASE_DIR)
    smgr.set_publisher(FakePublisher)
    smgr.location = INIT_ROOM
    
    # Add some rooms and synthesize
    new_rooms = ["room" + str(num) for num in range(15)]
    new_world_map = (TEST_WORLD_MAP[0] + new_rooms, TEST_WORLD_MAP[1] + 
                     [("hall", room) for room in new_rooms])
    # Sneakily replace this under the tester's nose
    TEST_WORLD_MAP = new_world_map
    smgr.process_orders(orders, None, True, new_world_map)
    test_smgr(smgr)
Exemplo n.º 11
0
 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()
Exemplo n.º 12
0
    def Draw(self):
        self.newGame = self.screen.blit(self.newGameImage, (120, self.res[1] / 2))
        self.settings = self.screen.blit(self.settingsImage, (150, self.res[1] / 2 + 60))
        self.about = self.screen.blit(self.aboutImage, (165, self.res[1] / 2 + 120))
        self.scores = self.screen.blit(self.scoresImage, (160, self.res[1] / 2 + 180))
        self.logo = self.screen.blit(self.logoImage, (80, 60))

        if self.settings.collidepoint(self.mouse_pos):
            self.screen.blit(self.settingsImage_pres, (150, self.res[1] / 2 + 60))
        #            for event in pygame.event.get():
        #                if event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]:
        #                    from statemanager import StateManager
        #                    StateManager.setState(StateManager.instance, 'STATE_SETTINGS')
        else:
            self.screen.blit(self.settingsImage, (150, self.res[1] / 2 + 60))

        if self.newGame.collidepoint(self.mouse_pos):
            self.screen.blit(self.newGameImage_pres, (120, self.res[1] / 2))
            for event in pygame.event.get():
                if event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]:
                    from statemanager import StateManager

                    StateManager.setState(StateManager.instance, "STATE_GAME")
        else:
            self.screen.blit(self.newGameImage, (120, self.res[1] / 2))

        if self.about.collidepoint(self.mouse_pos):
            self.screen.blit(self.aboutImage_pres, (165, self.res[1] / 2 + 120))
            for event in pygame.event.get():
                if event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]:
                    from statemanager import StateManager

                    StateManager.setState(StateManager.instance, "STATE_ABOUT")
        else:
            self.screen.blit(self.aboutImage, (165, self.res[1] / 2 + 120))

        if self.scores.collidepoint(self.mouse_pos):
            self.scores = self.screen.blit(self.scoresImage_pres, (160, self.res[1] / 2 + 180))
            for event in pygame.event.get():
                if event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]:
                    from statemanager import StateManager

                    StateManager.setState(StateManager.instance, "STATE_HIGHSCORES")
        else:
            self.scores = self.screen.blit(self.scoresImage, (160, self.res[1] / 2 + 180))
Exemplo n.º 13
0
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)
Exemplo n.º 14
0
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

        #set style
        self._style = "/usr/share/kde4/apps/package-manager/data/style.qss"
        self.setStyleSheet(file(self._style).read())

        # 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"))
        self.initializeUpdateTypeList()

        self.morewidgets = MoreWidgets(self.state, self.parent)
        self.morewidgets._show()

        self.webdialog = WebDialog(self.state, self.parent)

        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.connect(self.packageList.model(), SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.statusChanged)
        self.connect(self.packageList, SIGNAL("updateRequested()"), self.initialize)
        self.connect(self.morewidgets.randomPackageList, SIGNAL("itemDoubleClicked(QListWidgetItem*)"), self.showWebdialog)

        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.connect(self.actionButton, SIGNAL("clicked()"), self.showBasket)
        self.connect(self.buttonMore, SIGNAL("clicked()"), self.showMoreWidgets)
        self.connect(self.checkUpdatesButton, SIGNAL("clicked()"), self.state.updateRepoAction)
        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.stateTab, SIGNAL("currentChanged(int)"), self.switchState)
        self.connect(self.groupList, SIGNAL("groupChanged()"), self.groupFilter)
        self.connect(self.groupList, SIGNAL("groupChanged()"), lambda:self.searchButton.setEnabled(False))
        self.connect(self.packageList.select_all, 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 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(i18n("All packages are up to date"), icon = "games-endturn"))
        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()

    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._list = {}
        self.groupList.setAlternatingRowColors(False)
        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(i18n("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(i18n("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()
            extraPackages = self.packageList.extraPackagesCount()
            self.operation.setTotalPackages(totalPackages)
            self.operation.setExtraPackages(extraPackages)
            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()

    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:
            self.summaryDialog.setDesktopFiles(self.operation.desktopFiles)
            self.summaryDialog.showSummary()

        if operation in ("System.Manager.updateRepository",
                         "System.Manager.updateAllRepositories"):
            self.emit(SIGNAL("repositoriesUpdated()"))
        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(force = True)
        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()
            # self.contentHistory.hide()
            self.content.show()
        # else:
            # self.contentHistory.show()
            # self.content.hide()

    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):

        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(i18n("Select packages"),
                                    i18n("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 showMoreWidgets(self):
        if self.morewidgets.isVisible():
            return
        waitCursor()
        self.morewidgets._show()
        restoreCursor()

    def showWebdialog(self):
        packageName = str(unicode(self.morewidgets.randomPackageList.currentItem().text()))
        liste = []
        liste.append(packageName)
        print liste
        waitCursor()
        self.morewidgets._hide()
        #self.webdialog._show()
        restoreCursor()



        #self.packageList.setPackages(liste)
        self.packageList.selectAll(liste)
        #self.packageList.setItemDelegate(PackageDelegate(self, self, showDetailsButton=True))
        #self.packageList.setColumnWidth(0, 32)
        
        
        self.operation = OperationManager(self.state)
        reinstall = False
        answer = True
        actions = self.state.checkInstallActions(liste)
        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.initializePackageList()
            self.initializeBasket()            
            self.initializeStatusUpdater()  
            self.state.state = self.parent.cw.currentState
            self.parent.cw.initialize()     
            return

        if actions:
            reinstall = True
            
        if reinstall == False:
            self.initializeStatusUpdater() 
            self.initializeBasket()
            self.statusUpdated()
           
        self.showBasket()
        self.initializeBasket()    
        self.initializeStatusUpdater()    
        
    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]), type[1], QVariant(type[0]))
Exemplo n.º 15
0
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]))
Exemplo n.º 16
0
class MainWidget(QWidget, PM, Ui_MainWidget):
    # Signal Emits
    updatingStatus = pyqtSignal()
    repositoriesUpdated = pyqtSignal()
    selectionStatusChanged = pyqtSignal([str])
    finished = pyqtSignal()
    cleanUp = pyqtSignal()
    
    def __init__(self, parent = None):
        super(MainWidget, self).__init__(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.dataChanged[QModelIndex,QModelIndex].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[str].connect(self.searchLineChanged)
        self.searchLine.returnPressed.connect(self.searchActivated)
        
        self.searchLine.textChanged[str].connect(self.slotSearchLineClear)       
        
        self.typeCombo.activated[int].connect(self.typeFilter)
        self.stateTab.currentChanged[int].connect(self.switchState)
        self.groupList.groupChanged.connect(self.groupFilter)
        self.groupList.groupChanged.connect(lambda:self.searchButton.setEnabled(False))
        self.packageList.select_all.clicked[bool].connect(self.toggleSelectAll)
        self.packageList.itemDelegate().packageSelected[bool].connect(self.toggleSelect)
        self.statusUpdater.selectedInfoChanged[int,str,int,str].connect(self.emitStatusBarInfo)
        self.statusUpdater.selectedInfoChanged[str].connect(lambda message: self.selectionStatusChanged[str].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(_translate("Packaga Manager","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.allPackages(), 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):   # pmconfig ikinci kez okunmuyor
        self.packageList.showComponents = PMConfig().showComponents()
        self.packageList.showIsA = PMConfig().showIsA()
        self.packageList.setFocus()
        self.initialize()

    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()

    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)
            if not self.state._typeFilter == filter:
                self.state._typeFilter = filter
                self.initializeGroupList()
    def slotSearchLineClear(self):
        if self.searchLine.text()!="":
            return
        
        self.groupFilter()
    
    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(_translate("Packaga Manager","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(_translate("Packaga Manager","No results found."), "dialog-information")
        else:
            self.pdsMessageBox.hideMessage()
        self.initializeGroupList()
        self.initializePackageList()
        

    def startSearch(self):
        searchText = str(self.searchLine.text()).split()
        sourceModel = self.packageList.model().sourceModel()
        self.state.cached_packages = sourceModel.search(searchText)
        self.finished.emit()
        return self.state.cached_packages

    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()

    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[str].emit(self.state.statusText(packages, packagesSize, extraPackages, extraPackagesSize))
        
        # paket seçimine geçici çözüm
        if packages > 0:
            self.actionButton.setEnabled(True)
        else:
            self.actionButton.setEnabled(False)

    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 toggleSelect(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())
        
        #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(_translate("Packaga Manager","Select packages"),
                                    _translate("Packaga Manager","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', _translate("Packaga Manager",'All Updates'), ('system-software-update', 'ledgreen')],
                        ['security', _translate("Packaga Manager",'Security Updates'), ('security-medium', 'ledyellow')],
                        ['critical', _translate("Packaga Manager",'Critical Updates'), ('security-low', 'ledred')]]

        for type in UPDATE_TYPES:
            self.typeCombo.addItem(KIcon(type[2]), type[1], QVariant(type[0]))
Exemplo n.º 17
0
    def run(self, aut_path=None):
        """Intialize all NL components."""
        # pylint: disable=W0603
        global WORLD_KNOWLEDGE
    
        # Start the NL pipeline
        if not aut_path:
            print "Starting NL pipeline..."
            init_pipes()
        else:
            print "Skipping loading nlpipeline because an automaton was loaded"
     
        # Start the ROS node
        print "Initializing ROS node..."
        rospy.init_node('nlproxy')
    
        # Set up the state mgr and its callbacks
        print "Starting state manager..."
        self.state_mgr = StateManager(self)
        self.state_mgr.set_basedir(LTLGEN_BASE_DIR)
    
        # Load the automaton if needed
        if aut_path:
            self.state_mgr.load_test_automaton(aut_path, False)
    
        # Create world knowledge
        print "Starting knowledge..."
        WORLD_KNOWLEDGE = Knowledge.Knowledge(self)
        self.state_mgr.world_knowledge = WORLD_KNOWLEDGE
        
        # Wait a little for ROS to avoid timing startup issues.
        print "Waiting for ROS node to settle..."
        time.sleep(1)
        
        # Set up ROS listening
        print "Subscribing to notifications..."
        # Set up state manager's sending and listening
        pub = add_ltl_publisher()
        self.state_mgr.set_publisher(pub)
        add_subscriber(LTL_ENVIRONMENT_TOPIC, self.state_mgr.process_sensor_data)
        add_subscriber(LTL_ENVIRONMENT_TOPIC, WORLD_KNOWLEDGE.process_sensor_data)

        # Create the input comm_proxy and iPad connections
        print "Starting comm_proxy..."
        self.comm_proxy = CallbackSocket(self.text_port)
        self.comm_proxy.register_callback(self.process_text)
        self.ipad_conn = iPadConnection(self.map_port)
        self.ipad_conn.register_rename_callback(Knowledge.rename_entity)
        self.ipad_conn.register_text_callback(self.process_text)
        # TODO Add highlight callback
        self.map_proxy = MapProxy(self.ipad_conn)
        add_subscriber(LTL_ENVIRONMENT_TOPIC, self.ipad_conn.add_icons)        
        WORLD_KNOWLEDGE.map_proxy = self.map_proxy

        # Set up odometry forwarding to the ipad
        tf = TransformListener()
        while not tf.frameExists("/map"):
            rospy.logwarn("Not ready for transforms yet")
            rospy.sleep(1.0)
        position_proxy = RobotPositionProxy(self.ipad_conn,tf)
        rospy.Subscriber(ODOM_TOPIC, Odometry, position_proxy.forward_position)

        # Set up getting directions
        direction_proxy = DirectionProxy()
        rospy.Subscriber(LOCATION_TOPIC, String, direction_proxy.set_location)
        WORLD_KNOWLEDGE.direction_proxy = direction_proxy
        
        print "NLMaster startup complete!"
        print "*" * 80
    
        # Finally, wait for input before quitting
        try:
            while True:
                text = raw_input("").strip()
                if text == "q":
                    break
        except (KeyboardInterrupt, EOFError):
            pass
        except:
            raise
        finally:
            # Only shutdown the pipeline if we actually were taking language input
            if not aut_path:
                print "Shutting down NL pipeline..."
                close_pipes()
            self.comm_proxy.shutdown()
            self.ipad_conn.shutdown()
    
        sys.exit()
Exemplo n.º 18
0
class NLMaster:
    """Natural language master server."""
    
    def __init__(self, text_port, map_port):
        self.text_port = text_port
        self.map_port = map_port
        self.ipad_conn = None
        self.comm_proxy = None
        self.map_proxy = None
        self.state_mgr = None
        
    def run(self, aut_path=None):
        """Intialize all NL components."""
        # pylint: disable=W0603
        global WORLD_KNOWLEDGE
    
        # Start the NL pipeline
        if not aut_path:
            print "Starting NL pipeline..."
            init_pipes()
        else:
            print "Skipping loading nlpipeline because an automaton was loaded"
     
        # Start the ROS node
        print "Initializing ROS node..."
        rospy.init_node('nlproxy')
    
        # Set up the state mgr and its callbacks
        print "Starting state manager..."
        self.state_mgr = StateManager(self)
        self.state_mgr.set_basedir(LTLGEN_BASE_DIR)
    
        # Load the automaton if needed
        if aut_path:
            self.state_mgr.load_test_automaton(aut_path, False)
    
        # Create world knowledge
        print "Starting knowledge..."
        WORLD_KNOWLEDGE = Knowledge.Knowledge(self)
        self.state_mgr.world_knowledge = WORLD_KNOWLEDGE
        
        # Wait a little for ROS to avoid timing startup issues.
        print "Waiting for ROS node to settle..."
        time.sleep(1)
        
        # Set up ROS listening
        print "Subscribing to notifications..."
        # Set up state manager's sending and listening
        pub = add_ltl_publisher()
        self.state_mgr.set_publisher(pub)
        add_subscriber(LTL_ENVIRONMENT_TOPIC, self.state_mgr.process_sensor_data)
        add_subscriber(LTL_ENVIRONMENT_TOPIC, WORLD_KNOWLEDGE.process_sensor_data)

        # Create the input comm_proxy and iPad connections
        print "Starting comm_proxy..."
        self.comm_proxy = CallbackSocket(self.text_port)
        self.comm_proxy.register_callback(self.process_text)
        self.ipad_conn = iPadConnection(self.map_port)
        self.ipad_conn.register_rename_callback(Knowledge.rename_entity)
        self.ipad_conn.register_text_callback(self.process_text)
        # TODO Add highlight callback
        self.map_proxy = MapProxy(self.ipad_conn)
        add_subscriber(LTL_ENVIRONMENT_TOPIC, self.ipad_conn.add_icons)        
        WORLD_KNOWLEDGE.map_proxy = self.map_proxy

        # Set up odometry forwarding to the ipad
        tf = TransformListener()
        while not tf.frameExists("/map"):
            rospy.logwarn("Not ready for transforms yet")
            rospy.sleep(1.0)
        position_proxy = RobotPositionProxy(self.ipad_conn,tf)
        rospy.Subscriber(ODOM_TOPIC, Odometry, position_proxy.forward_position)

        # Set up getting directions
        direction_proxy = DirectionProxy()
        rospy.Subscriber(LOCATION_TOPIC, String, direction_proxy.set_location)
        WORLD_KNOWLEDGE.direction_proxy = direction_proxy
        
        print "NLMaster startup complete!"
        print "*" * 80
    
        # Finally, wait for input before quitting
        try:
            while True:
                text = raw_input("").strip()
                if text == "q":
                    break
        except (KeyboardInterrupt, EOFError):
            pass
        except:
            raise
        finally:
            # Only shutdown the pipeline if we actually were taking language input
            if not aut_path:
                print "Shutting down NL pipeline..."
                close_pipes()
            self.comm_proxy.shutdown()
            self.ipad_conn.shutdown()
    
        sys.exit()

    def process_text(self, text):
        """Parse text and pass it to semantics."""
        if text:
            # Clean unicode first if needed
            if isinstance(text, unicode):
                text = text.encode('ascii', 'ignore')
            
            print "Parsing:", repr(text)
            parse = parse_text(text)
            result = WORLD_KNOWLEDGE.process_parse_tree(parse, text)
            answer = result[0]
            new_commands = result[3]
            # Use the answer if there was one and it was a string
            response = answer if answer and isinstance(answer, str) else ""
            
            # Also, echo back any new commands
            command_echo = make_response(new_commands)
                
            # Combine the responses as needed.
            if not response:
                response = command_echo
            elif new_commands:
                response += " " + command_echo

            if response:
                self.send_response(response)
            
            print "Completed:", repr(text)


    def send_response(self, text):
        """Send text to all listeners."""
        print "Sending text to listeners:", repr(text)                
        self.ipad_conn.sendtext(text)
        self.comm_proxy.send(text)
Exemplo n.º 19
0
    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)
Exemplo n.º 20
0
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)
Exemplo n.º 21
0
    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)
Exemplo n.º 22
0
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()
Exemplo n.º 23
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.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()
Exemplo n.º 24
0
def test_fixed(aut_path):
    """Test the state manager on a fixed automaton."""
    smgr = StateManager()
    smgr.set_publisher(FakePublisher)
    smgr.load_test_automaton(aut_path, True)
    test_smgr(smgr)
Exemplo n.º 25
0
def test_fixed(aut_path):
    """Test the state manager on a fixed automaton."""
    smgr = StateManager()
    smgr.set_publisher(FakePublisher)
    smgr.load_test_automaton(aut_path, True)
    test_smgr(smgr)
Exemplo n.º 26
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()