WIP: revpifiles.py has all functions for PyLoad 0.9.2

File download and delete functions are missing
This commit is contained in:
2020-09-24 17:06:11 +02:00
parent bf0df462fe
commit 9dda109325
5 changed files with 547 additions and 335 deletions

View File

@@ -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"))

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>891</width>
<height>579</height>
<width>725</width>
<height>592</height>
</rect>
</property>
<property name="windowTitle">
@@ -16,6 +16,16 @@
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="childrenCollapsible">
<bool>false</bool>
</property>
<widget class="QWidget" name="gridLayoutWidget">
<layout class="QVBoxLayout" name="vl_local">
<item>
<widget class="QGroupBox" name="gb_select_local">
<property name="title">
<string>Local computer</string>
@@ -67,6 +77,15 @@
</item>
<item row="1" column="0" colspan="3">
<widget class="QLabel" name="lbl_path_local">
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>/</string>
</property>
<property name="text">
<string>/</string>
</property>
@@ -75,7 +94,41 @@
</layout>
</widget>
</item>
<item row="0" column="2">
<item>
<widget class="QTreeWidget" name="tree_files_local">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="gridLayoutWidget_2">
<layout class="QVBoxLayout" name="vl_revpi">
<item>
<widget class="QGroupBox" name="gb_select_revpi">
<property name="title">
<string>Revolution Pi</string>
@@ -83,6 +136,15 @@
<layout class="QGridLayout" name="gridLayout_3" columnstretch="1,0">
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="lbl_path_revpi">
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>/</string>
</property>
<property name="text">
<string>/</string>
</property>
@@ -115,58 +177,8 @@
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QTreeWidget" name="tree_files_local">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
<item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPushButton" name="btn_to_left">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="ressources.qrc">
<normaloff>:/action/ico/arrow-left.ico</normaloff>:/action/ico/arrow-left.ico</iconset>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<layout class="QHBoxLayout" name="hl_revpi">
<item>
<widget class="QPushButton" name="btn_to_right">
<property name="text">
@@ -188,7 +200,27 @@
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_delete">
<widget class="QPushButton" name="btn_to_left">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="ressources.qrc">
<normaloff>:/action/ico/arrow-left.ico</normaloff>:/action/ico/arrow-left.ico</iconset>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_delete_revpi">
<property name="text">
<string/>
</property>
@@ -208,21 +240,21 @@
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="2">
<item>
<widget class="QTreeWidget" name="tree_files_revpi">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
@@ -252,7 +284,11 @@
</column>
</widget>
</item>
<item row="2" column="0" colspan="3">
</layout>
</widget>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="btn_all">
<property name="text">
<string>Stop - Upload - Start</string>

View File

@@ -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:

View File

@@ -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. "

View File

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