make actions more flexible

This commit is contained in:
Jan Grewe 2025-01-23 10:40:32 +01:00
parent da06011b44
commit 71116f0599
5 changed files with 129 additions and 74 deletions

View File

@ -14,19 +14,19 @@ import fixtracks.resources
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
def __init__(self, darkmode): def __init__(self, darkmode):
super().__init__() super().__init__()
self.create_actions() self._iconsuffix = "_dark" if darkmode else "_light"
self._top_toolbar = None self._top_toolbar = None
self._side_toolbar = None self._side_toolbar = None
cw = CentralWidget() self._cw = CentralWidget(darkmode)
self.setCentralWidget(cw) self.setCentralWidget(self._cw)
self._iconsuffix = "_dark" if darkmode else "_light" self.create_actions()
# cw.exit_signal.connect(self.exit_request) # cw.exit_signal.connect(self.exit_request)
def create_actions(self): def create_actions(self):
self._file_open_action = QAction(QIcon(":/icons/open" + self._iconsuffix), "Open", self) # self._file_open_action = QAction(QIcon(":/icons/open" + self._iconsuffix), "Open", self)
self._file_open_action.setStatusTip("Open nix file") # self._file_open_action.setStatusTip("Open nix file")
self._file_open_action.setShortcut(QKeySequence("Ctrl+o")) # self._file_open_action.setShortcut(QKeySequence("Ctrl+o"))
self._file_open_action.triggered.connect(self.on_file_open) # self._file_open_action.triggered.connect(self.on_file_open)
# self._file_close_action = QAction(QIcon(":/icons/file_close"), "Close", self) # self._file_close_action = QAction(QIcon(":/icons/file_close"), "Close", self)
# self._file_close_action.setStatusTip("Close current nix file") # self._file_close_action.setStatusTip("Close current nix file")
@ -71,47 +71,60 @@ class MainWindow(QMainWindow):
self.create_menu() self.create_menu()
def create_menu(self): def create_menu(self):
menu = self.menuBar() menu_bar = self.menuBar()
file_menu = menu.addMenu("&File") file_menu = menu_bar.addMenu("&File")
file_menu.addAction(self._file_open_action)
# file_menu.addAction(self._file_close_action) # file_menu.addAction(self._file_close_action)
file_menu.addSeparator() file_menu.addSeparator()
file_menu.addAction(self._quit_action) file_menu.addAction(self._quit_action)
plot_menu = menu.addMenu("&Plot") tools_menu = menu_bar.addMenu("&Tools")
# plot_menu.addAction(self._plot_action) tools_menu.addAction(self._mergeview_action)
plot_menu.addAction(self._mergeview_action)
help_menu = menu.addMenu("&Help") help_menu = menu_bar.addMenu("&Help")
help_menu.addAction(self._about_action) help_menu.addAction(self._about_action)
help_menu.addAction(self._help_action) help_menu.addAction(self._help_action)
self.setMenuBar(menu)
menus = {"File": file_menu, "Tools": tools_menu}
for k in self._cw.menuActions:
actions = self._cw.menuActions[k]
if k in menus:
menu = menus[k]
else:
menu = menu_bar.addMenu(k)
for a in actions:
menu.addAction(a)
self.setMenuBar(menu_bar)
def create_toolbar(self): def create_toolbar(self):
self._toolbar = QToolBar("My main toolbar") self._top_toolbar = QToolBar("My main toolbar")
self._top_toolbar.setAllowedAreas(Qt.ToolBarArea.TopToolBarArea)
self._top_toolbar.setFloatable(False)
self._top_toolbar.setIconSize(QSize(32, 32))
self._side_toolbar = QToolBar("Tools toolbar")
self._side_toolbar.setAllowedAreas(Qt.ToolBarArea.LeftToolBarArea)
self._top_toolbar.setIconSize(QSize(48, 48))
#self._toolbar.setStyleSheet("QToolButton:!hover {background-color:none}") #self._toolbar.setStyleSheet("QToolButton:!hover {background-color:none}")
self._toolbar.setAllowedAreas(Qt.ToolBarArea.LeftToolBarArea | Qt.ToolBarArea.TopToolBarArea)
self._toolbar.setFloatable(False)
self._toolbar.setIconSize(QSize(32, 32))
self._toolbar.addAction(self._file_open_action) # self._top_toolbar.addAction(self._file_open_action)
# self._toolbar.addAction(self._file_close_action) # self._toolbar.addAction(self._file_close_action)
self._toolbar.addSeparator() self._top_toolbar.addSeparator()
self._top_toolbar.addAction(self._mergeview_action)
# self._toolbar.addAction(self._plot_action) # self._toolbar.addAction(self._plot_action)
# self._toolbar.addAction(self._table_action) # self._toolbar.addAction(self._table_action)
self._toolbar.addAction(self._help_action)
for a in self._cw.toolbarActions:
self._side_toolbar.addAction(a)
self._side_toolbar.addAction(self._help_action)
empty = QWidget() empty = QWidget()
empty.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) empty.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self._toolbar.addWidget(empty) self._side_toolbar.addWidget(empty)
self._toolbar.addSeparator() self._side_toolbar.addSeparator()
self._toolbar.addAction(self._quit_action) self._side_toolbar.addAction(self._quit_action)
# settings = QSettings(info.ORGANIZATION, info.NAME) self.addToolBar(Qt.LeftToolBarArea, self._side_toolbar)
# tb_orientation = settings.value("app/toolbar_area", "left") # self.addToolBar(Qt.TopToolBarArea, self._top_toolbar)
self.addToolBar(Qt.LeftToolBarArea if tb_orientation == "left" else Qt.TopToolBarArea, self._toolbar)
# self._toolbar.topLevelChanged.connect(self.tb_changed)
# del settings
def on_file_open(self, s): def on_file_open(self, s):
QFileDialog.getExistingDirectory() QFileDialog.getExistingDirectory()

