diff --git a/fixtracks/fixtracks.py b/fixtracks/fixtracks.py index e63adcb..ecd8a45 100644 --- a/fixtracks/fixtracks.py +++ b/fixtracks/fixtracks.py @@ -14,19 +14,19 @@ import fixtracks.resources class MainWindow(QMainWindow): def __init__(self, darkmode): super().__init__() - self.create_actions() + self._iconsuffix = "_dark" if darkmode else "_light" self._top_toolbar = None self._side_toolbar = None - cw = CentralWidget() - self.setCentralWidget(cw) - self._iconsuffix = "_dark" if darkmode else "_light" + self._cw = CentralWidget(darkmode) + self.setCentralWidget(self._cw) + self.create_actions() # cw.exit_signal.connect(self.exit_request) def create_actions(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.setShortcut(QKeySequence("Ctrl+o")) - self._file_open_action.triggered.connect(self.on_file_open) + # self._file_open_action = QAction(QIcon(":/icons/open" + self._iconsuffix), "Open", self) + # self._file_open_action.setStatusTip("Open nix file") + # self._file_open_action.setShortcut(QKeySequence("Ctrl+o")) + # 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.setStatusTip("Close current nix file") @@ -71,47 +71,60 @@ class MainWindow(QMainWindow): self.create_menu() def create_menu(self): - menu = self.menuBar() - file_menu = menu.addMenu("&File") - file_menu.addAction(self._file_open_action) + menu_bar = self.menuBar() + file_menu = menu_bar.addMenu("&File") # file_menu.addAction(self._file_close_action) file_menu.addSeparator() file_menu.addAction(self._quit_action) - plot_menu = menu.addMenu("&Plot") - # plot_menu.addAction(self._plot_action) - plot_menu.addAction(self._mergeview_action) + tools_menu = menu_bar.addMenu("&Tools") + tools_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._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): - 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.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.addSeparator() + self._top_toolbar.addSeparator() + self._top_toolbar.addAction(self._mergeview_action) # self._toolbar.addAction(self._plot_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.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - self._toolbar.addWidget(empty) - self._toolbar.addSeparator() - self._toolbar.addAction(self._quit_action) - - # settings = QSettings(info.ORGANIZATION, info.NAME) - # tb_orientation = settings.value("app/toolbar_area", "left") - self.addToolBar(Qt.LeftToolBarArea if tb_orientation == "left" else Qt.TopToolBarArea, self._toolbar) - # self._toolbar.topLevelChanged.connect(self.tb_changed) - # del settings + self._side_toolbar.addWidget(empty) + self._side_toolbar.addSeparator() + self._side_toolbar.addAction(self._quit_action) + + self.addToolBar(Qt.LeftToolBarArea, self._side_toolbar) + # self.addToolBar(Qt.TopToolBarArea, self._top_toolbar) def on_file_open(self, s): QFileDialog.getExistingDirectory() diff --git a/fixtracks/resources.qrc b/fixtracks/resources.qrc index 957e246..c1c97b8 100644 --- a/fixtracks/resources.qrc +++ b/fixtracks/resources.qrc @@ -22,7 +22,7 @@ docs/index.md docs/merge.md docs/tracks.md - docs/concert.md + docs/convert.md docs/license.md \ No newline at end of file diff --git a/fixtracks/widgets/centralwidget.py b/fixtracks/widgets/centralwidget.py index 9071ed1..5af35f4 100644 --- a/fixtracks/widgets/centralwidget.py +++ b/fixtracks/widgets/centralwidget.py @@ -9,11 +9,11 @@ from fixtracks.widgets.converter import Json2PandasConverter class CentralWidget(QWidget): - def __init__(self, parent=None): + def __init__(self, darkmode, parent=None): super().__init__(parent) self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - self._tw = TasksWidget() + self._tw = TasksWidget(darkmode) self._tw.clicked.connect(self._select_task) self._mergewidget = MergeDetections(self) @@ -49,6 +49,14 @@ class CentralWidget(QWidget): def _on_back(self): self.layout().setCurrentIndex(self._tasksindex) + @property + def toolbarActions(self): + return self._tw.toolbarActions + + @property + def menuActions(self): + return self._tw.menuActions + # # @Slot(None) # def on_exit(self): # self.exit_signal.emit() diff --git a/fixtracks/widgets/taskwidget.py b/fixtracks/widgets/taskwidget.py index 1de66d8..f4a0292 100644 --- a/fixtracks/widgets/taskwidget.py +++ b/fixtracks/widgets/taskwidget.py @@ -9,53 +9,87 @@ from PySide6.QtGui import QIcon, QAction, QPixmap class TasksWidget(QWidget): clicked = Signal((str,)) - def __init__(self, parent = None): + def __init__(self, darkmode, parent = None): 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() - folderBtn.setEnabled(True) - folderBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - folderBtn.setMaximumSize(300, 300) - folderBtn.setIcon(QIcon(":icons/open")) - folderBtn.setIconSize(0.95 * folderBtn.size()) - folderBtn.clicked.connect(self._open_folder) - - self.convertBtn = QPushButton() - self.convertBtn.setIcon(QIcon(":/icons/convert")) - self.convertBtn.setToolTip("Convert JSON pose files to to Pandas data frames") - self.convertBtn.setEnabled(True) - self.convertBtn.setFixedSize(250, 100) - self.convertBtn.setIconSize(0.95 * self.convertBtn.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) + convertBtn = buttonfromaction(self._convertAction) + convertBtn.setEnabled(True) + convertBtn.setFixedSize(250, 100) + convertBtn.setIconSize(0.95 * convertBtn.size()) + + mergeBtn = buttonfromaction(self._mergeAction) + mergeBtn.setEnabled(False) + mergeBtn.setFixedSize(250, 100) + mergeBtn.setIconSize(0.95 * mergeBtn.size()) + + tracksBtn = buttonfromaction(self._tracksAction) + tracksBtn.setEnabled(False) + tracksBtn.setFixedSize(250, 100) + tracksBtn.setIconSize(0.95 * tracksBtn.size()) l = QGridLayout() l.setAlignment(Qt.AlignmentFlag.AlignCenter) - l.addWidget(folderBtn, 0, 0, 3, 1, Qt.AlignmentFlag.AlignCenter) - l.addWidget(self.convertBtn, 0, 1, 1, 1, Qt.AlignmentFlag.AlignCenter) - l.addWidget(self.mergeBtn, 1, 1, 1, 1, Qt.AlignmentFlag.AlignCenter) - l.addWidget(self.tracksBtn, 2, 1, 1, 1, Qt.AlignmentFlag.AlignCenter) + l.addWidget(openBtn, 0, 0, 3, 1, Qt.AlignmentFlag.AlignCenter) + l.addWidget(convertBtn, 0, 1, 1, 1, Qt.AlignmentFlag.AlignCenter) + l.addWidget(mergeBtn, 1, 1, 1, 1, Qt.AlignmentFlag.AlignCenter) + l.addWidget(tracksBtn, 2, 1, 1, 1, Qt.AlignmentFlag.AlignCenter) # l.addWidget(folderBtn) # l.addWidget(self.convertBtn) # l.addWidget(self.mergeBtn) - # l.addWidget(self.tracksBtn) + # l.addWidget(self.tracksBtn) self.setLayout(l) - self._file_list = [] + + + @property + def toolbarActions(self): + return self._toolbarActions + + @property + def menuActions(self): + return self._menuActions def _merge_clicked(self): self.clicked.emit("Merge") @@ -66,7 +100,7 @@ class TasksWidget(QWidget): def _convert_clicked(self): self.clicked.emit("Convert") - def _open_folder(self): + def _on_open(self): logging.debug("TasksWidget:select data folder") folder = QFileDialog.getExistingDirectory() if len(folder.strip()) == 0: diff --git a/main.py b/main.py index 0a71811..f50e117 100644 --- a/main.py +++ b/main.py @@ -47,7 +47,7 @@ app.setOrganizationDomain(info.organization_name) # icn = QIcon(":/icons/app_icon") # app.setWindowIcon(icn) # 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.setWindowTitle("FixTracks") window.setMinimumWidth(1024)