Пример #1
0
class SessionParamWidget(Qt.QWidget):

	def __init__(self, parent=None):
		Qt.QWidget.__init__(self, parent)

		self.file_model = QFileSystemModel()

	def set_directory(self,directory):
		self.directory = directory
		self.file_model.setRootPath(directory)

	def setup_tree(self):
		self.folder_select_tree.setModel(self.file_model)
		self.folder_select_tree.setRootIndex(self.file_model.index(self.directory));

	def connect_tree(self):
		self.folder_select_tree.clicked.connect(self.set_session_folder)

	def set_session_folder(self, index):
		indexItem = self.file_model.index(index.row(), 0, index.parent())
		fileName = self.file_model.fileName(indexItem)
		filePath = self.file_model.filePath(indexItem)

		print(fileName)
		print(filePath)
Пример #2
0
class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 file system view - pythonspot.com'
        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()

        r_inx = self.model.setRootPath(".")
        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setAnimated(False)
        self.tree.setIndentation(15)
        self.tree.setSortingEnabled(True)
        self.tree.setWindowTitle("Dir View")
        self.tree.resize(640, 480)
        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.tree)
        self.setLayout(windowLayout)
        print(self.model.rootPath())
        print(self.model.filePath(self.model.parent(r_inx)))
        index_temp = self.model.index(0, 0, QModelIndex())
        print(self.model.fileName(index_temp))
        self.show()
Пример #3
0
class QmyMainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.model = QFileSystemModel(self)
        self.model.setRootPath(QDir.currentPath())
        self.ui.qTreeView.setModel(self.model)
        self.ui.qListView.setModel(self.model)
        self.ui.qTableView.setModel(self.model)

        self.ui.qTreeView.clicked.connect(self.ui.qListView.setRootIndex)
        self.ui.qTreeView.clicked.connect(self.ui.qTableView.setRootIndex)

    def on_qTreeView_clicked(self, index):
        self.ui.qCheckBox.setChecked(self.model.isDir(index))
        self.ui.qLabel1.setText(self.model.filePath(index))
        self.ui.qLabel4.setText(self.model.type(index))
        self.ui.qLabel2.setText(self.model.fileName(index))
        fileSize = self.model.size(index)/1024
        if(fileSize<1024):
            self.ui.qLabel3.setText("%d KB" % fileSize)
        else:
            self.ui.qLabel3.setText("%.2f MB" % (fileSize/1024))
Пример #4
0
class QmyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)  #调用父类构造函数,创建窗体
        self.ui = Ui_MainWindow()  #创建UI对象
        self.ui.setupUi(self)  #构造UI界面

        self.__buildModelView()

##  ==============自定义功能函数============

    def __buildModelView(self):  ##构造Model/View 系统
        self.model = QFileSystemModel(self)
        self.model.setRootPath(QDir.currentPath())

        self.ui.treeView.setModel(self.model)  #设置数据模型
        self.ui.listView.setModel(self.model)
        self.ui.tableView.setModel(self.model)

        self.ui.treeView.clicked.connect(self.ui.listView.setRootIndex)
        self.ui.treeView.clicked.connect(self.ui.tableView.setRootIndex)

##  ==========由connectSlotsByName() 自动连接的槽函数==================

    def on_treeView_clicked(self, index):  ##treeView单击
        self.ui.chkBox_IsDir.setChecked(self.model.isDir(index))  #是否是目录

        self.ui.LabPath.setText(self.model.filePath(index))  #目录名
        self.ui.LabType.setText(self.model.type(index))  #节点类型
        self.ui.LabFileName.setText(self.model.fileName(index))  #文件名

        fileSize = self.model.size(index) / 1024
        if (fileSize < 1024):
            self.ui.LabFileSize.setText("%d KB" % fileSize)
        else:
            self.ui.LabFileSize.setText("%.2f MB" % (fileSize / 1024.0))
Пример #5
0
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)
Пример #6
0
class SelectFolderWindow(QtGui.QDialog, Ui_Session_Dialog):
    def __init__(self, directory, parent=None):
        super(SelectFolderWindow, self).__init__(parent)
        self.setupUi(self)
        self.folder_name = None
        self.folder_path = None
        self.file_model = QFileSystemModel()
        self.directory = directory
        self.file_model.setRootPath(directory)
        self.folder_tree.setModel(self.file_model)
        self.folder_tree.setRootIndex(self.file_model.index(self.directory))
        self.folder_tree.clicked.connect(self.set_session_folder)

    def update_file_model(self, new_dir):
        self.directory = new_dir
        self.file_model.setRootPath(new_dir)

    def set_session_folder(self, index):
        indexItem = self.file_model.index(index.row(), 0, index.parent())
        self.folder_name = self.file_model.fileName(indexItem)
        self.folder_path = self.file_model.filePath(indexItem)
        self.selected_session.setText(self.folder_path)
Пример #7
0
class QmyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)  #调用父类构造函数,创建窗体
        self.ui = Ui_MainWindow()  #创建Ui对象
        self.ui.setupUi(self)  #构造UI
        self.LabPath = QLabel(self)
        self.ui.statusBar.addWidget(self.LabPath)
        self.__buildModelView()

    ##==========自定义功能函数==========
    def __buildModelView(self):

        self.model = QFileSystemModel(self)  #定义数据模型
        self.model.setRootPath(QDir.currentPath())  #获取当前路径,并设置为model的根目录
        self.ui.treeView.setModel(self.model)  #将self.model设置为自己的数据模型
        self.ui.listView.setModel(self.model)
        self.ui.tableView.setModel(self.model)
        #将treeView的cilcked信号与listView与tableView的槽函数setRootIndex相关联
        self.ui.treeView.clicked.connect(self.ui.listView.setRootIndex)
        self.ui.treeView.clicked.connect(self.ui.tableView.setRootIndex)

    ##==========事件处理函数===========

    ##==========由connectSlotsByName()自动关联的槽函数====
    def on_treeView_clicked(self, index):  #index是模型索引
        print(index)
        self.ui.checkBox.setChecked(self.model.isDir(index))
        self.LabPath.setText(self.model.filePath(index))
        self.ui.LabType.setText(self.model.type(index))
        self.ui.LabFileName.setText(self.model.fileName(index))

        fileSize = self.model.size(index) / 1024
        # print(fileSize)
        if fileSize < 1024:
            self.ui.LabFileSize.setText("%d KB" % fileSize)
        else:
            self.ui.LabFileSize.setText(".2f MB" % (fileSize / 1024.0))
Пример #8
0
class Mtpfs(QWidget, Ui_mtpfs):
    def __init__(self):
        super(Mtpfs, self).__init__()
        self.setupUi(self)

        # connect arrow icons for buttons from resources.py
        self.MoveFileBackward.setIcon(
            QIcon(':button_arrows/ButtonIcons/left-arrow.png'))
        self.MoveFileForward.setIcon(
            QIcon(':button_arrows/ButtonIcons/right-arrow.png'))

        self.Unmount.setEnabled(False)
        self.MoveFileForward.setEnabled(False)
        self.MoveFileBackward.setEnabled(False)

        self.MoveFileForward.setDown(True)
        self.MoveFileBackward.setDown(True)
        self.Unmount.setDown(True)

        self.ComputerTreeModel = QFileSystemModel()

        path = self.ComputerTreeModel.setRootPath(os.path.expanduser('~'))

        self.ComputerTree.setModel(self.ComputerTreeModel)
        self.ComputerTree.expand(path)
        self.ComputerTree.scrollTo(path)

        self.ComputerTree.setColumnWidth(0, 350)
        self.ComputerTree.setColumnWidth(1, 50)
        self.ComputerTree.setColumnWidth(2, 50)
        self.ComputerTree.setColumnWidth(3, 50)

        self.ComputerTree.setCurrentIndex(path)

        self.AndroidPath.setText(os.path.expanduser('~'))

        # setting up shortcuts for copying files
        self.copy_android_computer = QShortcut(
            QKeySequence('Right'), self, self.CopyShortcutAndroidComputer)
        self.copy_computer_android = QShortcut(
            QKeySequence('Left'), self, self.CopyShortcutComputerAndroid)

        self.Mount.clicked.connect(self.MountFileSystem)
        self.Unmount.clicked.connect(self.UnmountFileSystem)
        self.ChoosePathAndroid.clicked.connect(self.GetDeviceDirectory)
        self.MoveFileForward.clicked.connect(
            self.CopyFileFromAndroidToComputer)
        self.MoveFileBackward.clicked.connect(
            self.CopyFileFromComputerToAndroid)

    def CopyFileFromAndroidToComputer(self):

        index_android = self.AndroidTree.currentIndex()
        file_path_android = self.AndroidTreeModel.filePath(index_android)
        file_name_android = self.AndroidTreeModel.fileName(index_android)

        index_computer = self.ComputerTree.currentIndex()
        file_path_computer = self.ComputerTreeModel.filePath(index_computer)
        file_name_computer = self.ComputerTreeModel.fileName(index_computer)
        file_type_computer = self.ComputerTreeModel.type(index_computer)
        file_name_computer_length = len(file_name_computer)

        if file_type_computer == 'Folder':
            self.Output.append(
                '<html><b>Please wait while copying...</b</html>')
            # the next command allows to show Output while a file is copying, it's useful when files are large and thus we notify a user to wait
            QApplication.processEvents()
            command_copy = ['cp', '-R', file_path_android, file_path_computer]
            cp = subprocess.Popen(command_copy,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.STDOUT)
            output_cp = cp.communicate()

            self.Output.append('<html><b>' + file_name_android + '</b</html>' +
                               ' has been successfully copied to ' +
                               '<html><b>' + file_path_computer + '</b</html>')
        else:

            self.Output.append(
                '<html><b>Please wait while copying...</b</html>')
            QApplication.processEvents()
            # "in file_path_computer" we delete the name of the file at the end of the path
            command_copy = [
                'cp', '-R', file_path_android,
                file_path_computer[:-file_name_computer_length]
            ]
            cp = subprocess.Popen(command_copy,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.STDOUT)
            output_cp = cp.communicate()

            self.Output.append(
                '<html><b>' + file_name_android + '</b</html>' +
                ' has been successfully copied to ' + '<html><b>' +
                file_path_computer[:-file_name_computer_length] + '</b</html>')

    def CopyFileFromComputerToAndroid(self):

        index_computer = self.ComputerTree.currentIndex()
        file_path_computer = self.ComputerTreeModel.filePath(index_computer)
        file_name_computer = self.ComputerTreeModel.fileName(index_computer)

        index_android = self.AndroidTree.currentIndex()
        file_path_android = self.AndroidTreeModel.filePath(index_android)
        file_name_android = self.AndroidTreeModel.fileName(index_android)
        file_type_android = self.AndroidTreeModel.type(index_android)
        file_name_android_length = len(file_name_android)

        if file_type_android == 'Folder':
            self.Output.append(
                '<html><b>Please wait while copying...</b</html>')

            QApplication.processEvents()
            command_copy = ['cp', '-R', file_path_computer, file_path_android]
            cp = subprocess.Popen(command_copy,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.STDOUT)
            output_cp = cp.communicate()

            self.Output.append('<html><b>' + file_name_computer +
                               '</b</html>' +
                               ' has been successfully copied to ' +
                               '<html><b>' + file_path_android + '</b</html>')
        else:
            self.Output.append(
                '<html><b>Please wait while copying...</b</html>')
            QApplication.processEvents()
            command_copy = [
                'cp', '-R', file_path_computer,
                file_path_android[:-file_name_android_length]
            ]
            cp = subprocess.Popen(command_copy,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.STDOUT)
            output_cp = cp.communicate()

            self.Output.append('<html><b>' + file_name_computer +
                               '</b</html>' +
                               ' has been successfully copied to ' +
                               '<html><b>' +
                               file_path_android[:-file_name_android_length] +
                               '</b</html>')

    def GetDeviceDirectory(self):
        path_dialog = QFileDialog()
        path_dialog.setFileMode(QFileDialog.DirectoryOnly)
        self.AndroidPath.setText(
            path_dialog.getExistingDirectory(self, 'Open Folder'))
        if not len(self.AndroidPath.text()):
            self.AndroidPath.setText(os.path.expanduser('~'))

    def MountFileSystem(self):
        # Check if a device connected via USB to the computer
        if self.isDeviceMounted():
            # set the name of the connected device
            self.AndroidLabel.setText(self.androidDeviceName)
            #Check if a folder is empty
            if len(os.listdir(self.AndroidPath.text())) != 0:

                msg = QMessageBox()
                msg.setIcon(QMessageBox.Information)
                msg.setWindowTitle('Warning')
                msg.setText(
                    'The folder doesn\'t have to contain any files in order to mount the device'
                )
                msg.setStandardButtons(QMessageBox.Ok)
                msg.exec_()
            else:
                self.Mount.setEnabled(False)
                self.Unmount.setEnabled(True)
                self.AndroidPath.setDisabled(True)
                self.ChoosePathAndroid.setEnabled(False)
                self.MoveFileForward.setEnabled(True)
                self.MoveFileBackward.setEnabled(True)
                self.Mount.setText('Mounted')

                self.Mount.setDown(True)
                self.Unmount.setDown(False)
                self.ChoosePathAndroid.setDown(True)
                self.MoveFileForward.setDown(False)
                self.MoveFileBackward.setDown(False)

                #create a folder for Android
                self.aditionalAndroidPath = self.AndroidPath.text(
                ) + '/Android'
                command_mkdir = ['mkdir', self.aditionalAndroidPath]
                mkdir = subprocess.Popen(command_mkdir,
                                         stdout=subprocess.PIPE,
                                         stderr=subprocess.STDOUT)

                command_go_mtpfs = ['mtpfs', self.aditionalAndroidPath]
                mount_go_mtpfs = subprocess.Popen(command_go_mtpfs,
                                                  stdout=subprocess.PIPE,
                                                  stderr=subprocess.STDOUT)

                self.AndroidTreeModel = QFileSystemModel()

                path = self.AndroidTreeModel.setRootPath(
                    self.AndroidPath.text())

                self.AndroidTree.setModel(self.AndroidTreeModel)
                self.AndroidTree.expand(path)
                self.AndroidTree.scrollTo(path)

                self.AndroidTree.setColumnWidth(0, 350)
                self.AndroidTree.setColumnWidth(1, 60)
                self.AndroidTree.setColumnWidth(2, 50)
                self.AndroidTree.setColumnWidth(3, 50)

                self.AndroidTree.setCurrentIndex(path)

                self.Output.append(
                    'You\'re using the <html><b>[mtpfs]</b</html> library')

                self.Output.append('Your Android Device mounted at ' +
                                   '<html><b>' + self.aditionalAndroidPath +
                                   '</b</html>')
        else:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Information)
            msg.setWindowTitle('Warning')
            msg.setText(
                'It seems the Device hasn\'t mounted yet. Please, connect your Android Device to the computer'
            )
            msg.setStandardButtons(QMessageBox.Ok)
            msg.exec_()

    def isDeviceMounted(self):
        command_usb_devices = ['usb-devices']
        usb_devices = subprocess.Popen(command_usb_devices,
                                       stdout=subprocess.PIPE)

        command_grep = ['grep', '-E', 'Manufacturer|Product']
        grep = subprocess.Popen(command_grep,
                                stdin=usb_devices.stdout,
                                stdout=subprocess.PIPE)

        output_grep = grep.communicate()[0].decode('utf-8')
        pattern = re.compile('Manufacturer=Android')
        listDevices = output_grep.split('\n')
        self.androidDeviceName = ''

        for index, line in enumerate(listDevices):
            matchedline = pattern.search(line)
            if matchedline is not None:
                #parsing the name of the device from the line
                self.androidDeviceName = listDevices[index + 1]
                self.androidDeviceName = self.androidDeviceName.split()
                self.androidDeviceName = self.androidDeviceName[1].replace(
                    'Product=', '')
                return True

        return False

    def UnmountFileSystem(self):
        self.AndroidTree.setModel(None)
        #get back the android label
        self.AndroidLabel.setText('Android Device')

        command_unmount = ['fusermount', '-uz', self.aditionalAndroidPath]
        fusermount = subprocess.Popen(command_unmount,
                                      stdout=subprocess.PIPE,
                                      stderr=subprocess.STDOUT)

        command_rm_folder = ['rm', '-rf', self.aditionalAndroidPath]
        remove_folder = subprocess.Popen(command_rm_folder,
                                         stdout=subprocess.PIPE,
                                         stderr=subprocess.STDOUT)

        self.Unmount.setEnabled(False)
        self.Mount.setEnabled(True)
        self.AndroidPath.setDisabled(False)
        self.ChoosePathAndroid.setEnabled(True)
        self.MoveFileForward.setEnabled(False)
        self.MoveFileBackward.setEnabled(False)
        self.Mount.setText('Mount')

        self.Unmount.setDown(True)
        self.Mount.setDown(False)
        self.ChoosePathAndroid.setDown(False)
        self.MoveFileForward.setDown(True)
        self.MoveFileBackward.setDown(True)

        self.Output.append('The Android Device successfully unmounted!')
        self.Output.clear()

    def CopyShortcutAndroidComputer(self):
        # if system is mounted we can use shortcuts
        if self.Unmount.isEnabled():
            index_android = self.AndroidTree.currentIndex()
            file_path_android = self.AndroidTreeModel.filePath(index_android)
            file_name_android = self.AndroidTreeModel.fileName(index_android)

            index_computer = self.ComputerTree.currentIndex()
            file_path_computer = self.ComputerTreeModel.filePath(
                index_computer)
            file_name_computer = self.ComputerTreeModel.fileName(
                index_computer)
            file_type_computer = self.ComputerTreeModel.type(index_computer)
            file_name_computer_length = len(file_name_computer)

            if file_type_computer == 'Folder':
                self.Output.append(
                    '<html><b>Please wait while copying...</b</html>')
                # the next command allows to show Output while a file is copying, it's useful when files are large and thus we notify a user to wait
                QApplication.processEvents()
                command_copy = [
                    'cp', '-R', file_path_android, file_path_computer
                ]
                cp = subprocess.Popen(command_copy,
                                      stdout=subprocess.PIPE,
                                      stderr=subprocess.STDOUT)
                output_cp = cp.communicate()

                self.Output.append('<html><b>' + file_name_android +
                                   '</b</html>' +
                                   ' has been successfully copied to ' +
                                   '<html><b>' + file_path_computer +
                                   '</b</html>')
            else:

                self.Output.append(
                    '<html><b>Please wait while copying...</b</html>')
                QApplication.processEvents()
                # "in file_path_computer" we delete the name of the file at the end of the path
                command_copy = [
                    'cp', '-R', file_path_android,
                    file_path_computer[:-file_name_computer_length]
                ]
                cp = subprocess.Popen(command_copy,
                                      stdout=subprocess.PIPE,
                                      stderr=subprocess.STDOUT)
                output_cp = cp.communicate()

                self.Output.append(
                    '<html><b>' + file_name_android + '</b</html>' +
                    ' has been successfully copied to ' + '<html><b>' +
                    file_path_computer[:-file_name_computer_length] +
                    '</b</html>')

    def CopyShortcutComputerAndroid(self):
        if self.Unmount.isEnabled():
            # if system is mounted we can use shortcuts
            index_computer = self.ComputerTree.currentIndex()
            file_path_computer = self.ComputerTreeModel.filePath(
                index_computer)
            file_name_computer = self.ComputerTreeModel.fileName(
                index_computer)

            index_android = self.AndroidTree.currentIndex()
            file_path_android = self.AndroidTreeModel.filePath(index_android)
            file_name_android = self.AndroidTreeModel.fileName(index_android)
            file_type_android = self.AndroidTreeModel.type(index_android)
            file_name_android_length = len(file_name_android)

            if file_type_android == 'Folder':
                self.Output.append(
                    '<html><b>Please wait while copying...</b</html>')

                QApplication.processEvents()
                command_copy = [
                    'cp', '-R', file_path_computer, file_path_android
                ]
                cp = subprocess.Popen(command_copy,
                                      stdout=subprocess.PIPE,
                                      stderr=subprocess.STDOUT)
                output_cp = cp.communicate()

                self.Output.append('<html><b>' + file_name_computer +
                                   '</b</html>' +
                                   ' has been successfully copied to ' +
                                   '<html><b>' + file_path_android +
                                   '</b</html>')
            else:
                self.Output.append(
                    '<html><b>Please wait while copying...</b</html>')
                QApplication.processEvents()
                command_copy = [
                    'cp', '-R', file_path_computer,
                    file_path_android[:-file_name_android_length]
                ]
                cp = subprocess.Popen(command_copy,
                                      stdout=subprocess.PIPE,
                                      stderr=subprocess.STDOUT)
                output_cp = cp.communicate()

                self.Output.append(
                    '<html><b>' + file_name_computer + '</b</html>' +
                    ' has been successfully copied to ' + '<html><b>' +
                    file_path_android[:-file_name_android_length] +
                    '</b</html>')
