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()