예제 #1
0
class World(DirectObject):
	def __init__(self):

		base.makeDefaultPipe()
		width=base.pipe.getDisplayWidth()
		height=base.pipe.getDisplayHeight()
		print('screen dimensions are '+str(width)+','+str(height))

		base.windowType = 'onscreen' 
		props=WindowProperties.getDefault()
		props.setSize(width,height)
		props.setFullscreen(True) 
		base.openDefaultWindow(props) 

		PStatClient.connect()
		loadPrcFileData("", "framebuffer-stencil #t")
		self.sessionManager=SessionManager()

		FPS = 60
		globalClock = ClockObject.getGlobalClock() 
		globalClock.setMode(ClockObject.MLimited) 
		globalClock.setFrameRate(FPS)

		taskMgr.add(self.move,"moveTask")

	def move(self, task):

		self.sessionManager.advanceTime()
		return task.cont
예제 #2
0
    def exportIndex(self, filename):
        iface = backend.pm.Iface()

        source = iface.source  # store current source
        iface.setSource(None)  # set source None

        list_installed = iface.getPackageList()  # get installed package list
        packages = []

        self.totalPackages = len(list_installed)
        self.packageNo = 0

        for name in list_installed:
            packages.append(iface.getPackage(name))
            self.packageNo += 1
            self.updateExportingProgress()

        session = SessionManager()
        session.setSession(session.OFFLINE)

        try:
            backend.pm.Iface().writeIndex(packages, filename)
            print "Index file is written successfully."
        except:
            print "Index file could not written!"

        # set source and session to their previous states
        session.setSession(session.NORMAL)
        iface.setSource(source)
예제 #3
0
    def setup_subscription(self):
        dprint("get:", SessionManager.instance().get_session())

        if self.use_other_session == False:
            self.m_client.subscribe(
                'commandResponse', [SessionManager.instance().get_session()],
                callback=self.subscription_response_callback)

        self.m_client.subscribe('imageviewerdb',
                                [SessionManager.instance().get_session()],
                                callback=self.subscription_image_callback)
예제 #4
0
 def getSession_callback(self, error, result):
     if error:
         dprint("getSession_callback error")
         dprint(error)
         return
     print("in getSession_callback, sessionID:", result)
     if self.use_other_session == False:
         SessionManager.instance().set_session(result)
     # subscribe response
     # subscribe imageController
     # observe response, imageController
     self.setup_subscription()
예제 #5
0
    def send_command(self,
                     cmd,
                     parameter,
                     built_callback=None,
                     user_callback=""):
        # 有built_callback就先處理它. 然後有user_callback就async,  沒有就直接return result
        # 沒有built_callback就建一個dummmy, 然後裡面再callback user_callback
        # 沒有user_callback就要把self.sync_resp_queue.put
        # 也有可能都沒有
        print("send command".format("cmd"))
        identifier = cmd + parameter
        #const id = cmd + parameter;

        # cmd_dict = {'if_async': if_async, 'callback': callback}
        cmd_dict = {
            'id': identifier,
            'built_callback': built_callback,
            'user_callback': user_callback
        }

        self.mutex.acquire()
        self.callbacks.append(cmd_dict)
        self.mutex.release()
        self.client.call(
            sendCmd, [cmd, parameter,
                      SessionManager.instance().get_session()],
            self.send_command_callback)
        if user_callback == None:
            data = self.block_for_user_callback()
            return data
        else:
            print("async send command !!!!!")
예제 #6
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()
예제 #7
0
    def exportIndex(self, filename):
        iface = backend.pm.Iface()

        source = iface.source  # store current source
        iface.setSource(None)  # set source None

        list_installed = iface.getPackageList()  # get installed package list
        packages = []

        self.totalPackages = len(list_installed)
        self.packageNo = 0

        for name in list_installed:
            packages.append(iface.getPackage(name))
            self.packageNo += 1
            self.updateExportingProgress()

        session = SessionManager()
        session.setSession(session.OFFLINE)

        try:
            backend.pm.Iface().writeIndex(packages, filename)
            print "Index file is written successfully."
        except:
            print "Index file could not written!"

        # set source and session to their previous states
        session.setSession(session.NORMAL)
        iface.setSource(source)
예제 #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.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()
예제 #9
0
 def saveDataToCollection(self, collection, newDocObject, actionType):
     sessionID = SessionManager.instance().get_session()
     docs = self.m_client.find(collection,
                               selector={'sessionID': sessionID})
     total = len(docs)
     if total > 0:
         dprint("try to replace first image in mongo, total images:", total)
         doc = docs[0]
         docID = doc["_id"]
         newDocObject["sessionID"] = sessionID
         # update, not test yet
         self.m_client.update(collection, {'_id': docID},
                              newDocObject,
                              callback=self.update_callback)
     else:
         # insert
         dprint("try to to insert images")
         newDocObject["sessionID"] = sessionID
         self.m_client.insert(collection,
                              newDocObject,
                              callback=self.insert_callback)
         dprint("end to insert")
