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)