Ejemplo n.º 1
0
 def createGui(self, guiParent):
     self._gui = FileBrowserGui(guiParent, self)
     self._actionHandlers = ActionHandlerStorage(self._guiUpdater)
     logger.debug("File Browser GUI created.")
     return self._gui
Ejemplo n.º 2
0
 def createGui(self, guiParent):
     self._gui = FileBrowserGui(guiParent, self)
     self._actionHandlers = ActionHandlerStorage(self._guiUpdater)
     logger.debug("File Browser GUI created.")
     return self._gui
Ejemplo n.º 3
0
class FileBrowser(AbstractTool):

    TOOL_ID = "FileBrowserTool"

    def __init__(self, guiUpdater, dialogsFacade):
        super(FileBrowser, self).__init__()
        self._guiUpdater = guiUpdater
        self._actionHandlers = None
        self._dialogsFacade = dialogsFacade
        self.__dropFilesDialogs = DropFilesDialogsFacade(dialogsFacade)
        self._gui = None
        self._repo = None
        self._user = None
        self._currDir = None
        self._listCache = None
        self._mutex = None
        self._thread = None
        self._enabled = False
        self._extAppMgr = ExtAppMgr()

        self._guiUpdater.subscribe(
            self._extAppMgr, self._extAppMgr.updateState,
            [HandlerSignals.REGGATA_CONF_CHANGED])

        logger.debug("File Browser __init__ finished.")


    def id(self):
        return self.TOOL_ID

    def title(self):
        return self.tr("File Browser")

    def createGui(self, guiParent):
        self._gui = FileBrowserGui(guiParent, self)
        self._actionHandlers = ActionHandlerStorage(self._guiUpdater)
        logger.debug("File Browser GUI created.")
        return self._gui

    def __getGui(self):
        return self._gui
    gui = property(fget=__getGui)


    def connectActionsWithActionHandlers(self):
        assert len(self._gui.actions) > 0, "Actions should be already built in ToolGui"

        self._actionHandlers.register(
            self._gui.actions['editItems'],
            EditItemsActionHandlerFileBrowser(self, self._dialogsFacade))

        self._actionHandlers.register(
            self._gui.actions['addFiles'],
            AddFilesToRepoActionHandler(self, self._dialogsFacade))

        self._actionHandlers.register(
            self._gui.actions['openFile'],
            OpenFileActionHandler(self, self._extAppMgr))

        self._actionHandlers.register(
            self._gui.actions['moveFiles'],
            MoveFilesActionHandler(self, self._dialogsFacade))

        self._actionHandlers.register(
            self._gui.actions['renameFile'],
            RenameFileActionHandler(self, self._dialogsFacade))

        self._actionHandlers.register(
            self._gui.actions['deleteFiles'],
            DeleteFilesActionHandler(self, self._dialogsFacade))




    def handlerSignals(self):
        return [([HandlerSignals.ITEM_CHANGED,
                  HandlerSignals.ITEM_CREATED,
                  HandlerSignals.ITEM_DELETED], self.refreshDir)]


    @property
    def repo(self):
        return self._repo

    def setRepo(self, repo):
        self._repo = repo
        if repo is not None:
            self.changeDir(repo.base_path)
            logger.debug("File Browser curr dir has been SET.")
        else:
            self.unsetDir()
            logger.debug("File Browser curr dir has been UNSET.")

    def checkActiveRepoIsNotNone(self):
        if self._repo is None:
            raise CurrentRepoIsNoneError("Current repository is None")


    @property
    def user(self):
        return self._user

    def setUser(self, user):
        self._user = user
        # TODO: update Gui according to the user change

    def checkActiveUserIsNotNone(self):
        if self._user is None:
            raise CurrentUserIsNoneError("Current user is None")


    def enable(self):
        self._enabled = True
        self.refreshDir()
        logger.debug("File Browser enabled.")


    def disable(self):
        self._enabled = False
        logger.debug("File Browser disabled.")


    @property
    def currDir(self):
        if self._currDir is None:
            raise NoneError()
        return self._currDir


    def repoBasePath(self):
        if self._repo is None:
            raise NoneError()
        return self._repo.base_path


    def itemIdsForDir(self, dirAbsPath):
        assert self._repo is not None
        dirRelPath = os.path.relpath(dirAbsPath, self._repo.base_path)
        itemIds = []
        try:
            uow = self._repo.createUnitOfWork()
            cmd = GetItemIdsWithFilesFrom(dirRelPath)
            itemIds = uow.executeCommand(cmd)
        finally:
            uow.close()
        return itemIds



    def listDir(self):
        if self._currDir is None:
            return []
        if self._listCache is None:
            self._rebuildListCache()
        return self._listCache


    def filesCount(self):
        if self._currDir is None:
            return 0
        if self._listCache is None:
            self._rebuildListCache()
        return len(self._listCache)


    def _rebuildListCache(self):
        if not self._enabled:
            self._listCache = []
            return

        def resetGuiTableRows(topRow, bottomRow):
            self._gui.resetTableRows(topRow, bottomRow)
            QtCore.QCoreApplication.processEvents()

        assert self._currDir is not None
        resultDirs = [FileInfo("..", FileInfo.DIR)]
        resultFiles = []
        for fname in os.listdir(self._currDir):
            absPath = os.path.join(self._currDir, fname)
            if os.path.isfile(absPath):
                resultFiles.append(FileInfo(absPath, FileInfo.FILE))
            elif os.path.isdir(absPath):
                resultDirs.append(FileInfo(absPath, FileInfo.DIR))
        self._listCache = resultDirs + resultFiles

        logger.debug("_rebuildListCache is about to start the FileInfoSearcherThread")
        self._thread = FileInfoSearcherThread(self, self._repo, self._listCache, self._mutex)
        self.connect(self._thread, QtCore.SIGNAL("progress"),
                         lambda topRow, bottomRow: resetGuiTableRows(topRow, bottomRow))
        self._thread.start()
        #self._thread.run()


    def changeDirUp(self):
        self.changeDir("..")


    def changeRelDir(self, relativeDir):
        absDir = os.path.join(self._currDir, relativeDir)
        absDir = os.path.normpath(absDir)
        self.changeDir(absDir)


    def refreshDir(self):
        if self._currDir is None:
            return
        self.changeDir(self._currDir)


    def changeDir(self, directory):
        if directory == ".":
            directory = self._currDir

        if directory == "..":
            directory, _ = os.path.split(self._currDir)

        if not os.path.exists(directory):
            raise NotExistError(directory + " not exists on the file system.")

        if not helpers.is_internal(directory, self.repoBasePath()):
            raise ValueError(directory +  " is outside the repository.")

        if os.path.isfile(directory):
            raise ValueError(directory + " is not a directory but a file.")

        assert os.path.isabs(directory)
        self.__setCurrDir(directory)


    def unsetDir(self):
        self.__setCurrDir(None)


    def __setCurrDir(self, directory):
        if self._thread is not None:
            self._thread.interrupt = True
            self._thread.wait()
        self._currDir = directory
        self._listCache = None
        self._mutex = QtCore.QMutex()
        self._gui.resetTableModel(self._mutex)

    def storeCurrentState(self):
        self._gui.saveColumnsWidth()
        self._gui.saveColumnsVisibility()


    def restoreRecentState(self):
        self._gui.restoreColumnsVisibility()
        self._gui.restoreColumnsWidth()
