Exemple #1
0
class DockFolders(QDockWidget, Ui_dock_folders):

    def __init__(self, parent):
        QDockWidget.__init__(self, parent=parent)
        self.setupUi(self)
        self.mw = parent
        #
        self.ed_path.setText(self.mw.cfg.value("root_path", defaultValue=QDir.homePath()))
        self.setupDirModel()
        self.tree.clicked.connect(self.onDirClicked)
        # self.btn_selectdir.clicked.connect(self.onButtonSelectDir)
        self.ed_path.returnPressed.connect(self.setupDirModel)

    def setupDirModel(self):
        """ Show folders on tree view """
        path = self.ed_path.text()
        self.dirModel = QFileSystemModel()
        self.dirModel.setRootPath(path)
        self.dirModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot)
        self.tree.setModel(self.dirModel)
        self.tree.setRootIndex(self.dirModel.index(path))
        self.tree.hideColumn(1)
        self.tree.hideColumn(2)
        self.tree.hideColumn(3)
        self.tree.resizeColumnToContents(0)

    def onDirClicked(self, index):
        path = self.dirModel.fileInfo(index).absoluteFilePath()
        self.mw.loadAlbum(path)
Exemple #2
0
class E5DirCompleter(QCompleter):
    """
    Class implementing a completer for directory names.
    """

    def __init__(self, parent=None, completionMode=QCompleter.PopupCompletion, showHidden=False):
        """
        Constructor
        
        @param parent parent widget of the completer (QWidget)
        @keyparam completionMode completion mode of the
            completer (QCompleter.CompletionMode)
        @keyparam showHidden flag indicating to show hidden entries as well
            (boolean)
        """
        super(E5DirCompleter, self).__init__(parent)
        self.__model = QFileSystemModel(self)
        if showHidden:
            self.__model.setFilter(QDir.Filters(QDir.Drives | QDir.AllDirs | QDir.Hidden))
        else:
            self.__model.setFilter(QDir.Filters(QDir.Drives | QDir.AllDirs))
        self.setModel(self.__model)
        self.setCompletionMode(completionMode)
        if isWindowsPlatform():
            self.setCaseSensitivity(Qt.CaseInsensitive)
        if parent:
            parent.setCompleter(self)
Exemple #3
0
class PangoFileWidget(PangoDockWidget):
    def __init__(self, title, parent=None):
        super().__init__(title, parent)
        self.setFixedWidth(160)

        self.file_model = QFileSystemModel()
        self.file_model.setFilter(QDir.Files | QDir.NoDotAndDotDot)
        self.file_model.setNameFilters(["*.jpg", "*.png"])
        self.file_model.setNameFilterDisables(False)
        self.th_provider = ThumbnailProvider()
        self.file_model.setIconProvider(self.th_provider)

        self.file_view = QListView()
        self.file_view.setModel(self.file_model)
        self.file_view.setViewMode(QListView.IconMode)
        self.file_view.setFlow(QListView.LeftToRight)
        self.file_view.setIconSize(QSize(150, 150))
        
        self.setWidget(self.file_view)

    def select_next_image(self):
        c_idx = self.file_view.currentIndex()
        idx = c_idx.siblingAtRow(c_idx.row()+1)
        if idx.row() != -1:
            self.file_view.setCurrentIndex(idx)

    def select_prev_image(self):
        c_idx = self.file_view.currentIndex()
        idx = c_idx.siblingAtRow(c_idx.row()-1)
        if idx.row() != -1:
            self.file_view.setCurrentIndex(idx)
Exemple #4
0
    def createDockWindows(self):
        dock = QDockWidget("Folders", self)
        dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
        #Code to Create FileView Colums and FolderTree
        self.FileView = QtWidgets.QColumnView()
        self.FileView.setGeometry(QtCore.QRect(240, 10, 291, 281))
        self.FolderTree = QtWidgets.QTreeView()
        self.FolderTree.setGeometry(QtCore.QRect(10, 10, 221, 281))
        FolderTree = self.FolderTree
        #FolderTree.hidecolumn(1),... ?? to show only name column

        #include FolderTree to a Dock at the left side
        dock.setWidget(FolderTree)
        self.addDockWidget(Qt.LeftDockWidgetArea, dock)
        #set the model and rootpath for filling the FolderTree from self.ui
        dirmodel = QFileSystemModel()
        #set filter to show only folders
        dirmodel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs)
        dirmodel.setRootPath(rootpath)
        #filemodel and filter for only files on right side
        filemodel = QFileSystemModel()
        filemodel.setFilter(QDir.NoDotAndDotDot | QDir.Files)
        filemodel.setRootPath(rootpath)
        FolderView = self.FolderTree
        FolderView.setModel(dirmodel)
        FolderView.setRootIndex(dirmodel.index(rootpath))
        FileView = self.FileView
        FileView.setModel(filemodel)
        dock = QDockWidget("Files", self)
        dock.setWidget(FileView)
        self.addDockWidget(Qt.RightDockWidgetArea, dock)

        #important lines for the connection, which does not work
        self.FolderTree.clicked['QModelIndex'].connect(self.setpathonclick)
Exemple #5
0
    def __init__(self, *args, **kwargs):
        super(DirTreeView, self).__init__(*args, **kwargs)

        mdl = QFileSystemModel(parent=self)
        mdl.setFilter(QDir.AllDirs | QDir.Drives | QDir.Hidden
                      | QDir.NoDotAndDotDot)
        self.setModel(mdl)
class FileChooser(QWidget):
    fileOpened = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.folderBox = QComboBox(self)
        self.explorerTree = FileTreeView(self)
        self.explorerTree.doubleClickCallback = self._fileOpened
        self.explorerModel = QFileSystemModel(self)
        self.explorerModel.setFilter(
            QDir.AllDirs | QDir.Files | QDir.NoDotAndDotDot)
        self.explorerModel.setNameFilters(["*.py"])
        self.explorerModel.setNameFilterDisables(False)
        self.explorerTree.setModel(self.explorerModel)
        for index in range(1, self.explorerModel.columnCount()):
            self.explorerTree.hideColumn(index)
        self.setCurrentFolder()
        self.folderBox.currentIndexChanged[int].connect(
            self.updateCurrentFolder)

        layout = QVBoxLayout(self)
        layout.addWidget(self.folderBox)
        layout.addWidget(self.explorerTree)
        layout.setContentsMargins(5, 5, 0, 0)

    def _fileOpened(self, modelIndex):
        path = self.explorerModel.filePath(modelIndex)
        if os.path.isfile(path):
            self.fileOpened.emit(path)

    def currentFolder(self):
        return self.explorerModel.rootPath()

    def setCurrentFolder(self, path=None):
        if path is None:
            app = QApplication.instance()
            path = app.getScriptsDirectory()
        else:
            assert os.path.isdir(path)
        self.explorerModel.setRootPath(path)
        self.explorerTree.setRootIndex(self.explorerModel.index(path))
        self.folderBox.blockSignals(True)
        self.folderBox.clear()
        style = self.style()
        dirIcon = style.standardIcon(style.SP_DirIcon)
        self.folderBox.addItem(dirIcon, os.path.basename(path))
        self.folderBox.insertSeparator(1)
        self.folderBox.addItem(self.tr("Browse…"))
        self.folderBox.setCurrentIndex(0)
        self.folderBox.blockSignals(False)

    def updateCurrentFolder(self, index):
        if index < self.folderBox.count() - 1:
            return
        path = QFileDialog.getExistingDirectory(
            self, self.tr("Choose Directory"), self.currentFolder(),
            QFileDialog.ShowDirsOnly)
        if path:
            QSettings().setValue("scripting/path", path)
            self.setCurrentFolder(path)
Exemple #7
0
class MyGridFilesWidget(QWidget):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        start_dir = QStringListModel()
        start_dir = 'C:/ROBOCZY'

        self.model = QFileSystemModel()
        self.model.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot
                             | QDir.AllEntries)
        self.model.setNameFilters()
        self.model.setNameFilterDisables(0)
        #self.model.setRootPath(start_dir)

        #self.model.setRootPath(start_dir)
        self.tree = QTreeView()
        self.tree.setRootIndex(self.model.index(start_dir))
        self.tree.setModel(self.model)

        self.tree.setAnimated(False)
        self.tree.setIndentation(20)
        self.tree.setSortingEnabled(True)

        self.tree.setWindowTitle("Dir View")
        self.tree.resize(640, 480)

        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.tree)
        self.setLayout(windowLayout)
class E5DirCompleter(QCompleter):
    """
    Class implementing a completer for directory names.
    """
    def __init__(self, parent=None,
                 completionMode=QCompleter.PopupCompletion,
                 showHidden=False):
        """
        Constructor
        
        @param parent parent widget of the completer (QWidget)
        @keyparam completionMode completion mode of the
            completer (QCompleter.CompletionMode)
        @keyparam showHidden flag indicating to show hidden entries as well
            (boolean)
        """
        super(E5DirCompleter, self).__init__(parent)
        self.__model = QFileSystemModel(self)
        if showHidden:
            self.__model.setFilter(
                QDir.Filters(QDir.Drives | QDir.AllDirs | QDir.Hidden))
        else:
            self.__model.setFilter(
                QDir.Filters(QDir.Drives | QDir.AllDirs))
        self.setModel(self.__model)
        self.setCompletionMode(completionMode)
        if isWindowsPlatform():
            self.setCaseSensitivity(Qt.CaseInsensitive)
        if parent:
            parent.setCompleter(self)
class FileTree(QWidget):

    def __init__(self, defaultfolder=r'c:\Zen_Output'):
        super(QWidget, self).__init__()

        filter = ['*.czi', '*.ome.tiff', '*ome.tif' '*.tiff' '*.tif']

        # define the style for the FileTree via s style sheet
        self.setStyleSheet("""
            QTreeView::item {
            background-color: rgb(38, 41, 48);
            font-weight: bold;
            }

            QTreeView::item::selected {
            background-color: rgb(38, 41, 48);
            color: rgb(0, 255, 0);

            }

            QTreeView QHeaderView:section {
            background-color: rgb(38, 41, 48);
            color: rgb(255, 255, 255);
            }
            """)

        self.model = QFileSystemModel()
        self.model.setRootPath(defaultfolder)
        self.model.setFilter(QtCore.QDir.AllDirs | QDir.Files | QtCore.QDir.NoDotAndDotDot)
        self.model.setNameFilterDisables(False)
        self.model.setNameFilters(filter)

        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index(defaultfolder))
        self.tree.setAnimated(True)
        self.tree.setIndentation(20)
        self.tree.setSortingEnabled(False)
        header = self.tree.header()
        header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)

        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.tree)
        self.setLayout(windowLayout)

        self.tree.clicked.connect(self.on_treeView_clicked)

    @pyqtSlot()
    def on_treeView_clicked(self, index):
        indexItem = self.model.index(index.row(), 0, index.parent())
        filename = self.model.fileName(indexItem)
        filepath = self.model.filePath(indexItem)

        # open the file when clicked
        print('Opening ImageFile : ', filepath)
        open_image_stack(filepath)
Exemple #10
0
class E5FileCompleter(QCompleter):
    """
    Class implementing a completer for file names.
    """
    def __init__(self,
                 parent=None,
                 completionMode=QCompleter.PopupCompletion,
                 showHidden=False):
        """
        Constructor
        
        @param parent parent widget of the completer (QWidget)
        @keyparam completionMode completion mode of the
            completer (QCompleter.CompletionMode)
        @keyparam showHidden flag indicating to show hidden entries as well
            (boolean)
        """
        super(E5FileCompleter, self).__init__(parent)
        self.__model = QFileSystemModel(self)
        if showHidden:
            self.__model.setFilter(
                QDir.Filters(QDir.Dirs | QDir.Files | QDir.Drives
                             | QDir.AllDirs | QDir.Hidden))
        else:
            self.__model.setFilter(
                QDir.Filters(QDir.Dirs | QDir.Files | QDir.Drives
                             | QDir.AllDirs))
        self.__model.setRootPath("")
        self.setModel(self.__model)
        self.setCompletionMode(completionMode)
        if isWindowsPlatform():
            self.setCaseSensitivity(Qt.CaseInsensitive)
        if parent:
            parent.setCompleter(self)

    def setRootPath(self, path):
        """
        Public method to set the root path of the model.
        
        @param path root path for the model
        @type str
        """
        if not os.path.isdir(path):
            path = os.path.dirname(path)
        self.__model.setRootPath(path)

    def rootPath(self):
        """
        Public method to get the root path of the model.
        
        @return root path of the model
        @rtype str
        """
        return self.__model.rootPath()
Exemple #11
0
    def __init__(self, *args, **kwargs):
        super(DirLineEdit, self).__init__(*args, **kwargs)
        completer = QCompleter()
        completer.setCompletionMode(QCompleter.CompletionMode.PopupCompletion)

        model = QFileSystemModel()
        model.setRootPath('/')
        model.setFilter(QDir.Filter.AllEntries | QDir.Filter.NoDotAndDotDot
                        | QDir.Filter.Hidden)
        completer.setModel(model)

        self.setCompleter(completer)
Exemple #12
0
class E5FileCompleter(QCompleter):
    """
    Class implementing a completer for file names.
    """
    def __init__(self, parent=None,
                 completionMode=QCompleter.PopupCompletion,
                 showHidden=False):
        """
        Constructor
        
        @param parent parent widget of the completer (QWidget)
        @keyparam completionMode completion mode of the
            completer (QCompleter.CompletionMode)
        @keyparam showHidden flag indicating to show hidden entries as well
            (boolean)
        """
        super(E5FileCompleter, self).__init__(parent)
        self.__model = QFileSystemModel(self)
        if showHidden:
            self.__model.setFilter(
                QDir.Filters(QDir.Dirs | QDir.Files | QDir.Drives |
                             QDir.AllDirs | QDir.Hidden))
        else:
            self.__model.setFilter(QDir.Filters(
                QDir.Dirs | QDir.Files | QDir.Drives | QDir.AllDirs))
        self.__model.directoryLoaded.connect(self.complete)
        self.__model.setRootPath("")
        self.setModel(self.__model)
        self.setCompletionMode(completionMode)
        if isWindowsPlatform():
            self.setCaseSensitivity(Qt.CaseInsensitive)
        if parent:
            parent.setCompleter(self)
    
    def setRootPath(self, path):
        """
        Public method to set the root path of the model.
        
        @param path root path for the model
        @type str
        """
        if not os.path.isdir(path):
            path = os.path.dirname(path)
        self.__model.setRootPath(path)
    
    def rootPath(self):
        """
        Public method to get the root path of the model.
        
        @return root path of the model
        @rtype str
        """
        return self.__model.rootPath()
Exemple #13
0
class DirectoryTree(QWidget):
    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 file system view'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 480
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.model = QFileSystemModel()
        self.model.setRootPath(QDir.rootPath())
        self.model.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot)
        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.hideColumn(1)
        self.tree.hideColumn(2)
        self.tree.hideColumn(3)

        self.tree.setAnimated(False)
        self.tree.setIndentation(20)
        self.tree.setSortingEnabled(True)

        self.tree.setWindowTitle("Dir View")
        self.tree.resize(640, 480)

        self.fileModel = QFileSystemModel()
        self.fileModel.setRootPath(QDir.rootPath())
        self.list = QTableView()
        self.list.setModel(self.fileModel)
        self.list.setShowGrid(False)
        self.list.verticalHeader().setVisible(False)
        self.list.setSelectionBehavior(QTableView().SelectRows)

        self.tree.clicked.connect(self.onClicked)

        windowLayout = QHBoxLayout()
        windowLayout.addWidget(self.tree)
        windowLayout.addWidget(self.list)
        self.setLayout(windowLayout)

        self.show()

    def onClicked(self, index):
        path = self.model.fileInfo(index).absoluteFilePath()
        self.list.setRootIndex(self.fileModel.setRootPath(path))
Exemple #14
0
def setup_file_view(view, encoded):
    d = path.join(getcwd(), 'docs')
    fs_model = QFileSystemModel(view)
    fs_model.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs | QDir.AllEntries)
    fs_model.setRootPath(d)
    model = SortFilterModel(encoded)
    model.setSourceModel(fs_model)
    view.setModel(model)
    view.setRootIndex(model.mapFromSource(fs_model.index(d)))
    view.setColumnHidden(2, True)
    view.sortByColumn(0, Qt.AscendingOrder)
    for i in range(0, 3):
        view.header().setSectionResizeMode(i, QHeaderView.ResizeToContents)
    return fs_model, model
    def __init__(self, *args, filename=None, delimiter=None, **kwargs):
        super().__init__(*args, **kwargs)

        self.setupUi(self)

        self._dialog = None
        self._workers = WorkerQueue(self, ProgressDialog(self))
        self._column_index = -1

        # Set completer for input files
        completer = QCompleter(self.editMetadataFile)
        if sys.platform.startswith('win'):
            completer.setCaseSensitivity(Qt.CaseInsensitive)
        model = QFileSystemModel(completer)
        model.setFilter(QDir.AllDirs | QDir.Files | QDir.NoDotAndDotDot)
        model.setRootPath(QDir.currentPath())
        completer.setModel(model)
        self.editMetadataFile.setCompleter(completer)

        # Create palette used when validating input files
        self._error_palette = QPalette()
        self._error_palette.setColor(QPalette.Base,
                                     QColor(Qt.red).lighter(150))

        # Connect Delimiter ComboBox to delimiter LineEdit
        self.cbCsvDelimiter.setOtherEditWidget(self.editCsvDelimiter)

        # Connect events
        self.btBrowseMetadataFile.clicked.connect(self.browse)
        self.chkComment.clicked.connect(
            lambda: self.editComment.setEnabled(self.chkComment.isChecked()))
        self.editMetadataFile.textChanged.connect(
            self.on_metadata_file_changed)
        self.cbCsvDelimiter.delimiterChanged.connect(self.populate_table)
        self.chkUseFirstLineAsHeader.clicked.connect(self.populate_table)
        self.spinSkipRows.valueChanged.connect(self.populate_table)
        self.editComment.textChanged.connect(self.populate_table)
        self.chkComment.clicked.connect(self.populate_table)
        self.btRefresh.clicked.connect(self.populate_table)
        self.chkComment.clicked.connect(self.populate_table)
        self.btSelectAll.clicked.connect(self.twMetadata.selectAll)
        self.btSelectNone.clicked.connect(self.twMetadata.clearSelection)
        self.btSelectInvert.clicked.connect(self.invert_selection)
        self.cbIndexColumn.currentIndexChanged.connect(
            self.on_column_index_changed)

        if filename is not None:
            self.editMetadataFile.setText(filename)