Пример #9
0
class MainWin(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWin,self).__init__()
        self.setupUi(self)
        self.Login.triggered.connect(self.open_login)
        self.RGB.triggered.connect(self.open_image_rgb)
        self.LoginDialog = LoginDialog()
        self.ImageMainWin = ImageRGB()

        # 设置TreeWidgets
        self.trees = [self.YCPGAMETREE, self.YCPCOMPTREE, self.YLANDFILETREE]
        for tree in self.trees:
            tree.setContextMenuPolicy(Qt.CustomContextMenu)
            tree.customContextMenuRequested.connect(self.show_context_menu)
            tree.header().setMinimumSectionSize(120)

        self.model = QFileSystemModel()

        self.RailID = ''
        self.ylands_path = ''
        self.rail_user_data = ''
        self.ycp_game_folder_path = ''
        self.ycp_comp_folder_path = ''
        self.yland_folder_path = ''
        self.key = OpenKey(HKEY_CURRENT_USER, r"Software\Rail\YlandsRail")
        _value, type = QueryValueEx(self.key, "InstallPath")
        if _value:
            self.ylands_path = _value
            self.rail_user_data = Path.dirname(self.ylands_path) + '\\' + 'rail_user_data\\2000108'
        self.YCPTAB.currentChanged.connect(self.refresh_tab_qlistwidget)
        self.GroupBoxTitleDict = {0: 'YCP游戏目录', 1: 'YCP组件目录', 2: 'YLAND文件目录'}
        self.YCPTAB.setCurrentIndex(0)
        print(self.OpenDirBtn.clicked)

    # 打开workshop 后去RailId
    def open_login(self):
        self.LoginDialog.LoginRailIDSignel.connect(self.slot_emit)
        self.LoginDialog.show()

    def open_image_rgb(self):
        self.ImageMainWin.show()

    def slot_emit(self, flag, str):
        # 获得 rail_id
        self.RailID = str
        self.ycp_game_folder_path = self.rail_user_data + '\\' + self.RailID + '\\cloud_storage\\files\\Share\\Games'
        self.ycp_comp_folder_path = self.rail_user_data + '\\' + self.RailID + '\\cloud_storage\\files\\Share\\Compositions'
        self.yland_folder_path = self.rail_user_data + '\\' + self.RailID + '\\cloud_storage\\files\\Scenarios'
        if not Path.exists(self.ycp_game_folder_path):
            makedirs(self.ycp_game_folder_path)
        if not Path.exists(self.ycp_comp_folder_path):
            makedirs(self.ycp_comp_folder_path)
        if not Path.exists(self.yland_folder_path):
            makedirs(self.yland_folder_path)
        self.YCPTAB.setEnabled(True)
        self.YCPTAB.setCurrentIndex(0)
        self.refresh_tab_qlistwidget(0)
        self.setAcceptDrops(True)

    def refresh_tab_qlistwidget(self, index):
        if self.RailID != '':
            self.OpenDirBtn.setEnabled(True)
            if index == 0:
                self.YCPGAMETREE.setEnabled(True)
                self.refresh_path(index, self.ycp_game_folder_path)
                self.model.setRootPath(self.ycp_game_folder_path)
                self.YCPGAMETREE.setModel(self.model)
                self.YCPGAMETREE.setRootIndex(self.model.index(self.ycp_game_folder_path))

            elif index == 1:
                self.YCPCOMPTREE.setEnabled(True)
                self.refresh_path(index, self.ycp_comp_folder_path)
                self.model.setRootPath(self.ycp_comp_folder_path)
                self.YCPCOMPTREE.setModel(self.model)
                self.YCPCOMPTREE.setRootIndex(self.model.index(self.ycp_comp_folder_path))
            else:
                self.YLANDFILETREE.setEnabled(True)
                self.refresh_path(index, self.yland_folder_path)
                self.model.setRootPath(self.yland_folder_path)
                self.YLANDFILETREE.setModel(self.model)
                self.YLANDFILETREE.setRootIndex(self.model.index(self.yland_folder_path))

    def refresh_path(self, index, path):
        self.files_count(path)
        self.frame.findChild(QGroupBox, 'groupBox').setTitle(self.GroupBoxTitleDict[index])
        self.PathTxt.setText(path)
        if MainWin.isconnected(self.OpenDirBtn, 'clicked()'):
            self.OpenDirBtn.disconnect()
        self.OpenDirBtn.clicked.connect(lambda: self.open_dir(path, index))
        #TODO 通过背景颜色,显示文件被使用的状态

    def open_dir(self, path, index):
        # QFileDialog.getExistingDirectory(self,"浏览"+ self.GroupBoxTitleDict[index], path, QFileDialog.ShowDirsOnly)
        QFileDialog.getOpenFileNames(self, "浏览" + self.GroupBoxTitleDict[index], path, "All Files (*);;Text Files (*.txt)")

    def files_count(self, path):
        count = 0
        for root, dirs, files in walk(path):
            for each in files:
                file = Path.splitext(each)
                filename, type = file
                if type != '.txt':
                    count += 1
        self.statusbar.showMessage("文件数:" + str(count))

    @staticmethod
    def isconnected(obj, name):
        """判断信号是否连接
        :param obj:        对象
        :param name:       信号名,如 clicked()
        """
        index = obj.metaObject().indexOfMethod(name)
        if index > -1:
            method = obj.metaObject().method(index)
            if method:
                return obj.isSignalConnected(method)
        return False

    def show_context_menu(self, pos):
        sender = self.sender()
        row_index = sender.indexAt(pos).row()
        menu = QMenu()
        cpy = menu.addAction('复制')
        cpy.triggered.connect(lambda: self.copy_selected(sender.currentIndex()))
        rmfile = menu.addAction('删除')
        rmfile.triggered.connect(lambda: self.remove_selected_file(sender.currentIndex()))
        menu.exec_(QCursor.pos())

    def copy_selected(self, index):
        filename = self.model.fileName(index)
        filepath = self.model.filePath(index)
        data = QMimeData()
        url = QUrl.fromLocalFile(filepath)
        clipboard = QApplication.clipboard()
        data.setUrls([url])
        clipboard.setMimeData(data)

    def remove_selected_file(self, index):
        filename = self.model.fileName(index)
        filepath = self.model.filePath(index)
        if not self.model.fileInfo(index).isDir():
            msgBox = QMessageBox()
            msgBox.setText("确定删除文件:" + filename + "?")
            msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            ret = msgBox.exec_()
            if ret == QMessageBox.Ok:
                self.model.remove(index)
            else:
                return

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            filetempname = event.mimeData().urls()[0].fileName()
            filename, extension = Path.splitext(filetempname)
            if self.YCPTAB.currentIndex() == 0 or self.YCPTAB.currentIndex() == 1:
                if extension == '.ycp':
                    event.accept()
                    # clipboard = QApplication.clipboard()
                    # clipboard.clear()
                    # clipboard.setMimeData(event.mimeData())
                else:
                    msgBox = QMessageBox()
                    msgBox.setText("只能拖放.ycp后缀文件")
                    ret = msgBox.exec_()
                    event.ignore()
                    return
            elif self.YCPTAB.currentIndex() == 2:
                if extension == '.yland':
                    event.accept()
                    # clipboard = QApplication.clipboard()
                    # clipboard.clear()
                    # clipboard.setMimeData(event.mimeData())
                else:
                    msgBox = QMessageBox()
                    msgBox.setText("只能拖放.yland后缀文件")
                    ret = msgBox.exec_()
                    event.ignore()
                    return

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls:
            try:
                event.setDropAction(Qt.CopyAction)
            except Exception as e:
                print(e)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        try:
            if event.mimeData().hasUrls:
                event.setDropAction(Qt.CopyAction)
                event.accept()
                filepath = event.mimeData().urls()[0]
                filename = filepath.fileName()
                if self.YCPTAB.currentIndex() == 0:
                    self.copy_file(filepath.url().replace("file:///", ""), Path.join(self.ycp_game_folder_path, filename))
                elif self.YCPTAB.currentIndex() == 1:
                    self.copy_file(filepath.url().replace("file:///", ""), Path.join(self.ycp_comp_folder_path, filename))
                else:
                    self.copy_file(filepath.url().replace("file:///", ""), Path.join(self.yland_folder_path, filename))
            else:
                event.ignore()
        except Exception as e:
            print(e)

    def copy_file(self,srcfle, dstfile):
        newdstfile = dstfile
        if not Path.isfile(srcfle):
            print("$%s not exist!" % (srcfle))
        else:
            fpath, ftempname = Path.split(dstfile)
            if not Path.exists(fpath):
                makedirs(fpath)
            elif Path.exists(dstfile):
                filename, extension = Path.splitext(ftempname)
                newdstfile = Path.join(fpath, filename + "copybyylandsbox" + extension)
            copyfile(srcfle, newdstfile)
Пример #10
0
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))
Пример #11
0
class MyApp(QWidget):
    def __init__(self):
        super().__init__()

        self.path = "C:"
        self.index = None

        self.tv = QTreeView(self)
        self.model = QFileSystemModel()
        self.btnRen = QPushButton("이름바꾸기")
        self.btnDel = QPushButton("파일삭제")
        self.layout = QVBoxLayout()

        self.setUi()
        self.setSlot()
        self.show()

    def setUi(self):
        self.setGeometry(300, 300, 700, 350)
        self.setWindowTitle("QFileSystemModel")
        self.model.setRootPath(self.path)
        self.tv.setModel(self.model)
        self.tv.setColumnWidth(0, 250)

        self.layout.addWidget(self.tv)
        self.layout.addWidget(self.btnDel)
        self.layout.addWidget(self.btnRen)
        self.setLayout(self.layout)

    def setSlot(self):
        self.tv.clicked.connect(self.setIndex)
        self.btnRen.clicked.connect(self.ren)
        self.btnDel.clicked.connect(self.rm)

    def setIndex(self, index):
        self.index = index

    def ren(self):
        os.chdir(self.model.filePath(self.model.parent(self.index)))
        fname = self.model.fileName(self.index)
        text, res = QInputDialog.getText(self, "이름바꾸기", "바꿀이름을 입력하세요",
                                         QLineEdit.Normal, fname)

        if res:
            while True:
                self.ok = True
                for i in os.listdir(os.getcwd()):
                    print(i)
                    if i == text:
                        text, res = QInputDialog.getText(
                            self, "중복오류!", "바꿀이름을 입력하세요", QLineEdit.Normal,
                            text)

                        if not res:
                            return
                        self.ok = False
                if self.ok:
                    break
            os.rename(fname, text)

    def rm(self):
        os.chdir(self.model.filePath(self.model.parent(self.index)))
        fname = self.model.fileName(self.index)
        try:
            if not self.model.isDir(self.index):
                os.unlike(fname)
                print(fname + '파일 삭제')
            else:
                shutil.rmtree(fname)
                print(fname + '폴더 삭제')

        except:
            print("에러발생")
