aboutsummaryrefslogtreecommitdiffstats
path: root/gui/basewindow.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gui/basewindow.cc')
-rw-r--r--gui/basewindow.cc156
1 files changed, 53 insertions, 103 deletions
diff --git a/gui/basewindow.cc b/gui/basewindow.cc
index 346efb88..550a4b93 100644
--- a/gui/basewindow.cc
+++ b/gui/basewindow.cc
@@ -29,17 +29,17 @@
#include "designwidget.h"
#include "fpgaviewwidget.h"
#include "jsonparse.h"
+#include "jsonwrite.h"
#include "log.h"
#include "mainwindow.h"
-#include "project.h"
#include "pythontab.h"
static void initBasenameResource() { Q_INIT_RESOURCE(base); }
NEXTPNR_NAMESPACE_BEGIN
-BaseMainWindow::BaseMainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent)
- : QMainWindow(parent), chipArgs(args), ctx(std::move(context)), timing_driven(false)
+BaseMainWindow::BaseMainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent)
+ : QMainWindow(parent), handler(handler), ctx(std::move(context)), timing_driven(false)
{
initBasenameResource();
qRegisterMetaType<std::string>();
@@ -130,25 +130,6 @@ 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);
- actionNew->setStatusTip("New project file");
- connect(actionNew, &QAction::triggered, this, &BaseMainWindow::new_proj);
-
- actionOpen = new QAction("Open", this);
- actionOpen->setIcon(QIcon(":/icons/resources/open.png"));
- actionOpen->setShortcuts(QKeySequence::Open);
- actionOpen->setStatusTip("Open an existing project file");
- connect(actionOpen, &QAction::triggered, this, &BaseMainWindow::open_proj);
-
- actionSave = new QAction("Save", this);
- actionSave->setIcon(QIcon(":/icons/resources/save.png"));
- actionSave->setShortcuts(QKeySequence::Save);
- actionSave->setStatusTip("Save existing project to disk");
- actionSave->setEnabled(false);
- connect(actionSave, &QAction::triggered, this, &BaseMainWindow::save_proj);
-
QAction *actionExit = new QAction("Exit", this);
actionExit->setIcon(QIcon(":/icons/resources/exit.png"));
actionExit->setShortcuts(QKeySequence::Quit);
@@ -158,13 +139,26 @@ void BaseMainWindow::createMenusAndBars()
// Help menu actions
QAction *actionAbout = new QAction("About", this);
- // Design menu options
+ // Gile menu options
+ actionNew = new QAction("New", this);
+ actionNew->setIcon(QIcon(":/icons/resources/new.png"));
+ actionNew->setShortcuts(QKeySequence::New);
+ actionNew->setStatusTip("New project");
+ connect(actionNew, &QAction::triggered, this, &BaseMainWindow::new_proj);
+
actionLoadJSON = new QAction("Open JSON", this);
actionLoadJSON->setIcon(QIcon(":/icons/resources/open_json.png"));
actionLoadJSON->setStatusTip("Open an existing JSON file");
actionLoadJSON->setEnabled(true);
connect(actionLoadJSON, &QAction::triggered, this, &BaseMainWindow::open_json);
+ actionSaveJSON = new QAction("Save JSON", this);
+ actionSaveJSON->setIcon(QIcon(":/icons/resources/save_json.png"));
+ actionSaveJSON->setStatusTip("Write to JSON file");
+ actionSaveJSON->setEnabled(true);
+ connect(actionSaveJSON, &QAction::triggered, this, &BaseMainWindow::save_json);
+
+ // Design menu options
actionPack = new QAction("Pack", this);
actionPack->setIcon(QIcon(":/icons/resources/pack.png"));
actionPack->setStatusTip("Pack current design");
@@ -244,13 +238,12 @@ void BaseMainWindow::createMenusAndBars()
// Add File menu actions
menuFile->addAction(actionNew);
- menuFile->addAction(actionOpen);
- menuFile->addAction(actionSave);
+ menuFile->addAction(actionLoadJSON);
+ menuFile->addAction(actionSaveJSON);
menuFile->addSeparator();
menuFile->addAction(actionExit);
// Add Design menu actions
- menuDesign->addAction(actionLoadJSON);
menuDesign->addAction(actionPack);
menuDesign->addAction(actionAssignBudget);
menuDesign->addAction(actionPlace);
@@ -261,17 +254,13 @@ void BaseMainWindow::createMenusAndBars()
// Add Help menu actions
menuHelp->addAction(actionAbout);
- // Project toolbar
- QToolBar *projectToolBar = new QToolBar("Project");
- addToolBar(Qt::TopToolBarArea, projectToolBar);
- projectToolBar->addAction(actionNew);
- projectToolBar->addAction(actionOpen);
- projectToolBar->addAction(actionSave);
-
// Main action bar
mainActionBar = new QToolBar("Main");
addToolBar(Qt::TopToolBarArea, mainActionBar);
+ mainActionBar->addAction(actionNew);
mainActionBar->addAction(actionLoadJSON);
+ mainActionBar->addAction(actionSaveJSON);
+ mainActionBar->addSeparator();
mainActionBar->addAction(actionPack);
mainActionBar->addAction(actionAssignBudget);
mainActionBar->addAction(actionPlace);
@@ -304,25 +293,29 @@ void BaseMainWindow::createMenusAndBars()
setStatusBar(statusBar);
}
-void BaseMainWindow::load_json(std::string filename)
+void BaseMainWindow::open_json()
{
- disableActions();
- std::ifstream f(filename);
- if (parse_json_file(f, filename, ctx.get())) {
- log("Loading design successful.\n");
+ QString fileName = QFileDialog::getOpenFileName(this, QString("Open JSON"), QString(), QString("*.json"));
+ if (!fileName.isEmpty()) {
+ disableActions();
+ ctx = handler->load_json(fileName.toStdString());
+ Q_EMIT contextChanged(ctx.get());
Q_EMIT updateTreeView();
- updateLoaded();
- } else {
- actionLoadJSON->setEnabled(true);
- log("Loading design failed.\n");
+ log("Loading design successful.\n");
+ updateActions();
}
}
-void BaseMainWindow::open_json()
+void BaseMainWindow::save_json()
{
- QString fileName = QFileDialog::getOpenFileName(this, QString("Open JSON"), QString(), QString("*.json"));
+ QString fileName = QFileDialog::getSaveFileName(this, QString("Save JSON"), QString(), QString("*.json"));
if (!fileName.isEmpty()) {
- load_json(fileName.toStdString());
+ std::string fn = fileName.toStdString();
+ std::ofstream f(fn);
+ if (write_json_file(f, fn, ctx.get()))
+ log("Saving JSON successful.\n");
+ else
+ log("Saving JSON failed.\n");
}
}
@@ -332,9 +325,7 @@ void BaseMainWindow::pack_finished(bool status)
if (status) {
log("Packing design successful.\n");
Q_EMIT updateTreeView();
- actionPlace->setEnabled(true);
- actionAssignBudget->setEnabled(true);
- onPackFinished();
+ updateActions();
} else {
log("Packing design failed.\n");
}
@@ -345,8 +336,7 @@ void BaseMainWindow::budget_finish(bool status)
disableActions();
if (status) {
log("Assigning timing budget successful.\n");
- actionPlace->setEnabled(true);
- onBudgetFinished();
+ updateActions();
} else {
log("Assigning timing budget failed.\n");
}
@@ -358,8 +348,7 @@ void BaseMainWindow::place_finished(bool status)
if (status) {
log("Placing design successful.\n");
Q_EMIT updateTreeView();
- actionRoute->setEnabled(true);
- onPlaceFinished();
+ updateActions();
} else {
log("Placing design failed.\n");
}
@@ -370,7 +359,7 @@ void BaseMainWindow::route_finished(bool status)
if (status) {
log("Routing design successful.\n");
Q_EMIT updateTreeView();
- onRouteFinished();
+ updateActions();
} else
log("Routing design failed.\n");
}
@@ -386,9 +375,6 @@ void BaseMainWindow::taskStarted()
disableActions();
actionPause->setEnabled(true);
actionStop->setEnabled(true);
-
- actionNew->setEnabled(false);
- actionOpen->setEnabled(false);
}
void BaseMainWindow::taskPaused()
@@ -396,9 +382,6 @@ void BaseMainWindow::taskPaused()
disableActions();
actionPlay->setEnabled(true);
actionStop->setEnabled(true);
-
- actionNew->setEnabled(false);
- actionOpen->setEnabled(false);
}
void BaseMainWindow::budget()
@@ -416,52 +399,32 @@ void BaseMainWindow::place() { Q_EMIT task->place(timing_driven); }
void BaseMainWindow::disableActions()
{
- actionLoadJSON->setEnabled(false);
+ actionLoadJSON->setEnabled(true);
actionPack->setEnabled(false);
actionAssignBudget->setEnabled(false);
actionPlace->setEnabled(false);
actionRoute->setEnabled(false);
+
actionExecutePy->setEnabled(true);
actionPlay->setEnabled(false);
actionPause->setEnabled(false);
actionStop->setEnabled(false);
- actionNew->setEnabled(true);
- actionOpen->setEnabled(true);
-
- if (ctx->settings.find(ctx->id("input/json")) != ctx->settings.end())
- actionSave->setEnabled(true);
- else
- actionSave->setEnabled(false);
-
onDisableActions();
}
-void BaseMainWindow::updateLoaded()
-{
- disableActions();
- actionPack->setEnabled(true);
- onJsonLoaded();
- onProjectLoaded();
-}
-
-void BaseMainWindow::projectLoad(std::string filename)
+void BaseMainWindow::updateActions()
{
- ProjectHandler proj;
- disableActions();
- ctx = proj.load(filename);
- Q_EMIT contextChanged(ctx.get());
- log_info("Loaded project %s...\n", filename.c_str());
- updateLoaded();
-}
+ if (ctx->settings.find(ctx->id("pack")) == ctx->settings.end())
+ actionPack->setEnabled(true);
+ else if (ctx->settings.find(ctx->id("place")) == ctx->settings.end()) {
+ actionAssignBudget->setEnabled(true);
+ actionPlace->setEnabled(true);
+ } else if (ctx->settings.find(ctx->id("route")) == ctx->settings.end())
+ actionRoute->setEnabled(true);
-void BaseMainWindow::open_proj()
-{
- QString fileName = QFileDialog::getOpenFileName(this, QString("Open Project"), QString(), QString("*.proj"));
- if (!fileName.isEmpty()) {
- projectLoad(fileName.toStdString());
- }
+ onUpdateActions();
}
void BaseMainWindow::execute_python()
@@ -473,18 +436,5 @@ void BaseMainWindow::execute_python()
}
void BaseMainWindow::notifyChangeContext() { Q_EMIT contextChanged(ctx.get()); }
-void BaseMainWindow::save_proj()
-{
- if (currentProj.empty()) {
- QString fileName = QFileDialog::getSaveFileName(this, QString("Save Project"), QString(), QString("*.proj"));
- if (fileName.isEmpty())
- return;
- currentProj = fileName.toStdString();
- }
- if (!currentProj.empty()) {
- ProjectHandler proj;
- proj.save(ctx.get(), currentProj);
- }
-}
NEXTPNR_NAMESPACE_END