aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gui/basewindow.cc189
-rw-r--r--gui/basewindow.h23
-rw-r--r--gui/designwidget.h1
-rw-r--r--gui/ice40/mainwindow.cc12
4 files changed, 120 insertions, 105 deletions
diff --git a/gui/basewindow.cc b/gui/basewindow.cc
index 27d0b528..84d86483 100644
--- a/gui/basewindow.cc
+++ b/gui/basewindow.cc
@@ -50,20 +50,9 @@ BaseMainWindow::BaseMainWindow(std::unique_ptr<Context> context, QWidget *parent
resize(1024, 768);
task = new TaskManager();
- connect(task, SIGNAL(log(std::string)), this, SLOT(writeInfo(std::string)));
-
- connect(task, SIGNAL(pack_finished(bool)), this, SLOT(pack_finished(bool)));
- connect(task, SIGNAL(budget_finish(bool)), this, SLOT(budget_finish(bool)));
- connect(task, SIGNAL(place_finished(bool)), this, SLOT(place_finished(bool)));
- connect(task, SIGNAL(route_finished(bool)), this, SLOT(route_finished(bool)));
-
- connect(task, SIGNAL(taskCanceled()), this, SLOT(taskCanceled()));
- connect(task, SIGNAL(taskStarted()), this, SLOT(taskStarted()));
- connect(task, SIGNAL(taskPaused()), this, SLOT(taskPaused()));
- connect(this, SIGNAL(contextChanged(Context *)), task, SIGNAL(contextChanged(Context *)));
+ // Create and deploy widgets on main screen
QWidget *centralWidget = new QWidget(this);
-
QGridLayout *gridLayout = new QGridLayout(centralWidget);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
@@ -84,35 +73,51 @@ BaseMainWindow::BaseMainWindow(std::unique_ptr<Context> context, QWidget *parent
console = new PythonTab();
tabWidget->addTab(console, "Console");
- connect(this, SIGNAL(contextChanged(Context *)), console, SLOT(newContext(Context *)));
centralTabWidget = new QTabWidget();
centralTabWidget->setTabsClosable(true);
- connect(centralTabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int)));
fpgaView = new FPGAViewWidget();
centralTabWidget->addTab(fpgaView, "Device");
centralTabWidget->tabBar()->setTabButton(0, QTabBar::RightSide, 0);
centralTabWidget->tabBar()->setTabButton(0, QTabBar::LeftSide, 0);
+ splitter_v->addWidget(centralTabWidget);
+ splitter_v->addWidget(tabWidget);
+
+ // Connect Worker
+ connect(task, SIGNAL(log(std::string)), this, SLOT(writeInfo(std::string)));
+ connect(task, SIGNAL(pack_finished(bool)), this, SLOT(pack_finished(bool)));
+ connect(task, SIGNAL(budget_finish(bool)), this, SLOT(budget_finish(bool)));
+ connect(task, SIGNAL(place_finished(bool)), this, SLOT(place_finished(bool)));
+ connect(task, SIGNAL(route_finished(bool)), this, SLOT(route_finished(bool)));
+ connect(task, SIGNAL(taskCanceled()), this, SLOT(taskCanceled()));
+ connect(task, SIGNAL(taskStarted()), this, SLOT(taskStarted()));
+ connect(task, SIGNAL(taskPaused()), this, SLOT(taskPaused()));
+
+ // Events for context change
+ connect(this, SIGNAL(contextChanged(Context *)), task, SIGNAL(contextChanged(Context *)));
+ connect(this, SIGNAL(contextChanged(Context *)), console, SLOT(newContext(Context *)));
connect(this, SIGNAL(contextChanged(Context *)), fpgaView, SLOT(newContext(Context *)));
+ connect(this, SIGNAL(contextChanged(Context *)), designview, SLOT(newContext(Context *)));
+
+ // Catch close tab events
+ connect(centralTabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int)));
+
+ // Propagate events from design view to device view
connect(designview, SIGNAL(selected(std::vector<DecalXY>, bool)), fpgaView,
SLOT(onSelectedArchItem(std::vector<DecalXY>, bool)));
- connect(fpgaView, SIGNAL(clickedBel(BelId, bool)), designview, SLOT(onClickedBel(BelId, bool)));
- connect(fpgaView, SIGNAL(clickedWire(WireId, bool)), designview, SLOT(onClickedWire(WireId, bool)));
- connect(fpgaView, SIGNAL(clickedPip(PipId, bool)), designview, SLOT(onClickedPip(PipId, bool)));
connect(designview, SIGNAL(zoomSelected()), fpgaView, SLOT(zoomSelected()));
-
connect(designview, SIGNAL(highlight(std::vector<DecalXY>, int)), fpgaView,
SLOT(onHighlightGroupChanged(std::vector<DecalXY>, int)));
- connect(this, SIGNAL(contextChanged(Context *)), designview, SLOT(newContext(Context *)));
- connect(this, SIGNAL(updateTreeView()), designview, SLOT(updateTree()));
-
- connect(designview, SIGNAL(info(std::string)), this, SLOT(writeInfo(std::string)));
+ // Click event on device view
+ connect(fpgaView, SIGNAL(clickedBel(BelId, bool)), designview, SLOT(onClickedBel(BelId, bool)));
+ connect(fpgaView, SIGNAL(clickedWire(WireId, bool)), designview, SLOT(onClickedWire(WireId, bool)));
+ connect(fpgaView, SIGNAL(clickedPip(PipId, bool)), designview, SLOT(onClickedPip(PipId, bool)));
- splitter_v->addWidget(centralTabWidget);
- splitter_v->addWidget(tabWidget);
+ // Update tree event
+ connect(this, SIGNAL(updateTreeView()), designview, SLOT(updateTree()));
createMenusAndBars();
}
@@ -125,6 +130,7 @@ void BaseMainWindow::writeInfo(std::string text) { console->info(text); }
void BaseMainWindow::createMenusAndBars()
{
+ // File menu / project toolbar actions
actionNew = new QAction("New", this);
actionNew->setIcon(QIcon(":/icons/resources/new.png"));
actionNew->setShortcuts(QKeySequence::New);
@@ -150,42 +156,10 @@ void BaseMainWindow::createMenusAndBars()
actionExit->setStatusTip("Exit the application");
connect(actionExit, SIGNAL(triggered()), this, SLOT(close()));
+ // Help menu actions
QAction *actionAbout = new QAction("About", this);
- menuBar = new QMenuBar();
- menuBar->setGeometry(QRect(0, 0, 1024, 27));
- QMenu *menuFile = new QMenu("&File", menuBar);
- QMenu *menuHelp = new QMenu("&Help", menuBar);
- menuDesign = new QMenu("&Design", menuBar);
- setMenuBar(menuBar);
-
- mainToolBar = new QToolBar();
- addToolBar(Qt::TopToolBarArea, mainToolBar);
-
- statusBar = new QStatusBar();
- progressBar = new QProgressBar(statusBar);
- progressBar->setAlignment(Qt::AlignRight);
- progressBar->setMaximumSize(180, 19);
- statusBar->addPermanentWidget(progressBar);
- progressBar->setValue(0);
- progressBar->setEnabled(false);
- setStatusBar(statusBar);
-
- menuFile->addAction(actionNew);
- menuFile->addAction(actionOpen);
- menuFile->addAction(actionSave);
- menuFile->addSeparator();
- menuFile->addAction(actionExit);
- menuHelp->addAction(actionAbout);
-
- mainToolBar->addAction(actionNew);
- mainToolBar->addAction(actionOpen);
- mainToolBar->addAction(actionSave);
-
- menuBar->addAction(menuFile->menuAction());
- menuBar->addAction(menuDesign->menuAction());
- menuBar->addAction(menuHelp->menuAction());
-
+ // Design menu options
actionLoadJSON = new QAction("Open JSON", this);
actionLoadJSON->setIcon(QIcon(":/icons/resources/open_json.png"));
actionLoadJSON->setStatusTip("Open an existing JSON file");
@@ -216,22 +190,7 @@ void BaseMainWindow::createMenusAndBars()
actionRoute->setEnabled(false);
connect(actionRoute, SIGNAL(triggered()), task, SIGNAL(route()));
- taskFPGABar = new QToolBar();
- addToolBar(Qt::TopToolBarArea, taskFPGABar);
-
- taskFPGABar->addAction(actionLoadJSON);
- taskFPGABar->addAction(actionPack);
- taskFPGABar->addAction(actionAssignBudget);
- taskFPGABar->addAction(actionPlace);
- taskFPGABar->addAction(actionRoute);
-
-
- menuDesign->addAction(actionLoadJSON);
- menuDesign->addAction(actionPack);
- menuDesign->addAction(actionAssignBudget);
- menuDesign->addAction(actionPlace);
- menuDesign->addAction(actionRoute);
-
+ // Worker control toolbar actions
actionPlay = new QAction("Play", this);
actionPlay->setIcon(QIcon(":/icons/resources/control_play.png"));
actionPlay->setStatusTip("Continue running task");
@@ -250,13 +209,7 @@ void BaseMainWindow::createMenusAndBars()
actionStop->setEnabled(false);
connect(actionStop, SIGNAL(triggered()), task, SLOT(terminate_thread()));
- QToolBar *taskToolBar = new QToolBar();
- addToolBar(Qt::TopToolBarArea, taskToolBar);
-
- taskToolBar->addAction(actionPlay);
- taskToolBar->addAction(actionPause);
- taskToolBar->addAction(actionStop);
-
+ // Device view control toolbar actions
QAction *actionZoomIn = new QAction("Zoom In", this);
actionZoomIn->setIcon(QIcon(":/icons/resources/zoom_in.png"));
connect(actionZoomIn, SIGNAL(triggered()), fpgaView, SLOT(zoomIn()));
@@ -273,12 +226,74 @@ void BaseMainWindow::createMenusAndBars()
actionZoomOutbound->setIcon(QIcon(":/icons/resources/shape_square.png"));
connect(actionZoomOutbound, SIGNAL(triggered()), fpgaView, SLOT(zoomOutbound()));
- graphicsToolBar = new QToolBar();
- addToolBar(Qt::TopToolBarArea, graphicsToolBar);
- graphicsToolBar->addAction(actionZoomIn);
- graphicsToolBar->addAction(actionZoomOut);
- graphicsToolBar->addAction(actionZoomSelected);
- graphicsToolBar->addAction(actionZoomOutbound);
+ // Add main menu
+ menuBar = new QMenuBar();
+ menuBar->setGeometry(QRect(0, 0, 1024, 27));
+ setMenuBar(menuBar);
+ QMenu *menuFile = new QMenu("&File", menuBar);
+ QMenu *menuHelp = new QMenu("&Help", menuBar);
+ menuDesign = new QMenu("&Design", menuBar);
+ menuBar->addAction(menuFile->menuAction());
+ menuBar->addAction(menuDesign->menuAction());
+ menuBar->addAction(menuHelp->menuAction());
+
+ // Add File menu actions
+ menuFile->addAction(actionNew);
+ menuFile->addAction(actionOpen);
+ menuFile->addAction(actionSave);
+ menuFile->addSeparator();
+ menuFile->addAction(actionExit);
+
+ // Add Design menu actions
+ menuDesign->addAction(actionLoadJSON);
+ menuDesign->addAction(actionPack);
+ menuDesign->addAction(actionAssignBudget);
+ menuDesign->addAction(actionPlace);
+ menuDesign->addAction(actionRoute);
+
+ // Add Help menu actions
+ menuHelp->addAction(actionAbout);
+
+ // Project toolbar
+ QToolBar *projectToolBar = new QToolBar();
+ addToolBar(Qt::TopToolBarArea, projectToolBar);
+ projectToolBar->addAction(actionNew);
+ projectToolBar->addAction(actionOpen);
+ projectToolBar->addAction(actionSave);
+
+ // Main action bar
+ mainActionBar = new QToolBar();
+ addToolBar(Qt::TopToolBarArea, mainActionBar);
+ mainActionBar->addAction(actionLoadJSON);
+ mainActionBar->addAction(actionPack);
+ mainActionBar->addAction(actionAssignBudget);
+ mainActionBar->addAction(actionPlace);
+ mainActionBar->addAction(actionRoute);
+
+ // Add worker control toolbar
+ QToolBar *workerControlToolBar = new QToolBar();
+ addToolBar(Qt::TopToolBarArea, workerControlToolBar);
+ workerControlToolBar->addAction(actionPlay);
+ workerControlToolBar->addAction(actionPause);
+ workerControlToolBar->addAction(actionStop);
+
+ // Add device view control toolbar
+ QToolBar *deviceViewToolBar = new QToolBar();
+ addToolBar(Qt::TopToolBarArea, deviceViewToolBar);
+ deviceViewToolBar->addAction(actionZoomIn);
+ deviceViewToolBar->addAction(actionZoomOut);
+ deviceViewToolBar->addAction(actionZoomSelected);
+ deviceViewToolBar->addAction(actionZoomOutbound);
+
+ // Add status bar with progress bar
+ statusBar = new QStatusBar();
+ progressBar = new QProgressBar(statusBar);
+ progressBar->setAlignment(Qt::AlignRight);
+ progressBar->setMaximumSize(180, 19);
+ statusBar->addPermanentWidget(progressBar);
+ progressBar->setValue(0);
+ progressBar->setEnabled(false);
+ setStatusBar(statusBar);
}
void BaseMainWindow::load_json(std::string filename)
diff --git a/gui/basewindow.h b/gui/basewindow.h
index 536ce786..9cea6637 100644
--- a/gui/basewindow.h
+++ b/gui/basewindow.h
@@ -86,16 +86,26 @@ class BaseMainWindow : public QMainWindow
void updateTreeView();
protected:
+ // state variables
std::unique_ptr<Context> ctx;
TaskManager *task;
+ bool timing_driven;
+ std::string currentJson;
+
+ // main widgets
QTabWidget *tabWidget;
QTabWidget *centralTabWidget;
PythonTab *console;
+ DesignWidget *designview;
+ FPGAViewWidget *fpgaView;
+ // Menus, bars and actions
QMenuBar *menuBar;
- QToolBar *mainToolBar;
- QToolBar *graphicsToolBar;
+ QMenu *menuDesign;
QStatusBar *statusBar;
+ QToolBar *mainActionBar;
+ QProgressBar *progressBar;
+
QAction *actionNew;
QAction *actionOpen;
QAction *actionSave;
@@ -108,15 +118,6 @@ class BaseMainWindow : public QMainWindow
QAction *actionPlay;
QAction *actionPause;
QAction *actionStop;
-
- QMenu *menuDesign;
- QToolBar *taskFPGABar;
-
- QProgressBar *progressBar;
- DesignWidget *designview;
- FPGAViewWidget *fpgaView;
- bool timing_driven;
- std::string currentJson;
};
NEXTPNR_NAMESPACE_END
diff --git a/gui/designwidget.h b/gui/designwidget.h
index 628586f4..c78d7232 100644
--- a/gui/designwidget.h
+++ b/gui/designwidget.h
@@ -53,7 +53,6 @@ class DesignWidget : public QWidget
std::vector<DecalXY> getDecals(ElementType type, IdString value);
void updateHighlightGroup(QList<TreeModel::Item *> item, int group);
Q_SIGNALS:
- void info(std::string text);
void selected(std::vector<DecalXY> decal, bool keep);
void highlight(std::vector<DecalXY> decal, int group);
void zoomSelected();
diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc
index 8f880191..10817e07 100644
--- a/gui/ice40/mainwindow.cc
+++ b/gui/ice40/mainwindow.cc
@@ -54,8 +54,8 @@ MainWindow::MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget
MainWindow::~MainWindow() {}
void MainWindow::createMenu()
-{
-
+{
+ // Add arch specific actions
actionLoadPCF = new QAction("Open PCF", this);
actionLoadPCF->setIcon(QIcon(":/icons/resources/open_pcf.png"));
actionLoadPCF->setStatusTip("Open PCF file");
@@ -68,14 +68,14 @@ void MainWindow::createMenu()
actionSaveAsc->setEnabled(false);
connect(actionSaveAsc, SIGNAL(triggered()), this, SLOT(save_asc()));
- taskFPGABar->addSeparator();
- taskFPGABar->addAction(actionLoadPCF);
- taskFPGABar->addAction(actionSaveAsc);
+ // Add actions in menus
+ mainActionBar->addSeparator();
+ mainActionBar->addAction(actionLoadPCF);
+ mainActionBar->addAction(actionSaveAsc);
menuDesign->addSeparator();
menuDesign->addAction(actionLoadPCF);
menuDesign->addAction(actionSaveAsc);
-
}
#if defined(_MSC_VER)