qtvcp -fileManager: add delete jump button, load button

Authur: Jim 'Persei'
Having to delete 'jump to' file paths from the preference file was
annoying. add a button to do it. add a loadfile button and expose
the copy file features with a checkbox
This commit is contained in:
CMorley 2022-09-02 11:41:10 -07:00
parent dbaa1cec11
commit 0f8e0abad3
2 changed files with 115 additions and 65 deletions

View file

@ -82,3 +82,9 @@ class Access(cp):
self.add_section(section) self.add_section(section)
self.set(section, option, type(value)) self.set(section, option, type(value))
self.write(open(self.fn, "w")) self.write(open(self.fn, "w"))
def removepref(self, option, section):
try:
self.remove_option(section, option)
except configparser.NoSectionError:
print('Section {} does not exist'.format(section))

View file

@ -5,11 +5,9 @@ import os
import shutil import shutil
from collections import OrderedDict from collections import OrderedDict
from PyQt5.QtWidgets import (QApplication, QFileSystemModel, from PyQt5.QtWidgets import (QApplication, QFileSystemModel, QWidget, QVBoxLayout, QHBoxLayout,
QWidget, QVBoxLayout, QHBoxLayout, QListView, QListView, QComboBox, QPushButton, QToolButton, QSizePolicy,
QComboBox, QToolButton, QSizePolicy, QMenu, QAction, QLineEdit, QCheckBox, QTableView, QHeaderView)
QMenu, QAction, QLineEdit, QFrame,
QTableView, QHeaderView)
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from PyQt5.QtCore import (QModelIndex, QDir, Qt, pyqtSlot, from PyQt5.QtCore import (QModelIndex, QDir, Qt, pyqtSlot,
QItemSelectionModel, QItemSelection) QItemSelectionModel, QItemSelection)
@ -53,39 +51,50 @@ class FileManager(QWidget, _HalWidgetBase):
self._jumpList = OrderedDict(temp) self._jumpList = OrderedDict(temp)
self.currentPath = None self.currentPath = None
self.currentFolder = None self.currentFolder = None
self.jump_delete = []
self.PREFS_ = None self.PREFS_ = None
self.initUI() self.initUI()
def initUI(self): def initUI(self):
self.setWindowTitle(self.title) self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height) self.setGeometry(self.left, self.top, self.width, self.height)
pasteBox = QHBoxLayout() line_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
button_policy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
box_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
self.textLine = QLineEdit() self.textLine = QLineEdit()
self.textLine.setToolTip('Current Director/selected File') self.textLine.setToolTip('Current Director/selected File')
self.pasteButton = QToolButton() self.textLine.setSizePolicy(line_policy)
self.textLine.setMinimumHeight(40)
self.pasteButton = QPushButton()
self.pasteButton.setSizePolicy(button_policy)
self.pasteButton.setMinimumSize(80, 40)
self.pasteButton.setEnabled(False) self.pasteButton.setEnabled(False)
self.pasteButton.setText('Paste') self.pasteButton.setText('Paste')
self.pasteButton.setToolTip('Copy file from copy path to current directory/file') self.pasteButton.setToolTip('Copy file from copy path to current directory/file')
self.pasteButton.clicked.connect(self.paste) self.pasteButton.clicked.connect(self.paste)
self.pasteButton.hide() self.pasteButton.hide()
pasteBox = QHBoxLayout()
pasteBox.addWidget(self.textLine) pasteBox.addWidget(self.textLine)
pasteBox.addWidget(self.pasteButton) pasteBox.addWidget(self.pasteButton)
self.copyBox = QFrame()
hbox = QHBoxLayout()
hbox.setContentsMargins(0,0,0,0)
self.copyLine = QLineEdit() self.copyLine = QLineEdit()
self.copyLine.setSizePolicy(line_policy)
self.copyLine.setToolTip('File path to copy from, when pasting') self.copyLine.setToolTip('File path to copy from, when pasting')
self.copyButton = QToolButton() self.copyLine.setMinimumHeight(40)
self.copyLine.setReadOnly(True)
self.copyButton = QPushButton()
self.copyButton.setSizePolicy(button_policy)
self.copyButton.setMinimumSize(80, 40)
self.copyButton.setText('Copy') self.copyButton.setText('Copy')
self.copyButton.setToolTip('Record current file as copy path') self.copyButton.setToolTip('Record current file as copy path')
self.copyButton.clicked.connect(self.recordCopyPath) self.copyButton.clicked.connect(self.recordCopyPath)
hbox.addWidget(self.copyButton) self.copyBox = QHBoxLayout()
hbox.addWidget(self.copyLine) self.copyBox.addWidget(self.copyButton)
self.copyBox.setLayout(hbox) self.copyBox.addWidget(self.copyLine)
self.copyBox.hide() self.copyLine.hide()
self.copyButton.hide()
self.model = QFileSystemModel() self.model = QFileSystemModel()
self.model.setRootPath(QDir.currentPath()) self.model.setRootPath(QDir.currentPath())
@ -122,35 +131,58 @@ class FileManager(QWidget, _HalWidgetBase):
self.cb = QComboBox() self.cb = QComboBox()
self.cb.currentIndexChanged.connect(self.filterChanged) self.cb.currentIndexChanged.connect(self.filterChanged)
self.fillCombobox(INFO.PROGRAM_FILTERS_EXTENSIONS) self.fillCombobox(INFO.PROGRAM_FILTERS_EXTENSIONS)
self.cb.setMinimumSize(200,30) self.cb.setMinimumSize(200,40)
self.cb.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.cb.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
self.button2 = QToolButton() self.jumpButton = QToolButton()
self.button2.setText('User') self.jumpButton.setText('User')
self.button2.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.jumpButton.setSizePolicy(button_policy)
self.button2.setMinimumSize(60, 30) self.jumpButton.setMinimumSize(80, 40)
self.button2.setToolTip('Jump to User directory.\nLong press for Options.') self.jumpButton.setToolTip('Jump to User directory.\nLong press for Options.')
self.button2.clicked.connect(self.onJumpClicked) self.jumpButton.clicked.connect(self.onJumpClicked)
self.button3 = QToolButton() self.addButton = QPushButton()
self.button3.setText('Add Jump') self.addButton.setText('Add Jump')
self.button3.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.addButton.setSizePolicy(button_policy)
self.button3.setMinimumSize(60, 30) self.addButton.setMinimumSize(80, 40)
self.button3.setToolTip('Add current directory to jump button list') self.addButton.setToolTip('Add current directory to jump button list')
self.button3.clicked.connect(self.onActionClicked) self.addButton.clicked.connect(self.onActionClicked)
self.delButton = QPushButton()
self.delButton.setText('Del Jump')
self.delButton.setSizePolicy(button_policy)
self.delButton.setMinimumSize(80, 40)
self.delButton.setToolTip('Delete current directory from jump button list')
self.delButton.clicked.connect(self.onActionClicked)
self.loadButton = QPushButton()
self.loadButton.setText('Load')
self.loadButton.setSizePolicy(button_policy)
self.loadButton.setMinimumSize(80, 40)
self.loadButton.setToolTip('Load selected file')
self.loadButton.clicked.connect(self._getPathActivated)
self.copy_control = QCheckBox()
self.copy_control.setText('Show Copy Controls')
self.copy_control.setSizePolicy(box_policy)
self.copy_control.setMinimumSize(80, 40)
self.copy_control.stateChanged.connect(lambda state: self.showCopyControls(state))
self.settingMenu = QMenu(self) self.settingMenu = QMenu(self)
self.button2.setMenu(self.settingMenu) self.jumpButton.setMenu(self.settingMenu)
hbox = QHBoxLayout() hbox = QHBoxLayout()
hbox.addWidget(self.button2) hbox.addWidget(self.jumpButton)
hbox.addWidget(self.button3) hbox.addWidget(self.addButton)
hbox.insertStretch (2, stretch = 0) hbox.addWidget(self.delButton)
hbox.addWidget(self.loadButton)
hbox.addWidget(self.copy_control)
hbox.insertStretch (4, stretch = 0)
hbox.addWidget(self.cb) hbox.addWidget(self.cb)
windowLayout = QVBoxLayout() windowLayout = QVBoxLayout()
windowLayout.addLayout(pasteBox) windowLayout.addLayout(pasteBox)
windowLayout.addWidget(self.copyBox) windowLayout.addLayout(self.copyBox)
windowLayout.addWidget(self.list) windowLayout.addWidget(self.list)
windowLayout.addWidget(self.table) windowLayout.addWidget(self.table)
windowLayout.addLayout(hbox) windowLayout.addLayout(hbox)
@ -166,7 +198,6 @@ class FileManager(QWidget, _HalWidgetBase):
else: else:
self.updateDirectoryView(self.user_path) self.updateDirectoryView(self.user_path)
# get all the saved jumplist paths # get all the saved jumplist paths
temp = self.PREFS_.getall('FILEMANAGER_JUMPLIST') temp = self.PREFS_.getall('FILEMANAGER_JUMPLIST')
self._jumpList.update(temp) self._jumpList.update(temp)
@ -191,6 +222,8 @@ class FileManager(QWidget, _HalWidgetBase):
# record jump list paths # record jump list paths
def _hal_cleanup(self): def _hal_cleanup(self):
if self.PREFS_: if self.PREFS_:
for opt in self.jump_delete:
self.PREFS_.removepref(opt, 'FILEMANAGER_JUMPLIST')
for i, key in enumerate(self._jumpList): for i, key in enumerate(self._jumpList):
if i in(0,1): if i in(0,1):
continue continue
@ -250,45 +283,55 @@ class FileManager(QWidget, _HalWidgetBase):
# jump directly to a saved path shown on the button # jump directly to a saved path shown on the button
def onJumpClicked(self): def onJumpClicked(self):
data = self.button2.text() data = self.jumpButton.text()
if data.upper() == 'MEDIA': if data.upper() == 'MEDIA':
self.showMediaDir() self.showMediaDir()
elif data.upper() == 'USER': elif data.upper() == 'USER':
self.showUserDir() self.showUserDir()
else: elif data in self._jumpList:
temp = self._jumpList.get(data) temp = self._jumpList[data]
if temp is not None: if temp is not None:
self.updateDirectoryView(temp) self.updateDirectoryView(temp)
else: else:
STATUS.emit('error', OPERATOR_ERROR, 'file jumopath: {} not valid'.format(data)) STATUS.emit('error', linuxcnc.OPERATOR_ERROR, 'file jumppath: {} not valid'.format(data))
LOG.debug('file jumopath: {} not valid'.format(data)) log.debug('file jumopath: {} not valid'.format(data))
else:
self.jumpButton.setText('User')
# jump directly to a saved path from the menu # jump directly to a saved path from the menu
def jumpTriggered(self, data): def jumpTriggered(self, data):
name = data
self.jumpButton.setText(name)
if data.upper() == 'MEDIA': if data.upper() == 'MEDIA':
self.button2.setText('{}'.format(data)) self.jumpButton.setToolTip('Jump to Media directory.\nLong press for Options.')
self.button2.setToolTip('Jump to Media directory.\nLong press for Options.')
self.showMediaDir() self.showMediaDir()
elif data.upper() == 'USER': elif data.upper() == 'USER':
self.button2.setText('{}'.format(data)) self.jumpButton.setToolTip('Jump to User directory.\nLong press for Options.')
self.button2.setToolTip('Jump to User directory.\nLong press for Options.')
self.showUserDir() self.showUserDir()
else: else:
self.button2.setText('{}'.format(data)) self.jumpButton.setToolTip('Jump to directory:\n{}'.format(self._jumpList.get(name)))
self.button2.setToolTip('Jump to directory:\n{}'.format(self._jumpList.get(data))) self.updateDirectoryView(self._jumpList.get(name))
self.updateDirectoryView(self._jumpList.get(data))
# add a jump list path # add or remove a jump list path
def onActionClicked(self): def onActionClicked(self):
i = self.currentFolder name = os.path.basename(self.currentFolder)
try: btn = self.sender()
self._jumpList[i] = i if btn == self.addButton:
except Exception as e: try:
print(e) self._jumpList[name] = self.currentFolder
button = QAction(QIcon.fromTheme('user-home'), i, self) self.addAction(name)
# weird lambda i=i to work around 'function closure' except Exception as e:
button.triggered.connect(lambda state, i=i: self.jumpTriggered(i)) print(e)
self.settingMenu.addAction(button) elif btn == self.delButton:
try:
self.jump_delete.append(name)
self._jumpList.pop(name)
self.settingMenu.clear()
for key in self._jumpList:
self.addAction(key)
self.jumpButton.setText('User')
except Exception as e:
print(e)
# get current selection and update the path # get current selection and update the path
# then if the path is good load it into linuxcnc # then if the path is good load it into linuxcnc
@ -301,7 +344,7 @@ class FileManager(QWidget, _HalWidgetBase):
self.listClicked(row) self.listClicked(row)
fname = self.currentPath fname = self.currentPath
if fname is None: if fname is None:
return return
if fname: if fname:
self.load(fname) self.load(fname)
@ -327,10 +370,10 @@ class FileManager(QWidget, _HalWidgetBase):
######################## ########################
def addAction(self, i): def addAction(self, i):
axisButton = QAction(QIcon.fromTheme('user-home'), i, self) action = QAction(QIcon.fromTheme('user-home'), i, self)
# weird lambda i=i to work around 'function closure' # weird lambda i=i to work around 'function closure'
axisButton.triggered.connect(lambda state, i=i: self.jumpTriggered(i)) action.triggered.connect(lambda state, i=i: self.jumpTriggered(i))
self.settingMenu.addAction(axisButton) self.settingMenu.addAction(action)
def showList(self, state=True): def showList(self, state=True):
if state: if state:
@ -345,10 +388,12 @@ class FileManager(QWidget, _HalWidgetBase):
def showCopyControls(self, state): def showCopyControls(self, state):
if state: if state:
self.copyBox.show() self.copyLine.show()
self.copyButton.show()
self.pasteButton.show() self.pasteButton.show()
else: else:
self.copyBox.hide() self.copyLine.hide()
self.copyButton.hide()
self.pasteButton.hide() self.pasteButton.hide()
def showMediaDir(self, quiet = False): def showMediaDir(self, quiet = False):
@ -447,7 +492,7 @@ class FileManager(QWidget, _HalWidgetBase):
# This can be class patched to do something else # This can be class patched to do something else
def recordBookKeeping(self): def recordBookKeeping(self):
fname = self.currentPath fname = self.currentPath
if fname is None: if fname is None:
return return
if self.PREFS_: if self.PREFS_:
self.PREFS_.putpref('last_loaded_directory', self.model.rootPath(), str, 'BOOK_KEEPING') self.PREFS_.putpref('last_loaded_directory', self.model.rootPath(), str, 'BOOK_KEEPING')
@ -457,6 +502,5 @@ if __name__ == "__main__":
import sys import sys
app = QApplication(sys.argv) app = QApplication(sys.argv)
gui = FileManager() gui = FileManager()
gui.showCopyControls(True)
gui.show() gui.show()
sys.exit(app.exec_()) sys.exit(app.exec_())