Exemple #16
0
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setupUi(self)

        self._dialog = None
        self._workers = WorkerQueue(self, ProgressDialog(self))

        super().__init__(*args, **kwargs)

        self.setupUi(self)

        self._dialog = None

        # Set completer for output files
        completer = QCompleter(self.editExportFile)
        if sys.platform.startswith('win'):
            completer.setCaseSensitivity(Qt.CaseInsensitive)
        model = QFileSystemModel(completer)
        model.setFilter(QDir.AllDirs | QDir.Files | QDir.NoDotAndDotDot)
        model.setRootPath(QDir.currentPath())
        completer.setModel(model)
        self.editExportFile.setCompleter(completer)

        # Create palette used when validating input files
        self._error_palette = QPalette()
        self._error_palette.setColor(QPalette.Base,
                                     QColor(Qt.red).lighter(150))

        self.cbFieldSeparator.setOtherEditWidget(self.editFieldSeparator)
        self.cbFieldSeparator.setCurrentText("Semicolon (;)")

        # Connect events
        self.btBrowseExportFile.clicked.connect(self.browse)
        self.btSelectAllStandards.clicked.connect(
            lambda: self.select(self.lstStandards, 'all'))
        self.btSelectNodeStandards.clicked.connect(
            lambda: self.select(self.lstStandards, 'none'))
        self.btInvertSelectionStandards.clicked.connect(
            lambda: self.select(self.lstStandards, 'invert'))
        self.btSelectAllAnalogs.clicked.connect(
            lambda: self.select(self.lstAnalogs, 'all'))
        self.btSelectNodeAnalogs.clicked.connect(
            lambda: self.select(self.lstAnalogs, 'none'))
        self.btInvertSelectionAnalogs.clicked.connect(
            lambda: self.select(self.lstAnalogs, 'invert'))
        self.editExportFile.textChanged.connect(self.validate_export_filename)
        self.editFieldSeparator.textChanged.connect(self.validate_separator)
Exemple #17
0
class FolderContents(QWidget):
    def __init__(self, editor):
        super().__init__(editor)
        self.editor = editor
        self.layout = QHBoxLayout()
        self.setLayout(self.layout)
        self.tView = QTreeView()
        self.createFileExplorer()

    def createFileExplorer(self):
        self.dirModel = QFileSystemModel()
        # self.fileModel = QFileSystemModel()
        # self.fmDialog = QDialog()

        # self.dirModel.setFilter()
        self.root = self.dirModel.setRootPath(QDir.homePath())
        self.dirModel.setFilter(QDir.NoDot | QDir.AllEntries)
        # self.dirModel.setFilter(QDir.AllDirs)
        self.tView.setModel(self.dirModel)
        self.layout.addWidget(self.tView)
        self.tView.setRootIndex(self.root)
        self.tView.doubleClicked.connect(self.clickAction)
        self.subdirs = 0
        self.current_dir = QDir.homePath()

    def clickAction(self, index):
        if index.data() == '..':
            if self.subdirs > 0:
                self.current_dir = self.current_dir.rsplit('/', 1)[0]
                self.tView.setRootIndex(
                    self.dirModel.setRootPath(self.current_dir))
                self.subdirs -= 1
            # print(QDir(index.parent()).absoluteFilePath())
            # self.dirModel.setRootPath(QDir(index.parent()).absolutePath())
        elif self.dirModel.fileInfo(index).isDir():
            self.subdirs += 1
            self.current_dir = self.current_dir + '/' + str(index.data())
            self.tView.setRootIndex(index)
        elif self.dirModel.fileInfo(index).isFile():
            extension = index.data().rsplit('.', 1)[1]
            if extension == 'nc' or extension == 'nc4':
                subprocess.call('ncview ' + self.current_dir + '/' +
                                index.data(),
                                shell=True)
            elif extension == 'ncl':
                self.editor.AddTab(self.current_dir + '/' + index.data())
Exemple #18
0
class CommanderFileManager(object):
    """docstring for FileManager"""
    def __init__(self):

        self.files_tree_model = QFileSystemModel()
        self.set_filter()
        self.files_tree_model.setRootPath(os.path.abspath(__file__))
        self._file = None

    def set_filter(self, filter_list=['*.lua']):
        self.files_tree_model.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot | QDir.AllEntries)
        self.files_tree_model.setNameFilters(filter_list)
        self.files_tree_model.setNameFilterDisables(0)

    def get_path(self, index):
        return self.files_tree_model.filePath(index)

    def open(self, path):
        try:
            with open(path, 'rt') as f:
                text = f.read()
                self._file = path
                return text
        except Exception as e:
            print(e)
        return None

    def save(self, fp, text):
        """ save file document """
        try:
            with open(fp, 'wt') as f:
                f.write(text)
        except Exception as e:
            return False

        return True

    @property
    def file(self):
        return self._file
    @file.setter
    def file(self, f):
        self._file = f
 def open_project(self, project):
     project_path = project.path
     qfsm = None  # Should end up having a QFileSystemModel
     if project_path not in self.__projects:
         qfsm = QFileSystemModel()
         project.model = qfsm
         qfsm.setRootPath(project_path)
         qfsm.setFilter(QDir.AllDirs | QDir.Files | QDir.NoDotAndDotDot)
         # If set to true items that dont match are displayed disabled
         qfsm.setNameFilterDisables(False)
         pext = ["*{0}".format(x) for x in project.extensions]
         logger.debug(pext)
         qfsm.setNameFilters(pext)
         self.__projects[project_path] = project
         self.__check_files_for(project_path)
         self.projectOpened.emit(project_path)
     else:
         qfsm = self.__projects[project_path]
     return qfsm
Exemple #20
0
class AssetBrowser(QMainWindow, Ui_MainWindow):
    asset_clicked = pyqtSignal(str, str, name='assetClicked')

    def __init__(self):
        super(AssetBrowser, self).__init__()
        self.setupUi(self)

        self.dir_model = QFileSystemModel()
        self.dir_model.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs)
        self.dir_model.setReadOnly(False)

        self.dir_view.setModel(self.dir_model)
        self.dir_view.hideColumn(1)
        self.dir_view.hideColumn(2)
        self.dir_view.hideColumn(3)

        self.file_model = QFileSystemModel()
        self.file_model.setFilter(QDir.NoDotAndDotDot | QDir.Files)
        self.file_model.setReadOnly(False)

        self.file_view.setModel(self.file_model)

    def open_project(self, project_dir):
        path = os.path.join(project_dir)

        self.dir_model.setRootPath(path)
        self.file_model.setRootPath(path)

        self.dir_view.setRootIndex(self.dir_model.index(path))
        self.file_view.setRootIndex(self.file_model.index(path))

    def dir_clicked(self, idx):
        path = self.dir_model.fileInfo(idx).absoluteFilePath()

        self.file_view.setRootIndex(self.file_model.setRootPath(path))

    def file_doubleclicked(self, idx):
        fileinfo = self.file_model.fileInfo(idx)

        path = fileinfo.absoluteFilePath()
        ext = fileinfo.suffix()

        self.asset_clicked.emit(path, ext)
Exemple #21
0
 def open_project(self, project):
     project_path = project.path
     qfsm = None  # Should end up having a QFileSystemModel
     if project_path not in self.__projects:
         qfsm = QFileSystemModel()
         project.model = qfsm
         qfsm.setRootPath(project_path)
         qfsm.setFilter(QDir.AllDirs | QDir.Files | QDir.NoDotAndDotDot)
         # If set to true items that dont match are displayed disabled
         qfsm.setNameFilterDisables(False)
         pext = ["*{0}".format(x) for x in project.extensions]
         logger.debug(pext)
         qfsm.setNameFilters(pext)
         self.__projects[project_path] = project
         self.__check_files_for(project_path)
         self.projectOpened.emit(project_path)
     else:
         qfsm = self.__projects[project_path]
     return qfsm
    def load_tree(self, project):
        """Load the tree view on the right based on the project selected."""
        qfsm = QFileSystemModel()
        qfsm.setRootPath(project.path)
        load_index = qfsm.index(qfsm.rootPath())
        qfsm.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot)
        qfsm.setNameFilterDisables(False)
        pext = ["*{0}".format(x) for x in project.extensions]
        qfsm.setNameFilters(pext)

        self._tree.setModel(qfsm)
        self._tree.setRootIndex(load_index)

        t_header = self._tree.header()
        t_header.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
        t_header.setSectionResizeMode(0, QHeaderView.Stretch)
        t_header.setStretchLastSection(False)
        t_header.setClickable(True)

        self._tree.hideColumn(1)  # Size
        self._tree.hideColumn(2)  # Type
        self._tree.hideColumn(3)  # Modification date
Exemple #23
0
    def load_tree(self, project):
        """Load the tree view on the right based on the project selected."""
        qfsm = QFileSystemModel()
        qfsm.setRootPath(project.path)
        load_index = qfsm.index(qfsm.rootPath())
        qfsm.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot)
        qfsm.setNameFilterDisables(False)
        pext = ["*{0}".format(x) for x in project.extensions]
        qfsm.setNameFilters(pext)

        self._tree.setModel(qfsm)
        self._tree.setRootIndex(load_index)

        t_header = self._tree.header()
        t_header.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
        t_header.setSectionResizeMode(0, QHeaderView.Stretch)
        t_header.setStretchLastSection(False)
        t_header.setSectionsClickable(True)

        self._tree.hideColumn(1)  # Size
        self._tree.hideColumn(2)  # Type
        self._tree.hideColumn(3)  # Modification date
Exemple #24
0
    def setupModel(self):
        self.list_view_imported_symbols.setModel(
            self._parent_controller.get_instruments_model())

        fileName = "G:/Programming/Projects/QtStatisticCalculator/^spx_y_test.csv"
        name = AkFunctions.getShortName(fileName)
        headers, data = AkFunctions.loadCSV(fileName)
        xPeriod = AkPeriod(1, data, headers=headers)

        #instrument = AkInstrument(name, [xPeriod])

        analysis_list = [
            AkAnalysisType.Calendar, AkAnalysisType.Period,
            AkAnalysisType.Series
        ]
        instrument_ = AkInstrument(name,
                                   sources=[data],
                                   analysis_types=analysis_list,
                                   method=AkSelectionMethod.CC,
                                   precision=3)

        self._parent_controller.get_instruments_model().insertRows(
            0, len([instrument_]), [instrument_])

        fileSystemModel = QFileSystemModel()
        fileSystemModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot
                                  | QDir.AllEntries)

        filters = ["*.csv"]
        fileSystemModel.setNameFilters(filters)
        fileSystemModel.setNameFilterDisables(False)

        fileSystemModel.setRootPath(QDir.currentPath())

        self.tree_view_windows_files.setModel(fileSystemModel)
        self.tree_view_windows_files.hideColumn(1)
        self.tree_view_windows_files.hideColumn(2)
        self.tree_view_windows_files.hideColumn(3)
    def __init__(self, win):
        Ui_MainWindow.__init__(self)
        self.window = win
        self.setupUi(win)

        qfs = QFileSystemModel(self.treeView)
        exclude = ExcludeSomeNamesModel()
        exclude.setSourceModel(qfs)
        self.treeView.setModel(exclude)

        qfs.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot | QDir.Files)

        if sys.platform == 'darwin':
            qfs.setRootPath("/Volumes")
            self.treeView.setRootIndex(
                exclude.mapFromSource(qfs.index("/Volumes")))
        elif sys.platform == 'win32':
            qfs.setRootPath("\\")
            self.treeView.setRootIndex(exclude.mapFromSource(qfs.index("\\")))
        else:
            raise UnsupportedPlatform(sys.platform)

        self.treeView.doubleClicked.connect(self.volumeDoubleClicked)

        self.qfs = qfs
        self.exclude = exclude

        self.treeView.setSortingEnabled(True)
        self.treeView.setColumnWidth(0, 300)
        self.treeView.setItemsExpandable(False)
        self.treeView.setRootIsDecorated(False)

        self.openFileButton.clicked.connect(self.openFileButtonClicked)
        self.aboutButton.clicked.connect(self.aboutButtonClicked)

        for elem in range(1, 4):
            self.treeView.hideColumn(elem)
Exemple #26
0
class MainWindow(QMainWindow):
    def __init__(self, parent=None):

        super(MainWindow, self).__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        path = QDir.currentPath()

        self.browser_model = QFileSystemModel()
        self.browser_model.setRootPath(path)
        self.browser_model.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs)

        self.ui.browser.setModel(self.browser_model)

        self.details_model = QFileSystemModel()
        self.details_model.setRootPath(path)
        self.details_model.setFilter(QDir.NoDotAndDotDot | QDir.AllEntries)

        self.ui.details.setModel(self.details_model)

        column_count = self.browser_model.columnCount()
        for i in range(1, column_count):
            self.ui.browser.hideColumn(i)

        self.setupUi()

    def setupUi(self):
        self.ui.browser.clicked.connect(self.browser_clicked)

    def browser_clicked(self, index):

        file_info = self.browser_model.fileInfo(index)
        path = file_info.absoluteFilePath()
        self.ui.details.setRootIndex(self.details_model.setRootPath(path))
Exemple #27
0
class miFormulario(QMainWindow,QDialog):
    path=''
    enPlay2={}
    enDirectorio=[]
    
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self,parent)
        self.ui=Ui_MainWindow()
        self.ui.setupUi(self)
        
        
        self.ui.btnNuevaCancion.clicked.connect(self.nuevaCancion)
        self.ui.btnAgregarSet.clicked.connect(self.agregar_a_play)
        self.ui.listaCanciones.doubleClicked.connect(self.agregar_a_play)
        self.ui.btnQuitarSet.clicked.connect(self.borrarItemListaPlay)
        self.ui.btnPlay.clicked.connect(self.abrirCancion)
        self.ui.listaPlay.doubleClicked.connect(self.abrirCancion)
        self.ui.btnGuardarCancion.clicked.connect(self.guardarCambios)
        self.ui.btnSubir.clicked.connect(self.transportarArriba)
        self.ui.btnBajar.clicked.connect(self.transportarAbajo)
        self.ui.btnExportarPDF.clicked.connect(self.exportarPDF)
        self.ui.btnGuardarSet.clicked.connect(self.guardarSet)
        self.ui.btnCargarSet.clicked.connect(self.cargarLista)
        self.ui.btnAbrirDirectorio.clicked.connect(self.abrirBrwserCarpetas)
        self.ui.btnAbrirCancion.clicked.connect(self.abrirUnaCancion)
        
    def abrirBrwserCarpetas(self):
        self.ventana=QtWidgets.QDialog()
        self.ui2=Ui_Directorio()
        self.ui2.setupUi(self.ventana)
        self.ventana.show()
        
        homedir = os.path.expanduser("~")
        
        self.model = QFileSystemModel()
        self.model.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs | QtCore.QDir.NoSymLinks)
        self.model.setRootPath(QtCore.QDir.rootPath())
        self.tree = self.ui2.vistaDirectorio
        self.tree.setModel(self.model)  
        self.tree.setRootIndex(self.model.index(homedir))
        
        self.ui2.btnAbrirCarpeta.clicked.connect(self.rutaCarpeta)
        self.ui2.btnCancelarBrowser.clicked.connect(self.cerrarBrowser)
        
    def rutaCarpeta(self):
        index=self.ui2.vistaDirectorio.currentIndex()
        self.path=self.model.filePath(index)
        self.abrirDirectorio()
    
    def cerrarBrowser(self):
        self.ventana.close()    
                
    def closeEvent(self, event):        
        respuesta = QMessageBox.question(self, 'Cerra Aplicación',
            "Está seguro que quiere cerrar la aplicación", QMessageBox.Yes | 
            QMessageBox.No, QMessageBox.No)
        if respuesta == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()
            
    def abrirDirectorio(self):
        self.enDirectorio=[] 
        self.ui.listaCanciones.clear()
        files=[]
        for r, d, f in os.walk(self.path): #@UnusedVariable
            for file in f:               
                if file[-4:]=='.cec':
                    files.append(file)
                    self.enDirectorio.append((r+'/'+file))
        for f in files:
            self.ui.listaCanciones.addItem(f.strip('.cec'))
        if files!=[]:            
            self.cerrarBrowser()
        if files==[]:
            QMessageBox.information(self, 'Error', 'Esta carpeta no contiene canciones para abrir')
            
    def abrirUnaCancion(self):
        try:
            homedir = os.path.expanduser("~")
            ruta=homedir+'\Desktop'
            path,_=QFileDialog.getOpenFileName(self, 'Seleccionar Canción', ruta)
            nombre=QFileInfo(path).fileName()
            if path[-4:]=='.cec':
                self.enDirectorio.append(path)
                self.ui.listaCanciones.addItem(nombre.strip('.cec'))
        except:
            pass
            
    def nuevaCancion(self):
        self.ui.cancionTE.clear()
        self.ui.cancionTE2.clear()
        self.ui.cancionTE.setPlaceholderText('''Escribir o pegar la cancion que desee guardar aquí 
recuerde que los reglones de las notas deben comensar con un punto (.) en el margen izquierdo 
y las tono principal deben estar en mayúscula y el resto del acorde en minúsculas.

Ej:

                TITULO  (si lo desea)
                AUTOR  (si lo desea)
                
ALGUNA OBSERVACIÓN (si lo desea)

INTRO:
.A   Dm    G#

.C                      G                   Ebm
 Mi corazón confiado está por que yo te conozco
 
.      Emaj7            F#                Gm/D
 Y en medio de la tempestad nunca estoy solo ''')   
             
    def agregar_a_play(self):
        try:
            fila=self.ui.listaCanciones.currentRow()
            lista=self.ui.listaCanciones.selectedItems()
            for l in lista: 
                self.enPlay2[l.text()]=self.enDirectorio[fila]+'\n' 
                self.ui.listaPlay.addItem(l.text())
        except:
            QMessageBox.information(self, 'Error','Error al cargar a Play List')
            
    def borrarItemListaPlay(self):
        try: 
            lista=self.ui.listaPlay.selectedItems()       
            self.ui.listaPlay.takeItem(self.ui.listaPlay.currentRow())   
            for l in lista:
                del self.enPlay2[l.text()]
        except:
            QMessageBox.information(self, 'Quitar', 'No hay nada para quitar')
        
    def abrirCancion(self):
        try:
            self.ui.cancionTE.clear()
            self.ui.cancionTE2.clear()
            lista=self.ui.listaPlay.selectedItems()
            for l in lista:
                file_text=abrirCancionSeleccionada(self.enPlay2[l.text()].strip('\n'))
            self.abrirConFormato(file_text)
            
            
        except:
            QMessageBox.information(self, 'Error', 'Verifique que la canción no se haya movido de carpeta')
            
    def guardarCambios(self):
        homedir = os.path.expanduser("~")
        ruta=homedir+'\Desktop'
        try:
            texto2 = self.ui.cancionTE.toPlainText()
            self.ui.cancionTE.clear()
            escribirCrearArchivo(texto2)
            file_text=abrirAuxiliar()

            for f in file_text:
                if f[0]=='.':                     
                    self.ui.cancionTE.setTextColor(QtGui.QColor("blue"))
                    self.ui.cancionTE.setFontWeight(QtGui.QFont.Bold)
                    self.ui.cancionTE.setFontPointSize(10)
                    self.ui.cancionTE.append(f.strip('\n'))
                if f[0]!='.':
                    if f[0]!=' ':
                        self.ui.cancionTE.setTextColor(QtGui.QColor("black"))
                        self.ui.cancionTE.setFontWeight(QtGui.QFont.Bold)
                        self.ui.cancionTE.setFontPointSize(10)                            
                        self.ui.cancionTE.append(' '+f.strip('\n'))
                    if f[0]==' ':
                        self.ui.cancionTE.setTextColor(QtGui.QColor("black"))
                        self.ui.cancionTE.setFontWeight(QtGui.QFont.Bold)
                        self.ui.cancionTE.setFontPointSize(10)                            
                        self.ui.cancionTE.append(f.strip('\n'))
            
            filename, _ = QFileDialog.getSaveFileName(self, 'Save File', ruta)
            if filename !='':
                if QFileInfo(filename).suffix() == '':
                    filename += '.cec'
            f=open(filename, 'w')
            texto = self.ui.cancionTE.toPlainText()+'\n'+self.ui.cancionTE2.toPlainText()            
            f.write(texto)            
            f.close()            
        except:
            pass
        
    def transportarArriba(self): 
        try:       
            cancion=abrirAuxiliar()
            self.ui.cancionTE.clear()
            self.ui.cancionTE2.clear()
            nuevaCancion=transportarMedioArriba(cancion)
            self.abrirConFormato(nuevaCancion)
        except:
            QMessageBox.information(self, 'Error','Debe guardar la canción primero o No hay nada para transportar')

    def transportarAbajo(self):
        try:        
            cancion=abrirAuxiliar()
            self.ui.cancionTE.clear()
            self.ui.cancionTE2.clear()
            nuevaCancion=transportarMedioAbajo(cancion)
            self.abrirConFormato(nuevaCancion)
        except:
            QMessageBox.information(self, 'Error','Debe guardar la canción primero o No hay nada para transportar')
                    
    def exportarPDF(self):
        try:
            self.ui.cancionTE2.clear()
            file_text=abrirAuxiliar()
            for f in file_text:
                if f[0]=='.':                     
                    self.ui.cancionTE2.setTextColor(QtGui.QColor("blue"))
                    self.ui.cancionTE2.setFontWeight(QtGui.QFont.Bold)
                    self.ui.cancionTE2.setFontPointSize(10)
                    self.ui.cancionTE2.append(f.strip('\n'))
                if f[0]!='.':
                    self.ui.cancionTE2.setTextColor(QtGui.QColor("black"))
                    self.ui.cancionTE2.setFontWeight(QtGui.QFont.Bold)
                    self.ui.cancionTE2.setFontPointSize(10)                            
                    self.ui.cancionTE2.append(f.strip('\n'))
        except:
            pass
        try:
            filename, _ = QFileDialog.getSaveFileName(self, 'Exportar a PDF', None, 'PDF files (.pdf) ;; All Files()')
            if filename !='':
                if QFileInfo(filename).suffix() == '':
                    filename += '.pdf'
                printer = QPrinter(QPrinter.HighResolution)
                printer.setOutputFormat(QPrinter.PdfFormat)
                printer.setOutputFileName(filename)
                self.ui.cancionTE2.document().print_(printer)
    
            self.ui.cancionTE.clear()
            self.ui.cancionTE2.clear()
            file_text=abrirAuxiliar()
            self.abrirConFormato(file_text)
        except:
            pass
        
    def guardarSet(self):
        homedir = os.path.expanduser("~")
        ruta=homedir+'\Desktop'
        try:
            enPlay={}
            for i in range(self.ui.listaPlay.count()):
                enPlay[self.ui.listaPlay.item(i).text()]=self.enPlay2[self.ui.listaPlay.item(i).text()]
            filename, _ = QFileDialog.getSaveFileName(self, 'Guardar Lista', ruta)
            if filename !='':
                if QFileInfo(filename).suffix() == '':
                    filename += '.lec'
            f=open(filename,'w')
            f.writelines(str(enPlay))
            f.close()
            
        except:
            QMessageBox.information(self, 'Error','Error al Guardar Set') 
            
    def cargarLista(self):
        homedir = os.path.expanduser("~")
        ruta=homedir+'\Desktop'
        try:            
            self.ui.listaPlay.clear()
            self.enPlay2={}
            filename, _ = QFileDialog.getOpenFileName(self, 'Abrir Lista', ruta)
            f=open(filename, 'r')
            file_text =f.readlines()            
            for ft in file_text:
                self.enPlay2=eval(ft)
            for key in self.enPlay2.keys():
                self.ui.listaPlay.addItem(key)  
        except:
            QMessageBox.information(self, 'Error','Error al cargar Lista')
            
    def abrirConFormato(self,file_text):
        count=0
        for f in file_text:
            count+=1
            if count<40:
                if f[0]=='.':                     
                    self.ui.cancionTE.setTextColor(QtGui.QColor("blue"))
                    self.ui.cancionTE.setFontWeight(QtGui.QFont.Bold)
                    self.ui.cancionTE.setFontPointSize(10)
                    self.ui.cancionTE.append(f.strip('\n'))
                if f[0]!='.':
                    self.ui.cancionTE.setTextColor(QtGui.QColor("black"))
                    self.ui.cancionTE.setFontWeight(QtGui.QFont.Bold)
                    self.ui.cancionTE.setFontPointSize(10)                            
                    self.ui.cancionTE.append(f.strip('\n'))
            if count>=40:
                if f[0]=='.':                     
                    self.ui.cancionTE2.setTextColor(QtGui.QColor("blue"))
                    self.ui.cancionTE2.setFontWeight(QtGui.QFont.Bold)
                    self.ui.cancionTE2.setFontPointSize(10)
                    self.ui.cancionTE2.append(f.strip('\n'))
                if f[0]!='.':
                    self.ui.cancionTE2.setTextColor(QtGui.QColor("black"))
                    self.ui.cancionTE2.setFontWeight(QtGui.QFont.Bold)
                    self.ui.cancionTE2.setFontPointSize(10)                            
                    self.ui.cancionTE2.append(f.strip('\n'))
        #posicionar cursor arriba
        cursor = QTextCursor(self.ui.cancionTE2.document())
        cursor.setPosition(0)
        self.ui.cancionTE2.setTextCursor(cursor)