View File

@ -22,7 +22,7 @@
<file alias="index">docs/index.md</file> <file alias="index">docs/index.md</file>
<file alias="merge">docs/merge.md</file> <file alias="merge">docs/merge.md</file>
<file alias="tracks">docs/tracks.md</file> <file alias="tracks">docs/tracks.md</file>
<file alias="convert">docs/concert.md</file> <file alias="convert">docs/convert.md</file>
<file alias="license">docs/license.md</file> <file alias="license">docs/license.md</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -9,11 +9,11 @@ from fixtracks.widgets.converter import Json2PandasConverter
class CentralWidget(QWidget): class CentralWidget(QWidget):
def __init__(self, parent=None): def __init__(self, darkmode, parent=None):
super().__init__(parent) super().__init__(parent)
self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self._tw = TasksWidget() self._tw = TasksWidget(darkmode)
self._tw.clicked.connect(self._select_task) self._tw.clicked.connect(self._select_task)
self._mergewidget = MergeDetections(self) self._mergewidget = MergeDetections(self)
@ -49,6 +49,14 @@ class CentralWidget(QWidget):
def _on_back(self): def _on_back(self):
self.layout().setCurrentIndex(self._tasksindex) self.layout().setCurrentIndex(self._tasksindex)
@property
def toolbarActions(self):
return self._tw.toolbarActions
@property
def menuActions(self):
return self._tw.menuActions
# # @Slot(None) # # @Slot(None)
# def on_exit(self): # def on_exit(self):
# self.exit_signal.emit() # self.exit_signal.emit()

View File