Пример #12
0
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)
Пример #13
0
class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        # sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)
        self.actionAutoencoder.setChecked(True)
        # Connect the menu action
        self.actionSelect_Data_Path.triggered.connect(self.selectPath)
        self.actionLoad_from_Data_Path.triggered.connect(self.loadtifFile)
        # Connect the model selections
        self.actionAutoencoder.triggered.connect(self.createAE_Model)
        self.actionAE_CS.triggered.connect(self.createAECS_Model)
        self.actionOpen_Model.triggered.connect(self.openModel)
        # Connect the treeView action
        self.treeView.clicked.connect(self.on_treeView_clicked)
        # Connect the Label action
        self.actionAddLabel.triggered.connect(self.addCategory)
        self.actionDel_Label.triggered.connect(self.delCategory)
        self.actionUpdate_Setting.triggered.connect(self.updateLabelSetting)

        # Connect the Function action
        self.actionStart_Training.triggered.connect(self.Training)
        self.actionStop_Training.triggered.connect(self.stopTraining)
        self.actionNew_tSNE.triggered.connect(self.New_tSNE)
        # Gif
        self.movie = QtGui.QMovie("cube.gif")
        self.movie.setCacheMode(QtGui.QMovie.CacheAll)
        self.movie.setSpeed(80)
        self.movie.setScaledSize(QSize(256, 320))
        self.Gif.setMovie(self.movie)
        self.movie.start()
        self.movie.stop()

        import wmi

        computer = wmi.WMI()
        computer_info = computer.Win32_ComputerSystem()[0]
        os_info = computer.Win32_OperatingSystem()[0]
        proc_info = computer.Win32_Processor()[0]
        gpu_info = computer.Win32_VideoController()[0]

        os_name = os_info.Name.encode('utf-8').split(b'|')[0]
        os_version = ' '.join([os_info.Version, os_info.BuildNumber])
        system_ram = float(
            os_info.TotalVisibleMemorySize) / 1048576  # KB to GB

        print('OS Name: {0}'.format(os_name))
        print('OS Version: {0}'.format(os_version))
        print('CPU: {0}'.format(proc_info.Name))
        print('RAM: {0} GB'.format(system_ram))
        print('Graphics Card: {0}'.format(gpu_info.Name))

        self.setWindowIcon(QIcon('Icon.png'))
        self.System_textEdit.setText('OS Name: {}\n'
                                     'OS Version: {}\n'
                                     'CPU: {}\n'
                                     'RAM: {} GB\n'
                                     'Graphics Card: {}'.format(
                                         os_name.decode("utf-8"), os_version,
                                         proc_info.Name, system_ram,
                                         gpu_info.Name))

    def Training(self):
        global file_loaded
        if file_loaded:
            self.label_7.setText('Training')
            self.label_7.setStyleSheet("color: rgb(200, 0, 0);\n"
                                       "font: 75 14pt \"MS Shell Dlg 2\";")
            self.movie.setSpeed(100)
            self.movie.start()
            self.training_thread = Training_Thread()
            self.training_thread.start()
            self.training_thread.finished.connect(self.DrawtSNE)
            self.training_thread.finished.connect(self.DrawLog)
            self.training_thread.quit()
        else:
            pass

    def New_tSNE(self):
        self.movie.start()
        self.tSNE_thread = tSNE_Thread()
        self.tSNE_thread.start()
        self.tSNE_thread.finished.connect(self.DrawtSNE)
        pass

    def stopTraining(self):
        self.training_thread = Training_Thread()
        if self.training_thread.isRunning():
            self.training_thread.terminate()
            self.movie.stop()
            self.label_7.setText('Stopped')
            self.label_7.setStyleSheet("color: rgb(200, 0, 0);\n"
                                       "font: 75 14pt \"MS Shell Dlg 2\";")

    def DrawtSNE(self):
        global imagesavepath, currentdate, labels, cavans, groups, labels_dict, groups3D, test_data, test_annotation
        from matplotlib.offsetbox import OffsetImage, AnnotationBbox
        global df, df_3D, Y, Y_3D
        print("DrawtSNE Start ")
        test_annotation = test_data.reshape(-1, 190, 190)
        # 2D tSNE
        plt.cla()
        fig, ax = plt.subplots()
        ax.margins(0.05)  # Optional, just adds 5% padding to the autoscaling
        points_with_annotation = []
        for label, group in groups:
            name = labels_dict[label]
            point, = ax.plot(group.x,
                             group.y,
                             marker='o',
                             linestyle='',
                             ms=5,
                             label=name,
                             alpha=0.5)
            points_with_annotation.append([point])
        plt.title('t-SNE Scattering Plot')
        ax.legend()
        cavans2D = FigureCanvas(fig)
        #Annotation

        # create the annotations box
        im = OffsetImage(test_annotation[0, :, :], zoom=0.25, cmap='gray')
        xybox = (10., 10.)
        ab = AnnotationBbox(im, (10, 10),
                            xybox=xybox,
                            xycoords='data',
                            boxcoords="offset points",
                            pad=0.3,
                            arrowprops=dict(arrowstyle="->"))

        # add it to the axes and make it invisible
        ax.add_artist(ab)
        ab.set_visible(False)

        tsneprelabel = int(len(test_data) / len(labels))

        def hover(event):
            global df, test_annotation
            i = 0
            ispointed = np.zeros((len(groups), ), dtype=bool)
            for point in points_with_annotation:
                if point[0].contains(event)[0]:
                    ispointed[i] = True
                    cont, ind = point[0].contains(event)
                    image_index = ind["ind"][0] + i * tsneprelabel
                    # get the figure size
                    w, h = fig.get_size_inches() * fig.dpi
                    ws = (event.x > w / 2.) * -1 + (event.x <= w / 2.)
                    hs = (event.y > h / 2.) * -1 + (event.y <= h / 2.)
                    # if event occurs in the top or right quadrant of the figure,
                    # change the annotation box position relative to mouse.
                    ab.xybox = (xybox[0] * ws, xybox[1] * hs)
                    # place it at the position of the hovered scatter point
                    global df, test_annotation
                    df = df
                    ab.xy = (df['x'][image_index], df['y'][image_index])
                    # set the image corresponding to that point
                    im.set_data(test_annotation[image_index, :, :])
                    ab.set_visible(True)
                else:
                    ispointed[i] = False
                i = i + 1
            ab.set_visible(max(ispointed))
            fig.canvas.draw_idle()

        cid = fig.canvas.mpl_connect('motion_notify_event', hover)
        rows = int(self.tSNE_Layout.count())
        if rows == 1:
            myWidget = self.tSNE_Layout.itemAt(0).widget()
            myWidget.deleteLater()
        self.tSNE_Layout.addWidget(cavans2D)

        print("tSNE 2D Finished")
        # 3D tSNE
        fig_3D = plt.figure()
        cavans3D = FigureCanvas(fig_3D)
        ax_3D = Axes3D(fig_3D)
        ax_3D.margins(
            0.05)  # Optional, just adds 5% padding to the autoscaling
        test_annotation = test_data.reshape(-1, 190, 190)
        for label, group in groups3D:
            name = labels_dict[label]
            ax_3D.scatter(group.x,
                          group.y,
                          group.z,
                          marker='o',
                          label=name,
                          alpha=0.8)
        ax_3D.legend()
        ax_3D.patch.set_visible(False)
        ax_3D.set_axis_off()
        ax_3D._axis3don = False
        from matplotlib.offsetbox import OffsetImage, AnnotationBbox
        im_3D = OffsetImage(test_annotation[0, :, :], zoom=0.25, cmap='gray')
        xybox = (10., 10.)
        ab_3D = AnnotationBbox(im_3D, (10, 10),
                               xybox=xybox,
                               xycoords='data',
                               boxcoords="offset points",
                               pad=0.3,
                               arrowprops=dict(arrowstyle="->"))
        # add it to the axes and make it invisible
        ax_3D.add_artist(ab_3D)
        ab_3D.set_visible(False)

        def onMouseMotion(event):
            global Y_3D
            distances = []
            for i in range(Y_3D.shape[0]):
                x2, y2, _ = proj3d.proj_transform(Y_3D[i, 0], Y_3D[i, 1],
                                                  Y_3D[i, 2], ax_3D.get_proj())
                x3, y3 = ax_3D.transData.transform((x2, y2))
                distance = np.sqrt((x3 - event.x)**2 + (y3 - event.y)**2)
                distances.append(distance)
            closestIndex = np.argmin(distances)
            print(closestIndex)
            x2, y2, _ = proj3d.proj_transform(Y_3D[closestIndex,
                                                   0], Y_3D[closestIndex, 1],
                                              Y_3D[closestIndex, 2],
                                              ax_3D.get_proj())
            ab_3D.xy = (x2, y2)
            im_3D.set_data(test_annotation[closestIndex, :, :])
            ab_3D.set_visible(True)
            fig_3D.canvas.draw_idle()

        cid3d = fig_3D.canvas.mpl_connect('motion_notify_event',
                                          onMouseMotion)  # on mouse motion

        rows = int(self.tSNE3D_Layout.count())
        if rows == 1:
            myWidget = self.tSNE3D_Layout.itemAt(0).widget()
            myWidget.deleteLater()
        self.tSNE3D_Layout.addWidget(cavans3D)
        self.movie.stop()
        self.movie.jumpToFrame(0)
        self.label_7.setText('Finished')
        self.label_7.setStyleSheet("color: rgb(70, 70, 70);\n"
                                   "font: 75 14pt \"MS Shell Dlg 2\";")

    def DrawLog(self):
        global history, CSfunction
        if CSfunction:
            train_history = history
            loss = 'class_output_loss'
            fig = plt.figure()
            plt.plot(range(1,
                           len(train_history.history[loss]) + 1),
                     train_history.history[loss])
            plt.title('Train History')
            plt.ylabel(loss)
            plt.xlabel('Epoch')
            plt.legend([loss])
            loss_cavans = FigureCanvas(fig)
            rows = int(self.Log_Layout.count())
            if rows == 1:
                myWidget = self.Log_Layout.itemAt(0).widget()
                myWidget.deleteLater()
            self.Log_Layout.addWidget(loss_cavans)
        else:
            train_history = history
            loss = 'decoder_output_loss'
            fig = plt.figure()
            plt.plot(range(1,
                           len(train_history.history[loss]) + 1),
                     train_history.history[loss])
            plt.title('Train History')
            plt.ylabel(loss)
            plt.xlabel('Epoch')
            plt.legend([loss])
            loss_cavans = FigureCanvas(fig)
            rows = int(self.Log_Layout.count())
            if rows == 1:
                myWidget = self.Log_Layout.itemAt(0).widget()
                myWidget.deleteLater()
            self.Log_Layout.addWidget(loss_cavans)

    def DrawDecoded(self):
        global test_data, decoded_imgs
        n = 5
        fig = plt.figure()
        plt.subplots_adjust(wspace=0, hspace=0)
        for i in range(n):
            # display original
            ax = plt.subplot(2, n, i + 1)
            plt.imshow(test_data[i].reshape(190, 190))
            plt.gray()
            ax.get_xaxis().set_visible(False)
            ax.get_yaxis().set_visible(False)

            # display reconstruction
            ax = plt.subplot(2, n, i + n + 1)
            plt.imshow(decoded_imgs[1][i].reshape(190, 190))
            plt.gray()
            ax.get_xaxis().set_visible(False)
            ax.get_yaxis().set_visible(False)
        plt.subplot(2, n, round(n / 2))
        plt.tight_layout()
        # plt.title('Raw Images &Decoded Images')
        cavans = FigureCanvas(fig)

        # rows = int(self.Decoded_layout.count())
        # if rows == 1:
        #     myWidget = self.Decoded_layout.itemAt(0).widget()
        #     myWidget.deleteLater()
        # self.Decoded_layout.addWidget(cavans)

    def addCategory(self):
        global folder_layers, layers_of_folders, file_readed, label_setting, file_loaded
        if file_readed:
            cat_cont = int(self.Category_Layout.count() / 2)
            location = self.Category_Layout.count()
            self.Category_new = QtWidgets.QLabel(self.formLayoutWidget)
            self.Category_new.setText('Label {} :'.format(cat_cont + 1))
            self.Category_new.setStyleSheet("font: 14pt \"Lucida Console\";")
            self.Category_new.setObjectName("Category_{}".format(cat_cont + 1))
            self.Category_Layout.setWidget(location,
                                           QtWidgets.QFormLayout.LabelRole,
                                           self.Category_new)
            self.Category_box_new = QtWidgets.QComboBox(self.formLayoutWidget)
            self.Category_box_new.setStyleSheet(
                "background-color: rgb(255, 255, 255);\n"
                "color: rgb(65, 65, 65);")
            self.Category_box_new.setObjectName(
                "Category_box{}".format(cat_cont + 1))
            self.Category_Layout.setWidget(location,
                                           QtWidgets.QFormLayout.FieldRole,
                                           self.Category_box_new)
            self.Category_box_new.clear()
            for a in range(0, layers_of_folders):
                self.Category_box_new.addItems(folder_layers[a])
            self.label_3.setStyleSheet(
                "color: rgb(200, 200, 200);\n"
                "font: 75 14pt \"MS Shell Dlg 2\";")  # Light the Label
            label_setting = False
            file_loaded = False

    def delCategory(self):
        global label_setting, file_loaded
        rows = int(self.Category_Layout.count() / 1)
        if rows / 2 > 2:
            box = self.Category_Layout.itemAt(rows - 2,
                                              QtWidgets.QFormLayout.FieldRole)
            label = self.Category_Layout.itemAt(
                rows - 2, QtWidgets.QFormLayout.LabelRole)
            box.widget().deleteLater()
            label.widget().deleteLater()
            self.label_3.setStyleSheet(
                "color: rgb(200, 200, 200);\n"
                "font: 75 14pt \"MS Shell Dlg 2\";")  # Light the Label
            label_setting = False
            file_loaded = False

    def updateLabelSetting(self):
        global labels, label_setting
        if str(self.Category_box1.currentText()):
            label_numbers = int(self.Category_Layout.count() / 2)
            print('\nThere are {} labels.'.format(label_numbers))
            rows = int(self.Category_Layout.count())
            labels = []
            i = 0
            for index in range(0, rows, 2):
                box = self.Category_Layout.itemAt(
                    index, QtWidgets.QFormLayout.FieldRole)
                print('Label {} :{}'.format(i + 1,
                                            str(box.widget().currentText())))
                labels.append(str(box.widget().currentText()))
                i = i + 1

            self.label_3.setText('Label Updated')
            self.label_3.setStyleSheet(
                "color: rgb(70, 70, 70);\n"
                "font: 75 14pt \"MS Shell Dlg 2\";")  # Light the Label
            label_setting = True
            print(labels)

    def readimgFile(self):
        global base_path, folder_layers, layers_of_folders, file_readed, folder_list
        if base_path:
            folder_layers = []
            folder_list = []
            layers_of_folders = 0
            files = os.scandir(base_path)
            # %% Get the 1st layer of folder
            first_folder = []
            first_folder_kind = []
            for entry in files:
                if entry.is_dir():
                    first_folder.append(entry.path)
                    first_folder_kind.append(entry.name)
            folder_layers.append(first_folder_kind)
            folder_list.append(first_folder)
            # %% Get the 2nd layer of folder
            second_folder = []
            if first_folder:
                second_folder = []
                second_folder_kind = []
                layers_of_folders += 1
                for fldr in first_folder:
                    files = os.scandir(fldr)
                    for entry in files:
                        if entry.is_dir():

                            second_folder.append(entry.path)
                            second_folder_kind.append(entry.name)
                second_folder_kind = second_folder_kind[
                    0:int(len(second_folder_kind) / len(first_folder_kind))]
                folder_layers.append(second_folder_kind)
                folder_list.append(second_folder)
            # %% Get the 3rd layer of folder
            third_folder = []
            if second_folder:
                third_folder = []
                third_folder_kind = []
                layers_of_folders += 1
                for fldr in second_folder:
                    files = os.scandir(fldr)
                    for entry in files:
                        if entry.is_dir():
                            third_folder.append(entry.path)
                            third_folder_kind.append(entry.name)
                third_folder_kind = third_folder_kind[0:int(
                    len(third_folder_kind) /
                    (len(second_folder_kind) * len(first_folder_kind)))]
                folder_layers.append(third_folder_kind)
                folder_list.append(third_folder)
            # %% Get the 4th layer of folder
            forth_folder = []
            if third_folder:
                forth_folder = []
                forth_folder_kind = []
                layers_of_folders += 1
                for fldr in third_folder:
                    files = os.scandir(fldr)
                    for entry in files:
                        if entry.is_dir():
                            forth_folder.append(entry.path)
                            forth_folder_kind.append(entry.name)
                forth_folder_kind = forth_folder_kind[0:int(
                    len(forth_folder_kind) /
                    (len(third_folder_kind) * len(second_folder_kind) *
                     len(first_folder_kind)))]
                folder_layers.append(forth_folder_kind)
                folder_list.append(forth_folder)
            # %% Get the 5th layer of folder
            fifth_folder = []
            if forth_folder:
                fifth_folder = []
                fifth_folder_kind = []
                layers_of_folders += 1
                for fldr in third_folder:
                    files = os.scandir(fldr)
                    for entry in files:
                        if entry.is_dir():
                            fifth_folder.append(entry.path)
                            fifth_folder_kind.append(entry.name)
                fifth_folder_kind = fifth_folder_kind[0:int(
                    len(fifth_folder_kind) /
                    (len(forth_folder_kind) * len(third_folder_kind) *
                     len(second_folder_kind) * len(first_folder_kind)))]
                folder_layers.append(fifth_folder_kind)
                folder_list.append(fifth_folder)
            print('\nThere are {} Layers in the Data Path.'.format(
                layers_of_folders))

            import fnmatch
            file_list = []
            for root, dirs, files in os.walk(base_path, topdown=False):
                for name in files:
                    if fnmatch.fnmatch(name, '*.tif'):
                        file_list.append(os.path.join(root, name))
            print('\nThere are {} .Tif files in the Data Path.'.format(
                len(file_list)))

            rows = int(self.Category_Layout.count())
            print(rows)
            for index in range(0, rows, 2):
                print(index)
                box = self.Category_Layout.itemAt(
                    index, QtWidgets.QFormLayout.FieldRole)
                print(box.widget().objectName())
                box.widget().clear()
                for a in range(0, layers_of_folders):
                    for labels in folder_layers[a]:
                        box.widget().addItem(labels)
            file_readed = True

    def loadtifFile(self):

        global datanumber, file_loaded
        datanumber = int(self.spinBox.value())
        self.thread = Thread_1()
        self.label_5.setText('Data Loading')
        self.label_5.setStyleSheet(
            "color: rgb(200, 0, 0);\n"
            "font: 75 14pt \"MS Shell Dlg 2\";")  # Light the Label
        self.thread.start()
        self.thread.finished.connect(self.DataCreated)
        self.thread.quit()
        file_loaded = True

    def DataCreated(self):
        self.label_5.setText('Data Loaded')
        self.label_5.setStyleSheet(
            "color: rgb(70, 70, 70);\n"
            "font: 75 14pt \"MS Shell Dlg 2\";")  # Light the Label

    def selectPath(self):

        global base_path
        repfldr = []
        celltypefldr = []
        self.statusBar().showMessage('Now Loading Files')
        base_path = str(
            QFileDialog.getExistingDirectory(self, "Select Directory", '/'))
        print(base_path)
        if base_path:
            files = os.scandir(base_path)

            # %% Get the 1st layer of folder
            for entry in files:
                if entry.is_dir():
                    if 'replicate' in entry.name:
                        repfldr.append(entry.path)
            # %% Get the 2nd layer of folder
            for fldr in repfldr:
                files = os.scandir(fldr)
                for entry in files:
                    if entry.is_dir():
                        celltypefldr.append(entry.path)
            self.readimgFile()
        self.model = QFileSystemModel()
        self.model.setRootPath(base_path)
        self.treeView.setModel(self.model)
        self.treeView.setRootIndex(self.model.index(base_path))
        self.treeView.hideColumn(2)
        self.treeView.hideColumn(3)

        return base_path

    def keyPressEvent(self, e):  # Use ESC to Close the APP
        from PyQt5.QtCore import Qt

        if e.key() == Qt.Key_Escape:
            self.close()

    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)
        from PyQt5.QtGui import QIcon, QPixmap
        pixmap = QPixmap(filePath)
        self.Cell_Image.setPixmap(pixmap.scaled(256, 256))

    def createAE_Model(self, state):
        global CSfunction
        if state:
            self.actionAE_CS.setChecked(False)
            CSfunction = False

    def createAECS_Model(self, state):
        global CSfunction
        if state:
            self.actionAutoencoder.setChecked(False)
            CSfunction = True

    def openModel(self):
        global model_path
        model_path = QFileDialog.getOpenFileName(self, "Select Model", '/')
        print(model_path)

    def runExample(self):
        global base_path, folder_layers, layers_of_folders, file_readed, folder_list
Пример #14
0
class SidebarView:
    def __init__(self, root, wads, controller):
        self.wads = wads
        self.current_wad = None

        self.wad_dir_model = QFileSystemModel()
        self.wad_dir = root.findChild(QTreeView, 'sidebar_waddir')
        self.wad_dir.setModel(self.wad_dir_model)
        for i in range(1, self.wad_dir.header().length()):
            self.wad_dir.hideColumn(i)
        self.wad_dir.setContextMenuPolicy(Qt.CustomContextMenu)
        self.wad_dir.customContextMenuRequested.connect(self.open_dir_menu)

        self.loadorder_model = QStandardItemModel()
        # rowsRemoved is called when something is moved, AFTER the model actually is updated
        self.loadorder_model.rowsRemoved.connect(
            self.update_load_ordered_files)
        self.loadorder = root.findChild(QListView, 'sidebar_loadorder')
        self.loadorder.setModel(self.loadorder_model)
        self.loadorder.clicked.connect(self.update_load_ordered_files)
        self.loadorder.setContextMenuPolicy(Qt.CustomContextMenu)
        self.loadorder.customContextMenuRequested.connect(
            self.open_load_order_menu)

        self.search_button = root.findChild(QPushButton,
                                            'sidebar_idgames_search')

        def search():
            display_widget(root, WidgetIndices.IDGAMES_SEARCH)

        self.search_button.clicked.connect(search)

        self.random_button = root.findChild(QPushButton,
                                            'sidebar_idgames_random')
        self.random_button.clicked.connect(controller.random_clicked)
        self.selected_wad_id = None

        self.iwad_only_checkbox = root.findChild(QCheckBox,
                                                 'sidebar_iwad_only')
        # checking this should send an empty file_paths list to wads.model.
        self.iwad_only_checkbox.stateChanged.connect(
            self.update_load_ordered_files)

    def show_dir(self, wad):
        self.current_wad = wad
        self.wad_dir_model.setRootPath(QDir.currentPath())
        self.wad_dir.setRootIndex(self.wad_dir_model.index(wad.path))
        self.selected_path = wad.path
        self.selected_wad_id = wad.id

        try:
            self.loadorder_model.clear()
            for file_path in wad.file_paths:
                file_name = os.path.basename(file_path)
                item = QStandardItem(file_name)
                item.setData(file_path, PATH_ROLE)
                item.setFlags(LOAD_ORDER_ITEM_FLAGS)
                item.setCheckable(True)
                item.setCheckState(Qt.Checked)
                self.loadorder_model.appendRow(item)
        except KeyError:
            print('file paths not found in:', wad.name)

    def update_load_ordered_files(self, *_):
        file_paths_reordered = []
        for i in range(self.loadorder_model.rowCount()):
            item = self.loadorder_model.item(i)
            if self.iwad_only_checkbox.checkState() != Qt.Checked:
                item.setEnabled(True)
                if item.checkState() == Qt.Checked:
                    file_paths_reordered.append(item.data(PATH_ROLE))
            else:
                item.setEnabled(False)

        self.wads.set_load_order(file_paths_reordered)

    def open_dir_menu(self, pos):
        index = self.wad_dir.indexAt(pos)
        file_name = self.wad_dir_model.fileName(index)
        file_path = self.wad_dir_model.filePath(index)
        add_file_to_load_order_string = 'Add {} to load order list'.format(
            file_name)

        def add_file_to_load_order():
            self.current_wad.add_file_path_to_paths(file_path)
            self.show_dir(self.current_wad)

        menu_actions = [(add_file_to_load_order_string, add_file_to_load_order)
                        ]

        execute_menu = make_context_menu(self.wad_dir, menu_actions)
        execute_menu(pos)

    def open_load_order_menu(self, pos):
        index = self.loadorder.indexAt(pos)
        item = self.loadorder_model.itemFromIndex(index)
        file_name = item.text()
        file_path = item.data()
        remove_file_from_load_order_string = 'Remove {} from load order list'.format(
            file_name)

        def remove_file_from_load_order():
            self.current_wad.remove_file_path_from_paths(file_path)
            self.show_dir(self.current_wad)

        menu_actions = [(remove_file_from_load_order_string,
                         remove_file_from_load_order)]

        execute_menu = make_context_menu(self.loadorder, menu_actions)
        execute_menu(pos)