Exemple #28
0
class Win(QMainWindow):
	def __init__(self, options):
		super(Win, self).__init__()

		self.db = dbtag.Db()
		self.db.open(options.db)
		self.db.create_tables()
		self.rootPath = options.filespath

		self._init_widgets()
		self._init_more()

	def _init_widgets(self):
		bigsplitter = QSplitter(Qt.Horizontal, self)
		self.setCentralWidget(bigsplitter)

		leftsplitter = QSplitter(Qt.Vertical, self)

		self.tabWidget = QTabWidget(self)

		self.tagChooser = TagChooser(self.db)
		self.dirChooser = QTreeView(self)

		self.tabWidget.addTab(self.dirChooser, 'Dir')
		self.tabWidget.addTab(self.tagChooser, 'Tags')

		self.tagEditor = TagEditor(self.db)
		self.imageList = ImageList()

		leftsplitter.addWidget(self.tabWidget)
		leftsplitter.addWidget(self.tagEditor)

		bigsplitter.addWidget(leftsplitter)
		bigsplitter.addWidget(self.imageList)

		self.viewer = ImageViewer(self.db)

	def _init_more(self):
		self.setWindowTitle('Tags4')

		self.dirModel = QFileSystemModel()
		self.dirModel.setFilter(QDir.AllDirs | QDir.Drives | QDir.Hidden | QDir.NoDotAndDotDot)
		qidx = self.dirModel.setRootPath(self.rootPath)
		self.dirChooser.setModel(self.dirModel)
		self.dirChooser.setRootIndex(qidx)

		self.dirChooser.clicked.connect(self.browseSelectedDir)
		self.imageList.itemSelectionChanged.connect(self._editTagsItems)
		self.imageList.itemDoubleClicked.connect(self._spawnViewerItem)
		self.imageList.setSelectionMode(QAbstractItemView.ExtendedSelection)

		self.tabWidget.currentChanged.connect(self._tabSelected)
		self.tagChooser.changed.connect(self.browseSelectedTags)

	def editTags(self, path):
		self.tagEditor.setFile(path)

	def editTagsItems(self, paths):
		self.tagEditor.setFiles(paths)

	def spawnViewer(self, files, currentFile):
		self.viewer.spawn(files, currentFile)

	@Slot()
	def _editTagsItems(self):
		self.editTagsItems([qitem.getPath() for qitem in self.imageList.selectedItems()])

	@Slot(QListWidgetItem)
	def _spawnViewerItem(self, qitem):
		self.spawnViewer(self.imageList.getFiles(), qitem.getPath())

	@Slot()
	def browseSelectedDir(self):
		path = self.dirModel.filePath(self.dirChooser.currentIndex())
		if not path:
			return
		files = [os.path.join(path, f) for f in os.listdir(path)]
		files = filter(os.path.isfile, files)
		files.sort()
		self.imageList.setFiles(files)

	@Slot()
	def browseSelectedTags(self):
		self.imageList.setFiles(self.tagChooser.matchingFiles())

	@Slot(int)
	def _tabSelected(self, idx):
		if idx == 0:
			self.browseSelectedDir()
		else:
			self.browseSelectedTags()

	def browsePath(self, path):
		self.imageList.setFiles(os.path.join(path, f) for f in os.listdir(path))
Exemple #29
0
class PhotoAlbumAndDirectoryViewer(QWidget):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.parent = parent
        self.setFixedWidth(400)
        self.layout = QVBoxLayout(self)

        # Инициализация вкладок
        self.tabs = QTabWidget()

        # init first tab
        self.directory_viewer = QTreeView()

        self.cur_item = None

        path = QDir.rootPath()
        self.dirModel = QFileSystemModel()
        self.dirModel.setRootPath(QDir.rootPath())
        self.dirModel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs)

        self.fileModel = QFileSystemModel()
        self.fileModel.setFilter(QDir.NoDotAndDotDot | QDir.Files)

        self.directory_viewer.setModel(self.dirModel)
        self.directory_viewer.setRootIndex(self.dirModel.index(path))

        self.directory_viewer.clicked.connect(self.parent.on_clicked_directory)

        self.tabs.addTab(self.directory_viewer, 'Directory')

        # init photo album creator and viewer
        self.album_viewer = QListWidget()

        self.dict_albums = {}  # key - name album, value list path photo path

        self.album_viewer.setViewMode(QListWidget.IconMode)
        self.album_viewer.setResizeMode(QListWidget.Adjust)
        self.album_viewer.setMovement(QListView.Static)

        self.tabs.addTab(self.album_viewer, 'Album viewer')

        self.album_viewer.itemClicked.connect(self.on_clicked_album)

        self.layout.addWidget(self.tabs)

        # init btn for manage photo album directory

        self.search_btn = QPushButton(self)
        self.search_btn.resize(QSize(28, 28))
        self.search_btn.setIconSize(QSize(28, 28))
        self.search_btn.setIcon(QIcon('image/search.png'))
        self.search_btn.clicked.connect(self.open_find_widget)

        self.add_album = QPushButton(self)
        self.add_album.resize(QSize(28, 28))
        self.add_album.setIconSize(QSize(28, 28))
        self.add_album.setIcon(QIcon('image/add_album.png'))
        self.add_album.clicked.connect(self.add_album_widget)

        self.edit_album = QPushButton(self)
        self.edit_album.resize(QSize(28, 28))
        self.edit_album.setIconSize(QSize(40, 44))
        self.edit_album.setIcon(QIcon('image/edit_folder.png'))
        self.edit_album.clicked.connect(self.edit_album_f)

        self.del_album = QPushButton(self)
        self.del_album.resize(QSize(28, 28))
        self.del_album.setIconSize(QSize(28, 28))
        self.del_album.setIcon(QIcon('image/delete_folder.png'))
        self.del_album.clicked.connect(self.del_album_f)

        self.cluster_widget = ClusterWidget(list(self.dict_albums.keys()),
                                            parent=self)

        self.btn_cluster = QPushButton(self)
        self.btn_cluster.resize(QSize(28, 28))
        self.btn_cluster.setIconSize(QSize(28, 28))
        self.btn_cluster.setIcon(QIcon('image/cluster.png'))
        self.btn_cluster.clicked.connect(self.show_cluster_widget)

        # init widgets edit and add, del album

        self.add_album_w = AddAlbum(self)
        self.edit_album_w = None

        self.search_widget = SearchWidget(self)
        self.cluster_creator = None

        self.setLayout(self.layout)

    def show_cluster_widget(self):
        self.cluster_widget = ClusterWidget(list(self.dict_albums.keys()),
                                            parent=self)
        self.cluster_widget.show()

    def clusters_files(self, clusters_list_album):
        dict_tags = {}
        for album in clusters_list_album:
            for image_path in self.dict_albums[album]:
                print('Dict_tags: ', dict_tags)
                dict_tags[DirectoryViewer.get_name_from_path(image_path)] = \
                    [image_path, list(get_tags_image(image_path).keys())]

        self.cluster_creator = ClusterSelector(self, dict_tags)
        self.cluster_creator.show()

    def open_find_widget(self):
        self.search_widget.show()

    def add_cluster_albums(self, added_albums):
        del self.cluster_creator
        for i in added_albums:
            self.create_album(i, [added_albums[i][1]])

    def find_files(self, file_name, flags_search: list):
        if 'folder' in flags_search:
            self.search_file_in_folders(file_name)
        if 'album' in flags_search:
            self.search_file_in_album(file_name)

    def search_file_in_folders(self, file_name):
        pass

    def search_file_in_album(self, file_name):
        list_equal = []
        for file_list in self.dict_albums:
            for file_path in self.dict_albums[file_list]:
                print(file_path, ':', file_name)
                if file_name == DirectoryViewer.get_name_from_path(file_path):
                    list_equal.append(file_path)
        if not list_equal:
            QMessageBox.critical(None, 'Error', 'No files found in album')
        else:
            self.parent.change_list(list_equal)

    def del_album_f(self):
        if self.cur_item:
            if self.cur_item in self.dict_albums:
                self.dict_albums.pop(self.cur_item)
                self.update_album_list()

    def edit_album_f(self):
        if self.cur_item:
            if self.cur_item in self.dict_albums:
                self.edit_album_w = EditAlbum(
                    name=self.cur_item,
                    list_images=self.dict_albums[self.cur_item],
                    parent=self)
                self.edit_album_w.show()

    def contain_name_album(self, name):
        if name in self.dict_albums:
            return True
        return False

    def create_album(self, name, photo_list):
        if name in self.dict_albums:
            self.dict_albums[name].extend(photo_list)
        else:
            self.dict_albums[name] = photo_list

        self.album_viewer.clear()
        for i in self.dict_albums:
            item = QListWidgetItem()
            item.setText(i)
            item.setIcon(QIcon('image/photo.png'))
            item.setSizeHint(QSize(128, 128))
            self.album_viewer.addItem(item)
            item.setTextAlignment(Qt.AlignCenter)

    def update_album_list(self):
        self.album_viewer.clear()
        for i in self.dict_albums:
            item = QListWidgetItem()
            item.setText(i)
            item.setIcon(QIcon('image/photo.png'))
            item.setSizeHint(QSize(128, 128))
            self.album_viewer.addItem(item)
            item.setTextAlignment(Qt.AlignCenter)

    def add_album_widget(self):
        self.add_album_w.show()

    def resizeEvent(self, e):
        cor = e.size()
        self.btn_cluster.move(self.tabs.width() - 165, 0)
        self.search_btn.move(self.tabs.width() - 130, 0)
        self.add_album.move(self.tabs.width() - 25, 0)
        self.edit_album.move(self.tabs.width() - 60, 0)
        self.del_album.move(self.tabs.width() - 95, 0)
        self.tabs.resize(abs(cor.width() - self.tabs.width()),
                         abs(cor.height() - self.tabs.height()))

    def on_clicked_album(self, item):
        self.cur_item = item.text()
        text_item = item.text()
        self.parent.on_clicked_album(self.dict_albums[text_item])
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(874, 596)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(MainWindow)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout.addWidget(self.centralwidget)
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(0, 0, 871, 41))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.frame.setObjectName("frame")
        self.line = QtWidgets.QFrame(self.frame)
        self.line.setGeometry(QtCore.QRect(43, 0, 20, 41))
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.line_2 = QtWidgets.QFrame(self.frame)
        self.line_2.setGeometry(QtCore.QRect(180, 0, 20, 41))
        self.line_2.setFrameShape(QtWidgets.QFrame.VLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(0, 40, 221, 541))
        self.widget.setObjectName("widget")
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setGeometry(QtCore.QRect(10, 10, 191, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setGeometry(QtCore.QRect(10, 70, 201, 16))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.widget)
        self.label_3.setGeometry(QtCore.QRect(10, 140, 191, 16))
        self.label_3.setObjectName("label_3")
        self.groupBox = QtWidgets.QGroupBox(self.widget)
        self.groupBox.setGeometry(QtCore.QRect(10, 250, 201, 141))
        self.groupBox.setObjectName("groupBox")
        self.checkBox = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox.setGeometry(QtCore.QRect(10, 20, 70, 17))
        self.checkBox.setShortcut("")
        self.checkBox.setTristate(False)
        self.checkBox.setObjectName("checkBox")
        self.checkBox_2 = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox_2.setGeometry(QtCore.QRect(10, 50, 70, 17))
        self.checkBox_2.setObjectName("checkBox_2")
        self.checkBox_3 = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox_3.setGeometry(QtCore.QRect(10, 80, 70, 17))
        self.checkBox_3.setObjectName("checkBox_3")
        self.checkBox_4 = QtWidgets.QCheckBox(self.groupBox)
        self.checkBox_4.setGeometry(QtCore.QRect(10, 110, 111, 17))
        self.checkBox_4.setObjectName("checkBox_4")
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setGeometry(QtCore.QRect(10, 200, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.widget)
        self.pushButton_2.setGeometry(QtCore.QRect(100, 200, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 874, 21))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        self.menuEdit = QtWidgets.QMenu(self.menubar)
        self.menuEdit.setObjectName("menuEdit")
        self.menuTools = QtWidgets.QMenu(self.menubar)
        self.menuTools.setObjectName("menuTools")
        self.menuHelp = QtWidgets.QMenu(self.menubar)
        self.menuHelp.setObjectName("menuHelp")
        MainWindow.setMenuBar(self.menubar)
        self.actionAbout = QtWidgets.QAction(MainWindow)
        self.actionAbout.setObjectName("actionAbout")
        self.actionOpen = QtWidgets.QAction(MainWindow)
        self.actionOpen.setObjectName("actionOpen")
        self.actionSearch_From_Specific_Location = QtWidgets.QAction(
            MainWindow)
        self.actionSearch_From_Specific_Location.setObjectName(
            "actionSearch_From_Specific_Location")
        self.actionDelete = QtWidgets.QAction(MainWindow)
        self.actionDelete.setObjectName("actionDelete")
        self.actionExit = QtWidgets.QAction(MainWindow)
        self.actionExit.setObjectName("actionExit")
        self.actionCut = QtWidgets.QAction(MainWindow)
        self.actionCut.setObjectName("actionCut")
        self.actionCopy = QtWidgets.QAction(MainWindow)
        self.actionCopy.setObjectName("actionCopy")
        self.actionClear_List = QtWidgets.QAction(MainWindow)
        self.actionClear_List.setObjectName("actionClear_List")
        self.actionSelect_All = QtWidgets.QAction(MainWindow)
        self.actionSelect_All.setObjectName("actionSelect_All")
        self.actionProperties = QtWidgets.QAction(MainWindow)
        self.actionProperties.setObjectName("actionProperties")
        self.menuFile.addAction(self.actionOpen)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionSearch_From_Specific_Location)
        self.menuFile.addAction(self.actionDelete)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionExit)
        self.menuEdit.addAction(self.actionCut)
        self.menuEdit.addAction(self.actionCopy)
        self.menuEdit.addSeparator()
        self.menuEdit.addAction(self.actionClear_List)
        self.menuEdit.addAction(self.actionSelect_All)
        self.menuTools.addAction(self.actionProperties)
        self.menuTools.addSeparator()
        self.menuHelp.addAction(self.actionAbout)
        self.menuHelp.addSeparator()
        self.menubar.addAction(self.menuFile.menuAction())
        self.menubar.addAction(self.menuEdit.menuAction())
        self.menubar.addAction(self.menuTools.menuAction())
        self.menubar.addAction(self.menuHelp.menuAction())

        #Search column View
        #self.columnView = QtWidgets.QColumnView(self.centralwidget)
        #self.columnView.setGeometry(QtCore.QRect(220, 50, 651, 521))
        #self.columnView.setResizeGripsVisible(True)
        #self.columnView.setObjectName("columnView")
        self.treeView = QtWidgets.QTreeView(self.centralwidget)
        self.treeView.setGeometry(QtCore.QRect(220, 50, 651, 521))

        self.treeView.setObjectName("columnView")
        self.horizontalLayout.addWidget(self.treeView)
        path = QDir.rootPath()

        self.dirModel = QFileSystemModel()
        self.dirModel.setRootPath(QDir.rootPath())

        self.fileModel = QFileSystemModel()
        self.fileModel.setFilter(QDir.NoDotAndDotDot | QDir.Files)
        self.model = QtWidgets.QFileSystemModel()
        self.model.setRootPath((QtCore.QDir.rootPath()))
        self.treeView.setModel(self.model)
        self.treeView.setRootIndex(self.dirModel.index(path))
        self.treeView.doubleClicked.connect(self.on_clicked)
        self.treeView.setObjectName("treeView")
        self.treeView.setColumnWidth(0, 300)

        logoPath = QDir.homePath()
        self.logoModel = QFileSystemModel()
        self.logoModel.setRootPath(logoPath)
        self.logoModel.setFilter(QDir.NoDotAndDotDot | QDir.Files
                                 | QDir.NoSymLinks)
        print(logoPath)

        self.comboBox = QtWidgets.QComboBox(self.widget)
        self.comboBox.setGeometry(QtCore.QRect(10, 30, 201, 31))
        self.comboBox.setEditable(True)
        self.comboBox.setObjectName("comboBox")
        self.comboBox_2 = QtWidgets.QComboBox(self.widget)
        self.comboBox_2.setGeometry(QtCore.QRect(10, 100, 201, 31))
        self.comboBox_2.setEditable(True)
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_3 = QtWidgets.QComboBox(self.widget)
        self.comboBox_3.setGeometry(QtCore.QRect(10, 160, 201, 31))
        self.comboBox_3.setEditable(True)
        self.comboBox_3.setObjectName("comboBox_3")
        self.comboBox_3.setModel(self.logoModel)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(
            _translate("MainWindow", "Search for files or folders"))
        self.label_2.setText(
            _translate("MainWindow",
                       "Containing text (for wordprocessor files)"))
        self.label_3.setText(_translate("MainWindow", "Look in (Directory)"))
        self.groupBox.setTitle(_translate("MainWindow", "Options"))
        self.checkBox.setText(_translate("MainWindow", "Date"))
        self.checkBox_2.setText(_translate("MainWindow", "Size"))
        self.checkBox_3.setText(_translate("MainWindow", "Type"))
        self.checkBox_4.setText(_translate("MainWindow", "Advance Options"))

        self.pushButton.setText(_translate("MainWindow", "Search"))
        self.pushButton.clicked.connect(self.search)
        self.pushButton_2.setText(_translate("MainWindow", "Stop"))
        self.pushButton_2.clicked.connect(self.stop)

        self.menuFile.setTitle(_translate("MainWindow", "File"))
        self.menuEdit.setTitle(_translate("MainWindow", "Edit"))
        self.menuTools.setTitle(_translate("MainWindow", "Tools"))
        self.menuHelp.setTitle(_translate("MainWindow", "Help"))
        self.actionAbout.setText(_translate("MainWindow", "About"))
        self.actionOpen.setText(_translate("MainWindow", "Open"))
        self.actionSearch_From_Specific_Location.setText(
            _translate("MainWindow", "Search From Specific Location"))
        self.actionDelete.setText(_translate("MainWindow", "Delete"))
        self.actionExit.setText(_translate("MainWindow", "Exit"))
        self.actionCut.setText(_translate("MainWindow", "Cut"))
        self.actionCopy.setText(_translate("MainWindow", "Copy"))
        self.actionClear_List.setText(_translate("MainWindow", "Clear List"))
        self.actionSelect_All.setText(_translate("MainWindow", "Select All"))
        self.actionProperties.setText(_translate("MainWindow", "Properties"))

    def on_clicked(self, index):
        path = self.fileModel.fileInfo(index).absoluteFilePath()
        #Tab Reading for index values
        os.startfile(path)

    def stop(self):
        print("Program Stoped")
        self.pushButton.setEnabled(True)

    def search(self):
        print("Search started")
        self.pushButton.setEnabled(False)
        file_name = self.comboBox.currentText()
        print(file_name)
        path_tmp1 = self.comboBox_3.currentText()
        print(path_tmp1)
        path_tmp = re.findall("[A-Z]:", path_tmp1)
        print(path_tmp[-1])
        cur_dir = path_tmp[-1] + '/' ''
        print(cur_dir)

        result = []
        # Wlaking top-down from the root
        for root, dir, files in os.walk(cur_dir):
            for i in files:
                b = re.findall(".*" + file_name + ".*.*", i, re.IGNORECASE)
                if b == []:
                    pass
                elif b != []:
                    for i in files:
                        if b[-1] == i:
                            result.append(os.path.join(root, b[-1]))
        if result != []:
            for i in result:
                print(i)
            self.pushButton.setEnabled(True)

        else:
            print("No match")
            self.pushButton.setEnabled(True)