Ejemplo n.º 4
0
class FileBrowser(AbstractTool):

    TOOL_ID = "FileBrowserTool"

    def __init__(self, guiUpdater, dialogsFacade):
        super(FileBrowser, self).__init__()
        self._guiUpdater = guiUpdater
        self._actionHandlers = None
        self._dialogsFacade = dialogsFacade
        self.__dropFilesDialogs = DropFilesDialogsFacade(dialogsFacade)
        self._gui = None
        self._repo = None
        self._user = None
        self._currDir = None
        self._listCache = None
        self._mutex = None
        self._thread = None
        self._enabled = False
        self._extAppMgr = ExtAppMgr()

        self._guiUpdater.subscribe(self._extAppMgr,
                                   self._extAppMgr.updateState,
                                   [HandlerSignals.REGGATA_CONF_CHANGED])

        logger.debug("File Browser __init__ finished.")

    def id(self):
        return self.TOOL_ID

    def title(self):
        return self.tr("File Browser")

    def createGui(self, guiParent):
        self._gui = FileBrowserGui(guiParent, self)
        self._actionHandlers = ActionHandlerStorage(self._guiUpdater)
        logger.debug("File Browser GUI created.")
        return self._gui

    def __getGui(self):
        return self._gui

    gui = property(fget=__getGui)

    def connectActionsWithActionHandlers(self):
        assert len(self._gui.actions
                   ) > 0, "Actions should be already built in ToolGui"

        self._actionHandlers.register(
            self._gui.actions['editItems'],
            EditItemsActionHandlerFileBrowser(self, self._dialogsFacade))

        self._actionHandlers.register(
            self._gui.actions['addFiles'],
            AddFilesToRepoActionHandler(self, self._dialogsFacade))

        self._actionHandlers.register(
            self._gui.actions['openFile'],
            OpenFileActionHandler(self, self._extAppMgr))

        self._actionHandlers.register(
            self._gui.actions['moveFiles'],
            MoveFilesActionHandler(self, self._dialogsFacade))

        self._actionHandlers.register(
            self._gui.actions['renameFile'],
            RenameFileActionHandler(self, self._dialogsFacade))

        self._actionHandlers.register(
            self._gui.actions['deleteFiles'],
            DeleteFilesActionHandler(self, self._dialogsFacade))

    def handlerSignals(self):
        return [([
            HandlerSignals.ITEM_CHANGED, HandlerSignals.ITEM_CREATED,
            HandlerSignals.ITEM_DELETED
        ], self.refreshDir)]

    @property
    def repo(self):
        return self._repo

    def setRepo(self, repo):
        self._repo = repo
        if repo is not None:
            self.changeDir(repo.base_path)
            logger.debug("File Browser curr dir has been SET.")
        else:
            self.unsetDir()
            logger.debug("File Browser curr dir has been UNSET.")

    def checkActiveRepoIsNotNone(self):
        if self._repo is None:
            raise CurrentRepoIsNoneError("Current repository is None")

    @property
    def user(self):
        return self._user

    def setUser(self, user):
        self._user = user
        # TODO: update Gui according to the user change

    def checkActiveUserIsNotNone(self):
        if self._user is None:
            raise CurrentUserIsNoneError("Current user is None")

    def enable(self):
        self._enabled = True
        self.refreshDir()
        logger.debug("File Browser enabled.")

    def disable(self):
        self._enabled = False
        logger.debug("File Browser disabled.")

    @property
    def currDir(self):
        if self._currDir is None:
            raise NoneError()
        return self._currDir

    def repoBasePath(self):
        if self._repo is None:
            raise NoneError()
        return self._repo.base_path

    def itemIdsForDir(self, dirAbsPath):
        assert self._repo is not None
        dirRelPath = os.path.relpath(dirAbsPath, self._repo.base_path)
        itemIds = []
        try:
            uow = self._repo.createUnitOfWork()
            cmd = GetItemIdsWithFilesFrom(dirRelPath)
            itemIds = uow.executeCommand(cmd)
        finally:
            uow.close()
        return itemIds

    def listDir(self):
        if self._currDir is None:
            return []
        if self._listCache is None:
            self._rebuildListCache()
        return self._listCache

    def filesCount(self):
        if self._currDir is None:
            return 0
        if self._listCache is None:
            self._rebuildListCache()
        return len(self._listCache)

    def _rebuildListCache(self):
        if not self._enabled:
            self._listCache = []
            return

        def resetGuiTableRows(topRow, bottomRow):
            self._gui.resetTableRows(topRow, bottomRow)
            QtCore.QCoreApplication.processEvents()

        assert self._currDir is not None
        resultDirs = [FileInfo("..", FileInfo.DIR)]
        resultFiles = []
        for fname in os.listdir(self._currDir):
            absPath = os.path.join(self._currDir, fname)
            if os.path.isfile(absPath):
                resultFiles.append(FileInfo(absPath, FileInfo.FILE))
            elif os.path.isdir(absPath):
                resultDirs.append(FileInfo(absPath, FileInfo.DIR))
        self._listCache = resultDirs + resultFiles

        logger.debug(
            "_rebuildListCache is about to start the FileInfoSearcherThread")
        self._thread = FileInfoSearcherThread(self, self._repo,
                                              self._listCache, self._mutex)
        self.connect(
            self._thread, QtCore.SIGNAL("progress"),
            lambda topRow, bottomRow: resetGuiTableRows(topRow, bottomRow))
        self._thread.start()
        #self._thread.run()

    def changeDirUp(self):
        self.changeDir("..")

    def changeRelDir(self, relativeDir):
        absDir = os.path.join(self._currDir, relativeDir)
        absDir = os.path.normpath(absDir)
        self.changeDir(absDir)

    def refreshDir(self):
        if self._currDir is None:
            return
        self.changeDir(self._currDir)

    def changeDir(self, directory):
        if directory == ".":
            directory = self._currDir

        if directory == "..":
            directory, _ = os.path.split(self._currDir)

        if not os.path.exists(directory):
            raise NotExistError(directory + " not exists on the file system.")

        if not helpers.is_internal(directory, self.repoBasePath()):
            raise ValueError(directory + " is outside the repository.")

        if os.path.isfile(directory):
            raise ValueError(directory + " is not a directory but a file.")

        assert os.path.isabs(directory)
        self.__setCurrDir(directory)

    def unsetDir(self):
        self.__setCurrDir(None)

    def __setCurrDir(self, directory):
        if self._thread is not None:
            self._thread.interrupt = True
            self._thread.wait()
        self._currDir = directory
        self._listCache = None
        self._mutex = QtCore.QMutex()
        self._gui.resetTableModel(self._mutex)

    def storeCurrentState(self):
        self._gui.saveColumnsWidth()
        self._gui.saveColumnsVisibility()

    def restoreRecentState(self):
        self._gui.restoreColumnsVisibility()
        self._gui.restoreColumnsWidth()