diff --git a/include/ui/files_ui.py b/include/ui/files_ui.py index 04e86b1..a335e8f 100644 --- a/include/ui/files_ui.py +++ b/include/ui/files_ui.py @@ -11,12 +11,21 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_win_files(object): def setupUi(self, win_files): win_files.setObjectName("win_files") - win_files.resize(891, 579) + win_files.resize(725, 592) self.centralwidget = QtWidgets.QWidget(win_files) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") - self.gb_select_local = QtWidgets.QGroupBox(self.centralwidget) + self.splitter = QtWidgets.QSplitter(self.centralwidget) + self.splitter.setOrientation(QtCore.Qt.Horizontal) + self.splitter.setChildrenCollapsible(False) + self.splitter.setObjectName("splitter") + self.gridLayoutWidget = QtWidgets.QWidget(self.splitter) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.vl_local = QtWidgets.QVBoxLayout(self.gridLayoutWidget) + self.vl_local.setContentsMargins(0, 0, 0, 0) + self.vl_local.setObjectName("vl_local") + self.gb_select_local = QtWidgets.QGroupBox(self.gridLayoutWidget) self.gb_select_local.setObjectName("gb_select_local") self.gridLayout_2 = QtWidgets.QGridLayout(self.gb_select_local) self.gridLayout_2.setObjectName("gridLayout_2") @@ -39,15 +48,39 @@ class Ui_win_files(object): self.btn_refresh_local.setObjectName("btn_refresh_local") self.gridLayout_2.addWidget(self.btn_refresh_local, 0, 2, 1, 1) self.lbl_path_local = QtWidgets.QLabel(self.gb_select_local) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_path_local.sizePolicy().hasHeightForWidth()) + self.lbl_path_local.setSizePolicy(sizePolicy) self.lbl_path_local.setObjectName("lbl_path_local") self.gridLayout_2.addWidget(self.lbl_path_local, 1, 0, 1, 3) self.gridLayout_2.setColumnStretch(0, 1) - self.gridLayout.addWidget(self.gb_select_local, 0, 0, 1, 1) - self.gb_select_revpi = QtWidgets.QGroupBox(self.centralwidget) + self.vl_local.addWidget(self.gb_select_local) + self.tree_files_local = QtWidgets.QTreeWidget(self.gridLayoutWidget) + self.tree_files_local.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) + self.tree_files_local.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + self.tree_files_local.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) + self.tree_files_local.setIconSize(QtCore.QSize(24, 24)) + self.tree_files_local.setObjectName("tree_files_local") + self.tree_files_local.headerItem().setText(0, "1") + self.tree_files_local.header().setVisible(False) + self.vl_local.addWidget(self.tree_files_local) + self.gridLayoutWidget_2 = QtWidgets.QWidget(self.splitter) + self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") + self.vl_revpi = QtWidgets.QVBoxLayout(self.gridLayoutWidget_2) + self.vl_revpi.setContentsMargins(0, 0, 0, 0) + self.vl_revpi.setObjectName("vl_revpi") + self.gb_select_revpi = QtWidgets.QGroupBox(self.gridLayoutWidget_2) self.gb_select_revpi.setObjectName("gb_select_revpi") self.gridLayout_3 = QtWidgets.QGridLayout(self.gb_select_revpi) self.gridLayout_3.setObjectName("gridLayout_3") self.lbl_path_revpi = QtWidgets.QLabel(self.gb_select_revpi) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lbl_path_revpi.sizePolicy().hasHeightForWidth()) + self.lbl_path_revpi.setSizePolicy(sizePolicy) self.lbl_path_revpi.setObjectName("lbl_path_revpi") self.gridLayout_3.addWidget(self.lbl_path_revpi, 1, 0, 1, 2) self.lbl_select_revpi = QtWidgets.QLabel(self.gb_select_revpi) @@ -59,49 +92,40 @@ class Ui_win_files(object): self.btn_refresh_revpi.setObjectName("btn_refresh_revpi") self.gridLayout_3.addWidget(self.btn_refresh_revpi, 0, 1, 1, 1) self.gridLayout_3.setColumnStretch(0, 1) - self.gridLayout.addWidget(self.gb_select_revpi, 0, 2, 1, 1) - self.tree_files_local = QtWidgets.QTreeWidget(self.centralwidget) - self.tree_files_local.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) - self.tree_files_local.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) - self.tree_files_local.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) - self.tree_files_local.setIconSize(QtCore.QSize(24, 24)) - self.tree_files_local.setObjectName("tree_files_local") - self.tree_files_local.headerItem().setText(0, "1") - self.tree_files_local.header().setVisible(False) - self.gridLayout.addWidget(self.tree_files_local, 1, 0, 1, 1) - self.verticalLayout_2 = QtWidgets.QVBoxLayout() - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.btn_to_left = QtWidgets.QPushButton(self.centralwidget) - self.btn_to_left.setText("") - icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(":/action/ico/arrow-left.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.btn_to_left.setIcon(icon2) - self.btn_to_left.setIconSize(QtCore.QSize(24, 24)) - self.btn_to_left.setAutoDefault(False) - self.btn_to_left.setObjectName("btn_to_left") - self.verticalLayout_2.addWidget(self.btn_to_left) - self.btn_to_right = QtWidgets.QPushButton(self.centralwidget) + self.vl_revpi.addWidget(self.gb_select_revpi) + self.hl_revpi = QtWidgets.QHBoxLayout() + self.hl_revpi.setObjectName("hl_revpi") + self.btn_to_right = QtWidgets.QPushButton(self.gridLayoutWidget_2) self.btn_to_right.setText("") - icon3 = QtGui.QIcon() - icon3.addPixmap(QtGui.QPixmap(":/action/ico/arrow-right.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.btn_to_right.setIcon(icon3) + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(":/action/ico/arrow-right.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.btn_to_right.setIcon(icon2) self.btn_to_right.setIconSize(QtCore.QSize(24, 24)) self.btn_to_right.setAutoDefault(False) self.btn_to_right.setObjectName("btn_to_right") - self.verticalLayout_2.addWidget(self.btn_to_right) - self.btn_delete = QtWidgets.QPushButton(self.centralwidget) - self.btn_delete.setText("") + self.hl_revpi.addWidget(self.btn_to_right) + self.btn_to_left = QtWidgets.QPushButton(self.gridLayoutWidget_2) + self.btn_to_left.setText("") + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(":/action/ico/arrow-left.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.btn_to_left.setIcon(icon3) + self.btn_to_left.setIconSize(QtCore.QSize(24, 24)) + self.btn_to_left.setAutoDefault(False) + self.btn_to_left.setObjectName("btn_to_left") + self.hl_revpi.addWidget(self.btn_to_left) + self.btn_delete_revpi = QtWidgets.QPushButton(self.gridLayoutWidget_2) + self.btn_delete_revpi.setText("") icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(":/action/ico/edit-delete.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.btn_delete.setIcon(icon4) - self.btn_delete.setIconSize(QtCore.QSize(24, 24)) - self.btn_delete.setAutoDefault(False) - self.btn_delete.setObjectName("btn_delete") - self.verticalLayout_2.addWidget(self.btn_delete) - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem) - self.gridLayout.addLayout(self.verticalLayout_2, 1, 1, 1, 1) - self.tree_files_revpi = QtWidgets.QTreeWidget(self.centralwidget) + self.btn_delete_revpi.setIcon(icon4) + self.btn_delete_revpi.setIconSize(QtCore.QSize(24, 24)) + self.btn_delete_revpi.setAutoDefault(False) + self.btn_delete_revpi.setObjectName("btn_delete_revpi") + self.hl_revpi.addWidget(self.btn_delete_revpi) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.hl_revpi.addItem(spacerItem) + self.vl_revpi.addLayout(self.hl_revpi) + self.tree_files_revpi = QtWidgets.QTreeWidget(self.gridLayoutWidget_2) self.tree_files_revpi.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.tree_files_revpi.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) self.tree_files_revpi.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) @@ -109,10 +133,11 @@ class Ui_win_files(object): self.tree_files_revpi.setObjectName("tree_files_revpi") self.tree_files_revpi.headerItem().setText(0, "1") self.tree_files_revpi.header().setVisible(False) - self.gridLayout.addWidget(self.tree_files_revpi, 1, 2, 1, 1) + self.vl_revpi.addWidget(self.tree_files_revpi) + self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1) self.btn_all = QtWidgets.QPushButton(self.centralwidget) self.btn_all.setObjectName("btn_all") - self.gridLayout.addWidget(self.btn_all, 2, 0, 1, 3) + self.gridLayout.addWidget(self.btn_all, 1, 0, 1, 1) win_files.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(win_files) self.statusbar.setObjectName("statusbar") @@ -128,12 +153,14 @@ class Ui_win_files(object): self.lbl_select_local.setText(_translate("win_files", "Path to development root:")) self.btn_select_local.setToolTip(_translate("win_files", "Open developer root directory")) self.btn_refresh_local.setToolTip(_translate("win_files", "Reload file list")) + self.lbl_path_local.setToolTip(_translate("win_files", "/")) self.lbl_path_local.setText(_translate("win_files", "/")) + self.tree_files_local.setSortingEnabled(True) self.gb_select_revpi.setTitle(_translate("win_files", "Revolution Pi")) + self.lbl_path_revpi.setToolTip(_translate("win_files", "/")) self.lbl_path_revpi.setText(_translate("win_files", "/")) self.lbl_select_revpi.setText(_translate("win_files", "RevPiPyLoad working directory:")) self.btn_refresh_revpi.setToolTip(_translate("win_files", "Reload file list")) - self.tree_files_local.setSortingEnabled(True) self.tree_files_revpi.setSortingEnabled(True) self.btn_all.setText(_translate("win_files", "Stop - Upload - Start")) diff --git a/include/ui_dev/files.ui b/include/ui_dev/files.ui index e48a0be..a0983d1 100644 --- a/include/ui_dev/files.ui +++ b/include/ui_dev/files.ui @@ -6,8 +6,8 @@ 0 0 - 891 - 579 + 725 + 592 @@ -16,243 +16,279 @@ - - - Local computer + + + Qt::Horizontal - - - - - Path to development root: - - - - - - - Open developer root directory - - - - :/action/ico/folder-open.ico:/action/ico/folder-open.ico - - - - 24 - 24 - - - - false - - - - - - - Reload file list - - - - :/action/ico/refresh.ico:/action/ico/refresh.ico - - - - 24 - 24 - - - - - - - - / - - - - - - - - - - Revolution Pi + + false - - - - - / - - - - - - - RevPiPyLoad working directory: - - - - - - - Reload file list - - - - :/action/ico/refresh.ico:/action/ico/refresh.ico - - - - 24 - 24 - - - - - + + + + + + Local computer + + + + + + Path to development root: + + + + + + + Open developer root directory + + + + :/action/ico/folder-open.ico:/action/ico/folder-open.ico + + + + 24 + 24 + + + + false + + + + + + + Reload file list + + + + :/action/ico/refresh.ico:/action/ico/refresh.ico + + + + 24 + 24 + + + + + + + + + 0 + 0 + + + + / + + + / + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::MultiSelection + + + QAbstractItemView::SelectRows + + + + 24 + 24 + + + + true + + + false + + + + 1 + + + + + + + + + + + + Revolution Pi + + + + + + + 0 + 0 + + + + / + + + / + + + + + + + RevPiPyLoad working directory: + + + + + + + Reload file list + + + + :/action/ico/refresh.ico:/action/ico/refresh.ico + + + + 24 + 24 + + + + + + + + + + + + + + + + + :/action/ico/arrow-right.ico:/action/ico/arrow-right.ico + + + + 24 + 24 + + + + false + + + + + + + + + + + :/action/ico/arrow-left.ico:/action/ico/arrow-left.ico + + + + 24 + 24 + + + + false + + + + + + + + + + + :/action/ico/edit-delete.ico:/action/ico/edit-delete.ico + + + + 24 + 24 + + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::MultiSelection + + + QAbstractItemView::SelectRows + + + + 24 + 24 + + + + true + + + false + + + + 1 + + + + + + - - - QAbstractItemView::NoEditTriggers - - - QAbstractItemView::MultiSelection - - - QAbstractItemView::SelectRows - - - - 24 - 24 - - - - true - - - false - - - - 1 - - - - - - - - - - - - - - :/action/ico/arrow-left.ico:/action/ico/arrow-left.ico - - - - 24 - 24 - - - - false - - - - - - - - - - - :/action/ico/arrow-right.ico:/action/ico/arrow-right.ico - - - - 24 - 24 - - - - false - - - - - - - - - - - :/action/ico/edit-delete.ico:/action/ico/edit-delete.ico - - - - 24 - 24 - - - - false - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - QAbstractItemView::NoEditTriggers - - - QAbstractItemView::MultiSelection - - - QAbstractItemView::SelectRows - - - - 24 - 24 - - - - true - - - false - - - - 1 - - - - - Stop - Upload - Start diff --git a/revpicommander/helper.py b/revpicommander/helper.py index b6977bb..de34a75 100644 --- a/revpicommander/helper.py +++ b/revpicommander/helper.py @@ -241,7 +241,7 @@ class ConnectionManager(QtCore.QThread): # Load values and test connection to Revolution Pi try: - pyload_version = list(map(int, sp.version().split("."))) + pyload_version = tuple(map(int, sp.version().split("."))) xml_funcs = sp.system.listMethods() xml_mode = sp.xmlmodus() except Exception as e: diff --git a/revpicommander/revpicommander.py b/revpicommander/revpicommander.py index fa818b2..951c481 100755 --- a/revpicommander/revpicommander.py +++ b/revpicommander/revpicommander.py @@ -281,7 +281,7 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander): return # Check version of RevPiPyLoad, must be greater than 0.5! - if helper.cm.pyload_version[0] == 0 and helper.cm.pyload_version[1] < 6: + if helper.cm.pyload_version < (0, 6, 0): QtWidgets.QMessageBox.critical( self, self.tr("Error"), self.tr( "The Version of RevPiPyLoad on your Revolution Pi ({0}) is to old. " diff --git a/revpicommander/revpifiles.py b/revpicommander/revpifiles.py index a574bef..64ebe49 100644 --- a/revpicommander/revpifiles.py +++ b/revpicommander/revpifiles.py @@ -29,21 +29,33 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files): super(RevPiFiles, self).__init__(parent) self.setupUi(self) + self.dc_settings = {} self.tree_files_counter = 0 self.tree_files_counter_max = 10000 self.lbl_path_local.setText(helper.cm.develop_watch_path or self.tr("Please select...")) + self.lbl_path_local.setToolTip(self.lbl_path_local.text()) self.btn_all.setEnabled(False) self.btn_to_left.setEnabled(False) self.btn_to_right.setEnabled(False) - self.btn_delete.setEnabled(False) + self.btn_delete_revpi.setEnabled(False) if helper.cm.develop_watch_path: - self._load_path_files(True) + self._load_files_local(True) + if helper.cm.connected: + self._load_files_revpi(True) + + self.restoreGeometry(helper.settings.value("files/geo", b'')) + self.splitter.setSizes(list(map(int, helper.settings.value("files/splitter", [0, 0])))) def __del__(self): pi.logger.debug("RevPiFiles.__del__") + def closeEvent(self, a0: QtGui.QCloseEvent) -> None: + pi.logger.debug("RevPiFiles.closeEvent") + helper.settings.setValue("files/geo", self.saveGeometry()) + helper.settings.setValue("files/splitter", self.splitter.sizes()) + def _do_my_job(self, stop_restart=True): """ Upload the selected files and do a optionally restart. @@ -67,7 +79,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files): uploaded = True # Will be False, when opt_program was found in files ec = 0 - for file_name in self.file_list(): + for file_name in self.file_list_local(): # todo: Check exception of local file with open(file_name, "rb") as fh: # Remove base dir of file to set relative for PyLoad @@ -126,16 +138,78 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files): def _set_gui_control_states(self): """Setup states of actions and buttons.""" - state = len(self.tree_files_local.selectedItems()) > 0 - self.btn_all.setEnabled(state) - self.btn_to_left.setEnabled(state) - self.btn_to_right.setEnabled(state) - self.btn_delete.setEnabled(state) + version_okay = helper.cm.pyload_version >= (0, 9, 3) + if not version_okay: + self.btn_to_left.setToolTip(self.tr("The RevPiPyLoad version on the Revolution Pi is to old.")) + self.btn_delete_revpi.setToolTip(self.tr("The RevPiPyLoad version on the Revolution Pi is to old.")) + state_local = len(self.tree_files_local.selectedItems()) > 0 + state_revpi = version_okay and len(self.tree_files_revpi.selectedItems()) > 0 + self.btn_all.setEnabled(state_local) + self.btn_to_left.setEnabled(state_revpi) + self.btn_to_right.setEnabled(state_local) + self.btn_delete_revpi.setEnabled(state_revpi) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # region # REGION: Tree management - def __insert_files(self, base_dir: str, child=None): + @staticmethod + def _parent_selection_state(item: QtWidgets.QTreeWidgetItem): + """Set selected, if all children are selected.""" + if item.parent(): + all_selected = True + for i in range(item.parent().childCount()): + if not item.parent().child(i).isSelected(): + all_selected = False + break + item.parent().setSelected(all_selected) + + def _select_children(self, top_item: QtWidgets.QTreeWidgetItem, value: bool): + """Recursive select children from parent.""" + pi.logger.debug("RevPiFiles._select_children") + + for i in range(top_item.childCount()): + item = top_item.child(i) + if item.type() == NodeType.DIR: + item.setSelected(value) + self._select_children(item, value) + elif item.type() == NodeType.FILE: + item.setSelected(value) + + def __item_selection_changed(self, tree_view: QtWidgets.QTreeView): + """Manager vor item selection of three views.""" + item = tree_view.currentItem() + if item is None: + return + + pi.logger.debug("RevPiFiles.__itemSelectionChanged") + + # Block while preselect other entries + tree_view.blockSignals(True) + + if item.type() == NodeType.DIR: + self._select_children(item, item.isSelected()) + elif item.type() == NodeType.FILE: + self._parent_selection_state(item) + + tree_view.blockSignals(False) + + self._set_gui_control_states() + + @QtCore.pyqtSlot() + def on_tree_files_local_itemSelectionChanged(self): + self.__item_selection_changed(self.tree_files_local) + helper.cm.develop_watch_files = self.file_list_local() + + @QtCore.pyqtSlot() + def on_tree_files_revpi_itemSelectionChanged(self): + self.__item_selection_changed(self.tree_files_revpi) + + # endregion # # # # # + + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + # region # REGION: Local file lists + + def __insert_files_local(self, base_dir: str, child=None): """ Recursively add files to tree view. @@ -156,7 +230,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files): else: self.tree_files_local.addTopLevelItem(item) - self.__insert_files(de.path, item) + self.__insert_files_local(de.path, item) elif de.is_file(follow_symlinks=False): self.tree_files_counter += 1 @@ -174,34 +248,22 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files): self.tree_files_local.addTopLevelItem(item) item.setSelected(de.path in helper.cm.develop_watch_files) - self._parent_selected(item) + self._parent_selection_state(item) - def __select_children(self, top_item: QtWidgets.QTreeWidgetItem, value: bool): - """Recursive select files from directory.""" - pi.logger.debug("RevPiFiles.__select_children") - - for i in range(top_item.childCount()): - item = top_item.child(i) - if item.type() == NodeType.DIR: - self.__select_children(item, value) - elif item.type() == NodeType.FILE: - item.setSelected(value) - - def _load_path_files(self, silent=False): + def _load_files_local(self, silent=False): """ Refresh the file list. :param silent: Do not show message boxes """ - pi.logger.debug("RevPiFiles._load_path_files") + pi.logger.debug("RevPiFiles._load_files_local") self.tree_files_counter = 0 self.tree_files_local.blockSignals(True) self.tree_files_local.clear() - self.tree_files_local.blockSignals(False) - - self.__insert_files(helper.cm.develop_watch_path) + self.__insert_files_local(helper.cm.develop_watch_path) self.tree_files_local.sortItems(0, QtCore.Qt.AscendingOrder) + self.tree_files_local.blockSignals(False) if not silent and self.tree_files_counter > self.tree_files_counter_max: QtWidgets.QMessageBox.critical( @@ -212,49 +274,122 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files): self._set_gui_control_states() - def _parent_selected(self, item: QtWidgets.QTreeWidgetItem): - """Check all children of a parent are selected.""" - if item.parent(): - all_selected = True - for i in range(item.parent().childCount()): - if not item.parent().child(i).isSelected(): - all_selected = False - break - item.parent().setSelected(all_selected) - - def file_list(self): + def file_list_local(self): """Generate a file list with full path of selected entries.""" - pi.logger.debug("RevPiFiles.file_list") + pi.logger.debug("RevPiFiles.file_list_local") lst = [] for item in self.tree_files_local.selectedItems(): if item.type() == NodeType.DIR: + # We just want files continue lst.append(item.data(0, WidgetData.file_name)) return lst - @QtCore.pyqtSlot() - def on_tree_files_local_itemSelectionChanged(self): - item = self.tree_files_local.currentItem() - if item is None: - return + # endregion # # # # # - pi.logger.debug("RevPiFiles.on_tree_files_itemSelectionChanged") + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + # region # REGION: RevPi file lists - # Block while preselect other entries - self.tree_files_local.blockSignals(True) + def _load_files_revpi(self, silent=False): + """ + Refresh the file list of revolution pi. - if item.type() == NodeType.DIR: - self.__select_children(item, item.isSelected()) + :param silent: Do not show message boxes + """ + pi.logger.debug("RevPiFiles._load_files_revpi") - elif item.type() == NodeType.FILE: - self._parent_selected(item) + self.tree_files_revpi.blockSignals(True) + self.tree_files_revpi.clear() + self.tree_files_revpi.blockSignals(False) - self.tree_files_local.blockSignals(False) + if not helper.cm.connected: + lst_revpi = None + else: + lst_revpi = helper.cm.call_remote_function("get_filelist") + # Just load settings once + if not self.dc_settings: + self.dc_settings = helper.cm.call_remote_function("get_config", default_value={}) + self.lbl_path_revpi.setText( + self.dc_settings.get("plcworkdir", self.tr("Could not load path of working dir")) + ) + self.lbl_path_revpi.setToolTip(self.lbl_path_revpi.text()) + + if lst_revpi: + lst_revpi.sort() + + for path_file in lst_revpi: + lst_path_file = path_file.split("/") + dir_node = None # type: QtWidgets.QTreeWidgetItem + + for folder in lst_path_file[:-1]: + new_dir_node = QtWidgets.QTreeWidgetItem(NodeType.DIR) + new_dir_node.setText(0, folder) + new_dir_node.setIcon(0, QtGui.QIcon(":/main/ico/folder.ico")) + + if dir_node: + # Subfolder of top level + for i in range(dir_node.childCount()): + item = dir_node.child(i) + if item.type() != NodeType.DIR: + continue + if item.text(0) == new_dir_node.text(0): + dir_node = item + new_dir_node = None + break + if new_dir_node: + dir_node.addChild(new_dir_node) + dir_node = new_dir_node + else: + # Search in top level + for i in range(self.tree_files_revpi.topLevelItemCount()): + item = self.tree_files_revpi.topLevelItem(i) + if item.type() != NodeType.DIR: + continue + if item.text(0) == new_dir_node.text(0): + dir_node = item + new_dir_node = None + break + if new_dir_node: + self.tree_files_revpi.addTopLevelItem(new_dir_node) + dir_node = new_dir_node + + # This is the file name + object_name = lst_path_file[-1] + item = QtWidgets.QTreeWidgetItem(NodeType.FILE) + item.setText(0, object_name) + item.setData(0, WidgetData.file_name, path_file) + item.setIcon(0, QtGui.QIcon( + ":/file/ico/file-else.ico" if object_name.find(".py") == -1 else + ":/file/ico/file-python.ico" + )) + if dir_node: + dir_node.addChild(item) + else: + self.tree_files_revpi.addTopLevelItem(item) + + self.tree_files_revpi.sortItems(0, QtCore.Qt.AscendingOrder) + + elif not silent: + QtWidgets.QMessageBox.critical( + self, self.tr("Error"), self.tr( + "Can not load file list from Revolution Pi." + ) + ) self._set_gui_control_states() - helper.cm.develop_watch_files = self.file_list() + def file_list_revpi(self): + """Generate a file list with full path of selected entries.""" + pi.logger.debug("RevPiFiles.file_list_revpi") + lst = [] + for item in self.tree_files_revpi.selectedItems(): + if item.type() == NodeType.DIR: + # We just want files + continue + lst.append(item.data(0, WidgetData.file_name)) + + return lst # endregion # # # # # @@ -262,6 +397,7 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files): def on_btn_all_pressed(self): pi.logger.debug("RevPiDevelop.on_btn_all_pressed") self._do_my_job(True) + self.file_list_revpi() @QtCore.pyqtSlot() def on_btn_select_local_pressed(self): @@ -288,12 +424,25 @@ class RevPiFiles(QtWidgets.QMainWindow, Ui_win_files): return self.lbl_path_local.setText(selected_dir) + self.lbl_path_local.setToolTip(self.lbl_path_local.text()) helper.cm.develop_watch_path = selected_dir helper.cm.develop_watch_files = [] - self._load_path_files(False) + self._load_files_local(False) @QtCore.pyqtSlot() def on_btn_refresh_local_pressed(self): pi.logger.debug("RevPiDevelop.on_btn_refresh_pressed") - self._load_path_files(False) \ No newline at end of file + self._load_files_local(False) + + @QtCore.pyqtSlot() + def on_btn_refresh_revpi_pressed(self): + pi.logger.debug("RevPiDevelop.on_btn_refresh_revpi_pressed") + self._load_files_revpi(False) + + @QtCore.pyqtSlot() + def on_btn_to_right_pressed(self): + """Upload selected files to revolution pi.""" + pi.logger.debug("RevPiDevelop.on_btn_to_right_pressed") + self._do_my_job(False) + self.file_list_revpi()