Exemple #31
0
class CandyWinForm(QMainWindow):
    refreshDroneAsked = pyqtSignal()
    refreshArduinoAsked = pyqtSignal()
    refreshRiotAsked = pyqtSignal()

    verticalSpeedValueChanged = pyqtSignal(float)
    horizontalSpeedValueChanged = pyqtSignal(float)
    rotationSpeedValueChanged = pyqtSignal(int)

    axesChanged = pyqtSignal(list)

    presetChanged = pyqtSignal(str)
    saveAsked = pyqtSignal()

    closing = pyqtSignal()
    discrete_threshold_changed = pyqtSignal(int)
    discrete_duration_changed = pyqtSignal(int)
    control_changed = pyqtSignal(str)
    drone_changed = pyqtSignal(str)

    calibrationChanged = pyqtSignal()

    ask_take_off = pyqtSignal()
    ask_land = pyqtSignal()

    def __init__(self):
        super().__init__()

        # create the form
        self.ui = Ui_MainWindow()
        widget = QWidget()
        self.ui.setupUi(widget)
        self.setCentralWidget(widget)

        # create the scene and add it to the tabs
        self.scene = QGraphicsScene()
        self.scene.setBackgroundBrush(BG_COL)

        self.view = self.ui.graphicsView

        self.view.setScene(self.scene)
        self.view.setRenderHint(QPainter.Antialiasing)
        self.view.scale(1.2, 1.2)

        # set up the central scene with axis
        self.z_axis = VerticalAxis("up.png", "down.png", self)
        self.rotation_axis = VerticalAxis("clock.png", "anticlock.png", self)
        self.rotation_axis.setRotation(90)
        self.axis1_rect = RectSelector(self.z_axis, self.rotation_axis, self)

        self.front_axis = VerticalAxis("front.png", "back.png", self)
        self.right_axis = VerticalAxis("front.png", "back.png", self)
        self.right_axis.setRotation(90)
        self.axis2_rect = RectSelector(self.front_axis, self.right_axis, self)

        self.scene.addItem(self.z_axis)
        self.scene.addItem(self.rotation_axis)
        self.scene.addItem(self.axis1_rect)

        self.scene.addItem(self.front_axis)
        self.scene.addItem(self.right_axis)
        self.scene.addItem(self.axis2_rect)

        self.ui.simple_mode.stateChanged.connect(self.set_simplified)
        self.set_simplified(False)

        # set up the calibration widgets
        self.range_keys = ["up", "down", "clock", "anticlock", "front", "back", 'right', 'left']
        self.range_sliders = {}

        for key in self.range_keys:
            _min = 0
            _max = 100
            _start = 5
            _end = 95
            rs = QRangeSlider()
            rs.setMin(_min)
            rs.setMax(_max)
            rs.setRange(_start, _end)
            rs.setBackgroundStyle('background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #222, stop:1 #333);')
            rs.handle.setStyleSheet(
                'background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #282, stop:1 #393);')

            rs.endValueChanged.connect(self.calibrationChanged)
            rs.startValueChanged.connect(self.calibrationChanged)
            self.range_sliders[key] = rs

        self.ui.top_down_layout.addWidget(self.range_sliders['up'])
        self.ui.top_down_layout.addWidget(self.range_sliders['down'])
        self.ui.clock_anticlock_layout.addWidget(self.range_sliders['clock'])
        self.ui.clock_anticlock_layout.addWidget(self.range_sliders['anticlock'])
        self.ui.front_back_layout.addWidget(self.range_sliders['front'])
        self.ui.front_back_layout.addWidget(self.range_sliders['back'])
        self.ui.right_left_layout.addWidget(self.range_sliders['right'])
        self.ui.right_left_layout.addWidget(self.range_sliders['left'])

        # handle presets
        self.current_preset = None
        self.presets_path = ""
        self.file_model = QFileSystemModel(self)

        self.ui.save_as_btn.clicked.connect(self.saveAsked)

        # add bindings to values
        self.ui.discrete_treshold_sld.valueChanged.connect(self.discrete_threshold_changed)
        self.ui.discrete_treshold_spin.valueChanged.connect(self.discrete_threshold_changed)

        self.ui.drone_refresh_btn.clicked.connect(lambda: self.ui.take_off_btn.setEnabled(True))
        self.ui.drone_refresh_btn.clicked.connect(self.refreshDroneAsked.emit)

        self.ui.arduino_refresh_btn.clicked.connect(self.refreshArduinoAsked.emit)

        self.ui.control_group.buttonClicked.connect(lambda button: self.control_changed.emit(button.text()))
        self.ui.drone_group.buttonClicked.connect(lambda button: self.drone_changed.emit(button.text()))

        # process speed sliders (handle double values)
        self.ui.vert_speed_spin.valueChanged.connect(self.verticalSpeedValueChanged)
        self.ui.horiz_speed_spin.valueChanged.connect(self.horizontalSpeedValueChanged)
        self.ui.rot_speed_spin.valueChanged.connect(self.rotationSpeedValueChanged)

        self.ui.vert_speed_spin.valueChanged.connect(lambda val: self.ui.vert_speed_sld.setValue(val * 100))
        self.ui.vert_speed_sld.valueChanged.connect(lambda val: self.ui.vert_speed_spin.setValue(val / 100))
        self.ui.horiz_speed_spin.valueChanged.connect(lambda val: self.ui.horiz_speed_sld.setValue(val * 100))
        self.ui.horiz_speed_sld.valueChanged.connect(lambda val: self.ui.horiz_speed_spin.setValue(val / 100))
        self.ui.rot_speed_spin.valueChanged.connect(self.ui.rot_speed_sld.setValue)
        self.ui.rot_speed_sld.valueChanged.connect(self.ui.rot_speed_spin.setValue)

        self.ui.take_off_btn.clicked.connect(lambda : self.ask_take_off.emit())
        self.ui.land_btn.clicked.connect(lambda : self.ask_land.emit())

    def display_processed_inputs(self, _up, _rotate, _front, _right):
        self.z_axis.display(_up)
        self.rotation_axis.display(_rotate)
        self.front_axis.display(_front)
        self.right_axis.display(_right)

    def display_raw_inputs(self, _up, _rotate, _front, _right):
        self.z_axis.display_raw(_up)
        self.rotation_axis.display_raw(_rotate)
        self.front_axis.display_raw(_front)
        self.right_axis.display_raw(_right)

    def set_simplified(self, is_simplified):
        if is_simplified:
            self.front_axis.set_active(False)
            self.rotation_axis.set_active(False)
            self.rotation_axis.hide()
            self.front_axis.hide()
            self.axis2_rect.hide()

            self.z_axis.show()
            self.z_axis.setPos(270, 50)
            self.right_axis.show()
            self.right_axis.setPos(435, 135)
            self.axis1_rect.show()
            self.axis1_rect.setPos(290, 155)
            self.axis1_rect.set_axis(self.z_axis, self.right_axis)
        else:
            # axis 1
            self.z_axis.show()
            self.z_axis.setPos(110, 50)
            self.rotation_axis.show()
            self.rotation_axis.setPos(275, 135)
            self.axis1_rect.show()
            self.axis1_rect.setPos(130, 155)
            self.axis1_rect.set_axis(self.z_axis, self.rotation_axis)

            # axis 2
            self.front_axis.show()
            self.front_axis.setPos(410, 50)
            self.right_axis.show()
            self.right_axis.setPos(575, 135)
            self.axis2_rect.show()
            self.axis2_rect.setPos(430, 155)

    def get_calibration(self):
        res = {}
        for key in self.range_keys:
            slider = self.range_sliders[key]
            res[key] = [slider.start() / 100, slider.end() / 100]
        return res

    def set_calibration(self, calibration_list):
        for key in self.range_keys:
            slider = self.range_sliders[key]
            if key in calibration_list:
                values = calibration_list[key]
                slider.setStart_silent(values[0] * 100)
                slider.setEnd_silent(values[1] * 100)
            else:
                slider.setStart_silent(5)
                slider.setEnd_silent(95)
        self.calibrationChanged.emit()

    def update_battery_level(self, battery_val):
        max = 4.3
        mid = 3.6
        min = 3.1

        percentage = (battery_val / max) * 100
        self.ui.drone_battery_gauge.setValue(int(percentage))

        style = gauge_danger
        if battery_val > mid:
            style = gauge_safe
        elif battery_val > min:
            style = gauge_warning
        self.ui.drone_battery_gauge.setStyleSheet(style)
        self.ui.drone_battery_gauge.setFormat("{:.2f}".format(battery_val) + "v (%p%)")

    def update_drone_connection(self, connection_status):
        if connection_status == "on":
            self.ui.drone_status_lbl.setStyleSheet(STATUS_ON_STYLE)
        elif connection_status == "progress":
            self.ui.drone_status_lbl.setStyleSheet(STATUS_PROGRESS_STYLE)
        else:
            self.ui.drone_status_lbl.setStyleSheet(STATUS_OFF_STYLE)

        if connection_status != "on":
            self.update_battery_level(0)

    def update_arduino_connection(self, is_connected):
        if is_connected:
            self.ui.arduino_status_lbl.setStyleSheet(STATUS_ON_STYLE)
        else:
            self.ui.arduino_status_lbl.setStyleSheet(STATUS_OFF_STYLE)

    def set_max_vert_speed(self, val):
        self.ui.vert_speed_spin.setValue(val)

    def set_max_horiz_speed(self, val):
        self.ui.horiz_speed_spin.setValue(val)

    def set_max_rotation_speed(self, val):
        self.ui.rot_speed_spin.setValue(val)

    def get_control_mode(self):
        return self.ui.control_group.checkedButton().text()

    def set_control_mode(self, _mode):
        if _mode == "Arduino Continu":
            self.ui.arduino_continous_radio.setChecked(True)
        else :
            self.ui.arduino_discrete_radio.setChecked(True)

    def get_drone_type(self):
        return self.ui.drone_group.checkedButton().text()

    def set_drone_type(self, _type):
        if _type == "Crazyflie":
            self.ui.crazy_radio.setChecked(True)
        else:
            self.ui.ar_radio.setChecked(True)

    def set_comments(self, comments):
        self.ui.comment_textEdit.setText(comments)

    def set_discrete_threshold(self, _threshold):
        self.ui.discrete_treshold_spin.setValue(_threshold)

    def set_discrete_duration(self, _duration):
        self.ui.discrete_duration_spin.setValue(_duration)

    def get_max_vert_speed(self):
        return self.ui.vert_speed_spin.value()

    def get_max_horiz_speed(self):
        return self.ui.horiz_speed_spin.value()

    def get_max_rotation_speed(self):
        return self.ui.rot_speed_spin.value()

    def update_activated_axis(self):
        self.axesChanged.emit(self.get_axes())

    def set_axes(self, _axes):
        self.z_axis.set_active(bool(_axes[0]))
        if not self.ui.simple_mode.isChecked():
            self.rotation_axis.set_active(bool(_axes[1]))
            self.front_axis.set_active(bool(_axes[2]))
        else:
            self.rotation_axis.set_active(False)
            self.front_axis.set_active(False)

        self.right_axis.set_active(bool(_axes[3]))

    def get_axes(self):
        return [self.z_axis.is_active(), self.rotation_axis.is_active(), self.front_axis.is_active(),
                self.right_axis.is_active()]

    def get_comments(self):
        return self.ui.comment_textEdit.toPlainText()

    def get_discrete_threshold(self):
        return self.ui.discrete_treshold_spin.value()

    def get_discrete_duration(self):
        return self.ui.discrete_duration_spin.value()

    def closeEvent(self, event):
        self.closing.emit()

    def on_selection_changed(self, selected, deselected):
        index = self.ui.presets_listView.currentIndex()
        preset = str(index.data())
        self.presetChanged.emit(preset)

    def populate_presets(self, path):
        self.presets_path = path
        self.file_model.setRootPath(path)
        self.file_model.setFilter(QDir.NoDotAndDotDot | QDir.Files)
        self.ui.presets_listView.setModel(self.file_model)

        def load_first_element(val):
            self.ui.presets_listView.setCurrentIndex(self.file_model.index(0,0,self.ui.presets_listView.rootIndex()))

        self.file_model.directoryLoaded.connect(load_first_element)
        self.ui.presets_listView.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.ui.presets_listView.setRootIndex(self.file_model.index(path))
        self.ui.presets_listView.selectionModel().selectionChanged.connect(self.on_selection_changed)

    def get_current_preset(self):
        return self.current_preset