예제 #10
0
파일: runner.py 프로젝트: HeidiSQL/pyHeidi
import sys
from sessionmanager import SessionManager
from PyQt4 import QtGui

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    sessionManager = SessionManager()
    sessionManager.show()
    app.exec_()
예제 #11
0
    def handleAddedOrChanged(self, collection, id, fields):
        for key, value in fields.items():
            dprint('  - FIELD {}'.format(key))
            # dprint('  - FIELD {} {}'.format(key, value))

        if collection == "users":
            dprint("grimmer users added/changed ")
        elif collection == "responses":
            dprint("grimmer responses added/changed, self_sessionID:",
                   fields["sessionID"])

            if "pushedImage" in fields:
                # if "buffer" in fields:
                imgString = fields["buffer"]
                imageLeng = len(imgString)
                print("get image, data size in (cmd) response:", imageLeng)

                #TODO the dummy empty images should be solved in the future, but now we use it to judge connect ok
                if imageLeng > 10012:
                    # url = "data:image/jpeg;base64,"+imgString
                    # save to mongo for share screen
                    #TODO python: forget to setup controllerID. js: forget to add size
                    self.saveDataToCollection('imageviewerdb', {
                        "imageURL": imgString,
                        "size": len(imgString)
                    }, GET_IMAGE)
                    #save file for testing
                    # dprint("try to save image")
                    # self.render_received_image(imgString)

                    # imgdata = base64.b64decode(imgString)
                    # filename = currentTime +".jpg"  # I assume you have a way of picking unique filenames
                    # with open(filename, 'wb') as f:
                    #     f.write(imgdata)
                    #
                    #     if run_from_interactive():
                    #         # img = mpimg.imread('1.jpg'), from file
                    #         i = io.BytesIO(imgdata)
                    #         i = mpimg.imread(i, format='JPG') # from memory, binary
                    #
                    #         # plt.imshow(i, interpolation='nearest')
                    #         #TODO let mainthread to redraw
                    #         imgplot = plt.imshow(i)# may be no difference
                    #         plt.pause(0.01)
                    #     else:
                    #         dprint("not ipython, so do no show image after saving")

                # global numberOfImages
                # self.numberOfImages += 1
                # if self.numberOfImages == 2:
                #     print("get dummy 2 images")
                #     self.sync_connected_queue.put(connect_response)
            elif "cmd" in fields:
                self.receive_response(fields)
            #2.  remove it, may not be necessary for Browser, just aligh with React JS Browser client
            self.m_client.remove('responses', {'_id': id},
                                 callback=self.remove_callback)

        elif collection == 'imageviewerdb':
            sessionID = SessionManager.instance().get_session()
            docs = self.m_client.find(collection,
                                      selector={'sessionID': sessionID})
            total = len(docs)
            print("imagecontroller added/changed event happens, total docs:",
                  total)
            if total > 0:
                # firstDoc = docs[0]
                for doc in docs:
                    docID = doc["_id"]
                    dprint("loop image collection, id is", docID)
                    #NOTE since meteor-python does not have Optimistic update so that we need to remove old images after getting added/changed callback
                    if docID != id:
                        print("remove one image document")
                        self.m_client.remove(
                            'imageviewerdb', {'_id': docID},
                            callback=self.remove_image_callback)
                        # global testimage
                        # testimage +=1
                        # if testimage ==1:
                        #     dprint("try 2nd image file")
                        #     ImageController.selectFileToOpen2(client)
                        #
                        # doc["comments"] = "apple"
                        # for testing client.update('imageviewerdb', {'_id': docID}, {"name": "ggg"}, callback=update_callback)
                        # for testing
                        # client.update('imageviewerdb', {'_id': docID}, doc, callback=update_callback)
                    else:
                        dprint("not remove it")
                        print("image size in collection:",
                              len(doc["imageURL"]))
                        self.render_received_image(doc["imageURL"])
예제 #12
0
 def watch_other_session(self, session):
     SessionManager.instance().use_other_session(session)
     self.use_other_session = True
예제 #13
0
import sys
from sessionmanager import SessionManager
from PyQt4 import QtGui

if __name__ == '__main__':
	app = QtGui.QApplication(sys.argv)
	sessionManager = SessionManager()
	sessionManager.show()
	app.exec_()
예제 #14
0
#!/usr/bin/env python
import sys
assert sys.version_info > (3,5)
#from ipaddress import IPv4Address
import netifaces

from sessionmanager import SessionManager

def get_local_ipv4_addresses():
    for interface in netifaces.interfaces():
        if netifaces.AF_INET in netifaces.ifaddresses(interface):
            for address_info in netifaces.ifaddresses(interface)[netifaces.AF_INET]:
                yield address_info['addr']

peers = ["192.168.122.1","192.168.122.179","192.168.122.113"]
local_addresses = list(get_local_ipv4_addresses())
#print(local_addresses)
#print(peers)
_peers = []
for peer in peers:
    if peer not in local_addresses:
        print("using %s" % peer)
        _peers.append(peer)

# __peers = list(map(IPv4Address,_peers))
sm = SessionManager(_peers)
예제 #15
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()
예제 #16
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()