Пример #15
0
class TrackWindow(QMainWindow):
    def __init__(self, people):
        super().__init__()
        self.people = people
        self.setWindowTitle("Tracking stats")  
        self.result = []
        self.central = QWidget(self)
        self.vlayout = QVBoxLayout() 
        self.button_names = []       
        for person in self.people:
            self.upadte_column(person)
        self.add_button = QPushButton('Add new people')
        self.add_button.setMinimumSize(int((QDesktopWidget().screenGeometry(-1).width())/4), int((QDesktopWidget().screenGeometry(-1).height())/15))
        self.vlayout.addWidget(self.add_button)
        self.central.setLayout(self.vlayout)
        self.setCentralWidget(self.central)
        self.add_button.clicked.connect(self.add_person)

    def add_person(self):
        self.name_person, okPressed = QInputDialog.getText(self, "Name","Name of a person:",QLineEdit.Normal, "")
        if okPressed and self.name_person != '':
            self.window = QWidget()
            self.window.setWindowTitle('Doubleclick your image')
            okButtons = QHBoxLayout()
            windowLayout = QVBoxLayout()
            '''
            self.ok_button = QPushButton('Ok')
            self.cancel_button = QPushButton('Cancel')
            okButtons.addWidget(self.ok_button)
            okButtons.addWidget(self.cancel_button)
            self.ok_button.setEnabled(False)
            self.ok_button.setCheckable(True)
            '''
            self.model = QFileSystemModel()
            self.model.setRootPath('')
            self.tree = QTreeView()
            self.tree.setModel(self.model)
            self.tree.setIndentation(20)
            self.tree.setSortingEnabled(True)
            self.tree.setWindowTitle("Dir View")
            self.tree.setMinimumSize(int((QDesktopWidget().screenGeometry(-1).width())/2), int((QDesktopWidget().screenGeometry(-1).height())/2))
            windowLayout.addWidget(self.tree)
            windowLayout.addLayout(okButtons)
            self.window.setLayout(windowLayout)
            self.tree.doubleClicked.connect(self.on_treeView_clicked)
            self.window.show()
        else:
            print('Enter something')

    @pyqtSlot(QModelIndex)    
    def on_treeView_clicked(self, index):
        indexItem = self.model.index(index.row(), 0, index.parent())
        values = []
        fileName = self.model.fileName(indexItem)
        filePath = self.model.filePath(indexItem)
        values.append(filePath)
        self.result.append(self.name_person)               
        self.result.append(values)
        
    def update_stats(self):
        for person in self.people:
            ind = str(self.people.index(person))
            for key, value in person.__dict__.items():
                parametr = getattr(self, key+ind)
                if key  != 'name':     
                    time_val = float(value.split(' ')[-2])
                    indx = value.find(str(time_val))
                    parametr.setText(key+' time: '+value[:indx]+str(int(time_val))+value[value.find('sec')-1:]) 
    
    def upadte_column(self, person):
            ind = self.people.index(person)
            setattr(self, 'button'+str(ind), QVBoxLayout())
            self.button_names.append('button'+str(ind))
            if ind%2 == 0:
                setattr(self, 'buttons'+str(ind), QHBoxLayout())
            for key, value in person.__dict__.items():
                setattr(self, key+str(ind), QLabel(self))
                parametr = getattr(self, key+str(ind))
                if key  != 'name':
                    time_val = float(value.split(' ')[-2])
                    indx = value.find(str(time_val))
                    parametr.setText(key+' time: '+value[:indx]+str(int(time_val))+value[value.find('sec')-1:])
                else:
                    parametr.setText(value)
                but_ind = getattr(self, 'button'+str(ind))
                but_ind.addWidget(parametr)
                if ind%2 == 0:
                    box_lay = getattr(self, 'buttons'+str(ind))
                else:
                    box_lay = getattr(self, 'buttons'+str(ind-1))
                box_lay.addLayout(but_ind)
                self.vlayout.insertLayout(-2,box_lay)

    def update_row(self):
        key = list(self.people[-1].__dict__.keys())[-1]
        count = 0 
        for name in self.button_names:
            but_ind = getattr(self, name) 
            setattr(self, key+str(count), QLabel(self))
            parametr = getattr(self, key+str(count))
            parametr.setText(key+' time: 0 hrs 0 min 0.0 sec')
            but_ind.addWidget(parametr)  
            count += 1