Exemple #32
0
class FileManager(QWidget, _HalWidgetBase):
    def __init__(self, parent=None):
        super(FileManager, self).__init__(parent)
        self.title = 'PyQt5 file system view - pythonspot.com'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 480
        self.default_path = (os.path.join(os.path.expanduser('~'), 'linuxcnc/nc_files/examples'))
        self.user_path = (os.path.join('/media'))
        self.currentPath = None
        self.EXT = INFO.PROGRAM_FILTERS_EXTENSIONS
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.model = QFileSystemModel()
        self.model.setRootPath(QDir.currentPath())
        self.model.setFilter(QDir.AllDirs | QDir.NoDot | QDir.Files)
        self.model.setNameFilterDisables(False)
        self.model.setNameFilters(self.EXT)

        self.list = QListView()
        self.list.setModel(self.model)
        self.updateDirectoryView(self.default_path)
        self.list.setWindowTitle("Dir View")
        self.list.resize(640, 480)
        self.list.clicked[QModelIndex].connect(self.clicked)
        self.list.activated.connect(self._getPathActivated)
        #self.list.currentChanged = self.currentChanged
        self.list.setAlternatingRowColors(True)

        self.cb = QComboBox()
        self.cb.currentTextChanged.connect(self.filterChanged)
        self.cb.addItems(self.EXT)
        #self.cb.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))

        self.button = QPushButton()
        self.button.setText('Media')
        self.button.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.button.setToolTip('Jump to Media directory')
        self.button.clicked.connect(self.onMediaClicked)

        self.button2 = QPushButton()
        self.button2.setText('User')
        self.button2.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.button2.setToolTip('Jump to linuxcnc directory')
        self.button2.clicked.connect(self.onUserClicked)

        hbox = QHBoxLayout()
        hbox.addWidget(self.button)
        hbox.addWidget(self.button2)
        hbox.addWidget(self.cb)

        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.list)
        windowLayout.addLayout(hbox)
        self.setLayout(windowLayout)
        self.show()

    # this could return the current/previous selected as it's selected.
    # need to uncomment monkey patch of self.list.currentChanged above
    # so far this is not needed
    def currentChanged(self,c,p):
        dir_path = self.model.filePath(c)
        print('-> ',dir_path)

    def updateDirectoryView(self, path):
        self.list.setRootIndex(self.model.setRootPath(path))

    def filterChanged(self, text):
        self.model.setNameFilters([text])

    def clicked(self, index):
        # the signal passes the index of the clicked item
        dir_path = self.model.filePath(index)
        if self.model.fileInfo(index).isFile():
            self.currentPath = dir_path
            return
        root_index = self.model.setRootPath(dir_path)
        self.list.setRootIndex(root_index)

    def onMediaClicked(self):
        self.updateDirectoryView(self.user_path)

    def onUserClicked(self):
        self.updateDirectoryView(self.default_path)

    def select_row(self, style):
        style = style.lower()
        selectionModel = self.list.selectionModel()
        row = selectionModel.currentIndex().row()
        self.rows = self.model.rowCount(self.list.rootIndex())

        if style == 'last':
            row = self.rows
        elif style == 'up':
            if row > 0:
                row -= 1
            else:
                row = 0
        elif style == 'down':
            if row < self.rows:
                row += 1
            else:
                row = self.rows
        else:
            return
        top = self.model.index(row, 0, self.list.rootIndex())
        selectionModel.setCurrentIndex(top, QItemSelectionModel.Select | QItemSelectionModel.Rows)
        selection = QItemSelection(top, top)
        selectionModel.clearSelection()
        selectionModel.select(selection, QItemSelectionModel.Select)

    # returns the current highlighted (selected) path as well as
    # whether it's a file or not.
    def getCurrentSelected(self):
        selectionModel = self.list.selectionModel()
        index = selectionModel.currentIndex()
        dir_path = self.model.filePath(index)
        if self.model.fileInfo(index).isFile():
            return (dir_path, True)
        else:
            return (dir_path, False)

    def _hal_init(self):
        if self.PREFS_:
            last_path = self.PREFS_.getpref('last_loaded_directory', self.default_path, str, 'BOOK_KEEPING')
            self.updateDirectoryView(last_path)
            LOG.debug("lAST FILE PATH: {}".format(last_path))
        else:
            LOG.debug("lAST FILE PATH: {}".format(self.default_path))
            self.updateDirectoryView(self.default_path)

    # get current selection and update the path
    # then if the path is good load it into linuxcnc
    # record it in the preference file if available
    def _getPathActivated(self):
        row = self.list.selectionModel().currentIndex()
        self.clicked(row)

        fname = self.currentPath
        if fname is None: 
            return
        if fname:
            self.load(fname)

    # this can be class patched to do something else
    def load(self, fname=None):
        if fname is None:
            self._getPathActivated()
            return
        self.recordBookKeeping()
        ACTION.OPEN_PROGRAM(fname)
        STATUS.emit('update-machine-log', 'Loaded: ' + fname, 'TIME')

    # this can be class patched to do something else
    def recordBookKeeping(self):
        fname = self.currentPath
        if fname is None: 
            return
        if self.PREFS_:
            self.PREFS_.putpref('last_loaded_directory', self.model.rootPath(), str, 'BOOK_KEEPING')
            self.PREFS_.putpref('RecentPath_0', fname, str, 'BOOK_KEEPING')

    # moves the selection up
    # used with MPG scrolling
    def up(self):
        self.select_row('up')

    # moves the selection down
    # used with MPG scrolling
    def down(self):
        self.select_row('down')