@ -9,53 +9,87 @@ from PySide6.QtGui import QIcon, QAction, QPixmap
class TasksWidget(QWidget): class TasksWidget(QWidget):
clicked = Signal((str,)) clicked = Signal((str,))
def __init__(self, parent = None): def __init__(self, darkmode, parent = None):
super().__init__(parent) super().__init__(parent)
self._iconsuffix = "_dark" if darkmode else "_light"
self._toolbarActions = {}
self._menuActions = {}
self._file_list = []
self.createActions()
self.createLayout()
def createActions(self):
self._openAction = QAction(QIcon(":icons/open" + self._iconsuffix), "Open folder")
self._openAction.triggered.connect(self._on_open)
self._openAction.setEnabled(True)
self._convertAction = QAction(QIcon(":/icons/convert" + self._iconsuffix), "Convert")
self._convertAction.setToolTip("Convert JSON pose files to to Pandas data frames")
self._openAction.triggered.connect(self._convert_clicked)
self._mergeAction = QAction(QIcon(":/icons/merge" + self._iconsuffix), "Merge")
self._mergeAction.setToolTip("Merge detections from two cameras to the same dataset")
self._mergeAction.triggered.connect(self._merge_clicked)
self._tracksAction = QAction(QIcon(":/icons/tracks" + self._iconsuffix), "Tracks")
self._tracksAction.setToolTip("Merge detections from two cameras to the same dataset")
self._tracksAction.triggered.connect(self._tracks_clicked)
self._menuActions["File"] = [self._openAction]
self._menuActions["Tools"] = [self._convertAction, self._mergeAction, self._tracksAction]
self._toolbarActions = [self._convertAction, self._mergeAction, self._tracksAction]
def createLayout(self):
def buttonfromaction(action: QAction):
btn = QPushButton(action.icon(), "")
btn.setStatusTip(action.toolTip())
btn.setToolTip(action.text())
btn.clicked.connect(action.trigger)
return btn
openBtn = buttonfromaction(self._openAction)
openBtn.setEnabled(True)
openBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
openBtn.setMaximumSize(300, 300)
openBtn.setIconSize(0.95 * openBtn.size())
folderBtn = QPushButton() convertBtn = buttonfromaction(self._convertAction)
folderBtn.setEnabled(True) convertBtn.setEnabled(True)
folderBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) convertBtn.setFixedSize(250, 100)
folderBtn.setMaximumSize(300, 300) convertBtn.setIconSize(0.95 * convertBtn.size())
folderBtn.setIcon(QIcon(":icons/open"))
folderBtn.setIconSize(0.95 * folderBtn.size()) mergeBtn = buttonfromaction(self._mergeAction)
folderBtn.clicked.connect(self._open_folder) mergeBtn.setEnabled(False)
mergeBtn.setFixedSize(250, 100)
self.convertBtn = QPushButton() mergeBtn.setIconSize(0.95 * mergeBtn.size())
self.convertBtn.setIcon(QIcon(":/icons/convert"))
self.convertBtn.setToolTip("Convert JSON pose files to to Pandas data frames") tracksBtn = buttonfromaction(self._tracksAction)
self.convertBtn.setEnabled(True) tracksBtn.setEnabled(False)
self.convertBtn.setFixedSize(250, 100) tracksBtn.setFixedSize(250, 100)
self.convertBtn.setIconSize(0.95 * self.convertBtn.size()) tracksBtn.setIconSize(0.95 * tracksBtn.size())
self.convertBtn.clicked.connect(self._convert_clicked)
# self.convertBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self.mergeBtn = QPushButton(QIcon(":/icons/merge"), "")
self.mergeBtn.setEnabled(False)
self.mergeBtn.setFixedSize(250, 100)
self.mergeBtn.setIconSize(0.95 * self.mergeBtn.size())
self.mergeBtn.clicked.connect(self._merge_clicked)
# self.mergeBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self.tracksBtn = QPushButton(QIcon(":/icons/tracks"), "")
self.tracksBtn.setEnabled(False)
self.tracksBtn.setFixedSize(250, 100)
self.tracksBtn.setIconSize(0.95 * self.tracksBtn.size())
self.tracksBtn.clicked.connect(self._tracks_clicked)
# self.tracksBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
l = QGridLayout() l = QGridLayout()
l.setAlignment(Qt.AlignmentFlag.AlignCenter) l.setAlignment(Qt.AlignmentFlag.AlignCenter)
l.addWidget(folderBtn, 0, 0, 3, 1, Qt.AlignmentFlag.AlignCenter) l.addWidget(openBtn, 0, 0, 3, 1, Qt.AlignmentFlag.AlignCenter)
l.addWidget(self.convertBtn, 0, 1, 1, 1, Qt.AlignmentFlag.AlignCenter) l.addWidget(convertBtn, 0, 1, 1, 1, Qt.AlignmentFlag.AlignCenter)
l.addWidget(self.mergeBtn, 1, 1, 1, 1, Qt.AlignmentFlag.AlignCenter) l.addWidget(mergeBtn, 1, 1, 1, 1, Qt.AlignmentFlag.AlignCenter)
l.addWidget(self.tracksBtn, 2, 1, 1, 1, Qt.AlignmentFlag.AlignCenter) l.addWidget(tracksBtn, 2, 1, 1, 1, Qt.AlignmentFlag.AlignCenter)
# l.addWidget(folderBtn) # l.addWidget(folderBtn)
# l.addWidget(self.convertBtn) # l.addWidget(self.convertBtn)
# l.addWidget(self.mergeBtn) # l.addWidget(self.mergeBtn)
# l.addWidget(self.tracksBtn) # l.addWidget(self.tracksBtn)
self.setLayout(l) self.setLayout(l)
self._file_list = []
@property
def toolbarActions(self):
return self._toolbarActions
@property
def menuActions(self):
return self._menuActions
def _merge_clicked(self): def _merge_clicked(self):
self.clicked.emit("Merge") self.clicked.emit("Merge")
@ -66,7 +100,7 @@ class TasksWidget(QWidget):
def _convert_clicked(self): def _convert_clicked(self):
self.clicked.emit("Convert") self.clicked.emit("Convert")
def _open_folder(self): def _on_open(self):
logging.debug("TasksWidget:select data folder") logging.debug("TasksWidget:select data folder")
folder = QFileDialog.getExistingDirectory() folder = QFileDialog.getExistingDirectory()
if len(folder.strip()) == 0: if len(folder.strip()) == 0:

View File

@ -47,7 +47,7 @@ app.setOrganizationDomain(info.organization_name)
# icn = QIcon(":/icons/app_icon") # icn = QIcon(":/icons/app_icon")
# app.setWindowIcon(icn) # app.setWindowIcon(icn)
# Create a Qt widget, which will be our window. # Create a Qt widget, which will be our window.
window = fixtracks.MainWindow(is_dark_mode()) window = fixtracks.MainWindow(is_dark_mode(app))
window.setGeometry(100, 100, 1024, 768) window.setGeometry(100, 100, 1024, 768)
window.setWindowTitle("FixTracks") window.setWindowTitle("FixTracks")
window.setMinimumWidth(1024) window.setMinimumWidth(1024)