class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = 'logextracter-gui'
        self.left = 10
        self.top = 10
        self.width = 1024
        self.height = 400
        self.initUI()

    def initUI(self):

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        openSrcFolderAction = QAction(QIcon('opensrcfolder.png'), 'SRC Folder',
                                      self)
        openSrcFolderAction.setShortcut('Ctrl+S')
        openSrcFolderAction.setStatusTip('Open the source folder')
        openSrcFolderAction.triggered.connect(self.browseSrcFolder)

        openDestFolderAction = QAction(QIcon('opendestfolder.png'),
                                       'DEST Folder', self)
        openDestFolderAction.setShortcut('Ctrl+D')
        openDestFolderAction.setStatusTip('Open the destination folder')
        openDestFolderAction.triggered.connect(self.browseDestFolder)

        exitAction = QAction(QIcon('exit.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(self.close)

        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu('&File')
        fileMenu.addAction(openSrcFolderAction)
        fileMenu.addAction(openDestFolderAction)
        fileMenu.addAction(exitAction)
        helpMenu = menuBar.addMenu('&Help')

        self.srcModel = QFileSystemModel()
        self.srcModel.setRootPath(QDir.currentPath())
        self.srcTree = QTreeView()
        self.srcTree.setModel(self.srcModel)
        self.srcTree.setRootIndex(self.srcModel.index(QDir.currentPath()))
        self.srcTree.setAnimated(False)
        self.srcTree.setIndentation(20)
        self.srcTree.setSortingEnabled(True)
        self.srcTree.setSelectionMode(QAbstractItemView.ExtendedSelection)

        self.destModel = QFileSystemModel()
        self.destModel.setRootPath(QDir.currentPath())
        self.destTree = QTreeView()
        self.destTree.setModel(self.destModel)
        self.destTree.setRootIndex(self.destModel.index(QDir.currentPath()))
        self.destTree.setAnimated(False)
        self.destTree.setIndentation(20)
        self.destTree.setSortingEnabled(True)

        self.extractButton = QPushButton()
        self.extractButton.setText('====>')
        self.extractButton.clicked.connect(self.extract)
        mainLayout = QHBoxLayout()
        mainLayout.addWidget(self.srcTree)
        mainLayout.addWidget(self.extractButton)
        mainLayout.addWidget(self.destTree)
        self.centralWidget = QWidget()
        self.centralWidget.setLayout(mainLayout)
        self.setCentralWidget(self.centralWidget)

        self.show()

    def browseSrcFolder(self):

        directory = QFileDialog.getExistingDirectory(self,
                                                     'Open the source folder',
                                                     QDir.currentPath())

        if directory:
            self.srcTree.setRootIndex(self.srcModel.index(directory))

    def browseDestFolder(self):

        directory = QFileDialog.getExistingDirectory(self,
                                                     'Open the source folder',
                                                     QDir.currentPath())

        if directory:
            self.destTree.setRootIndex(self.destModel.index(directory))

    def extract(self):

        selectionModel = self.srcTree.selectionModel()
        indexes = selectionModel.selectedRows(0)
        logFilenameList = []
        excelFilenameList = []
        for index in indexes:
            logFilename = self.srcModel.filePath(index)
            excelFilename = QDir(
                self.destModel.filePath(
                    self.destTree.rootIndex())).absoluteFilePath(
                        self.srcModel.fileName(index).replace('.log', '.xlsx'))
            logFilenameList.append(logFilename)
            excelFilenameList.append(excelFilename)
        self.extractThread = ExtractThread()
        self.extractThread.setLogFilenameList(logFilenameList)
        self.extractThread.setExcelFilenameList(excelFilenameList)
        self.extractThread.completed.connect(self.updateStatusBar)
        self.extractThread.start()

        # for index in indexes:
        #     logFilename = self.srcModel.filePath(index)
        #     excelFilename = QDir(self.destModel.filePath(self.destTree.rootIndex())).absoluteFilePath(self.srcModel.fileName(index).replace('.log', '.xlsx'))
        #     data = parseFile(logFilename)
        #     saveToExcel(excelFilename, data)

    def updateStatusBar(self, message):
        self.statusBar().showMessage(message)
class clientUI_Interface(Ui_ClientUI):
    '''
	Mediator class between the logic and the Presentation
	'''
    def __init__(self, ftpClientUIMain, ftpClient, homeDir):
        Ui_ClientUI.__init__(self)
        self.setupUi(ftpClientUIMain)
        self.ftpClient = ftpClient

        #-----------------Local------------------------------------------------------
        self.homeDir = homeDir
        self.localDir_treeView.setContextMenuPolicy(
            QtCore.Qt.CustomContextMenu)
        self.localDir_treeView.customContextMenuRequested.connect(
            self.localMenu)
        self.populateLocalDir()

        #-----------------remote----------------------------------------------------
        self.remoteDir_tableWidget.setContextMenuPolicy(
            QtCore.Qt.CustomContextMenu)
        self.remoteDir_tableWidget.customContextMenuRequested.connect(
            self.remoteMenu)
        # Reset and hide progress bar
        self.progressBar.setValue(0)
        self.progressBar.hide()
        # Disable all remote widgets and buttons
        self.Back_pushButton.setEnabled(False)
        self.Quit_pushButton.setEnabled(False)
        self.btn_refreshRemoteDir.setEnabled(False)
        self.remoteDir_tableWidget.setEnabled(False)
        self.dirName_lineEdit.setEnabled(False)
        self.btn_createDir.setEnabled(False)
        self.btn_Cancell_createDir.setEnabled(False)
        # Initialise the table for listing files
        self.updateServerDirectoryList()
        # Create a thread pool
        self.threadpool = QtCore.QThreadPool()

        #----------------------- ACTION FUNCTIONS -------------------------------
        self.connect_pushButton.clicked.connect(self.connectToServer)
        self.Quit_pushButton.clicked.connect(self.quit)
        self.btn_refreshRemoteDir.clicked.connect(self.refreshRemote)
        self.btn_RefreshLocalDir.clicked.connect(self.refreshLocal)
        self.btn_createDir.clicked.connect(self.createDir)
        self.btn_Cancell_createDir.clicked.connect(self.disableFolderEdit)
        self.Back_pushButton.clicked.connect(self.directoryReturn)
        self.remoteDir_tableWidget.doubleClicked.connect(self.openFolder)

    #==================================================================================
    def setSatus(self, isError, status):
        self.ftpClient.isError = isError
        self.ftpClient.server_response = status
        self.dispStatus()

    #==================================================================================
    def dispStatus(self):
        if self.ftpClient.isError:
            self.status_label.setStyleSheet(
                'color: red; font-family:Times New Roman')
        else:
            self.status_label.setStyleSheet(
                'color: blue; font-family:Times New Roman; font-size: 11pt')

        self.status_label.setText(str(self.ftpClient.server_response))

    #==================================================================================
    def connectToServer(self):
        if not self.ftpClient.IsConnected:
            self.ftpClient.initializeFTPConnection(
                str(self.lineEdit_host.text()))
            self.dispStatus()
        self.loginToServer()
        if self.ftpClient.IsValidUser:
            self.Quit_pushButton.setEnabled(True)
            self.connect_pushButton.setEnabled(False)
            self.connect_pushButton.setText("Connect")
            self.Back_pushButton.setEnabled(True)
            self.btn_refreshRemoteDir.setEnabled(True)
            self.remoteDir_tableWidget.setEnabled(True)
            self.refreshRemote()
            self.conStatus.setStyleSheet(
                'color: blue; font-family:Times New Roman; font-size: 11pt')
            self.conStatus.setText("Online : ")
            self.dispStatus()

    #==================================================================================
    def loginToServer(self):
        if self.ftpClient.IsConnected:
            self.connect_pushButton.setText("Login")
            username = str(self.lineEdit_username.text())
            password = str(self.lineEdit_Password.text())
            self.ftpClient.login(username, password)
            self.dispStatus()

    #==================================================================================
    def populateLocalDir(self):
        self.localModel = QFileSystemModel()
        self.localModel.setRootPath(QtCore.QDir.rootPath())
        self.localDir_treeView.setModel(self.localModel)
        self.localDir_treeView.setRootIndex(
            self.localModel.index(str(self.homeDir)))
        self.localDir_treeView.setSortingEnabled(True)

    #==================================================================================
    def localMenu(self):
        local_menu = QtWidgets.QMenu()
        fileUpload = local_menu.addAction("Upload")
        fileUpload.triggered.connect(self.uploadFile)
        cursor = QtGui.QCursor()  #privide a cursor location
        local_menu.exec_(cursor.pos())  # pass it to the menu executor

    #==================================================================================
    def uploadFile(self):
        if self.ftpClient.IsConnected:
            local_index = self.localDir_treeView.currentIndex()
            filename = self.localModel.fileName(local_index)
            filepath = self.localModel.filePath(local_index)

            #self.ftpClient.upload_file(filename)

            self.ftpClient.upLoadList.append(filename)
            uploadThread = actionHandler(self.ftpClient.upload_file, filename,
                                         filepath)

            uploadThread.signals.finished.connect(self.uploadThreadComplete)
            uploadThread.signals.error.connect(self.uploadFailed)
            uploadThread.signals.fileProgress.connect(
                self.displayUploadProgBar)

            self.threadpool.start(uploadThread)

            msg = "Upload file : " + filename
            self.setSatus(False, msg)
            self.dispStatus()
        else:
            self.uploadFailed()
            self.disconnected()

    #==================================================================================
    def uploadFailed(self):
        msg = "Upload Failed, Check connection"
        self.setSatus(True, msg)
        self.dispStatus()
        print(msg)

    #==================================================================================
    def uploadThreadComplete(self):
        self.setSatus(False, "Done Uploading")
        self.dispStatus()
        self.progressBar.hide()
        self.up_downLoadlabel.setText("")
        self.progressBar.setEnabled(False)
        self.Back_pushButton.setEnabled(True)
        self.btn_refreshRemoteDir.setEnabled(True)
        self.remoteDir_tableWidget.setEnabled(True)
        self.refreshRemote()

    #==================================================================================
    def displayUploadProgBar(self):  #, filename)
        if len(self.ftpClient.upLoadList) is not 0:
            self.progressBar.show()
            self.progressBar.setEnabled(True)
            self.up_downLoadlabel.setText("Uploading file")
            self.progressBar.setValue(self.ftpClient.getProgressVal())
        return

    #==================================================================================
    def remoteMenu(self):
        remote_menu = QtWidgets.QMenu()
        fileDownload = remote_menu.addAction("Download")
        fileDownload.triggered.connect(self.downloadFile)
        fileDownload = remote_menu.addAction("Open")
        fileDownload.triggered.connect(self.openFolder)
        fileDownload = remote_menu.addAction("Delete")
        fileDownload.triggered.connect(self.deleteFile)
        fileDownload = remote_menu.addAction("New Folder")
        fileDownload.triggered.connect(self.enableFolderEdit)
        cursor = QtGui.QCursor()
        remote_menu.exec_(cursor.pos())

    #==================================================================================
    def deleteFile(self):
        for currentQTableWidgetRow in self.remoteDir_tableWidget.selectionModel(
        ).selectedRows():
            if currentQTableWidgetRow.row() != 0:
                try:
                    filename = self.remoteDir_tableWidget.item(
                        currentQTableWidgetRow.row(), 0).text()
                    permission = self.remoteDir_tableWidget.item(
                        currentQTableWidgetRow.row(), 3).text()
                    if permission.find('d') is not -1:
                        path = self.addPath(filename)
                        self.ftpClient.directory_delete(path)
                        self.dispStatus()
                        self.refreshRemote()
                    else:
                        path = self.addPath(filename)
                        self.ftpClient.file_delete(path)
                        self.dispStatus()
                        self.refreshRemote()
                except:
                    self.setSatus(True, "Cant delete File")
                    self.dispStatus()
                    return

    #==================================================================================
    def enableFolderEdit(self):
        self.dirName_lineEdit.setEnabled(True)
        self.btn_createDir.setEnabled(True)
        self.label_foldername.setEnabled(True)
        self.btn_Cancell_createDir.setEnabled(True)
        self.Back_pushButton.setEnabled(False)
        self.btn_refreshRemoteDir.setEnabled(False)
        self.remoteDir_tableWidget.setEnabled(False)

    #==================================================================================
    def disableFolderEdit(self):
        self.btn_Cancell_createDir.setEnabled(False)
        self.dirName_lineEdit.setEnabled(False)
        self.label_foldername.setEnabled(False)
        self.btn_createDir.setEnabled(False)
        self.Back_pushButton.setEnabled(True)
        self.btn_refreshRemoteDir.setEnabled(True)
        self.remoteDir_tableWidget.setEnabled(True)

    #==================================================================================
    def createDir(self):
        self.dirName_lineEdit.setFocus()
        directoryName = str(self.dirName_lineEdit.text())
        self.dirName_lineEdit.clear()
        self.ftpClient.directory_create(directoryName)
        self.disableFolderEdit()
        self.dispStatus()
        self.refreshRemote()
        return

    #==================================================================================
    def addPath(self, filename):
        self.ftpClient.directory_print()
        print(self.ftpClient.serverDir)
        self.ftpClient.serverDir = self.ftpClient.serverDir.replace('\r\n', '')
        s = '\\'
        path = self.ftpClient.serverDir + s + filename
        path = [self.ftpClient.serverDir, str(filename)]
        path = '\\'.join(path)
        return path

    #==================================================================================
    def openFolder(self):
        for currentQTableWidgetRow in self.remoteDir_tableWidget.selectionModel(
        ).selectedRows():
            try:
                filename = self.remoteDir_tableWidget.item(
                    currentQTableWidgetRow.row(), 0).text()
            except:
                return
            if (filename == ".."):
                self.directoryReturn()
            elif not (filename == ".."):

                try:
                    permission = self.remoteDir_tableWidget.item(
                        currentQTableWidgetRow.row(), 3).text()
                    if permission.find('d') is not -1:
                        path = self.addPath(filename)
                        print('path :', path)
                        self.ftpClient.directory_change(path)
                        self.dispStatus()
                        self.refreshRemote()
                    else:
                        self.setSatus(True, "Cant open file, Download instead")
                        self.dispStatus()

                except:
                    self.setSatus(True, "Cant open file, Download instead")
                    self.dispStatus()

            else:
                self.updateCurrentDir()
                self.ftpClient.directory_print()
                self.dispStatus()
                self.refreshRemote()

    #==================================================================================
    def directoryReturn(self):
        self.ftpClient.directory_return()
        self.ftpClient.directory_print()
        self.dispStatus()
        self.refreshRemote()

    #==================================================================================
    def downloadFile(self):
        for currentQTableWidgetRow in self.remoteDir_tableWidget.selectionModel(
        ).selectedRows():

            try:
                filename = self.remoteDir_tableWidget.item(
                    currentQTableWidgetRow.row(), 0).text()
            except:
                return
            permission = self.remoteDir_tableWidget.item(
                currentQTableWidgetRow.row(), 3).text()
            if permission.find('d') is -1:
                try:
                    #saveFileInDirectory = str(QtWidgets.QFileDialog.getExistingDirectory(None, "Save File In Directory", currentDirectory,\
                    #QtWidgets.QFileDialog.ShowDirsOnly))

                    self.ftpClient.downloadList.append(filename)
                    self.callDownloadFn()

                    downloadThread = actionHandler(
                        self.ftpClient.download_file, filename)

                    downloadThread.signals.finished.connect(
                        self.downloadThreadComplete)
                    downloadThread.signals.error.connect(self.downloadFailed)
                    downloadThread.signals.fileProgress.connect(
                        self.displayDownloadProgBar)

                    self.threadpool.start(downloadThread)

                except:

                    print("Error creating download Thread")
            else:
                self.setSatus(True, "Cant downloadFile, Try open instead")
                self.dispStatus()

        self.dispStatus()

    #==================================================================================
    def callDownloadFn(self):
        self.setSatus(False, "Downloading ...")
        self.dispStatus()
        self.Back_pushButton.setEnabled(False)
        self.btn_refreshRemoteDir.setEnabled(False)
        self.remoteDir_tableWidget.setEnabled(False)

    #==================================================================================
    def downloadFailed(self):
        msg = "Download Failed!!"
        self.setSatus(True, msg)
        self.dispStatus()
        print(msg)

    #==================================================================================
    def downloadThreadComplete(self):
        self.setSatus(False, "Done Downloading")
        self.dispStatus()
        self.refreshRemote()
        self.progressBar.hide()
        self.up_downLoadlabel.setText("")
        self.progressBar.setEnabled(False)
        self.Back_pushButton.setEnabled(True)
        self.btn_refreshRemoteDir.setEnabled(True)
        self.remoteDir_tableWidget.setEnabled(True)

    #==================================================================================
    def displayDownloadProgBar(self):  #, filename)
        if len(self.ftpClient.downloadList) is not 0:
            self.progressBar.show()
            self.progressBar.setEnabled(True)
            self.up_downLoadlabel.setText("Downloading file")
            self.progressBar.setValue(self.ftpClient.getProgressVal())
        return

    #==================================================================================
    def updateCurrentDir(self):
        self.ftpClient.directory_print()
        self.remoteDir_lineEdit.setText(str(self.ftpClient.serverDir))

    #==================================================================================
    def updateServerDirectoryList(self):
        try:
            self.remoteDir_tableWidget.setRowCount(0)

            # set column count
            self.remoteDir_tableWidget.setColumnCount(4)

            # Set Row Count:
            self.remoteDir_tableWidget.setRowCount(
                len(self.ftpClient.ListInDir) + 1)
            # Default:
            header = self.remoteDir_tableWidget.horizontalHeader()
            header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
            header.setSectionResizeMode(1,
                                        QtWidgets.QHeaderView.ResizeToContents)
            header.setSectionResizeMode(2,
                                        QtWidgets.QHeaderView.ResizeToContents)

            row = 0
            col = 0
            for item in self.ftpClient.ListInDir:
                print(item)
                for fileProperty in item:
                    fileTypeIco = None
                    if col == 0:
                        if item[3].find('x') is -1:
                            tempFilename = fileProperty.lower()
                            if tempFilename.endswith(
                                ('.png', '.jpg', '.jpeg', '.bmp', '.tiff')):
                                fileTypeIco = "assets/image.ico"
                            elif tempFilename.endswith(
                                ('.mp4', '.wmv', '.mkv', '.avi')):
                                fileTypeIco = "assets/video.ico"
                            else:
                                fileTypeIco = "assets/file.ico"
                        else:
                            fileTypeIco = "assets/folder.ico"

                    tempItem = QtWidgets.QTableWidgetItem(
                        QtGui.QIcon(QtGui.QPixmap(fileTypeIco)), fileProperty)
                    self.remoteDir_tableWidget.setItem(row, col, tempItem)
                    col = col + 1
                row = row + 1
                col = 0
            self.remoteDir_tableWidget.setHorizontalHeaderItem(
                0, QtWidgets.QTableWidgetItem("Name"))
            self.remoteDir_tableWidget.setHorizontalHeaderItem(
                1, QtWidgets.QTableWidgetItem("Size"))
            self.remoteDir_tableWidget.setHorizontalHeaderItem(
                2, QtWidgets.QTableWidgetItem("Last Modified"))
            self.remoteDir_tableWidget.setHorizontalHeaderItem(
                3, QtWidgets.QTableWidgetItem("Permissions"))
            self.remoteDir_tableWidget.setSelectionBehavior(
                QtWidgets.QTableView.SelectRows)

        except:
            self.setSatus(True, "Unable to update Server Directory.")
            self.dispStatus()

    #==================================================================================
    def refreshRemote(self):
        if self.ftpClient.IsConnected:
            self.ftpClient.getDirList()
            self.updateServerDirectoryList()
            self.updateCurrentDir()
            #self.setSatus(False,"Remote Directory refreshed")
            self.dispStatus()
        else:
            self.disconnected()

    #==================================================================================
    def refreshLocal(self):
        self.populateLocalDir()

    #==================================================================================
    def updateStatus(self):
        time.sleep(1)
        if self.ftpClient.IsConnected:
            self.status_label.setStyleSheet(
                'color: blue; font-family:Times New Roman; font-size: 11pt')
            self.status_label.setText("...")
        else:
            self.disconnected()

    #==================================================================================
    def disconnected(self):
        if not self.ftpClient.IsConnected:
            self.Quit_pushButton.setEnabled(False)
            self.btn_refreshRemoteDir.setEnabled(False)
            self.remoteDir_lineEdit.setText("")
            self.remoteDir_tableWidget.clear()
            self.remoteDir_tableWidget.setEnabled(False)
            self.connect_pushButton.setEnabled(True)
            time.sleep(1)
            self.conStatus.setStyleSheet(
                'color: red; font-family:Times New Roman; font-size: 11pt')
            self.conStatus.setText("Offline :")
            self.status_label.setText('')
            self.Back_pushButton.setEnabled(False)

    def quit(self):
        if self.ftpClient.IsConnected:
            self.ftpClient.logout()
            self.Quit_pushButton.setEnabled(False)
            self.btn_refreshRemoteDir.setEnabled(False)
            self.remoteDir_lineEdit.setText("")
            self.remoteDir_tableWidget.clear()
            self.remoteDir_tableWidget.setEnabled(False)
            self.connect_pushButton.setEnabled(True)
            self.conStatus.setStyleSheet(
                'color: red; font-family:Times New Roman; font-size: 11pt')
            self.conStatus.setText("Offline :")
            self.status_label.setText('')
            self.Back_pushButton.setEnabled(False)
Пример #18
0
class FilenamePrompt(_BasePrompt):

    """A prompt for a filename."""

    def __init__(self, question, parent=None):
        super().__init__(question, parent)
        self._init_texts(question)
        self._init_key_label()

        self._lineedit = LineEdit(self)
        if question.default:
            self._lineedit.setText(question.default)
        self._lineedit.textEdited.connect(self._set_fileview_root)
        self._vbox.addWidget(self._lineedit)

        self.setFocusProxy(self._lineedit)

        self._init_fileview()
        self._set_fileview_root(question.default)

        if config.val.prompt.filebrowser:
            self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)

        self._to_complete = ''

    @pyqtSlot(str)
    def _set_fileview_root(self, path, *, tabbed=False):
        """Set the root path for the file display."""
        separators = os.sep
        if os.altsep is not None:
            separators += os.altsep

        dirname = os.path.dirname(path)
        basename = os.path.basename(path)
        if not tabbed:
            self._to_complete = ''

        try:
            if not path:
                pass
            elif path in separators and os.path.isdir(path):
                # Input "/" -> don't strip anything
                pass
            elif path[-1] in separators and os.path.isdir(path):
                # Input like /foo/bar/ -> show /foo/bar/ contents
                path = path.rstrip(separators)
            elif os.path.isdir(dirname) and not tabbed:
                # Input like /foo/ba -> show /foo contents
                path = dirname
                self._to_complete = basename
            else:
                return
        except OSError:
            log.prompt.exception("Failed to get directory information")
            return

        root = self._file_model.setRootPath(path)
        self._file_view.setRootIndex(root)

    @pyqtSlot(QModelIndex)
    def _insert_path(self, index, *, clicked=True):
        """Handle an element selection.

        Args:
            index: The QModelIndex of the selected element.
            clicked: Whether the element was clicked.
        """
        if index == QModelIndex():
            path = os.path.join(self._file_model.rootPath(), self._to_complete)
        else:
            path = os.path.normpath(self._file_model.filePath(index))

        if clicked:
            path += os.sep
        else:
            # On Windows, when we have C:\foo and tab over .., we get C:\
            path = path.rstrip(os.sep)

        log.prompt.debug('Inserting path {}'.format(path))
        self._lineedit.setText(path)
        self._lineedit.setFocus()
        self._set_fileview_root(path, tabbed=True)
        if clicked:
            # Avoid having a ..-subtree highlighted
            self._file_view.setCurrentIndex(QModelIndex())

    def _init_fileview(self):
        self._file_view = QTreeView(self)
        self._file_model = QFileSystemModel(self)
        self._file_view.setModel(self._file_model)
        self._file_view.clicked.connect(self._insert_path)

        if config.val.prompt.filebrowser:
            self._vbox.addWidget(self._file_view)
        else:
            self._file_view.hide()

        # Only show name
        self._file_view.setHeaderHidden(True)
        for col in range(1, 4):
            self._file_view.setColumnHidden(col, True)
        # Nothing selected initially
        self._file_view.setCurrentIndex(QModelIndex())
        # The model needs to be sorted so we get the correct first/last index
        self._file_model.directoryLoaded.connect(
            lambda: self._file_model.sort(0))

    def accept(self, value=None):
        text = value if value is not None else self._lineedit.text()
        text = downloads.transform_path(text)
        if text is None:
            message.error("Invalid filename")
            return False
        self.question.answer = text
        return True

    def item_focus(self, which):
        # This duplicates some completion code, but I don't see a nicer way...
        assert which in ['prev', 'next'], which
        selmodel = self._file_view.selectionModel()

        parent = self._file_view.rootIndex()
        first_index = self._file_model.index(0, 0, parent)
        row = self._file_model.rowCount(parent) - 1
        last_index = self._file_model.index(row, 0, parent)

        if not first_index.isValid():
            # No entries
            return

        assert last_index.isValid()

        idx = selmodel.currentIndex()

        if not idx.isValid():
            # No item selected yet
            idx = last_index if which == 'prev' else first_index
        elif which == 'prev':
            idx = self._file_view.indexAbove(idx)
        else:
            assert which == 'next', which
            idx = self._file_view.indexBelow(idx)

        # wrap around if we arrived at beginning/end
        if not idx.isValid():
            idx = last_index if which == 'prev' else first_index

        idx = self._do_completion(idx, which)

        selmodel.setCurrentIndex(
            idx, QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows)
        self._insert_path(idx, clicked=False)

    def _do_completion(self, idx, which):
        filename = self._file_model.fileName(idx)
        while not filename.startswith(self._to_complete) and idx.isValid():
            if which == 'prev':
                idx = self._file_view.indexAbove(idx)
            else:
                assert which == 'next', which
                idx = self._file_view.indexBelow(idx)
            filename = self._file_model.fileName(idx)

        return idx

    def _allowed_commands(self):
        return [('prompt-accept', 'Accept'), ('leave-mode', 'Abort')]
Пример #19
0
class DipteraTrack(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(DipteraTrack, self).__init__(parent)
        self.setupUi(self)

        # Session parameters:
        self.session_loc = '...'
        self.session_name = '...'
        self.bckg_loc = '...'
        self.bckg_img_format = '...'
        self.cal_loc = '...'
        self.cal_name = '...'
        self.cal_img_format = '...'
        self.bckg_img_list = []
        self.mov_name_list = []
        self.cam_name_list = []
        self.N_mov = 0
        self.N_cam = 0
        self.frame_name = '...'
        self.frame_img_format = '...'
        self.model_loc = '...'
        self.model_name = '...'
        self.start_frame = 0
        self.trig_frame = 0
        self.end_frame = 0
        self.trigger_mode = '...'

        self.mov_1_name = '...'
        self.mov_2_name = '...'
        self.mov_3_name = '...'
        self.mov_4_name = '...'
        self.mov_5_name = '...'
        self.mov_6_name = '...'
        self.mov_7_name = '...'
        self.mov_8_name = '...'

        self.cam_1_name = '...'
        self.cam_2_name = '...'
        self.cam_3_name = '...'
        self.cam_4_name = '...'
        self.cam_5_name = '...'
        self.cam_6_name = '...'

        self.img_formats = ['...', 'bmp', 'tif']

        self.trig_modes = ['...', 'start', 'center', 'end']

        self.ses_par_file = ''

        # Focal grid parameters:
        self.nx = None
        self.ny = None
        self.nz = None
        self.ds = None
        self.x0 = None
        self.y0 = None
        self.z0 = None
        self.pixel_size = None

        self.flt = Flight_Tracker_Class()

        self.initialize()

        self.connectActions()

    def initialize(self):
        self.add_session_param_gui()
        self.add_focal_grid_gui()
        self.add_model_scale_gui()
        self.add_model_view_gui()
        self.add_image_segment_gui()
        self.add_pcl_view_gui()
        self.add_contour_view_gui()

    def connectActions(self):
        self.connect_session_param_gui()
        self.connect_focal_grid_gui()
        self.connect_model_scale_gui()
        self.connect_model_view_gui()
        self.connect_image_segment_gui()
        self.connect_pcl_view_gui()
        self.connect_contour_view_gui()

    def add_session_param_gui(self):
        self.ses_folder_rbtn.toggled.connect(lambda: self.ses_folder_rbtn)
        self.bckg_folder_rbtn.toggled.connect(lambda: self.bckg_folder_rbtn)
        self.cal_folder_rbtn.toggled.connect(lambda: self.cal_folder_rbtn)
        self.mov_folder1_rbtn.toggled.connect(lambda: self.mov_folder1_rbtn)
        self.mov_folder2_rbtn.toggled.connect(lambda: self.mov_folder2_rbtn)
        self.mov_folder3_rbtn.toggled.connect(lambda: self.mov_folder3_rbtn)
        self.mov_folder4_rbtn.toggled.connect(lambda: self.mov_folder4_rbtn)
        self.mov_folder5_rbtn.toggled.connect(lambda: self.mov_folder5_rbtn)
        self.mov_folder6_rbtn.toggled.connect(lambda: self.mov_folder6_rbtn)
        self.mov_folder7_rbtn.toggled.connect(lambda: self.mov_folder7_rbtn)
        self.mov_folder8_rbtn.toggled.connect(lambda: self.mov_folder8_rbtn)
        self.cam_folder1_rbtn.toggled.connect(lambda: self.cam_folder1_rbtn)
        self.cam_folder2_rbtn.toggled.connect(lambda: self.cam_folder2_rbtn)
        self.cam_folder3_rbtn.toggled.connect(lambda: self.cam_folder3_rbtn)
        self.cam_folder4_rbtn.toggled.connect(lambda: self.cam_folder4_rbtn)
        self.cam_folder5_rbtn.toggled.connect(lambda: self.cam_folder5_rbtn)
        self.cam_folder6_rbtn.toggled.connect(lambda: self.cam_folder6_rbtn)
        self.frame_name_rbtn.toggled.connect(lambda: self.frame_name_rbtn)
        self.mdl_loc_rbtn.toggled.connect(lambda: self.mdl_loc_rbtn)
        self.mdl_name_rbtn.toggled.connect(lambda: self.mdl_name_rbtn)
        self.load_settings_rbtn.toggled.connect(
            lambda: self.load_settings_rbtn)

        self.bck_img_fmt_box.addItem(self.img_formats[0])
        self.bck_img_fmt_box.addItem(self.img_formats[1])
        self.bck_img_fmt_box.addItem(self.img_formats[2])

        self.cal_img_fmt_box.addItem(self.img_formats[0])
        self.cal_img_fmt_box.addItem(self.img_formats[1])
        self.cal_img_fmt_box.addItem(self.img_formats[2])

        self.frame_img_fmt_box.addItem(self.img_formats[0])
        self.frame_img_fmt_box.addItem(self.img_formats[1])
        self.frame_img_fmt_box.addItem(self.img_formats[2])

        self.trig_mode_box.addItem(self.trig_modes[0])
        self.trig_mode_box.addItem(self.trig_modes[1])
        self.trig_mode_box.addItem(self.trig_modes[2])
        self.trig_mode_box.addItem(self.trig_modes[3])

        self.start_frame_spin.setMinimum(0)
        self.start_frame_spin.setMaximum(0)
        self.start_frame_spin.setValue(0)
        self.start_frame_spin.valueChanged.connect(self.set_start_frame)

        self.trig_frame_spin.setMinimum(0)
        self.trig_frame_spin.setMaximum(0)
        self.trig_frame_spin.setValue(0)
        self.trig_frame_spin.valueChanged.connect(self.set_trig_frame)

        self.end_frame_spin.setMinimum(0)
        self.end_frame_spin.setMaximum(0)
        self.end_frame_spin.setValue(0)
        self.end_frame_spin.valueChanged.connect(self.set_end_frame)

        self.reset_selection_push_btn.clicked.connect(self.reset_selection)
        self.load_settings_push_btn.clicked.connect(self.load_session_file)
        self.save_settings_push_btn.clicked.connect(self.save_session_file)

        directory = '/media/flyami'
        self.file_model = QFileSystemModel()
        self.file_model.setRootPath(directory)
        self.folder_select_tree.setModel(self.file_model)
        self.folder_select_tree.setRootIndex(self.file_model.index(directory))

    def connect_session_param_gui(self):
        self.tabs.setTabEnabled(1, False)
        self.folder_select_tree.clicked.connect(self.select_folder_file)
        self.bck_img_fmt_box.currentIndexChanged.connect(
            self.set_bckg_img_format)
        self.cal_img_fmt_box.currentIndexChanged.connect(
            self.set_cal_img_format)
        self.frame_img_fmt_box.currentIndexChanged.connect(
            self.set_frame_img_format)
        self.trig_mode_box.currentIndexChanged.connect(self.set_trigger_mode)
        self.start_session_push_btn.clicked.connect(self.start_session)

    def select_folder_file(self, index):
        indexItem = self.file_model.index(index.row(), 0, index.parent())
        fileName = self.file_model.fileName(indexItem)
        filePath = self.file_model.filePath(indexItem)
        if self.ses_folder_rbtn.isChecked():
            self.session_loc = filePath
            self.session_name = fileName
            self.ses_folder_label.setText(self.session_loc)
            self.ses_name_label.setText(self.session_name)
        elif self.bckg_folder_rbtn.isChecked():
            self.bckg_loc = fileName
            self.bckg_folder_label.setText(self.bckg_loc)
        elif self.cal_folder_rbtn.isChecked():
            self.cal_loc = fileName
            self.cal_folder_label.setText(self.cal_loc)
            try:
                for file_name in os.listdir(self.session_loc + '/' +
                                            self.cal_loc):
                    if file_name.endswith("calib.txt"):
                        self.cal_name = file_name
                        self.cal_file_label.setText(self.cal_name)
            except:
                self.cal_name = '...'
                self.cal_file_label.setText(self.cal_name)
        elif self.mov_folder1_rbtn.isChecked():
            self.mov_1_name = fileName
            self.mov_folder1_label.setText(fileName)
        elif self.mov_folder2_rbtn.isChecked():
            self.mov_2_name = fileName
            self.mov_folder2_label.setText(fileName)
        elif self.mov_folder3_rbtn.isChecked():
            self.mov_3_name = fileName
            self.mov_folder3_label.setText(fileName)
        elif self.mov_folder4_rbtn.isChecked():
            self.mov_4_name = fileName
            self.mov_folder4_label.setText(fileName)
        elif self.mov_folder5_rbtn.isChecked():
            self.mov_5_name = fileName
            self.mov_folder5_label.setText(fileName)
        elif self.mov_folder6_rbtn.isChecked():
            self.mov_6_name = fileName
            self.mov_folder6_label.setText(fileName)
        elif self.mov_folder7_rbtn.isChecked():
            self.mov_7_name = fileName
            self.mov_folder7_label.setText(fileName)
        elif self.mov_folder8_rbtn.isChecked():
            self.mov_8_name = fileName
            self.mov_folder8_label.setText(fileName)
        elif self.cam_folder1_rbtn.isChecked():
            self.cam_1_name = fileName
            self.cam_folder1_label.setText(fileName)
        elif self.cam_folder2_rbtn.isChecked():
            self.cam_2_name = fileName
            self.cam_folder2_label.setText(fileName)
        elif self.cam_folder3_rbtn.isChecked():
            self.cam_3_name = fileName
            self.cam_folder3_label.setText(fileName)
        elif self.cam_folder4_rbtn.isChecked():
            self.cam_4_name = fileName
            self.cam_folder4_label.setText(fileName)
        elif self.cam_folder5_rbtn.isChecked():
            self.cam_5_name = fileName
            self.cam_folder5_label.setText(fileName)
        elif self.cam_folder6_rbtn.isChecked():
            self.cam_6_name = fileName
            self.cam_folder6_label.setText(fileName)
        elif self.frame_name_rbtn.isChecked():
            try:
                frame_name_split = fileName.split('_', 1)
                self.frame_name = frame_name_split[0] + '_'
                self.frame_name_label.setText(self.frame_name)
            except:
                self.frame_name = '...'
                self.frame_name_label.setText(self.frame_name)
        elif self.mdl_loc_rbtn.isChecked():
            self.model_loc = filePath
            self.mdl_loc_label.setText(self.model_loc)
        elif self.mdl_name_rbtn.isChecked():
            self.model_name = fileName
            self.mdl_name_label.setText(self.model_name)
        elif self.load_settings_rbtn.isChecked():
            self.ses_par_file = filePath
            self.load_settings_file_label.setText(self.ses_par_file)

    def reset_selection(self):
        if self.ses_folder_rbtn.isChecked():
            self.session_loc = '...'
            self.session_name = '...'
            self.ses_folder_label.setText(self.session_loc)
            self.ses_name_label.setText(self.session_name)
        elif self.bckg_folder_rbtn.isChecked():
            self.bckg_loc = '...'
            self.bckg_folder_label.setText(self.bckg_loc)
        elif self.cal_folder_rbtn.isChecked():
            self.cal_loc = '...'
            self.cal_folder_label.setText(self.cal_loc)
            self.cal_name = '...'
            self.cal_file_label.setText(self.cal_name)
        elif self.mov_folder1_rbtn.isChecked():
            self.mov_1_name = '...'
            self.mov_folder1_label.setText(self.mov_1_name)
        elif self.mov_folder2_rbtn.isChecked():
            self.mov_2_name = '...'
            self.mov_folder2_label.setText(self.mov_2_name)
        elif self.mov_folder3_rbtn.isChecked():
            self.mov_3_name = '...'
            self.mov_folder3_label.setText(self.mov_3_name)
        elif self.mov_folder4_rbtn.isChecked():
            self.mov_4_name = '...'
            self.mov_folder4_label.setText(self.mov_4_name)
        elif self.mov_folder5_rbtn.isChecked():
            self.mov_5_name = '...'
            self.mov_folder5_label.setText(self.mov_5_name)
        elif self.mov_folder6_rbtn.isChecked():
            self.mov_6_name = '...'
            self.mov_folder6_label.setText(self.mov_6_name)
        elif self.mov_folder7_rbtn.isChecked():
            self.mov_7_name = '...'
            self.mov_folder7_label.setText(self.mov_7_name)
        elif self.mov_folder8_rbtn.isChecked():
            self.mov_8_name = '...'
            self.mov_folder8_label.setText(self.mov_8_name)
        elif self.cam_folder1_rbtn.isChecked():
            self.cam_1_name = '...'
            self.cam_folder1_label.setText(self.cam_1_name)
        elif self.cam_folder2_rbtn.isChecked():
            self.cam_2_name = '...'
            self.cam_folder2_label.setText(self.cam_2_name)
        elif self.cam_folder3_rbtn.isChecked():
            self.cam_3_name = '...'
            self.cam_folder3_label.setText(self.cam_3_name)
        elif self.cam_folder4_rbtn.isChecked():
            self.cam_4_name = '...'
            self.cam_folder4_label.setText(self.cam_4_name)
        elif self.cam_folder5_rbtn.isChecked():
            self.cam_5_name = '...'
            self.cam_folder5_label.setText(self.cam_5_name)
        elif self.cam_folder6_rbtn.isChecked():
            self.cam_6_name = '...'
            self.cam_folder6_label.setText(self.cam_6_name)
        elif self.frame_name_rbtn.isChecked():
            self.frame_name = '...'
            self.frame_name_label.setText(self.frame_name)
        elif self.mdl_loc_rbtn.isChecked():
            self.model_loc = '...'
            self.mdl_loc_label.setText(self.model_loc)
        elif self.mdl_name_rbtn.isChecked():
            self.model_name = '...'
            self.mdl_name_label.setText(self.model_name)

    def set_start_frame(self, val):
        self.start_frame = val

    def set_trig_frame(self, val):
        self.trig_frame = val

    def set_end_frame(self, val):
        self.end_frame = val

    def set_bckg_img_format(self, ind):
        self.bckg_img_format = self.img_formats[ind]

    def set_cal_img_format(self, ind):
        self.cal_img_format = self.img_formats[ind]

    def set_frame_img_format(self, ind):
        self.frame_img_format = self.img_formats[ind]

    def set_trigger_mode(self, ind):
        self.trigger_mode = self.trig_modes[ind]
        if (ind == 0):
            self.start_frame_spin.setMinimum(0)
            self.start_frame_spin.setMaximum(0)
            self.start_frame_spin.setValue(0)
            self.trig_frame_spin.setMinimum(0)
            self.trig_frame_spin.setMaximum(0)
            self.trig_frame_spin.setValue(0)
            self.end_frame_spin.setMinimum(0)
            self.end_frame_spin.setMaximum(0)
            self.end_frame_spin.setValue(0)
            self.start_frame = 0
            self.trig_frame = 0
            self.end_frame = 0
        elif (ind == 1):
            # Start trigger mode:
            try:
                file_count = 0
                for file_name in os.listdir(self.session_loc + '/' +
                                            self.mov_1_name + '/' +
                                            self.cam_1_name):
                    if file_name.endswith(self.frame_img_format):
                        file_count += 1
                frame_start = 0
                frame_trig = 0
                frame_end = file_count - 1
            except:
                frame_start = 0
                frame_trig = 0
                frame_end = 0
            self.start_frame_spin.setMinimum(frame_start)
            self.start_frame_spin.setMaximum(frame_trig)
            self.start_frame_spin.setValue(frame_start)
            self.trig_frame_spin.setMinimum(frame_start)
            self.trig_frame_spin.setMaximum(frame_end)
            self.trig_frame_spin.setValue(frame_trig)
            self.end_frame_spin.setMinimum(frame_trig)
            self.end_frame_spin.setMaximum(frame_end)
            self.end_frame_spin.setValue(frame_end)
            self.start_frame = frame_start
            self.trig_frame = frame_trig
            self.end_frame = frame_end
        elif (ind == 2):
            # Center trigger mode:
            try:
                file_count = 0
                for file_name in os.listdir(self.session_loc + '/' +
                                            self.mov_1_name + '/' +
                                            self.cam_1_name):
                    if file_name.endswith(self.frame_img_format):
                        file_count += 1
                frame_start = 0
                frame_trig = int(np.ceil(file_count / 2.0))
                frame_end = file_count - 1
            except:
                frame_start = 0
                frame_trig = 0
                frame_end = 0
            self.start_frame_spin.setMinimum(frame_start)
            self.start_frame_spin.setMaximum(frame_trig)
            self.start_frame_spin.setValue(frame_start)
            self.trig_frame_spin.setMinimum(frame_start)
            self.trig_frame_spin.setMaximum(frame_end)
            self.trig_frame_spin.setValue(frame_trig)
            self.end_frame_spin.setMinimum(frame_trig)
            self.end_frame_spin.setMaximum(frame_end)
            self.end_frame_spin.setValue(frame_end)
            self.start_frame = frame_start
            self.trig_frame = frame_trig
            self.end_frame = frame_end
        elif (ind == 3):
            # End trigger mode:
            try:
                file_count = 0
                for file_name in os.listdir(self.session_loc + '/' +
                                            self.mov_1_name + '/' +
                                            self.cam_1_name):
                    if file_name.endswith(self.frame_img_format):
                        file_count += 1
                frame_start = 0
                frame_trig = file_count - 1
                frame_end = file_count - 1
            except:
                frame_start = 0
                frame_trig = 0
                frame_end = 0
            self.start_frame_spin.setMinimum(frame_start)
            self.start_frame_spin.setMaximum(frame_trig)
            self.start_frame_spin.setValue(frame_start)
            self.trig_frame_spin.setMinimum(frame_start)
            self.trig_frame_spin.setMaximum(frame_end)
            self.trig_frame_spin.setValue(frame_trig)
            self.end_frame_spin.setMinimum(frame_trig)
            self.end_frame_spin.setMaximum(frame_end)
            self.end_frame_spin.setValue(frame_end)
            self.start_frame = frame_start
            self.trig_frame = frame_trig
            self.end_frame = frame_end

    def start_session(self):
        # Check parameters
        par_okay = True

        if (self.session_loc == '...'):
            par_okay = False
            print('No session folder')
        if (self.session_name == '...'):
            par_okay = False
            print('No session name')
        if (self.bckg_loc == '...'):
            par_okay = False
            print('No background folder')
        if (self.bckg_img_format == '...'):
            par_okay = False
            print('No background image format')
        if (self.cal_loc == '...'):
            par_okay = False
            print('No calibration folder')
        if (self.cal_name == '...'):
            par_okay = False
            print('No calibration file')
        if (self.cal_img_format == '...'):
            par_okay = False
            print('No calibration image format')
        if (self.mov_1_name == '...'):
            par_okay = False
            print('No movie folders selected')
        if (self.cam_1_name == '...'):
            par_okay = False
            print('No camera folders selected')
        if (self.frame_name == '...'):
            par_okay = False
            print('No frame name')
        if (self.frame_img_format == '...'):
            par_okay = False
            print('No frame image format')
        if (self.model_loc == '...'):
            par_okay = False
            print('No model folder')
        if (self.model_name == '...'):
            par_okay = False
            print('No model selected')
        if (self.trigger_mode == '...'):
            par_okay = False
            print('No trigger mode selected')

        try:
            self.bckg_img_list = []
            for file_name in os.listdir(self.session_loc + '/' +
                                        self.bckg_loc):
                if file_name.endswith(self.bckg_img_format):
                    self.bckg_img_list.append(str(file_name))
            self.bckg_img_list.sort()
            #print(self.bckg_img_list)
        except:
            par_okay = False
            self.bckg_img_list = []
            print('Could not find background images')

        if (par_okay):

            if (self.mov_1_name != '...'):
                self.mov_name_list.append(str(self.mov_1_name))
            if (self.mov_2_name != '...'):
                self.mov_name_list.append(str(self.mov_2_name))
            if (self.mov_3_name != '...'):
                self.mov_name_list.append(str(self.mov_3_name))
            if (self.mov_4_name != '...'):
                self.mov_name_list.append(str(self.mov_4_name))
            if (self.mov_5_name != '...'):
                self.mov_name_list.append(str(self.mov_5_name))
            if (self.mov_6_name != '...'):
                self.mov_name_list.append(str(self.mov_6_name))
            if (self.mov_7_name != '...'):
                self.mov_name_list.append(str(self.mov_7_name))
            if (self.mov_8_name != '...'):
                self.mov_name_list.append(str(self.mov_8_name))

            self.mov_name_list.sort()

            self.N_mov = len(self.mov_name_list)

            print('Number of movies: ' + str(self.N_mov))
            print(self.mov_name_list)

            if (self.cam_1_name != '...'):
                self.cam_name_list.append(str(self.cam_1_name))
            if (self.cam_2_name != '...'):
                self.cam_name_list.append(str(self.cam_2_name))
            if (self.cam_3_name != '...'):
                self.cam_name_list.append(str(self.cam_3_name))
            if (self.cam_4_name != '...'):
                self.cam_name_list.append(str(self.cam_4_name))
            if (self.cam_5_name != '...'):
                self.cam_name_list.append(str(self.cam_5_name))
            if (self.cam_6_name != '...'):
                self.cam_name_list.append(str(self.cam_6_name))

            self.cam_name_list.sort()

            self.N_cam = len(self.cam_name_list)

            print('Number of cameras: ' + str(self.N_cam))
            print(self.cam_name_list)

            # Transfer parameters to the flight_tracker_class.py
            self.flt.N_cam = self.N_cam
            self.flt.N_mov = self.N_mov
            self.flt.session_loc = str(self.session_loc)
            self.flt.session_name = str(self.session_name)
            self.flt.bckg_loc = str(self.bckg_loc)
            self.flt.bckg_img_list = self.bckg_img_list
            self.flt.bckg_img_format = str(self.bckg_img_format)
            self.flt.cal_loc = str(self.cal_loc)
            self.flt.cal_name = str(self.cal_name)
            self.flt.cal_img_format = str(self.cal_img_format)
            self.flt.mov_name_list = self.mov_name_list
            self.flt.cam_name_list = self.cam_name_list
            self.flt.frame_name = str(self.frame_name)
            self.flt.frame_img_format = str(self.frame_img_format)
            self.flt.model_loc = str(self.model_loc)
            self.flt.model_name = str(self.model_name)
            self.flt.start_point = self.start_frame
            self.flt.trig_point = self.trig_frame
            self.flt.end_point = self.end_frame
            self.flt.trigger_mode = str(self.trigger_mode)

            self.flt.set_parameters()

            self.flt.print_parameters()

            self.tabs.setTabEnabled(1, True)

    def load_session_file(self):
        # Load session parameter file
        try:
            pickle_in = open(self.ses_par_file, 'rb')
            ses_dict = pickle.load(pickle_in)
            self.session_loc = ses_dict['session_loc']
            self.session_name = ses_dict['session_name']
            self.bckg_loc = ses_dict['bckg_loc']
            self.bckg_img_list = ses_dict['bckg_img_list']
            self.bckg_img_format = ses_dict['bckg_img_format']
            self.cal_loc = ses_dict['cal_loc']
            self.cal_name = ses_dict['cal_name']
            self.cal_img_format = ses_dict['cal_img_format']
            self.mov_1_name = ses_dict['mov_1_name']
            self.mov_2_name = ses_dict['mov_2_name']
            self.mov_3_name = ses_dict['mov_3_name']
            self.mov_4_name = ses_dict['mov_4_name']
            self.mov_5_name = ses_dict['mov_5_name']
            self.mov_6_name = ses_dict['mov_6_name']
            self.mov_7_name = ses_dict['mov_7_name']
            self.mov_8_name = ses_dict['mov_8_name']
            self.cam_1_name = ses_dict['cam_1_name']
            self.cam_2_name = ses_dict['cam_2_name']
            self.cam_3_name = ses_dict['cam_3_name']
            self.cam_4_name = ses_dict['cam_4_name']
            self.cam_5_name = ses_dict['cam_5_name']
            self.cam_6_name = ses_dict['cam_6_name']
            self.frame_name = ses_dict['frame_name']
            self.frame_img_format = ses_dict['frame_img_format']
            self.model_loc = ses_dict['model_loc']
            self.model_name = ses_dict['model_name']
            self.trigger_mode = ses_dict['trigger_mode']
            self.start_frame = ses_dict['start_frame']
            self.trig_frame = ses_dict['trig_frame']
            self.end_frame = ses_dict['end_frame']
            print('loaded session parameters')
        except:
            print('could not load session parameter file')

    def save_session_file(self):
        # Save session paramter file
        try:
            ses_dict = {
                'session_loc': self.session_loc,
                'session_name': self.session_name,
                'bckg_loc': self.bckg_loc,
                'bckg_img_list': self.bckg_img_list,
                'bckg_img_format': self.bckg_img_format,
                'cal_loc': self.cal_loc,
                'cal_name': self.cal_name,
                'cal_img_format': self.cal_img_format,
                'mov_1_name': self.mov_1_name,
                'mov_2_name': self.mov_2_name,
                'mov_3_name': self.mov_3_name,
                'mov_4_name': self.mov_4_name,
                'mov_5_name': self.mov_5_name,
                'mov_6_name': self.mov_6_name,
                'mov_7_name': self.mov_7_name,
                'mov_8_name': self.mov_8_name,
                'cam_1_name': self.cam_1_name,
                'cam_2_name': self.cam_2_name,
                'cam_3_name': self.cam_3_name,
                'cam_4_name': self.cam_4_name,
                'cam_5_name': self.cam_5_name,
                'cam_6_name': self.cam_6_name,
                'frame_name': self.frame_name,
                'frame_img_format': self.frame_img_format,
                'model_loc': self.model_loc,
                'model_name': self.model_name,
                'trigger_mode': self.trigger_mode,
                'start_frame': self.start_frame,
                'trig_frame': self.trig_frame,
                'end_frame': self.end_frame
            }
            os.chdir(self.session_loc)
            ses_pickle = open('session_parameters.pickle', 'wb')
            pickle.dump(ses_dict, ses_pickle)
            ses_pickle.close()
            print('saved session_parameters.pickle')
        except:
            print('could not save session parameter file')

    def set_nx(self, val):
        self.nx = val

    def set_ny(self, val):
        self.ny = val

    def set_nz(self, val):
        self.nz = val

    def set_ds(self, val):
        self.ds = val

    def set_x0(self, val):
        self.x0 = val

    def set_y0(self, val):
        self.y0 = val

    def set_z0(self, val):
        self.z0 = val

    def set_pixel_size(self, val):
        self.pixel_size = val

    def add_focal_grid_gui(self):
        self.nx = 320
        self.ny = 320
        self.nz = 320
        self.ds = 0.032
        self.x0 = 0.0
        self.y0 = 0.0
        self.z0 = 0.0
        self.pixel_size = 0.040

    def connect_focal_grid_gui(self):
        self.tabs.setTabEnabled(2, False)

        self.nx_spin.setMinimum(1)
        self.nx_spin.setMaximum(2048)
        self.nx_spin.setValue(self.nx)
        self.nx_spin.valueChanged.connect(self.set_nx)

        self.ny_spin.setMinimum(1)
        self.ny_spin.setMaximum(2048)
        self.ny_spin.setValue(self.ny)
        self.ny_spin.valueChanged.connect(self.set_ny)

        self.nz_spin.setMinimum(1)
        self.nz_spin.setMaximum(2048)
        self.nz_spin.setValue(self.nz)
        self.nz_spin.valueChanged.connect(self.set_nz)

        self.ds_spin.setMinimum(0.001)
        self.ds_spin.setMaximum(1.000)
        self.ds_spin.setSingleStep(0.001)
        self.ds_spin.setValue(self.ds)
        self.ds_spin.valueChanged.connect(self.set_ds)

        self.x0_spin.setRange(-10.0, 10.0)
        self.x0_spin.setSingleStep(0.01)
        self.x0_spin.setValue(self.x0)
        self.x0_spin.valueChanged.connect(self.set_x0)

        self.y0_spin.setRange(-10.0, 10.0)
        self.y0_spin.setSingleStep(0.01)
        self.y0_spin.setValue(self.y0)
        self.y0_spin.valueChanged.connect(self.set_y0)

        self.z0_spin.setRange(-10.0, 10.0)
        self.z0_spin.setSingleStep(0.01)
        self.z0_spin.setValue(self.z0)
        self.z0_spin.valueChanged.connect(self.set_z0)

        self.pixel_size_spin.setRange(0.001, 0.1)
        self.pixel_size_spin.setSingleStep(0.001)
        self.pixel_size_spin.setValue(self.pixel_size)
        self.pixel_size_spin.valueChanged.connect(self.set_pixel_size)

        self.calc_vox_btn.clicked.connect(self.calculate_focal_grid)

        self.vox_progress_bar.setRange(0, 100)
        self.vox_progress_bar.setValue(0)

    def update_grid_progress_bar(self, progress):
        self.vox_progress_bar.setValue(progress)

    def calculate_focal_grid(self):
        self.flt.nx = self.nx
        self.flt.ny = self.ny
        self.flt.nz = self.nz
        self.flt.ds = self.ds
        self.flt.x0 = self.x0
        self.flt.y0 = self.y0
        self.flt.z0 = self.z0
        self.flt.pixel_size = self.pixel_size
        self.flt.set_focal_grid_parameters()
        self.flt.set_pixel_size(self.pixel_size)
        self.flt.calculate_focal_grid(self.update_grid_progress_bar)
        self.tabs.setTabEnabled(2, True)
        self.rawFrameView.setFrameParam()
        self.set_model_scale_gui()

    def add_model_scale_gui(self):
        self.tabs.setTabEnabled(2, False)

    def connect_model_scale_gui(self):
        self.tabs.setTabEnabled(3, False)
        self.rawFrameView.loadFLT(self.flt)

    def set_model_scale_gui(self):

        drag_pnt_data = self.flt.get_drag_point_pars()
        symbols = drag_pnt_data[0]
        labels = drag_pnt_data[1]
        adj = drag_pnt_data[4]
        scale_texts = drag_pnt_data[6]
        scale_calc = drag_pnt_data[7]
        length_calc = drag_pnt_data[8]
        origin_ind = drag_pnt_data[9]
        contour_calc = drag_pnt_data[10]
        scale_data = []
        for i in range(len(scale_texts)):
            scale_data.append(1.0)

        xyz_pos = drag_pnt_data[3]
        pos_list = []
        for i in range(xyz_pos.shape[0]):
            pos_list.append((xyz_pos[i, 0], xyz_pos[i, 1], xyz_pos[i, 2]))
        start_pos = np.array(pos_list)

        p_clr = drag_pnt_data[2]
        p_clr_list = []
        for i in range(p_clr.shape[0]):
            p_clr_list.append((p_clr[i, 0], p_clr[i, 1], p_clr[i, 2]))
        pnt_clr = np.array([p_clr_list],
                           dtype=[('red', np.ubyte), ('green', np.ubyte),
                                  ('blue', np.ubyte)])

        l_clr = drag_pnt_data[5]
        l_clr_list = []
        for i in range(l_clr.shape[0]):
            l_clr_list.append(
                (l_clr[i, 0], l_clr[i, 1], l_clr[i, 2], l_clr[i, 3], l_clr[i,
                                                                           4]))
        line_clr = np.array([l_clr_list],
                            dtype=[('red', np.ubyte), ('green', np.ubyte),
                                   ('blue', np.ubyte), ('alpha', np.ubyte),
                                   ('width', float)])

        self.rawFrameView.setSessionLoc(self.session_loc)
        self.rawFrameView.setPos(start_pos)
        self.rawFrameView.setAdj(adj)
        self.rawFrameView.setLines(l_clr)
        self.rawFrameView.setSymbols(symbols)
        self.rawFrameView.setTexts(labels)
        self.rawFrameView.setTextColor(p_clr)
        self.rawFrameView.setScaleCalc(scale_calc)
        self.rawFrameView.setLengthCalc(length_calc)
        self.rawFrameView.setOriginInd(origin_ind)
        self.rawFrameView.add_frame(self.start_frame)
        self.rawFrameView.add_graph()
        self.rawFrameView.setMouseCallbacks()

        self.raw_mov_spin.setMinimum(1)
        self.raw_mov_spin.setMaximum(self.N_mov)
        self.raw_mov_spin.setValue(1)
        self.raw_mov_spin.valueChanged.connect(self.rawFrameView.setMovNR)

        self.raw_frame_spin.setMinimum(self.start_frame)
        self.raw_frame_spin.setMaximum(self.end_frame)
        self.raw_frame_spin.setValue(self.start_frame)
        self.raw_frame_spin.valueChanged.connect(
            self.rawFrameView.update_frame)

        self.scaleTable.setRowCount(2)
        self.scaleTable.setColumnCount(len(scale_texts))
        for i in range(len(scale_texts)):
            self.scaleTable.setItem(0, i, QTableWidgetItem(scale_texts[i]))
            self.scaleTable.setItem(1, i, QTableWidgetItem(str(scale_data[i])))
        self.rawFrameView.connect_table(self.scaleTable)

        self.load_scale_btn.clicked.connect(self.rawFrameView.load_model_scale)
        self.save_scale_btn.clicked.connect(self.rawFrameView.save_model_scale)
        self.set_model_btn.clicked.connect(self.update_model_scale)

    def update_model_scale(self):
        self.tabs.setTabEnabled(3, True)
        self.model_view_window.set_file_loc(self.model_loc)
        self.rawFrameView.update_model_scale()
        self.model_view_window.load_model()
        self.tabs.setTabEnabled(4, True)
        self.set_image_segment_gui()

    def add_model_view_gui(self):
        self.tabs.setTabEnabled(3, False)

    def connect_model_view_gui(self):
        self.tabs.setTabEnabled(4, False)
        self.model_view_window.loadFLT(self.flt)

    def add_image_segment_gui(self):
        self.tabs.setTabEnabled(4, False)

    def connect_image_segment_gui(self):
        self.tabs.setTabEnabled(5, False)

        self.body_thresh = 40
        self.wing_thresh = 20
        self.sigma = 0.05
        self.K = 3000
        self.min_body_size = 50
        self.min_wing_size = 3

        self.seg_view.loadFLT(self.flt)
        self.seg_view.setBodyThresh(self.body_thresh)
        self.seg_view.setWingThresh(self.wing_thresh)
        self.seg_view.setSigma(self.sigma)
        self.seg_view.setK(self.K)
        self.seg_view.setMinBodySize(self.min_body_size)
        self.seg_view.setMinWingSize(self.min_wing_size)
        #self.seg_view.setTethered(self.tethered)

    def set_image_segment_gui(self):
        print("resetting mask")
        self.seg_view.reset_mask()
        self.seg_view.add_frame(self.flt.start_point)

        self.seg_mov_spin.setMinimum(1)
        self.seg_mov_spin.setMaximum(self.N_mov)
        self.seg_mov_spin.setValue(1)
        self.seg_mov_spin.valueChanged.connect(self.seg_view.update_mov)

        self.seg_frame_spin.setMinimum(self.flt.start_point)
        self.seg_frame_spin.setMaximum(self.flt.end_point)
        self.seg_mov_spin.setValue(self.flt.start_point)
        self.seg_frame_spin.valueChanged.connect(self.seg_view.update_frame)

        self.body_thresh_spin.setMinimum(0)
        self.body_thresh_spin.setMaximum(255)
        self.body_thresh_spin.setValue(self.body_thresh)
        self.body_thresh_spin.valueChanged.connect(self.seg_view.setBodyThresh)

        self.wing_thresh_spin.setMinimum(0)
        self.wing_thresh_spin.setMaximum(255)
        self.wing_thresh_spin.setValue(self.wing_thresh)
        self.wing_thresh_spin.valueChanged.connect(self.seg_view.setWingThresh)

        self.sigma_spin.setMinimum(0.0)
        self.sigma_spin.setMaximum(2.0)
        self.sigma_spin.setSingleStep(0.01)
        self.sigma_spin.setValue(self.sigma)
        self.sigma_spin.valueChanged.connect(self.seg_view.setSigma)

        self.K_spin.setMinimum(0)
        self.K_spin.setMaximum(10000)
        self.K_spin.setSingleStep(100)
        self.K_spin.setValue(self.K)
        self.K_spin.valueChanged.connect(self.seg_view.setK)

        self.min_body_spin.setMinimum(0)
        self.min_body_spin.setMaximum(10000)
        self.min_body_spin.setValue(self.min_body_size)
        self.min_body_spin.valueChanged.connect(self.seg_view.setMinBodySize)

        self.min_wing_spin.setMinimum(0)
        self.min_wing_spin.setMaximum(10000)
        self.min_wing_spin.setValue(self.min_wing_size)
        self.min_wing_spin.valueChanged.connect(self.seg_view.setMinWingSize)

        #self.tethered_check.setChecked(self.tethered)
        #self.tethered_check.stateChanged.connect(self.seg_view.setTethered)

        self.seg_update_btn.clicked.connect(self.seg_view.update_parameters)

        self.mask_cam_nr_spin.setMinimum(1)
        self.mask_cam_nr_spin.setMaximum(self.flt.N_cam)
        self.mask_cam_nr_spin.setValue(1)
        self.mask_cam_nr_spin.valueChanged.connect(self.seg_view.set_mask_view)

        self.mask_seg_nr_spin.setMinimum(1)
        self.mask_seg_nr_spin.setMaximum(1)
        self.mask_seg_nr_spin.setValue(1)
        self.mask_seg_nr_spin.valueChanged.connect(
            self.seg_view.set_mask_segment)

        self.seg_view.add_mask_spin(self.mask_seg_nr_spin, self.flt.N_cam)

        self.add_mask_btn.clicked.connect(self.seg_view.add_mask)

        self.reset_mask_btn.clicked.connect(self.seg_view.reset_mask)

        self.continue_btn.clicked.connect(self.set_pcl_view_gui)

    def add_pcl_view_gui(self):
        self.tabs.setTabEnabled(5, False)

    def connect_pcl_view_gui(self):
        self.min_nr_points = 50
        self.min_conn_points = 50
        self.sphere_radius = 0.25
        self.phi_bound = 120
        self.theta_bound = 50
        self.eta_bound = 180
        self.tethered = True

        self.pcl_view.loadFLT(self.flt)
        self.flt.set_tethered_flight(self.tethered)
        self.flt.set_min_conn_points(self.min_nr_points)
        self.flt.set_min_nr_points(self.min_conn_points)
        self.flt.set_stroke_bound(self.phi_bound)
        self.flt.set_deviation_bound(self.theta_bound)
        self.flt.set_wing_pitch_bound(self.eta_bound)

    def set_pcl_view_gui(self):
        self.tabs.setTabEnabled(5, True)

        self.pcl_view.setMov(1)
        self.pcl_view.loadFrame(self.flt.start_point)

        self.pcl_mov_spin.setMinimum(1)
        self.pcl_mov_spin.setMaximum(self.N_mov)
        self.pcl_mov_spin.setValue(1)
        self.pcl_mov_spin.valueChanged.connect(self.pcl_view.setMov)

        self.pcl_frame_spin.setMinimum(self.flt.start_point)
        self.pcl_frame_spin.setMaximum(self.flt.end_point)
        self.pcl_frame_spin.setValue(self.flt.start_point)
        self.pcl_frame_spin.valueChanged.connect(self.load_pcl_view_frame)

        self.sphere_radius_spin.setMinimum(0.0)
        self.sphere_radius_spin.setMaximum(2.0)
        self.sphere_radius_spin.setSingleStep(0.01)
        self.sphere_radius_spin.setValue(self.sphere_radius)
        self.pcl_view.setSphereRadius(self.sphere_radius)
        self.sphere_radius_spin.valueChanged.connect(
            self.pcl_view.setSphereRadius)

        self.tethered_radio_btn.toggled.connect(self.set_tethered_flight)
        self.free_radio_btn.toggled.connect(self.set_free_flight)

        self.stroke_bound_spin.setMinimum(0)
        self.stroke_bound_spin.setMaximum(120)
        self.stroke_bound_spin.setValue(self.phi_bound)
        self.stroke_bound_spin.valueChanged.connect(
            self.pcl_view.setStrokeBound)

        self.dev_bound_spin.setMinimum(0)
        self.dev_bound_spin.setMaximum(90)
        self.dev_bound_spin.setValue(self.theta_bound)
        self.dev_bound_spin.valueChanged.connect(self.pcl_view.setDevBound)

        self.wing_pitch_bound_spin.setMinimum(0)
        self.wing_pitch_bound_spin.setMaximum(180)
        self.wing_pitch_bound_spin.setValue(self.eta_bound)
        self.wing_pitch_bound_spin.valueChanged.connect(
            self.pcl_view.setWingPitchBound)

        self.pcl_view_btn.toggled.connect(lambda: self.pcl_view_btn)
        self.bbox_view_btn.toggled.connect(lambda: self.bbox_view_btn)
        self.model_view_btn.toggled.connect(lambda: self.model_view_btn)

        stl_list = self.flt.get_stl_list()
        self.pcl_view.load_stl_files(stl_list, self.model_loc)

        self.set_contour_view_gui()

    def set_free_flight(self):
        self.tethered = False
        self.flt.set_tethered_flight(self.tethered)

    def set_tethered_flight(self):
        self.tethered = True
        self.flt.set_tethered_flight(self.tethered)

    def load_pcl_view_frame(self, frame_nr):
        if self.pcl_view_btn.isChecked():
            self.pcl_view.setPCLView(True)
        elif self.bbox_view_btn.isChecked():
            self.pcl_view.setBBoxView(True)
        elif self.model_view_btn.isChecked():
            self.pcl_view.setModelView(True)
        self.pcl_view.loadFrame(frame_nr)

    def add_contour_view_gui(self):
        self.tabs.setTabEnabled(6, False)

    def connect_contour_view_gui(self):
        self.contour_view.loadFLT(self.flt)

    def set_contour_view_gui(self):

        self.tabs.setTabEnabled(6, True)

        self.opt_mov_spin.setMinimum(1)
        self.opt_mov_spin.setMaximum(self.N_mov)
        self.opt_mov_spin.setValue(1)
        self.opt_mov_spin.valueChanged.connect(self.contour_view.setMovNR)

        self.contour_view.add_frame(self.start_frame)

        self.contour_view.add_contour(self.start_frame)

        self.opt_frame_spin.setMinimum(self.start_frame)
        self.opt_frame_spin.setMaximum(self.end_frame)
        self.opt_frame_spin.setValue(self.start_frame)
        self.opt_frame_spin.valueChanged.connect(
            self.contour_view.update_frame)

        self.init_view_check.toggled.connect(self.contour_view.set_init_view)
        self.dest_view_check.toggled.connect(self.contour_view.set_dest_view)
        self.src_view_check.toggled.connect(self.contour_view.set_src_view)
Пример #20
0
class FilenamePrompt(_BasePrompt):

    """A prompt for a filename."""

    def __init__(self, question, parent=None):
        super().__init__(question, parent)
        self._init_texts(question)
        self._init_key_label()

        self._lineedit = LineEdit(self)
        if question.default:
            self._lineedit.setText(question.default)
        self._lineedit.textEdited.connect(self._set_fileview_root)
        self._vbox.addWidget(self._lineedit)

        self.setFocusProxy(self._lineedit)

        self._init_fileview()
        self._set_fileview_root(question.default)

        if config.val.prompt.filebrowser:
            self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)

        self._to_complete = ''

    @pyqtSlot(str)
    def _set_fileview_root(self, path, *, tabbed=False):
        """Set the root path for the file display."""
        separators = os.sep
        if os.altsep is not None:
            separators += os.altsep

        dirname = os.path.dirname(path)
        basename = os.path.basename(path)
        if not tabbed:
            self._to_complete = ''

        try:
            if not path:
                pass
            elif path in separators and os.path.isdir(path):
                # Input "/" -> don't strip anything
                pass
            elif path[-1] in separators and os.path.isdir(path):
                # Input like /foo/bar/ -> show /foo/bar/ contents
                path = path.rstrip(separators)
            elif os.path.isdir(dirname) and not tabbed:
                # Input like /foo/ba -> show /foo contents
                path = dirname
                self._to_complete = basename
            else:
                return
        except OSError:
            log.prompt.exception("Failed to get directory information")
            return

        root = self._file_model.setRootPath(path)
        self._file_view.setRootIndex(root)

    @pyqtSlot(QModelIndex)
    def _insert_path(self, index, *, clicked=True):
        """Handle an element selection.

        Args:
            index: The QModelIndex of the selected element.
            clicked: Whether the element was clicked.
        """
        if index == QModelIndex():
            path = os.path.join(self._file_model.rootPath(), self._to_complete)
        else:
            path = os.path.normpath(self._file_model.filePath(index))

        if clicked:
            path += os.sep
        else:
            # On Windows, when we have C:\foo and tab over .., we get C:\
            path = path.rstrip(os.sep)

        log.prompt.debug('Inserting path {}'.format(path))
        self._lineedit.setText(path)
        self._lineedit.setFocus()
        self._set_fileview_root(path, tabbed=True)
        if clicked:
            # Avoid having a ..-subtree highlighted
            self._file_view.setCurrentIndex(QModelIndex())

    def _init_fileview(self):
        self._file_view = QTreeView(self)
        self._file_model = QFileSystemModel(self)
        self._file_view.setModel(self._file_model)
        self._file_view.clicked.connect(self._insert_path)

        if config.val.prompt.filebrowser:
            self._vbox.addWidget(self._file_view)
        else:
            self._file_view.hide()

        # Only show name
        self._file_view.setHeaderHidden(True)
        for col in range(1, 4):
            self._file_view.setColumnHidden(col, True)
        # Nothing selected initially
        self._file_view.setCurrentIndex(QModelIndex())
        # The model needs to be sorted so we get the correct first/last index
        self._file_model.directoryLoaded.connect(
            lambda: self._file_model.sort(0))

    def accept(self, value=None, save=False):
        self._check_save_support(save)
        text = value if value is not None else self._lineedit.text()
        text = downloads.transform_path(text)
        if text is None:
            message.error("Invalid filename")
            return False
        self.question.answer = text
        return True

    def item_focus(self, which):
        # This duplicates some completion code, but I don't see a nicer way...
        assert which in ['prev', 'next'], which
        selmodel = self._file_view.selectionModel()

        parent = self._file_view.rootIndex()
        first_index = self._file_model.index(0, 0, parent)
        row = self._file_model.rowCount(parent) - 1
        last_index = self._file_model.index(row, 0, parent)

        if not first_index.isValid():
            # No entries
            return

        assert last_index.isValid()

        idx = selmodel.currentIndex()

        if not idx.isValid():
            # No item selected yet
            idx = last_index if which == 'prev' else first_index
        elif which == 'prev':
            idx = self._file_view.indexAbove(idx)
        else:
            assert which == 'next', which
            idx = self._file_view.indexBelow(idx)

        # wrap around if we arrived at beginning/end
        if not idx.isValid():
            idx = last_index if which == 'prev' else first_index

        idx = self._do_completion(idx, which)

        selmodel.setCurrentIndex(
            idx,
            QItemSelectionModel.ClearAndSelect |  # type: ignore[arg-type]
            QItemSelectionModel.Rows)
        self._insert_path(idx, clicked=False)

    def _do_completion(self, idx, which):
        filename = self._file_model.fileName(idx)
        while not filename.startswith(self._to_complete) and idx.isValid():
            if which == 'prev':
                idx = self._file_view.indexAbove(idx)
            else:
                assert which == 'next', which
                idx = self._file_view.indexBelow(idx)
            filename = self._file_model.fileName(idx)

        return idx

    def _allowed_commands(self):
        return [('prompt-accept', 'Accept'), ('leave-mode', 'Abort')]
Пример #21
0
class FileBrowser(QTreeView):
    def __init__(self,
                 parent=None,
                 textPad=None,
                 notebook=None,
                 codeView=None):
        super().__init__()
        self.path = self.checkPath(os.getcwd())
        self.filename = None

        self.text = None

        self.initItems()

        self.textPad = textPad
        self.notebook = notebook
        self.codeView = codeView

        self.mainWindow = parent

        self.index = None

        self.copySourceFilePath = None  # copy / paste items
        self.copySourceFileName = None
        self.isCopyFileFolder = None

        self.setStyleSheet("""
            border: 5 px;
            background-color: black; 
            color: white;
            alternate-background-color: #FFFFFF;
            selection-background-color: #3b5784;
            """)

        # Contextmenu
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.openMenu)

        self.popMenu = QMenu()
        self.popMenu.setStyleSheet("""
            color: #FFFFFF;
            background-color: #2c2c2c;
            selection-background-color: #3b5784;
            alternate-background-color: #FFFFFF;
        """)

        infoAction = QAction('Info', self)
        infoAction.triggered.connect(self.onInfo)
        createFolderAction = QAction('Create New Folder', self)
        createFolderAction.triggered.connect(self.onCreateNewFolder)
        copyAction = QAction('Copy Item', self)
        copyAction.triggered.connect(self.onCopy)
        pasteAction = QAction('Paste Item', self)
        pasteAction.triggered.connect(self.onPaste)
        renameAction = QAction('Rename Item', self)
        renameAction.triggered.connect(self.onRename)
        deleteAction = QAction('Delete Item', self)
        deleteAction.triggered.connect(self.onDelete)
        terminalAction = QAction('Open Terminal', self)
        terminalAction.triggered.connect(self.onTerminal)

        self.popMenu.addAction(infoAction)
        self.popMenu.addSeparator()
        self.popMenu.addAction(createFolderAction)
        self.popMenu.addSeparator()
        self.popMenu.addAction(copyAction)
        self.popMenu.addAction(pasteAction)
        self.popMenu.addAction(renameAction)
        self.popMenu.addSeparator()
        self.popMenu.addAction(deleteAction)
        self.popMenu.addSeparator()
        self.popMenu.addAction(terminalAction)

    def openMenu(self, position):
        # -> open ContextMenu
        self.popMenu.exec_(self.mapToGlobal(position))

    def onInfo(self):
        if not self.index:
            return

        index = self.index
        indexItem = self.model.index(index.row(), 0, index.parent())

        fileName, filePath, fileDir, fileInfo = self.getFileInformation()

        bundle = fileInfo.isBundle()  # bool
        dir = fileInfo.isDir()  # bool
        file = fileInfo.isFile()  # bool
        executable = fileInfo.isExecutable()  # bool
        readable = fileInfo.isReadable()  # bool
        writable = fileInfo.isWritable()  # bool
        created = fileInfo.created()  # QDateTime
        #modified = fileInfo.lastModified()      # QDateTime
        owner = fileInfo.owner()  # QString
        size = fileInfo.size()  # QInt
        s = format(size, ',d')

        text = ''
        text += 'Type:\t'
        if bundle:
            text += 'Bundle\n\n'
        if dir:
            text += 'Path\n\n'
        if file:
            text += 'File\n\n'

        if readable:
            text += 'read:\tyes\n'
        else:
            text += 'read:\tno\n'
        if writable:
            text += 'write:\tyes\n'
        else:
            text += 'write:\tno\n'
        if executable:
            text += 'exec:\tyes\n\n'
        else:
            text += 'exec:\tno\n\n'

        text += 'size:\t' + str(s) + ' bytes' + '\n'
        text += 'owner:\t' + owner + '\n'
        text += 'created:\t' + str(created.date().day()) + '.' + \
                str(created.date().month()) + '.' + \
                str(created.date().year()) + '  ' + \
                created.time().toString() + '\n'

        q = MessageBox(QMessageBox.Information, fileName, text,
                       QMessageBox.NoButton)
        q.exec_()

    def onCreateNewFolder(self):
        if not self.index:
            return
        else:
            index = self.index
            fileName, filePath, fileDir, fileInfo = self.getFileInformation()

            path = os.getcwd() + '/'
            path = self.checkPath(path)

        index = self.index
        fileName, filePath, fileDir, fileInfo = self.getFileInformation()

        dialog = EnterDialog(self.mainWindow, fileName, \
                             filePath, fileDir, fileInfo, False, path)
        dialog.exec_()

        # return

    def onCopy(self):
        if not self.index:
            return

        fileName, filePath, fileDir, fileInfo = self.getFileInformation()

        if fileName == '..':
            self.clearSelection()
            self.mainWindow.statusBar.showMessage("can't copy this item !",
                                                  3000)
            self.copySourceFilePath = None
            self.copySourceFileName = None
            self.isCopyFileFolder = None
            return

        if fileDir:
            self.copySourceFilePath = filePath
            self.copySourceFileName = fileName
            self.isCopyFileFolder = True
            self.mainWindow.statusBar.showMessage('Path: <' + \
                                                   self.copySourceFileName + \
                                                   '> marked', 3000)
        else:
            self.copySourceFilePath = filePath
            self.copySourceFileName = fileName
            self.mainWindow.statusBar.showMessage('File: <' + \
                                                   self.copySourceFileName + \
                                                   '> marked', 3000)

    def onPaste(self):
        if not self.index:
            return

        if not self.copySourceFilePath:
            self.mainWindow.statusBar.showMessage('nothing marked !', 3000)
            return

        if not self.copySourceFileName:
            self.mainWindow.statusBar.showMessage('nothing marked !', 3000)
            return

        fileName, filePath, fileDir, fileInfo = self.getFileInformation()

        rootPath = os.getcwd()
        rootPath = self.checkPath(rootPath)
        fileList = os.listdir(self.path)  # File list at current path

        if fileName == '..':
            # clicked on '..'
            rootPath = os.getcwd()
            rootPath = self.checkPath(rootPath)

        if fileDir and self.isCopyFileFolder:
            # copy path to another path
            if fileName == '..':
                path = os.getcwd()
                path = self.checkPath(path)
            else:
                path = filePath

            newPath = path + '/' + self.copySourceFileName
            fileList = os.listdir(path)

            if self.copySourceFileName in fileList:
                q = MessageBox(
                    QMessageBox.Warning, "Error",
                    "Another path with the same name already exists.",
                    QMessageBox.NoButton)
                q.exec_()

                self.resetMarkedItems(True)
                return

            if self.copySourceFilePath in newPath:

                q = MessageBox(QMessageBox.Critical, 'Error',
                               'Name of path already exists in new path',
                               QMessageBox.NoButton)

                q.exec_()
                self.resetMarkedItems(True)
                return

            try:
                os.mkdir(newPath)
                self.copytree(self.copySourceFilePath, newPath)
                self.mainWindow.statusBar.showMessage('Done !', 3000)

            except Exception as e:
                q = MessageBox(QMessageBox.Critical, "Error", str(e),
                               QMessageBox.NoButton)
                q.exec_()

                self.resetMarkedItems(True)
                return

        elif fileDir and not self.isCopyFileFolder:
            # copy file to path
            if fileName == '..':
                path = os.getcwd()
                path = self.checkPath(path)
            else:
                path = filePath

            fileList = os.listdir(path)  # File list at current path

            if self.copySourceFileName in fileList:
                result = MessageBox(QMessageBox.Warning, "Warning",
                                    "File already exists.\n" + "Continue ?",
                                    QMessageBox.Yes | QMessageBox.No)

                if (result.exec_() == QMessageBox.Yes):

                    try:
                        shutil.copy(self.copySourceFilePath, path)
                        self.mainWindow.statusBar.showMessage('Done !', 3000)

                    except Exception as e:
                        q = MessageBox(QMessageBox.Critical, "Error", str(e),
                                       QMessageBox.NoButton)
                        q.exec_()

                        self.resetMarkedItems(True)
                        return
                else:
                    self.resetMarkedItems()
                    return
            else:

                try:
                    shutil.copy(self.copySourceFilePath, path)
                    self.mainWindow.statusBar.showMessage('Done !', 3000)

                except Exception as e:
                    q = MessageBox(QMessageBox.Critical, "Error", str(e),
                                   QMessageBox.NoButton)
                    q.exec_()

                    self.resetMarkedItems(True)
                    return

        elif not fileDir and self.isCopyFileFolder:
            # copy path to selected file -> correct this user input ...
            newPath = rootPath + '/' + self.copySourceFileName

            if self.copySourceFileName in fileList:
                q = MessageBox(
                    QMessageBox.Information, "Error",
                    "Another path with the same name already exists.",
                    QMessageBox.NoButton)
                q.exec_()

                self.resetMarkedItems(True)
                return

            try:
                os.mkdir(newPath)
                self.copytree(self.copySourceFilePath, newPath)
                self.mainWindow.statusBar.showMessage('Done !', 3000)

            except Exception as e:
                q = MessageBox(QMessageBox.Critical, "Error", str(e),
                               QMessageBox.NoButton)
                q.exec_()

                self.resetMarkedItems(True)
                return

        elif not fileDir and not self.isCopyFileFolder:
            # user copy file to another file -> correct this input
            fileList = os.listdir(rootPath)  # File list in current path

            if self.copySourceFileName in fileList:
                result = MessageBox(
                    QMessageBox.Warning, "Warning",
                    "File with this name already exists !" + "Continue ?",
                    QMessageBox.Yes | QMessageBox.No)

                if (result.exec_() == QMessageBox.Yes):

                    try:
                        shutil.copy(self.copySourceFilePath, rootPath)
                        self.mainWindow.statusBar.showMessage('Done !', 3000)

                    except Exception as e:
                        q = MessageBox(QMessageBox.Critical, "Error", str(e),
                                       QMessageBox.NoButton)
                        q.exec_()

                        self.resetMarkedItems(True)
                    return

                else:
                    self.resetMarkedItems(True)
                    return

            else:

                try:
                    shutil.copy(self.copySourceFilePath, rootPath)
                    self.mainWindow.statusBar.showMessage('Done !', 3000)

                except Exception as e:
                    q = MessageBox(QMessageBox.Critical, "Error", str(e),
                                   QMessageBox.Ok)
                    q.exec_()

                    self.resetMarkedItems(True)
                    return

        self.resetMarkedItems()

    def resetMarkedItems(self, showMessage=False):
        # reset marked items
        self.copySourceFilePath = None
        self.copySourceFileName = None
        self.isCopyFileFolder = None

        if showMessage:
            self.mainWindow.statusBar.showMessage('Mark removed !', 3000)

    # copy path with subfolder
    #  thanks to stackoverflow.com ..... !
    def copytree(self, src, dst, symlinks=False, ignore=None):
        if not os.path.exists(dst):
            os.makedirs(dst)
        if not os.path.exists(src):
            os.makedirs(src)

        for item in os.listdir(src):
            s = os.path.join(src, item)
            d = os.path.join(dst, item)

            if os.path.isdir(s):
                self.copytree(s, d, symlinks, ignore)
            else:
                if not os.path.exists(
                        d) or os.stat(s).st_mtime - os.stat(d).st_mtime > 1:
                    shutil.copy2(s, d)

    def onRename(self):
        if not self.index:
            return

        fileName, filePath, fileDir, fileInfo = self.getFileInformation()

        dialog = EnterDialog(self.mainWindow, fileName, filePath, fileDir,
                             fileInfo, True)
        dialog.exec_()

    def onDelete(self):
        if not self.index:
            return

        fileName, filePath, fileDir, fileInfo = self.getFileInformation()

        if fileDir:
            if fileName == '..':
                self.mainWindow.statusBar.showMessage(
                    'can not delete this item !', 3000)
                return
            else:
                result = MessageBox(QMessageBox.Warning, 'Delete directory',
                                    '<b>' + filePath + '</b>' + "  ?",
                                    QMessageBox.Yes | QMessageBox.No)

                if (result.exec_() == QMessageBox.Yes):
                    try:
                        shutil.rmtree(filePath)
                        self.mainWindow.statusBar.showMessage('Done !', 3000)
                        self.resetMarkedItems()

                    except Exception as e:
                        q = MessageBox(QMessageBox.Critical, "Error", str(e),
                                       QMessageBox.NoButton)
                        q.exec_()

                        self.resetMarkedItems(True)
                else:
                    return

        else:
            pathList = filePath.split('/')[:-1]
            path = ''
            for elem in pathList:
                path += elem + '/'
            file = filePath.split('/')[-1]
            result = MessageBox(QMessageBox.Warning, 'Delete file',
                                path + "<b>" + file + "</b>" + "  ?",
                                QMessageBox.Yes | QMessageBox.No)

            if (result.exec_() == QMessageBox.Yes):
                try:
                    os.remove(filePath)
                    self.mainWindow.statusBar.showMessage('Done !', 3000)
                except Exception as e:
                    q = MessageBox(QMessageBox.Critical, "Error", str(e),
                                   QMessageBox.NoButton)

                    q.exec_()

                    self.resetMarkedItems(True)

    def onTerminal(self):
        c = Configuration()
        system = c.getSystem()
        command = c.getTerminal(system)

        thread = RunThread(command)
        thread.start()

    def initItems(self):
        font = QFont()
        font.setPixelSize(16)

        self.prepareModel(os.getcwd())

        self.setToolTip(os.getcwd())

        # prepare drag and drop
        self.setDragEnabled(False)

        sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding,
                                 QSizePolicy.MinimumExpanding)
        self.setSizePolicy(sizePolicy)
        self.setAutoExpandDelay(2)
        self.setAlternatingRowColors(False)
        self.setAnimated(False)
        self.setIndentation(20)
        self.setSortingEnabled(False)
        self.setRootIsDecorated(False)
        self.setPalette(QPalette(Qt.black))

        self.verticalScrollBar().setStyleSheet("""border: 20px solid black;
            background-color: darkgreen;
            alternate-background-color: #FFFFFF;""")

        self.horizontalScrollBar().setStyleSheet("""border: 20px solid black;
            background-color: darkgreen;
            alternate-background-color: #FFFFFF;""")

        self.setFont(font)

        # signals
        self.doubleClicked.connect(self.onDoubleClicked)
        self.clicked.connect(self.onClicked)
        self.pressed.connect(self.onClicked)
        #self.entered.connect(self.onEntered)
        self.columnMoved()

        # that hides the size, file type and last modified colomns
        self.setHeaderHidden(True)
        self.hideColumn(1)
        self.hideColumn(2)
        self.hideColumn(3)
        self.resize(400, 400)

    def prepareModel(self, path):
        self.model = QFileSystemModel()
        self.model.setRootPath(path)
        #model.setFilter(QDir.AllDirs |QDir.NoDotAndDotDot | QDir.AllEntries)
        self.model.setFilter(QDir.Files | QDir.AllDirs | QDir.NoDot
                             | QDir.Hidden)
        #self.model.setNameFilters(self.filter)

        self.model.rootPathChanged.connect(self.onRootPathChanged)

        self.fsindex = self.model.setRootPath(path)

        self.setModel(self.model)
        self.setRootIndex(self.fsindex)

    def checkPath(self, path):
        if '\\' in path:
            path = path.replace('\\', '/')
        return path

    def getFileInformation(self):
        index = self.index
        indexItem = self.model.index(index.row(), 0, index.parent())

        fileName = self.model.fileName(indexItem)
        filePath = self.model.filePath(indexItem)
        fileDir = self.model.isDir(indexItem)
        fileInfo = self.model.fileInfo(indexItem)

        fileName = self.checkPath(fileName)
        filePath = self.checkPath(filePath)

        return (fileName, filePath, fileDir, fileInfo)

    def onClicked(self, index):
        self.index = index  #.... index des FileSystemModels
        indexItem = self.model.index(index.row(), 0, index.parent())

        fileName, filePath, fileDir, fileInfo = self.getFileInformation()
        self.setToolTip(filePath)

        if fileDir:
            self.path = self.checkPath(os.getcwd())
            self.filename = None
        else:
            self.filename = filePath
            self.path = self.checkPath(os.getcwd())

        #print('self.filename: ', self.filename)
        #print('self.path: ', self.path)

    def refresh(self, dir=None):
        if not dir:
            dir = self.checkPath(os.getcwd())
        else:
            dir = dir

        self.model.setRootPath(dir)

        if self.rootIsDecorated:
            self.setRootIsDecorated(False)

        self.clearSelection()

    def onDoubleClicked(self, index):
        self.index = index  #.... wie oben ... def onClicked(...):
        indexItem = self.model.index(index.row(), 0, index.parent())

        fileName, filePath, fileDir, fileInfo = self.getFileInformation()

        if fileDir:
            filePath = self.checkPath(filePath)
            try:
                os.chdir(filePath)
            except Exception as e:
                self.mainWindow.statusBar.showMessage(str(e), 3000)
            self.path = self.checkPath(os.getcwd())

            self.model.setRootPath(filePath)

            if self.rootIsDecorated:
                self.setRootIsDecorated(False)

        else:
            self.filename = filePath

            try:
                with open(self.filename, 'r') as f:
                    self.text = f.read()
            except Exception as e:
                self.mainWindow.statusBar.showMessage(str(e), 3000)

                self.filename = None
                return

            # debug
            if self.textPad:

                if not self.textPad.filename:
                    editor = CodeEditor(self.mainWindow)
                    editor.setText(self.text)
                    editor.filename = filePath
                    self.notebook.newTab(editor)
                    self.textPad = editor

                    x = self.notebook.count()  # number of tabs
                    index = x - 1
                    self.notebook.setCurrentIndex(index)
                    tabName = os.path.basename(editor.filename)

                    self.notebook.setTabText(x, tabName)
                    self.textPad = editor
                    #self.textPad.filename = filePath

                else:
                    editor = CodeEditor(self.mainWindow)
                    editor.setText(self.text)
                    editor.filename = filePath
                    tabName = os.path.basename(editor.filename)
                    self.notebook.newTab(editor)
                    x = self.notebook.count()  # number of tabs
                    index = x - 1
                    self.notebook.setCurrentIndex(index)
                    self.textPad = editor
                    #self.textPad.filename = filePath

            if not self.textPad:
                editor = CodeEditor(self.mainWindow)
                editor.filename = None
                self.notebook.newTab(editor)
                x = self.notebook.count()
                index = x - 1
                self.notebook.setCurrentIndex(index)
                self.textPad = editor
                #self.textPad.filename = filePath

            # make codeView
            codeViewList = self.codeView.makeDictForCodeView(self.text)
            self.codeView.updateCodeView(codeViewList)

            # update textPad Autocomplete
            autocomplete = Qsci.QsciAPIs(self.textPad.lexer)
            self.textPad.autocomplete = autocomplete
            self.textPad.setPythonAutocomplete()

        self.clearSelection()

    def onRootPathChanged(self):
        self.setModel(None)
        self.setModel(self.model)
        self.fsindex = self.model.setRootPath(QDir.currentPath())
        self.setRootIndex(self.fsindex)
        sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding,
                                 QSizePolicy.MinimumExpanding)
        self.setSizePolicy(sizePolicy)
        self.setAutoExpandDelay(2)
        self.setAlternatingRowColors(False)
        self.setAnimated(True)
        self.setIndentation(20)
        self.setSortingEnabled(False)
        self.setRootIsDecorated(False)

        self.setHeaderHidden(True)
        self.hideColumn(1)
        self.hideColumn(2)
        self.hideColumn(3)
        self.setToolTip(QDir.currentPath())
        self.path = os.getcwd()
        self.path = self.checkPath(self.path)