Exemple #33
0
class mainForm(QMainWindow):
    get_template_filename = pyqtSignal(str)
    exit_program = pyqtSignal()
    camera_changed = pyqtSignal(int)

    def __init__(self):
        super().__init__()
        self.stream = None
        self.image_difference_thread = None
        self.template_set = False
        self._countour_max_tresh = 10
        self._countour_min_tresh = 1
        self._transparency_max = 10
        self._transparency_min = 0
        self._countour_gamma_max = 10
        self._countour_gamma_min = 1
        self._color_max = 255
        self._color_min = 0
        self.screen_resolution = None
        self.grid_layout = None
        self.output_picture = None
        self.initUI()
        self.init_image_difference()
        if self.webcam_switcher.count() > 0:
            self.stream = streamCapture(self.webcam_switcher.itemData(self.webcam_switcher.currentIndex()))
            self.stream.getframe.connect(self.mat2qimage)
            self.webcam_switcher.currentIndexChanged.connect(self.camera_switcher_index_changed)
            self.camera_changed.connect(self.stream.reopenStream)
            self.stream.start()
            self.exit_program.connect(self.stream.exit)

    ### отрисовка интерфейса
    def initUI(self):
        self.screen_resolution = QApplication.desktop().screenGeometry()
        # self.resize(self.screen_resolution.size())
        # self.move(self.screen_resolution.left(), self.screen_resolution.top())
        self.grid_layout = QGridLayout()

        self.central_widget = QWidget()
        self.central_widget.setLayout(self.grid_layout)
        self.central_widget.setMaximumSize(self.screen_resolution.width() // 4 * 3,
                                           self.screen_resolution.height() // 4 * 3)
        self.setCentralWidget(self.central_widget)

        self.camera_label = QLabel("Camera:")
        self.grid_layout.addWidget(self.camera_label, 0, 0, 1, 1, Qt.AlignmentFlag.AlignHCenter)

        self.webcam_switcher = QComboBox()
        self.detect_webcam_devices(self.webcam_switcher)
        self.grid_layout.addWidget(self.webcam_switcher, 0, 1, 1, 3)

        self.output_picture = QLabel()
        self.grid_layout.addWidget(self.output_picture, 1, 0, 1, 4)

        ### creating right dock
        self.right_dock_layout = QVBoxLayout()

        self.right_dock_widget = QDockWidget()
        self.right_dock_widget.setFeatures(QDockWidget.DockWidgetFeature.DockWidgetMovable | QDockWidget.DockWidgetFeature.DockWidgetFloatable)
        self.right_dock_widget.setMinimumSize(self.screen_resolution.width() // 4, self.screen_resolution.height())
        right_dock = QWidget(self.right_dock_widget)
        right_dock.setMinimumSize(self.screen_resolution.width() // 4, self.screen_resolution.height())
        right_dock.setLayout(self.right_dock_layout)

        template_label = QLabel("Templates")
        template_label.setMinimumSize(50, 25)
        self.right_dock_layout.addWidget(template_label)

        self.filter_template_edit = QLineEdit()
        self.filter_template_edit.setPlaceholderText("Filter (Ctr + Alt + f)")
        template_label.setMinimumSize(90, 25)
        self.filter_template_edit.setStyleSheet(
            "background-image: url(../image_difference/icons/searchIcon.png); background-repeat: no-repeat; background-position: right;")

        self.right_dock_layout.addWidget(self.filter_template_edit)

        self.file_system_model = QFileSystemModel()
        self.file_system_model.setFilter(QDir.Filter.AllDirs | QDir.Filter.NoDotAndDotDot | QDir.Filter.AllEntries)
        self.file_system_model.setRootPath(QDir.currentPath())

        self.directory_tree_view = QTreeView()
        self.directory_tree_view.setModel(self.file_system_model)
        self.directory_tree_view.setMinimumSize(200, 100)
        self.directory_tree_view.hideColumn(1)
        self.directory_tree_view.hideColumn(2)
        self.directory_tree_view.hideColumn(3)
        # self.directory_tree_view.sortByColumn(0)
        self.directory_tree_view.setSortingEnabled(True)
        self.directory_tree_view.doubleClicked.connect(self.load_template)
        self.directory_tree_view.setRootIndex(self.file_system_model.index("../image_difference/"))

        self.right_dock_layout.addWidget(self.directory_tree_view)

        self.load_template_button = QPushButton("Select Template")
        self.load_template_button.setMaximumSize(self.screen_resolution.width() // 4 - 30, 30)
        self.load_template_button.clicked.connect(self.load_template)

        self.right_dock_layout.addWidget(self.load_template_button)

        self.create_template_button = QPushButton("Create Template")
        self.create_template_button.setMaximumSize(self.screen_resolution.width() // 4 - 30, 30)
        self.create_template_button.clicked.connect(self.create_template)

        self.right_dock_layout.addWidget(self.create_template_button)

        self.template_image_widget = QWidget()
        self.template_image_widget.setMinimumSize(self.screen_resolution.width() // 4 - 20,
                                                  self.screen_resolution.width() // 4 - 10)

        self.template_image_back = QLabel(self.template_image_widget)
        self.template_image_back.resize(self.screen_resolution.width() // 4 - 20,
                                        self.screen_resolution.width() // 4 - 10)
        pix = QPixmap(self.template_image_back.size())
        pix.fill(Qt.lightGray)
        rect = QRectF(0.0, 0.0, self.template_image_back.size().width(), self.template_image_back.size().height())
        painter = QPainter()
        painter.begin(pix)
        painter.setRenderHints(QPainter.Antialiasing, True)
        path = QPainterPath()
        path.addRoundedRect(rect, 5.0, 5.0)
        painter.drawPath(path)
        painter.end()
        self.template_image_back.setPixmap(pix)

        self.template_image = QLabel(self.template_image_widget)
        self.template_image.move(5, 5)
        self.template_image.resize(self.screen_resolution.width() // 4 - 30, self.screen_resolution.width() // 4 - 30)

        self.template_image_text = QLabel(self.template_image_widget, text="Current Template")
        self.template_image_text.setStyleSheet("font-weight: bold")
        self.template_image_text.move(self.screen_resolution.width() // 8 - 65, 20)

        self.right_dock_layout.addWidget(self.template_image_widget)

        self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.right_dock_widget)

        ### creating bottom dock
        self.bottom_dock_layout = QGridLayout()
        self.bottom_dock_layout.setSpacing(10)

        self.bottom_dock_widget = QDockWidget()
        self.bottom_dock_widget.setMinimumSize(self.screen_resolution.width() // 4 * 3 - 10,
                                               self.screen_resolution.height() // 4 - 10)
        bottom_dock = QWidget(self.bottom_dock_widget)
        bottom_dock.setMinimumSize(self.screen_resolution.width() // 4 * 3 - 20,
                                   self.screen_resolution.height() // 4 - 20)
        bottom_dock.move(10, 10)
        bottom_dock.setLayout(self.bottom_dock_layout)

        settings_label = QLabel("Settings:")
        self.bottom_dock_layout.addWidget(settings_label, 0, 0, 1, 2,
                                          Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignTop)

        countour_tresh_label = QLabel("Countour Tresh:")
        self.bottom_dock_layout.addWidget(countour_tresh_label, 1, 0, 1, 1, Qt.AlignmentFlag.AlignTop)

        self.countour_tresh_slider = QSlider(Qt.Orientation.Horizontal)
        self.countour_tresh_slider.setTickPosition(QSlider.TickPosition.TicksBelow)
        self.countour_tresh_slider.setRange(self._countour_min_tresh, self._countour_max_tresh)
        self.countour_tresh_slider.setValue(2)
        self.bottom_dock_layout.addWidget(self.countour_tresh_slider, 1, 1, 1, 1, Qt.AlignmentFlag.AlignTop)

        transparency_weight_label = QLabel("Transparency:")
        self.bottom_dock_layout.addWidget(transparency_weight_label, 2, 0, 1, 1, Qt.AlignmentFlag.AlignTop)

        self.transparency_weight_slider = QSlider(Qt.Orientation.Horizontal)
        self.transparency_weight_slider.setTickPosition(QSlider.TickPosition.TicksBelow)
        self.transparency_weight_slider.setValue(6)
        self.transparency_weight_slider.setRange(self._transparency_min, self._transparency_max)
        self.bottom_dock_layout.addWidget(self.transparency_weight_slider, 2, 1, 1, 1, Qt.AlignmentFlag.AlignTop)

        countour_gamma_label = QLabel("Countour Gamma:")
        self.bottom_dock_layout.addWidget(countour_gamma_label, 3, 0, 1, 1, Qt.AlignmentFlag.AlignTop)

        self.countour_gamma_slider = QSlider(Qt.Orientation.Horizontal)
        self.countour_gamma_slider.setTickPosition(QSlider.TickPosition.TicksBelow)
        self.countour_gamma_slider.setValue(8)
        self.countour_gamma_slider.setRange(self._countour_gamma_min, self._countour_gamma_max)
        self.bottom_dock_layout.addWidget(self.countour_gamma_slider, 3, 1, 1, 1, Qt.AlignmentFlag.AlignTop)

        ### right side of settings
        countour_color_label = QLabel("Countour Color:")
        self.bottom_dock_layout.addWidget(countour_color_label, 0, 2, 1, 2,
                                          Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignTop)

        r_color_label = QLabel("R:")
        self.bottom_dock_layout.addWidget(r_color_label, 1, 2, 1, 1, Qt.AlignmentFlag.AlignTop)

        self.r_color_slider = QSlider(Qt.Orientation.Horizontal)
        self.r_color_slider.setTickPosition(QSlider.TickPosition.TicksBelow)
        self.r_color_slider.setRange(self._color_min, self._color_max)
        self.r_color_slider.setValue(255)
        self.bottom_dock_layout.addWidget(self.r_color_slider, 1, 3, 1, 1, Qt.AlignmentFlag.AlignTop)

        g_color_label = QLabel("G:")
        self.bottom_dock_layout.addWidget(g_color_label, 2, 2, 1, 1, Qt.AlignmentFlag.AlignTop)

        self.g_color_slider = QSlider(Qt.Orientation.Horizontal)
        self.g_color_slider.setTickPosition(QSlider.TickPosition.TicksBelow)
        self.g_color_slider.setRange(self._color_min, self._color_max)
        self.bottom_dock_layout.addWidget(self.g_color_slider, 2, 3, 1, 1, Qt.AlignmentFlag.AlignTop)

        b_color_label = QLabel("B:")
        self.bottom_dock_layout.addWidget(b_color_label, 3, 2, 1, 1, Qt.AlignmentFlag.AlignTop)

        self.b_color_slider = QSlider(Qt.Orientation.Horizontal)
        self.b_color_slider.setTickPosition(QSlider.TickPosition.TicksBelow)
        self.b_color_slider.setRange(self._color_min, self._color_max)
        self.bottom_dock_layout.addWidget(self.b_color_slider, 3, 3, 1, 1, Qt.AlignmentFlag.AlignTop)

        self.addDockWidget(Qt.DockWidgetArea.BottomDockWidgetArea, self.bottom_dock_widget)

        self.setCorner(Qt.Corner.BottomRightCorner, Qt.DockWidgetArea.RightDockWidgetArea)

    def init_image_difference(self):
        self.image_difference_thread = imageDifference()
        self.get_template_filename.connect(self.image_difference_thread.set_template_image)
        self.countour_tresh_slider.valueChanged.connect(self.image_difference_thread.set_countour_tresh_value)
        self.transparency_weight_slider.valueChanged.connect(self.image_difference_thread.set_transparency_weight_value)
        self.countour_gamma_slider.valueChanged.connect(self.image_difference_thread.set_countour_gamma_value)
        self.r_color_slider.valueChanged.connect(self.image_difference_thread.set_countour_color_r)
        self.g_color_slider.valueChanged.connect(self.image_difference_thread.set_countour_color_g)
        self.b_color_slider.valueChanged.connect(self.image_difference_thread.set_countour_color_b)
        self.image_difference_thread.output_image_defference.connect(self.mat2qimage)
        self.image_difference_thread.set_template_picture.connect(self.set_template_picture)
        self.image_difference_thread.start()

    def detect_webcam_devices(self, combo_box):
        _video_capture = cv2.VideoCapture()
        _dev_id = 0
        while (_dev_id < 3):
            if _video_capture.open(_dev_id):
                combo_box.addItem("Device #" + str(_dev_id + 1), _dev_id)
                _dev_id += 1
            else:
                _dev_id += 1
        _video_capture.release()

    def load_template(self):
        index = self.directory_tree_view.selectedIndexes()[0]
        if not QFileInfo(self.file_system_model.filePath(index)).isDir():
            # print("load template, path:", self.file_system_model.filePath(index))
            self.get_template_filename.emit(self.file_system_model.filePath(index))

    def create_template(self):
        if self.stream is not None:
            template_to_save = self.stream.get_current_frame()
            cv2.imwrite("../image_difference/examples/template.jpg", template_to_save)
            print("create template")

    pyqtSlot(np.ndarray)

    def mat2qimage(self, image):
        rgbImage = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        rgbImage = cv2.resize(rgbImage, (self.output_picture.size().width(),
                                         self.output_picture.size().height()))
        # rgbImage = imutils.resize(rgbImage, height=self.output_picture.height())
        h, w, ch = rgbImage.shape
        bytesPerLine = ch * w
        result_image = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)
        self.output_picture.setPixmap(QPixmap.fromImage(result_image))

    pyqtSlot(np.ndarray)

    def set_template_picture(self, image):
        rgbImage = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        # rgbImage = cv2.resize(rgbImage, (self.template_image.size().width(),
        #                                  self.template_image.size().height()))
        rgbImage = imutils.resize(rgbImage, self.template_image.size().width())
        h, w, ch = rgbImage.shape
        bytesPerLine = ch * w
        result_image = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)
        self.template_image.setPixmap(QPixmap.fromImage(result_image))
        if not self.template_set:
            self.template_set = True
            self.stream.getframe.disconnect(self.mat2qimage)
            self.stream.getframe.connect(self.image_difference_thread.get_image)
            self.image_difference_thread.output_image_defference.connect(self.mat2qimage)

    def camera_switcher_index_changed(self, index):
        self.camera_changed.emit(self.webcam_switcher.itemData(index))
        print("current index:", index)
        print("item data:", self.webcam_switcher.itemData(index))

    def closeEvent(self, event):
        self.exit_program.emit()
        event.accept()
class Explorer(QWidget):
    def __init__(self, rootdir=QDir.rootPath()):
        QWidget.__init__(self)
        self.treeview = QTreeView()
        self.listview = QListView()
        self.path = rootdir
        self.filename = ''
        self.filepath = rootdir
        self.canvas = None
        self.col_selector = None

        self.header = ''
        self.xcol = [1]
        self.ycol = [1]
        self.ncols = 0

        self.dirModel = QFileSystemModel()
        self.dirModel.setRootPath(self.path)
        self.dirModel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs)

        self.fileModel = QFileSystemModel()
        self.fileModel.setRootPath(self.filepath)
        self.fileModel.setFilter(QDir.NoDotAndDotDot | QDir.Files)
        self.fileModel.setNameFilters(['*.txt'])
        self.fileModel.setNameFilterDisables(0)

        self.treeview.setModel(self.dirModel)
        self.listview.setModel(self.fileModel)
        for i in [1, 2, 3]: self.treeview.setColumnHidden(i, True)
        self.treeview.setHeaderHidden(True)

        self.treeview.setRootIndex(self.dirModel.index(self.path))
        self.listview.setRootIndex(self.fileModel.index(self.path))

        self.treeview.clicked.connect(self.on_clicked)
        self.listview.selectionModel().currentChanged.connect(self.file_selected)
        self.listview.selectionModel().currentChanged.connect(lambda: self.canvas.update_plot(self))
        self.listview.selectionModel().currentChanged.connect(lambda: self.col_selector.update_range(self.ncols))

    def on_clicked(self, index):
        self.path = self.dirModel.fileInfo(index).absoluteFilePath()
        self.listview.setRootIndex(self.fileModel.setRootPath(self.path))

    def file_selected(self, index):
        self.filename = self.fileModel.fileName(index)
        self.filepath = self.fileModel.filePath(index)
        self.load_file()

    def load_file(self):
        try:
            if self.filepath.endswith('.txt'):
                with open(self.filepath, 'r') as file:
                        self.header, self.xcol, self.ycol = '', [], []
                        for ln in file:
                            if ln.startswith('#'):
                                self.header += ln[2:]
                            else:
                                cols = ln.split('\t')
                                self.xcol.append(float(cols[0]))
                                self.ycol.append(float(cols[self.col_selector.sp.value()]))
                        self.ncols = len(cols)
                        self.col_selector.update_range(self.ncols)
        except:
            self.header, self.xcol, self.ycol = '', [0], [0]

    def update_rootdir(self, rootdir):
        self.path = rootdir
        self.treeview.setRootIndex(self.dirModel.index(self.path))
        self.listview.setRootIndex(self.fileModel.index(self.path))
class LogInspectorWindow(QMainWindow):
    def __init__(self, configFilePath, parent=None):
        super(LogInspectorWindow, self).__init__(parent)
        self.initMatPlotLib()
        self.configFilePath = configFilePath

        folder = os.path.dirname(self.configFilePath)
        if not os.path.exists(folder):
            os.makedirs(folder)

        if os.path.exists(self.configFilePath):
            # config.yaml found.  Read from file.
            file = open(self.configFilePath, 'r')
            self.config = yaml.safe_load(file)
            file.close()
        else:
            # config.yaml not found.  Create new file.
            self.config = {}
            self.config['logs_directory'] = os.path.join(
                os.path.expanduser("~"), "Documents", "Inertial_Sense", "Logs")
            self.config['directory'] = ""
            self.config['serials'] = ["ALL"]
            file = open(self.configFilePath, 'w')
            yaml.dump(self.config, file)
            file.close()

        self.currently_selected = 'posNEDMap'
        self.downsample = 5
        self.plotargs = None
        self.log = None
        self.plotter = None

    def initMatPlotLib(self):
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.figure.subplots_adjust(left=0.05,
                                    right=0.99,
                                    bottom=0.05,
                                    top=0.91,
                                    wspace=0.2,
                                    hspace=0.2)

    def addButton(self, name, function, multithreaded=True, layout=None):
        setattr(self, name + "button", QPushButton(name))
        # if multithreaded:
        # setattr(self, name+"buttonThread", Thread(target=function))
        # getattr(self, name+"button").pressed.connect(self.startLoadingIndicator)
        # getattr(self, name+"button").released.connect(getattr(self, name+"buttonThread").start)
        # else:
        getattr(self, name + "button").clicked.connect(function)
        # getattr(self, name + "button").setMinimumWidth(220)
        if layout is None:
            if self.buttonLayoutRightCol.count(
            ) < self.buttonLayoutMiddleCol.count():
                self.buttonLayoutRightCol.addWidget(
                    getattr(self, name + "button"))
            elif self.buttonLayoutMiddleCol.count(
            ) < self.buttonLayoutLeftCol.count():
                self.buttonLayoutMiddleCol.addWidget(
                    getattr(self, name + "button"))
            else:
                self.buttonLayoutLeftCol.addWidget(
                    getattr(self, name + "button"))
        else:
            layout.addWidget(getattr(self, name + "button"))

    def updatePlot(self):
        self.plot(self.currently_selected, self.plotargs)

    def updateWindowTitle(self):
        if np.shape(self.log.data[0, DID_DEV_INFO])[0] != 0:
            info = self.log.data[0, DID_DEV_INFO][0]
            infoStr = 'SN' + str(info[1]) + ', H:' + verArrayToString(
                info[2]) + ', F:' + verArrayToString(
                    info[3]) + ' build ' + str(
                        info[4]) + ', ' + dateTimeArrayToString(
                            info[8], info[9]) + ', ' + info[10].decode('UTF-8')
            self.setWindowTitle("LogInspector  -  " + infoStr)

    def choose_directory(self):
        log_dir = config['logs_directory']
        directory = QFileDialog.getExistingDirectory(
            parent=self, caption='Choose Log Directory', directory=log_dir)

        if directory != '':
            try:
                self.load(directory)
            except Exception as e:
                msg = QMessageBox()
                msg.setIcon(QMessageBox.Critical)
                msg.setText("Unable to load log: " + e.__str__())
                msg.setDetailedText(traceback.format_exc())
                msg.exec()

    def load(self, directory):
        print("loading files from " + directory)
        # if self.log is None:
        self.log = Log()
        self.log.load(directory)
        print("done loading")
        self.plotter = logPlot(False, False, 'svg', self.log)
        self.plotter.setDownSample(self.downsample)
        # str = ''
        # if self.log.navMode:
        #     str += 'NAV '
        # if self.log.rtk:
        #     str += 'RTK '
        # if self.log.compassing:
        #     str += 'Comp '
        # self.statusLabel.setText(str)
        self.updatePlot()
        self.updateWindowTitle()
        self.stopLoadingIndicator()

    def setupUi(self):
        self.setObjectName("LogInspector")
        self.setWindowTitle("LogInspector")
        self.resize(1280, 900)
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowSystemMenuHint
                            | QtCore.Qt.WindowMinMaxButtonsHint)
        self.setWindowIcon(QIcon("assets/Magnifying_glass_icon.png"))

        # MainWindow.showMaximized()

        self.createFileTree()
        self.createButtonColumn()
        self.formatButtonColumn()
        self.createBottomToolbar()

        self.figureLayout = QVBoxLayout()
        self.figureLayout.addWidget(self.canvas)
        self.figureLayout.addLayout(self.toolLayout)
        self.figureLayout.setStretchFactor(self.canvas, 1)

        layout = QHBoxLayout()
        layout.addLayout(self.controlLayout)
        layout.addLayout(self.figureLayout)
        layout.setStretch(1, 1)
        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)
        # self.resize(1280, 900)
        self.resize(1450, 1000)
        self.setAcceptDrops(True)

    def createButtonColumn(self):
        self.controlLayout = QVBoxLayout()
        self.buttonLayoutLeftCol = QVBoxLayout()
        self.buttonLayoutMiddleCol = QVBoxLayout()
        self.buttonLayoutRightCol = QVBoxLayout()
        self.addButton('Pos NED Map', lambda: self.plot('posNEDMap'))
        self.addButton('Pos NED', lambda: self.plot('posNED'))
        self.addButton('Pos LLA', lambda: self.plot('posLLA'))
        self.addButton('GPS LLA', lambda: self.plot('llaGps'))
        self.addButton('Vel NED', lambda: self.plot('velNED'))
        self.addButton('Vel UVW', lambda: self.plot('velUVW'))
        self.addButton('Attitude', lambda: self.plot('attitude'))
        self.addButton('Heading', lambda: self.plot('heading'))
        self.addButton('INS Status', lambda: self.plot('insStatus'))
        self.addButton('HDW Status', lambda: self.plot('hdwStatus'))
        self.addButton('GPS 1 Stats', lambda: self.plot('gpsStats'))
        self.addButton('GPS 2 Stats', lambda: self.plot('gps2Stats'))
        self.addButton('RTK Pos Stats', lambda: self.plot('rtkPosStats'))
        self.addButton('RTK Cmp Stats', lambda: self.plot('rtkCmpStats'))
        self.addButton('Flash Config', lambda: self.showFlashConfig())
        self.addButton('Device Info', lambda: self.showDeviceInfo())
        self.addButton('IMU PQR', lambda: self.plot('imuPQR'))
        self.addButton('IMU Accel', lambda: self.plot('imuAcc'))
        self.addButton('PSD PQR', lambda: self.plot('gyroPSD'))
        self.addButton('PSD Accel', lambda: self.plot('accelPSD'))
        self.addButton('Magnetometer', lambda: self.plot('magnetometer'))
        self.addButton('Temp', lambda: self.plot('temp'))

    def formatButtonColumn(self):
        self.buttonLayoutLeftCol.setAlignment(QtCore.Qt.AlignTop)
        self.buttonLayoutMiddleCol.setAlignment(QtCore.Qt.AlignTop)
        self.buttonLayoutRightCol.setAlignment(QtCore.Qt.AlignTop)
        self.buttonColumnLayout = QHBoxLayout()
        self.buttonColumnLayout.addLayout(self.buttonLayoutLeftCol)
        self.buttonColumnLayout.addLayout(self.buttonLayoutMiddleCol)
        self.buttonColumnLayout.addLayout(self.buttonLayoutRightCol)
        self.controlLayout.addLayout(self.buttonColumnLayout)
        self.controlDirLayout = QHBoxLayout()
        self.controlDirLayout.addWidget(self.dirLineEdit)
        self.controlLayout.addLayout(self.controlDirLayout)
        self.controlLayout.addWidget(self.fileTree)
        # self.buttonLayout.addItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding))
        # self.addButton('load', self.choose_directory, multithreaded=False)

    def createBottomToolbar(self):
        self.toolLayout = QHBoxLayout()
        self.toolLayout.addWidget(self.toolbar)

        self.loadingIndictator = QLabel()
        self.loadingMovie = QMovie('assets/loader.gif')
        self.emptyLoadingPicture = QPicture()
        self.emptyLoadingPicture.load('assets/empty_loader.png')
        self.stopLoadingIndicator()
        self.toolLayout.addWidget(self.loadingIndictator)

        self.toolLayout.addItem(
            QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding))
        # self.toolLayout.addWidget(QSpacerItem(150, 10, QSizePolicy.Expanding))

        self.copyImagePushButton = QPushButton()
        # self.copyImagePushButton.setText("Copy")
        # self.copyImagePushButton.setMinimumWidth(1)
        # self.copyImagePushButton.style().standardIcon(QStyle.SP_DialogOpenButton)
        self.copyImagePushButton.setIcon(self.style().standardIcon(
            QStyle.SP_DialogSaveButton))
        self.toolLayout.addWidget(self.copyImagePushButton)
        self.copyImagePushButton.clicked.connect(self.copyPlotToClipboard)

        downsampleLabel = QLabel()
        downsampleLabel.setText("DS")
        self.downSampleInput = QSpinBox()
        self.downSampleInput.setValue(self.downsample)
        self.toolLayout.addWidget(downsampleLabel)
        self.toolLayout.addWidget(self.downSampleInput)
        self.downSampleInput.valueChanged.connect(self.changeDownSample)

        self.statusLabel = QLabel()
        self.toolLayout.addWidget(self.statusLabel)

    def changeDownSample(self, val):
        self.downsample = val
        self.plotter.setDownSample(self.downsample)
        self.updatePlot()

    def copyPlotToClipboard(self):
        # pixmap = QPixmap.grabWidget(self.canvas)
        # QApplication.clipboard().setPixmap(pixmap)
        # pixmap.save('test.png')

        # store the image in a buffer using savefig(), this has the
        # advantage of applying all the default savefig parameters
        # such as background color; those would be ignored if you simply
        # grab the canvas using Qt
        buf = io.BytesIO()
        self.figure.savefig(buf)

        QApplication.clipboard().setImage(QImage.fromData(buf.getvalue()))
        buf.close()

    def startLoadingIndicator(self):
        self.loadingIndictator.setMovie(self.loadingMovie)
        self.loadingMovie.start()

    def dragEnterEvent(self, e):
        if (e.mimeData().hasUrls()):
            e.acceptProposedAction()

    def dropEvent(self, e):
        try:
            directory = e.mimeData().urls()[0].toLocalFile()
            self.load(directory)
        except Exception as e:
            self.showError(e)

    def showError(self, e):
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Critical)
        msg.setText("Unable to load log: " + e.__str__())
        msg.setDetailedText(traceback.format_exc())
        msg.exec()

    def createFileTree(self):
        self.dirModel = QFileSystemModel()
        self.dirModel.setRootPath(self.config["logs_directory"])
        self.dirModel.setFilter(QtCore.QDir.Dirs | QtCore.QDir.NoDotAndDotDot)
        self.dirLineEdit = QLineEdit()
        self.dirLineEdit.setText(self.config["logs_directory"])
        self.dirLineEdit.setFixedHeight(25)
        self.dirLineEdit.returnPressed.connect(self.handleTreeDirChange)
        self.fileTree = QTreeView()
        self.fileTree.setModel(self.dirModel)
        self.fileTree.setRootIndex(
            self.dirModel.index(self.config['logs_directory']))
        self.fileTree.setColumnHidden(1, True)
        self.fileTree.setColumnHidden(2, True)
        self.fileTree.setColumnHidden(3, True)
        self.fileTree.setMinimumWidth(300)
        self.fileTree.clicked.connect(self.handleTreeViewClick)
        self.fileTree.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.fileTree.setSelectionMode(QAbstractItemView.SingleSelection)
        self.fileTree.customContextMenuRequested.connect(
            self.handleTreeViewRightClick)
        # self.populateRMSCheck(self.config['logs_directory'])

    def updateFileTree(self):
        self.dirModel.setRootPath(self.config["logs_directory"])
        self.fileTree.setRootIndex(
            self.dirModel.index(self.config['logs_directory']))

    def populateRMSCheck(self, directory):
        for subdir in os.listdir(directory):
            path = os.path.join(directory, subdir)
            if os.path.isdir(path):
                self.populateRMSCheck(path)
            elif 'RMS' in subdir:
                f = open(path)
                rms_report = f.read()
                p = re.compile(r'(?<=^PASS/FAIL).*\n', re.M)
                line = re.search(p, rms_report).group()
                failed = True if "FAIL" in line else False
                if failed:
                    pass
                else:
                    pass

    def handleTreeDirChange(self):
        self.config["logs_directory"] = self.dirLineEdit.text()
        self.updateFileTree()

        file = open(self.configFilePath, 'w')
        yaml.dump(self.config, file)
        file.close()

    def handleTreeViewClick(self):
        selected_directory = self.fileTree.model().filePath(
            self.fileTree.selectedIndexes()[0])
        for fname in os.listdir(selected_directory):
            if fname.endswith('.dat'):
                try:
                    self.load(selected_directory)
                except Exception as e:
                    self.showError(e)
                break

    def handleTreeViewRightClick(self, event):
        selected_directory = os.path.normpath(self.fileTree.model().filePath(
            self.fileTree.selectedIndexes()[0]))
        menu = QMenu(self)
        copyAction = menu.addAction("Copy path")
        nppActionHot = menu.addAction("Run NPP, HOT start")
        nppActionCold = menu.addAction("Run NPP, COLD start")
        nppActionFactory = menu.addAction("Run NPP, FACTORY start")
        setDataInfoDirHotAction = menu.addAction(
            "Set dataInfo.json directory, HOT start")
        setDataInfoDirColdAction = menu.addAction(
            "Set dataInfo.json directory, COLD start")
        setDataInfoDirFactoryAction = menu.addAction(
            "Set dataInfo.json directory, FACTORY start")
        exploreAction = menu.addAction("Explore folder")
        cleanFolderAction = menu.addAction("Clean folder")
        deleteFolderAction = menu.addAction("Delete folder")
        action = menu.exec_(self.fileTree.viewport().mapToGlobal(event))
        if action == copyAction:
            cb = QApplication.clipboard()
            cb.clear(mode=cb.Clipboard)
            cb.setText(selected_directory, mode=cb.Clipboard)
        if action == nppActionHot:
            cleanFolder(selected_directory)
            setDataInformationDirectory(selected_directory,
                                        startMode=START_MODE_HOT)
            sys.path.insert(1, '../../../../python/src')
            from supernpp.supernpp import SuperNPP
            spp = SuperNPP(selected_directory, self.config['serials'])
            spp.run()
        if action == nppActionCold:
            cleanFolder(selected_directory)
            setDataInformationDirectory(selected_directory,
                                        startMode=START_MODE_COLD)
            sys.path.insert(1, '../../../../python/src')
            from supernpp.supernpp import SuperNPP
            spp = SuperNPP(selected_directory,
                           self.config['serials'],
                           startMode=START_MODE_COLD)
            spp.run()
        if action == nppActionFactory:
            cleanFolder(selected_directory)
            setDataInformationDirectory(selected_directory,
                                        startMode=START_MODE_FACTORY)
            sys.path.insert(1, '../../../../python/src')
            from supernpp.supernpp import SuperNPP
            spp = SuperNPP(selected_directory,
                           self.config['serials'],
                           startMode=START_MODE_FACTORY)
            spp.run()
        if action == setDataInfoDirHotAction:
            setDataInformationDirectory(selected_directory,
                                        startMode=START_MODE_HOT)
        if action == setDataInfoDirColdAction:
            setDataInformationDirectory(selected_directory,
                                        startMode=START_MODE_COLD)
        if action == setDataInfoDirFactoryAction:
            setDataInformationDirectory(selected_directory,
                                        startMode=START_MODE_FACTORY)
        if action == exploreAction:
            openFolderWithFileBrowser(selected_directory)
        if action == cleanFolderAction:
            cleanFolder(selected_directory)
        if action == deleteFolderAction:
            msg = QMessageBox(self)
            msg.setIcon(QMessageBox.Question)
            msg.setText("Are you sure you want to delete this folder?\n\n" +
                        selected_directory)
            msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
            result = msg.exec()
            if result == QMessageBox.Yes:
                removeDirectory(selected_directory)

    def stopLoadingIndicator(self):
        self.loadingMovie.stop()
        self.loadingIndictator.clear()
        self.loadingIndictator.setPicture(self.emptyLoadingPicture)

    def showDeviceInfo(self):
        dlg = DeviceInfoDialog(self.log, self)
        dlg.show()
        dlg.exec_()

    def showFlashConfig(self):
        dlg = FlashConfigDialog(self.log, self)
        dlg.show()
        dlg.exec_()

    def plot(self, func, args=None):
        print("plotting " + func)
        self.currently_selected = func
        self.plotargs = args

        self.figure.clear()

        if hasattr(self, 'plotter'):
            if args is not None:
                getattr(self.plotter, func)(*args, self.figure)
            else:
                getattr(self.plotter, func)(self.figure)

        self.canvas.draw()
        self.stopLoadingIndicator()
        print("done plotting")
Exemple #36
0
class AssetBrowser(QMainWindow, Ui_MainWindow, PlaygroundModule):
    Name = "asset_browser"

    def __init__(self, module_manager):
        super(AssetBrowser, self).__init__()
        self.setupUi(self)

        self.init_module(module_manager)

        self.dir_model = QFileSystemModel()
        self.dir_model.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs)
        self.dir_model.setReadOnly(False)

        self.dir_view.setModel(self.dir_model)
        self.dir_view.hideColumn(1)
        self.dir_view.hideColumn(2)
        self.dir_view.hideColumn(3)

        self.file_model = QFileSystemModel()
        self.file_model.setFilter(QDir.NoDotAndDotDot | QDir.Files)
        self.file_model.setReadOnly(False)

        self.file_view.setModel(self.file_model)

        self.dock = self.modules_manager.new_docked(self, self.Name, "Asset browser",
                                                    Qt.BottomDockWidgetArea)

        self.modules_manager.main_window.splitDockWidget(self.dock,
                                                         self.modules_manager["asset_view"].dock, Qt.Horizontal)

    def on_open_project(self, project):
        project_dir = project.project_dir
        path = os.path.join(project_dir)

        self.dir_model.setRootPath(path)
        self.file_model.setRootPath(path)

        self.dir_view.setRootIndex(self.dir_model.index(path))
        self.file_view.setRootIndex(self.file_model.index(path))

    def dir_clicked(self, idx):
        path = self.dir_model.fileInfo(idx).absoluteFilePath()

        self.file_view.setRootIndex(self.file_model.setRootPath(path))

    def file_doubleclicked(self, idx):
        fileinfo = self.file_model.fileInfo(idx)

        path = fileinfo.absoluteFilePath()
        ext = fileinfo.suffix()
        asset_name = path.replace(self.project_manager.project_dir, '').replace('/src/', '').split('.')[0]

        self.modules_manager.open_asset(path, asset_name, ext)

    def file_clicked(self, idx):
        fileinfo = self.file_model.fileInfo(idx)

        path = fileinfo.absoluteFilePath()
        ext = fileinfo.suffix()
        asset_name = path.replace(self.project_manager.project_dir, '').replace('/src/', '').split('.')[0]

        self.modules_manager.show_asset(path, asset_name, ext)
Exemple #37
0
class Dialog_ImageFolder():
    def __init__(self, parent, title, init_path):
        self.w = QDialog(parent)

        self.parent = parent
        self.left = 300
        self.top = 300
        self.width = 600
        self.height = 400
        self.title = title

        self.dirModel = QFileSystemModel()
        self.dirModel.setRootPath(init_path)
        self.dirModel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs)
        self.treeview = QTreeView()
        self.treeview.setModel(self.dirModel)
        self.treeview.setRootIndex(self.dirModel.index(""))
        self.treeview.clicked.connect(self.on_clicked)
        #--- Hide All Header Sections Except First ----
        header = self.treeview.header()
        for sec in range(1, header.count()):
            header.setSectionHidden(sec, True)
        #--- ---- ---- ---- ---- ---- ---- ---- ---- --

        focus_index = self.dirModel.index(init_path)
        self.treeview.setCurrentIndex(focus_index)
        self.current_row_changed()

        self.listview = QListView()
        self.listview.setViewMode(QListView.IconMode)
        self.listview.setIconSize(QSize(192, 192))

        targetfiles1 = glob.glob(os.path.join(init_path, '*.png'))
        targetfiles2 = glob.glob(os.path.join(init_path, '*.tif'))
        targetfiles3 = glob.glob(os.path.join(init_path, '*.tiff'))
        targetfiles = targetfiles1 + targetfiles2 + targetfiles3
        lm = _MyListModel(targetfiles, self.parent)
        self.listview.setModel(lm)

        self.sub_layout = QHBoxLayout()
        self.sub_layout.addWidget(self.treeview)
        self.sub_layout.addWidget(self.listview)

        self.buttonBox = QDialogButtonBox(QDialogButtonBox.Open
                                          | QDialogButtonBox.Cancel)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)

        self.main_layout = QVBoxLayout()
        self.main_layout.addLayout(self.sub_layout)
        self.main_layout.addWidget(self.buttonBox)

        self.w.setGeometry(self.left, self.top, self.width, self.height)
        self.w.setWindowTitle(self.title)
        self.w.setWindowIcon(QIcon(os.path.join(icon_dir, 'Mojo2_16.png')))
        self.w.setLayout(self.main_layout)

    def current_row_changed(self):
        index = self.treeview.currentIndex()
        self.treeview.scrollTo(index, QAbstractItemView.EnsureVisible)
        self.treeview.resizeColumnToContents(0)

    def on_clicked(self, index):
        path = self.dirModel.fileInfo(index).absoluteFilePath()

        targetfiles1 = glob.glob(os.path.join(path, '*.png'))
        targetfiles2 = glob.glob(os.path.join(path, '*.tif'))
        targetfiles3 = glob.glob(os.path.join(path, '*.tiff'))
        targetfiles = targetfiles1 + targetfiles2 + targetfiles3

        lm = _MyListModel(targetfiles, self.parent)
        self.listview.setModel(lm)

    def accept(self):
        index = self.treeview.currentIndex()
        self.newdir = self.dirModel.filePath(index)
        self.w.done(1)

    def reject(self):
        self.w.done(0)

    def GetValue(self):
        index = self.treeview.currentIndex()
        self.newdir = self.dirModel.filePath(index)
        return self.newdir
class NProject(QObject):
    """Project representation.
    SIGNALS:
    @projectPropertiesUpdated()
    """
    projectPropertiesUpdated = pyqtSignal()
    projectNameUpdated = pyqtSignal(str)
    def __init__(self, path):
        super(NProject, self).__init__()
        project = json_manager.read_ninja_project(path)

        self.path = path
        self._name = project.get('name', '')
        if self._name == '':
            self._name = file_manager.get_basename(path)
        self.project_type = project.get('project-type', '')
        self.description = project.get('description', '')
        if self.description == '':
            self.description = translations.TR_NO_DESCRIPTION
        self.url = project.get('url', '')
        self.license = project.get('license', '')
        self.main_file = project.get('mainFile', '')
        self.pre_exec_script = project.get('preExecScript', '')
        self.post_exec_script = project.get('postExecScript', '')
        self.indentation = project.get('indentation', settings.INDENT)
        self.use_tabs = project.get('use-tabs', settings.USE_TABS)
        self.extensions = project.get('supported-extensions',
            settings.SUPPORTED_EXTENSIONS)
        self.python_exec = project.get('pythonExec', settings.PYTHON_EXEC)
        self.python_path = project.get('PYTHONPATH', '')
        self.additional_builtins = project.get('additional_builtins', [])
        self.program_params = project.get('programParams', '')
        self.venv = project.get('venv', '')
        self.related_projects = project.get('relatedProjects', [])
        self.added_to_console = False
        self.is_current = False
        #Model is a QFileSystemModel to be set on runtime
        self.__model = QFileSystemModel()
        self.__model.setRootPath(path)

    def _get_name(self):
        return self._name

    def _set_name(self, name):
        if name == '':
            self._name = file_manager.get_basename(self.path)
        else:
            self._name = name
        self.projectNameUpdated.emit(self._name)

    name = property(_get_name, _set_name)

    def save_project_properties(self):
        #save project properties
        project = {}
        project['name'] = self._name
        project['description'] = self.description
        project['url'] = self.url
        project['license'] = self.license
        project['mainFile'] = self.main_file
        project['project-type'] = self.project_type
        project['supported-extensions'] = self.extensions
        project['indentation'] = self.indentation
        project['use-tabs'] = self.use_tabs
        project['pythonExec'] = self.python_exec  # FIXME
        project['PYTHONPATH'] = self.python_path
        project['additional_builtins'] = self.additional_builtins
        project['preExecScript'] = self.pre_exec_script
        project['postExecScript'] = self.post_exec_script
        project['venv'] = self.venv
        project['programParams'] = self.program_params
        project['relatedProjects'] = self.related_projects
        if file_manager.file_exists(self.path, self._name + '.nja'):
            file_manager.delete_file(self.path, self._name + '.nja')
        json_manager.create_ninja_project(self.path, self._name, project)
        #TODO: update project tree on extensions changed

    @property
    def full_path(self):
        '''
        Returns the full path of the project
        '''
        project_file = json_manager.get_ninja_project_file(self.path)
        if not project_file:  # FIXME: If we dont have a project file
            project_file = ''     # we should do SOMETHING! like kill zombies!
        return os.path.join(self.path, project_file)

    @property
    def python_exec_command(self):
        '''
        Returns the python exec command of the project
        '''
        if self.venv is '':
            return self.venv
        return self.python_exec

    @property
    def model(self):
        return self.__model

    @model.setter
    def model(self, model):  # lint:ok
        self.__model = model
        self.__model.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot |
            QDir.AllEntries)
        self.__model.setNameFilters(self.extensions)

    @model.deleter
    def model(self):  # lint:ok
        del(self.__model)
Exemple #39
0
class ViewerWindow(QWidget):
    statusWindow: QLabel = None
    bottomStatus: QLabel = None
    fsDirModel: QFileSystemModel = None
    fsFileModel: QFileSystemModel = None
    fsTree: QTreeView = None
    fsList: QListView = None

    def makeTop(self):
        topBox = QHBoxLayout()
        self.statusWidget = QLabel('')
        self.statusWidget.setMinimumHeight(1)
        self.statusWidget.setMaximumHeight(1)
        self.statusWidget.setStyleSheet(
            "QLabel { background-color : lightgray; color : black; }")
        topBox.addWidget(self.statusWidget)
        return topBox

    @pyqtSlot(QModelIndex)
    def onDirChange(self, index):
        mPath = self.fsDirModel.fileInfo(index).absoluteFilePath()
        self.fsList.setRootIndex(self.fsFileModel.setRootPath(mPath))
        print("Dir=%s", mPath)

    def makeExplorer(self, under):
        self.fsDirModel = QFileSystemModel()
        self.fsDirModel.setFilter(QDir.Dirs | QDir.Drives | QDir.NoDotAndDotDot
                                  | QDir.AllDirs)
        self.fsDirModel.setRootPath("")
        self.fsTree = QTreeView()
        self.fsTree.setModel(self.fsDirModel)
        self.fsTree.clicked.connect(self.onDirChange)
        self.fsTree.hideColumn(1)
        self.fsTree.hideColumn(2)
        self.fsTree.hideColumn(3)
        self.fsTree.hideColumn(4)
        self.fsTree.setStyleSheet(
            "QLabel { background-color : green; color : blue; }")
        return self.fsTree

    def makeFiles(self, under):
        self.fsFileModel = QFileSystemModel()
        self.fsFileModel.setFilter(QDir.NoDotAndDotDot | QDir.Files)
        self.fsFileModel.setRootPath("")
        self.fsList = QListView()
        self.fsList.setModel(self.fsFileModel)
        self.fsList.setStyleSheet(
            "QLabel { background-color : lightblue; color : blue; }")
        return self.fsList

    def makeDisplay(selfself, under):
        displayWidget = QLabel("Display")
        displayWidget.setAlignment(QtCore.Qt.AlignCenter)
        displayWidget.setStyleSheet(
            "QLabel { background-color : pink; color : blue; }")
        return displayWidget

    def makeMiddle(self):
        middleBox = QHBoxLayout()
        explorerWidget = self.makeExplorer(middleBox)
        explorerWidget.setMinimumHeight(300)
        explorerWidget.setMinimumWidth(300)
        explorerWidget.setMaximumWidth(400)
        explorerWidget.setMaximumHeight(20000)

        filesWidget = self.makeFiles(middleBox)
        filesWidget.setMinimumHeight(300)
        filesWidget.setMinimumWidth(300)
        filesWidget.setMaximumWidth(400)
        filesWidget.setMaximumHeight(20000)

        displayWidget = self.makeDisplay(middleBox)
        displayWidget.setMinimumHeight(300)
        displayWidget.setMinimumWidth(300)
        displayWidget.setMaximumHeight(20000)

        middleBox.addWidget(explorerWidget)
        middleBox.addWidget(filesWidget)
        middleBox.addWidget(displayWidget)
        return middleBox

    @pyqtSlot()
    def okOK(self):
        print("Clicked")

    def makeBottom(self):
        bottomBox = QHBoxLayout()
        self.bottomStatus = QLabel("Status")
        self.bottomStatus.setMaximumHeight(20)
        self.bottomStatus.setMinimumHeight(20)
        self.bottomStatus.setStyleSheet(
            "QLabel { background-color : lightgray; color : black; }")
        bottomBox.addWidget(self.bottomStatus)
        bottomOK = QPushButton("Quit", self)
        bottomOK.setMaximumWidth(80)
        bottomOK.setToolTip("Quit Application")
        bottomOK.clicked.connect(self.okOK)
        bottomBox.addWidget(bottomOK)
        return bottomBox

    def __init__(self):
        super().__init__()

        vbox = QVBoxLayout()
        vbox.addLayout(self.makeTop())
        vbox.addLayout(self.makeMiddle())
        vbox.addLayout(self.makeBottom())

        self.setLayout(vbox)
        self.setWindowTitle("QtText")
        self.setGeometry(200, 200, 800, 600)
class MyMainWindow(QMainWindow):

    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.config_window()
        self.create_widgets()
        self.config_widgets()
        self.create_menubar()
        self.bind_widgets()
        self.show_widgets()

    def config_window(self):
        self.setWindowTitle('DirectoPy')
        self.setMinimumHeight(600)
        self.setMinimumWidth(1000)

    def create_widgets(self):
        self.central_widget = QWidget()
        self.main_layout = QGridLayout()
        self.moveup_button = QPushButton('Collapse all', self)
        self.goto_lineedit = QLineEdit('', self)
        self.goto_button = QPushButton('Go', self)
        self.folder_view = QTreeView(self)
        self.file_view = QTreeView(self)
        self.folder_model = QFileSystemModel(self)
        self.file_model = QFileSystemModel(self)

    def config_widgets(self):
        self.main_layout.addWidget(self.moveup_button, 0, 0)
        self.main_layout.addWidget(self.goto_lineedit, 0, 1, 1, 2)
        self.main_layout.addWidget(self.goto_button, 0, 3)
        self.main_layout.addWidget(self.folder_view, 1, 0, 1, 2)
        self.main_layout.addWidget(self.file_view, 1, 2, 1, 2)

        self.central_widget.setLayout(self.main_layout)

        # Кнопка "вверх"
        self.moveup_button.setMaximumWidth(100)

        # Кнопка "перейти"
        self.goto_button.setMaximumWidth(70)
        self.setCentralWidget(self.central_widget)
        # панели
        self.folder_model.setRootPath(None)
        self.folder_model.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot)
        self.folder_view.setModel(self.folder_model)
        self.folder_view.setRootIndex(self.folder_model.index(None))
        self.folder_view.clicked[QModelIndex].connect(self.clicked_onfolder)
        self.folder_view.hideColumn(1)
        self.folder_view.hideColumn(2)
        self.folder_view.hideColumn(3)

        self.file_model.setFilter(QDir.Files)
        self.file_view.setModel(self.file_model)
        self.file_model.setReadOnly(False)
        self.file_view.setColumnWidth(0, 200)
        self.file_view.setSelectionMode(QAbstractItemView.ExtendedSelection)

    # открытие папки при нажати на неё в окне папок
    def clicked_onfolder(self, index):
        selection_model = self.folder_view.selectionModel()
        index = selection_model.currentIndex()
        dir_path = self.folder_model.filePath(index)
        self.file_model.setRootPath(dir_path)
        self.file_view.setRootIndex(self.file_model.index(dir_path))

    # ф-я открытия нового файла
    def open_file(self):
        index = self.file_view.selectedIndexes()
        if not index:
            return
        else:
            index = index[0]
        file_path = self.file_model.filePath(index).replace('/', '\\')
        print(file_path)
        self.file_view.update()

    # ф-я создания нового файла
    def new_file(self):
        global file_name
        index = self.folder_view.selectedIndexes()
        if len(index) > 0:
            path = self.folder_model.filePath(index[0])
            for i in range(1, 9999999999999999):
                if not os.path.isfile(os.path.join(path, "newfile{}.txt".format(i))):
                    file_name = os.path.join(path, "newfile{}.txt".format(i))
                    break
            file_name = os.path.abspath(file_name)
            open(file_name, 'w').close()
        else:
            print("Please, select folder")

    # ф-я удаления файла
    def delete_file(self):
        indexes = self.file_view.selectedIndexes()
        for i in indexes:
            self.file_model.remove(i)

    # ф-я переименования файла
    def rename_file(self):
        index = self.file_view.selectedIndexes()
        if not index:
            return
        else:
            index = index[0]
        self.file_view.edit(index)

    # ф-я копирования файла
    def copy_file(self):
        print("COPY")
        ask = QFileDialog.getExistingDirectory(self, "Open Directory", "C:\\",
                                               QFileDialog.ShowDirsOnly |
                                               QFileDialog.DontResolveSymlinks)
        new_path = ask.replace('\\', '/')
        indexes = self.file_view.selectedIndexes()[::4]
        for i in indexes:
            new_filename = new_path + '/' + self.file_model.fileName(i)
            copy2(self.file_model.filePath(i), new_filename)

    # ф-я возвращения к корню пути
    def colapse(self):
        self.folder_view.collapseAll()

    # ф-я перемещения в заданную директорию
    def go_to(self):
        dir_path = self.goto_lineedit.text().replace('\\', '/')
        print(dir_path)
        self.file_model.setRootPath(dir_path)
        self.file_view.setRootIndex(self.file_model.index(dir_path))

        #self.file_model.setRootPath()

    # ф-я перемещения файла
    def move_file(self):
        print("MOVE")
        ask = QFileDialog.getExistingDirectory(self, "Open Directory", "C:\\",
                                               QFileDialog.ShowDirsOnly |
                                               QFileDialog.DontResolveSymlinks)
        if ask == '':
            return
        new_path = ask.replace('\\', '/')
        indexes = self.file_view.selectedIndexes()[::4]
        for i in indexes:
            new_filename = new_path + '/' + self.file_model.fileName(i)
            move(self.file_model.filePath(i), new_filename)

    # ф-я создания новой папки
    def new_folder(self):
        global file_name
        index = self.folder_view.selectedIndexes()
        if len(index) > 0:
            path = self.folder_model.filePath(index[0])
            for i in range(1, 9999999999999999):
                if not os.path.isdir(os.path.join(path, "newfolder{}".format(i))):
                    file_name = os.path.join(path, "newfolder{}".format(i))
                    break
            file_name = os.path.abspath(file_name)
            os.mkdir(file_name)
        else:
            print("Please, select folder")

    # ф-я удаления папки
    def delete_folder(self):
        indexes = self.folder_view.selectedIndexes()
        for i in indexes:
            self.folder_model.remove(i)

    # ф-я переименования папки
    def rename_folder(self):
        index = self.folder_view.selectedIndexes()
        if not index:
            return
        else:
            index = index[0]
        self.folder_view.edit(index)

    # ф-я закрытия окна файлового менеджера
    def exit_application(self):
       print("EXIT")
       self.close()

    # задавание функции каждой кнопке
    def bind_widgets(self):
        self.open_file_action.triggered.connect(self.open_file)
        self.new_file_action.triggered.connect(self.new_file)
        self.delete_file_action.triggered.connect(self.delete_file)
        self.rename_file_action.triggered.connect(self.rename_file)
        self.copy_file_action.triggered.connect(self.copy_file)
        self.move_file_action.triggered.connect(self.move_file)
        self.exit_action.triggered.connect(self.exit_application)
        self.new_folder_action.triggered.connect(self.new_folder)
        self.delete_folder_action.triggered.connect(self.delete_folder)
        self.rename_folder_action.triggered.connect(self.rename_folder)


        self.goto_button.clicked.connect(partial(self.go_to))
        self.moveup_button.clicked.connect(partial(self.colapse))

    # создание меню
    def create_menubar(self):

        self.exit_action = QAction('Exit', self)
        self.exit_action.setShortcut('Ctrl+Q')

        self.new_file_action = QAction('New file', self)
        self.new_file_action.setShortcut('F4')

        self.open_file_action = QAction('Open file', self)
        self.open_file_action.setShortcut('F3')

        self.rename_file_action = QAction('Rename file', self)
        self.rename_file_action.setShortcut('F2')

        self.delete_file_action = QAction('Remove file', self)
        self.delete_file_action.setShortcut(QKeySequence.Delete)

        self.copy_file_action = QAction('Copy folder...', self)
        self.copy_file_action.setShortcut(QKeySequence.Copy)

        self.move_file_action = QAction('Move folder...', self)
        self.move_file_action.setShortcut(QKeySequence.Cut)

        self.new_folder_action = QAction('New folder', self)
        self.new_folder_action.setShortcut('Ctrl+Shift+N')

        self.delete_folder_action = QAction('Delete folder', self)
        self.delete_folder_action.setShortcut('Ctrl+Shift+Del')

        self.rename_folder_action = QAction('Rename folder', self)
        self.rename_folder_action.setShortcut('Ctrl+Shift+R')

        self.menubar = self.menuBar()
        self.file_menu = self.menubar.addMenu('File')
        self.file_menu.addAction(self.new_file_action)
        self.file_menu.addAction(self.open_file_action)
        self.file_menu.addAction(self.rename_file_action)
        self.file_menu.addAction(self.delete_file_action)
        self.file_menu.addAction(self.copy_file_action)
        self.file_menu.addAction(self.move_file_action)
        self.file_menu.addSeparator()
        self.file_menu.addAction(self.exit_action)

        self.folder_menu = self.menubar.addMenu('Folder')
        self.folder_menu.addAction(self.new_folder_action)
        self.folder_menu.addAction(self.delete_folder_action)
        self.folder_menu.addAction(self.rename_folder_action)

    def show_widgets(self):
        self.setLayout(self.main_layout)
Exemple #41
0
class MainView(QMainWindow):

    resizeCompleted = pyqtSignal()

    def __init__(self, model, controller, image_path):
        self.settings = SettingsModel()
        self.slideshow = SlideshowModel()

        self.model = model
        self.canvas = self.model.canvas
        self.main_controller = controller
        self.canvas_controller = CanvasController(self.canvas)
        super(MainView, self).__init__()
        self.build_ui()
        self.center_ui()

        # Resize timer to prevent laggy updates
        self.resize_timer = None
        self.resizeCompleted.connect(self.resize_completed)

        # Slideshow
        if self.settings.get('Slideshow', 'reverse') == 'True':
            self.slideshow.updateSignal.connect(self.on_previous_item)
        else:
            self.slideshow.updateSignal.connect(self.on_next_item)
            
        self.model.subscribe_update_func(self.update_ui_from_model)

        self.arguments = {
            'image_path': image_path
        }

    def build_ui(self):
        self.ui = Ui_Hitagi()
        self.ui.setupUi(self)

        # File menu
        self.ui.actionSet_as_wallpaper.triggered.connect(self.on_set_as_wallpaper)
        self.ui.actionCopy_to_clipboard.triggered.connect(self.on_clipboard)
        self.ui.actionOpen_current_directory.triggered.connect(self.on_current_dir)
        self.ui.actionOptions.triggered.connect(self.on_options)
        self.ui.actionExit.triggered.connect(self.on_close)

        # Folder menu 
        self.ui.actionOpen_next.triggered.connect(self.on_next_item)
        self.ui.actionOpen_previous.triggered.connect(self.on_previous_item)
        self.ui.actionChange_directory.triggered.connect(self.on_change_directory)
        self.ui.actionSlideshow.triggered.connect(self.on_slideshow)

        # View menu
        self.ui.actionZoom_in.triggered.connect(self.on_zoom_in)
        self.ui.actionZoom_out.triggered.connect(self.on_zoom_out)
        self.ui.actionOriginal_size.triggered.connect(self.on_zoom_original)
        self.ui.actionRotate_clockwise.triggered.connect(self.on_rotate_clockwise)
        self.ui.actionRotate_counterclockwise.triggered.connect(self.on_rotate_counterclockwise)
        self.ui.actionFlip_horizontally.triggered.connect(self.on_flip_horizontal)
        self.ui.actionFlip_vertically.triggered.connect(self.on_flip_vertical)
        self.ui.actionFit_image_width.triggered.connect(self.on_scale_image_to_width)
        self.ui.actionFit_image_height.triggered.connect(self.on_scale_image_to_height)
        self.ui.actionFile_list.triggered.connect(self.on_toggle_filelist)
        self.ui.actionFullscreen.triggered.connect(self.on_fullscreen)

        # Favorite menu
        self.ui.actionAdd_to_favorites.triggered.connect(self.on_add_to_favorites)
        self.ui.actionRemove_from_favorites.triggered.connect(self.on_remove_from_favorites)

        # Help menu
        self.ui.actionChangelog.triggered.connect(self.on_changelog)
        self.ui.actionAbout.triggered.connect(self.on_about)

        # Load stylesheet
        stylesheet_dir = "resources/hitagi.stylesheet"
        with open(stylesheet_dir, "r") as sh:
            self.setStyleSheet(sh.read())
        
        # File listing
        self.file_model = QFileSystemModel()
        self.file_model.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs | QDir.Files)
        self.file_model.setNameFilters(['*.bmp', '*.gif', '*.jpg', '*.jpeg', '*.png', '*.png', '*.pbm', '*.pgm', '*.ppm', '*.xbm', '*.xpm'])
        self.file_model.setNameFilterDisables(False)
        self.file_model.setRootPath(self.settings.get('Directory', 'default'))

        self.ui.treeView.setModel(self.file_model)
        self.ui.treeView.setColumnWidth(0, 120)
        self.ui.treeView.setColumnWidth(1, 120)
        self.ui.treeView.hideColumn(1)
        self.ui.treeView.hideColumn(2)

        # Double click
        self.ui.treeView.activated.connect(self.on_dir_list_activated)
        # Update file list
        self.ui.treeView.clicked.connect(self.on_dir_list_clicked)
        # Open parent
        self.ui.pushButton_open_parent.clicked.connect(self.on_open_parent)
        self.ui.pushButton_favorite.clicked.connect(self.on_manage_favorite)

        # Shortcuts
        _translate = QCoreApplication.translate
        self.ui.actionExit.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Exit')))

        self.ui.actionOpen_next.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Next')))
        self.ui.actionOpen_previous.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Previous')))
        self.ui.actionChange_directory.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Directory')))
        self.ui.actionAdd_to_favorites.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Add to favorites')))
        self.ui.actionRemove_from_favorites.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Remove from favorites')))
        self.ui.actionSlideshow.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Slideshow')))

        self.ui.actionZoom_in.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Zoom in')))
        self.ui.actionZoom_out.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Zoom out')))
        self.ui.actionOriginal_size.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Zoom original')))
        self.ui.actionRotate_clockwise.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Rotate clockwise')))
        self.ui.actionRotate_counterclockwise.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Rotate counterclockwise')))
        self.ui.actionFlip_horizontally.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Flip horizontal')))
        self.ui.actionFlip_vertically.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Flip vertical')))
        self.ui.actionFit_image_width.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Fit to width')))
        self.ui.actionFit_image_height.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Fit to height')))
        self.ui.actionFile_list.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Toggle filelist')))
        self.ui.actionFullscreen.setShortcut(_translate("Hitagi", self.settings.get('Hotkeys', 'Fullscreen')))

        # Load favorites in UI
        self.load_favorites()

        # Background
        self.ui.graphicsView.setBackgroundBrush(QBrush(QColor(self.settings.get('Look', 'background')), Qt.SolidPattern))

        # Save current height for fullscreen mode
        self.default_menubar_height = self.ui.menubar.height()
        # Save current width for file list
        self.default_filelist_width = self.ui.fileWidget.width()

    def load_favorites(self):
        self.favorites = FavoritesModel()
        self.ui.menuFavorites.clear()
        for item in self.favorites.items():
            self.ui.menuFavorites.addAction(item).triggered.connect((lambda item: lambda: self.on_open_favorite(item))(item))

    def on_open_favorite(self, path):
        self.main_controller.change_directory(path)

    def center_ui(self):
        ui_geometry = self.frameGeometry()
        center_point = QDesktopWidget().availableGeometry().center()
        ui_geometry.moveCenter(center_point)
        self.move(ui_geometry.topLeft())
   
    # Qt show event
    def showEvent(self, event):
        self.main_controller.start(self.arguments['image_path']) # Arguments and starting behaviour

        # Start in fullscreen mode according to settings
        if self.settings.get('Misc', 'fullscreen_mode') == 'True':
            self.on_fullscreen()
            
        # Initialize container geometry to canvas
        self.canvas_controller.update(self.ui.graphicsView.width(), self.ui.graphicsView.height())
        self.main_controller.update_canvas()

    def update_resize_timer(self, interval=None):
        if self.resize_timer is not None:
            self.killTimer(self.resize_timer)
        if interval is not None:
            self.resize_timer = self.startTimer(interval)
        else:
            self.resize_timer = None

    # Qt resize event
    def resizeEvent(self, event):
        self.update_resize_timer(300)

    # Qt timer event
    def timerEvent(self, event):
        if event.timerId() == self.resize_timer:
            self.update_resize_timer()
            self.resizeCompleted.emit()

    def resize_completed(self):
        self.canvas_controller.update(self.ui.graphicsView.width(), self.ui.graphicsView.height())
        self.main_controller.update_canvas()
        
    # Additional static shortcuts
    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape and self.model.is_fullscreen:
            self.main_controller.toggle_fullscreen()

    def on_open_parent(self):
        parent_index = self.file_model.parent(self.file_model.index(self.file_model.rootPath()))
        self.file_model.setRootPath(self.file_model.filePath(parent_index))
        self.ui.treeView.setRootIndex(parent_index)

        # Update directory path
        self.model.directory = self.file_model.filePath(parent_index)

        self.update_ui_from_model()

    def on_dir_list_activated(self, index):
        if self.file_model.isDir(index) is not False:
            self.file_model.setRootPath(self.file_model.filePath(index))
            self.ui.treeView.setRootIndex(index)

            # Save current path
            self.model.directory = self.file_model.filePath(index)
            self.update_ui_from_model()
        
    def on_dir_list_clicked(self, index):
        self.main_controller.open_image(self.file_model.filePath(index))

    # File menu
    def on_set_as_wallpaper(self):
        from hitagilib.view.WallpaperView import WallpaperDialog
        from hitagilib.controller.wallpaper import WallpaperController

        image = self.model.get_image()
        if image is not None:
            dialog = WallpaperDialog(self, None, WallpaperController(self.model), image)
            dialog.show()

    def on_clipboard(self):
        self.main_controller.copy_to_clipboard()

    def on_current_dir(self):
        if not self.main_controller.open_in_explorer():
            self.show_explorer_error()

    def on_options(self):
        from hitagilib.view.OptionsView import OptionDialog
        self.dialog = OptionDialog(self)
        self.dialog.show()

    def on_close(self):
        if self.slideshow.isRunning():
            self.slideshow.exit()
        self.close()

    # Folder menu
    def on_next_item(self):
        current_index = self.ui.treeView.currentIndex()
        
        # Slideshow restart - determine if we are at the end of our file list
        if self.slideshow.is_running and self.settings.get('Slideshow', 'restart') == 'True' and not self.ui.treeView.indexBelow(current_index).isValid():
            self.main_controller.open_image(self.file_model.filePath(current_index))
            self.on_slideshow_restart(0) # Restart slideshow
        elif self.slideshow.is_running and self.settings.get('Slideshow', 'random') == 'True':
            # Random index - moveCursor expects constants @http://doc.qt.io/qt-5/qabstractitemview.html#CursorAction-enum
            index = self.ui.treeView.moveCursor(randint(0,9), Qt.NoModifier)
            self.ui.treeView.setCurrentIndex(index)
            self.main_controller.open_image(self.file_model.filePath(index))
        else:
            # Proceed normally, scroll down
            index = self.ui.treeView.moveCursor(QAbstractItemView.MoveDown, Qt.NoModifier)
            self.ui.treeView.setCurrentIndex(index)
            self.main_controller.open_image(self.file_model.filePath(index))

    def on_previous_item(self):
        current_index = self.ui.treeView.currentIndex()
        
        # Slideshow restart (reverse) - determine if we are the the top of our file list
        if self.slideshow.is_running and self.settings.get('Slideshow', 'restart') == 'True' and not self.ui.treeView.indexAbove(current_index).isValid():
            self.main_controller.open_image(self.file_model.filePath(current_index))
            self.on_slideshow_restart(1) # Restart slideshow
        elif self.slideshow.is_running and self.settings.get('Slideshow', 'random') == 'True':
            # Random index
            index = self.ui.treeView.moveCursor(randint(0,9), Qt.NoModifier)
            self.ui.treeView.setCurrentIndex(index)
            self.main_controller.open_image(self.file_model.filePath(index))
        else:
            # Proceed normally, scroll up
            index = self.ui.treeView.moveCursor(QAbstractItemView.MoveUp, Qt.NoModifier)
            self.ui.treeView.setCurrentIndex(index)
            self.main_controller.open_image(self.file_model.filePath(index))

    def on_slideshow(self):
        if self.ui.actionSlideshow.isChecked():
            self.slideshow.start()
            self.slideshow.is_running = True
        else:
            self.slideshow.is_running = False
            self.slideshow.exit()

    def on_slideshow_restart(self, direction):
        # 0: Restart from top to bottom
        # 1: Restart from bottom to top
        if direction == 0:
            index = self.ui.treeView.moveCursor(QAbstractItemView.MoveHome, Qt.NoModifier)
            self.main_controller.open_image(self.file_model.filePath(index))
        else:
            index = self.ui.treeView.moveCursor(QAbstractItemView.MoveEnd, Qt.NoModifier)
            self.main_controller.open_image(self.file_model.filePath(index))

        self.ui.treeView.setCurrentIndex(index)
            
        
    def on_change_directory(self):
        self.main_controller.change_directory()

    # View menu
    def on_zoom_in(self):
        self.canvas_controller.scale_image(1.1)

    def on_zoom_out(self):
        self.canvas_controller.scale_image(0.9)
    
    def on_rotate_clockwise(self):
        self.canvas_controller.rotate_image(90)

    def on_rotate_counterclockwise(self):
        self.canvas_controller.rotate_image(-90)

    def on_flip_horizontal(self):
        self.canvas_controller.flip_image(0)

    def on_flip_vertical(self):
        self.canvas_controller.flip_image(1)

    def on_scale_image_to_width(self):
        self.canvas_controller.update_image(1)

    def on_scale_image_to_height(self):
        self.canvas_controller.update_image(2)

    def on_zoom_original(self):
        self.canvas_controller.update_image(3)

    def on_toggle_filelist(self):
        if self.ui.fileWidget.isHidden():
            self.ui.fileWidget.show()
        else:
            self.ui.fileWidget.hide()
        self.update_resize_timer(300)
        
    def on_fullscreen(self):
        self.main_controller.toggle_fullscreen()
        
        if self.model.is_fullscreen:
            self.showFullScreen()
            if self.settings.get('Misc', 'hide_menubar') == 'True':
                self.ui.menubar.setMaximumHeight(0) # Workaround to preserve shortcuts
        else:
            self.showNormal()
            if self.settings.get('Misc', 'hide_menubar') == 'True':
                self.ui.menubar.setMaximumHeight(self.default_menubar_height)
        self.canvas_controller.update(self.ui.graphicsView.width(), self.ui.graphicsView.height())
        self.main_controller.update_canvas()

    # Favorite button
    def on_manage_favorite(self):
        if self.main_controller.check_favorites(self.model.directory):
            self.on_remove_from_favorites()
        else:
            self.on_add_to_favorites()

    # Favorite menu
    def on_add_to_favorites(self):
        self.main_controller.add_to_favorites()
        self.load_favorites()
        self.update_ui_from_model()

    def on_remove_from_favorites(self):
        self.main_controller.remove_from_favorites()
        self.load_favorites()
        self.update_ui_from_model()

    # Help menu
    def on_changelog(self):
        webbrowser.open('https://github.com/gimu/hitagi-reader/releases')

    def on_about(self):
        from hitagilib.view.AboutView import AboutDialog
        dialog = AboutDialog(self, None, None)
        dialog.show()

    def on_fileWidget_visibilityChanged(self, visible):
        """On file list hide/show and de/attachment"""
        if visible:
            self.ui.actionFile_list.setChecked(True)
        else:
            self.ui.actionFile_list.setChecked(False)
        self.update_resize_timer(300)

    def show_explorer_error(self):
        notify = QMessageBox()
        notify.setWindowTitle("Error")
        notify.setText(QCoreApplication.translate('Hitagi', "Couldn't open the current directory with an appropriate filemanager!"))
        notify.exec_()

    def update_ui_from_model(self):
        """Update UI from model."""
        self.settings = SettingsModel()

        # On changing directory
        self.file_model.setRootPath(self.model.directory)
        self.ui.treeView.setRootIndex(self.file_model.index(self.model.directory))

        # Update favorite button
        if self.main_controller.check_favorites(self.model.directory):
            self.ui.pushButton_favorite.setText(QCoreApplication.translate('Hitagi', "Unfavorite"))
        else:
            self.ui.pushButton_favorite.setText(QCoreApplication.translate('Hitagi', "Favorite"))

        # Canvas update
        self.ui.graphicsView.setScene(self.canvas.scene)
Exemple #42
-1
class LocalPathView(QTreeView):
    def __init__ (self):
        super(LocalPathView, self).__init__()
        self._model = QFileSystemModel()
        self._model.setFilter(QDir.Dirs | QDir.Drives | QDir.NoDotAndDotDot | QDir.AllDirs)
        self._model.setRootPath('')
        self.setModel(self._model )

        self.hideColumn(1); # removing Size Column
        self.hideColumn(2); # removing Type Column
        self.setAnimated(False)
        self.setSortingEnabled(True)
        self.header().setSortIndicator(0, Qt.AscendingOrder)

        width = self.size().width() >> 1
        self.setColumnWidth(0, width*0.7)
        self.setColumnWidth(1, width*0.3)

        index = self._model.index(QDir.currentPath())
        self.selectionModel().setCurrentIndex(index, QItemSelectionModel.Select | QItemSelectionModel.Rows)
        self.expand(index)
        self.scrollTo(index)

    @property
    def selectedDir(self):
        return self._model.filePath(self.selectionModel().selectedIndexes()[0])