From e770f16a22d5255de53f23f9a95e8ef3fc664107 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Tue, 26 Jun 2018 13:49:32 +0200 Subject: [PATCH 1/2] Added Save ASC option --- gui/ice40/mainwindow.cc | 39 ++++++++++++++++++++++++++++--- gui/ice40/mainwindow.h | 3 +++ gui/ice40/nextpnr.qrc | 1 + gui/ice40/resources/save_asc.png | Bin 0 -> 1384 bytes gui/ice40/worker.cc | 15 ++++++++++++ gui/ice40/worker.h | 4 ++++ 6 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 gui/ice40/resources/save_asc.png diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc index 34769abe..4c9ef0ef 100644 --- a/gui/ice40/mainwindow.cc +++ b/gui/ice40/mainwindow.cc @@ -48,6 +48,7 @@ MainWindow::MainWindow(Context *_ctx, QWidget *parent) : BaseMainWindow(_ctx, pa connect(task, SIGNAL(loadfile_finished(bool)), this, SLOT(loadfile_finished(bool))); connect(task, SIGNAL(loadpcf_finished(bool)), this, SLOT(loadpcf_finished(bool))); + connect(task, SIGNAL(saveasc_finished(bool)), this, SLOT(saveasc_finished(bool))); 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))); @@ -107,6 +108,14 @@ void MainWindow::createMenu() connect(actionRoute, SIGNAL(triggered()), task, SIGNAL(route())); actionRoute->setEnabled(false); + actionSaveAsc = new QAction("Save ASC", this); + QIcon iconSaveAsc; + iconSaveAsc.addFile(QStringLiteral(":/icons/resources/save_asc.png")); + actionSaveAsc->setIcon(iconSaveAsc); + actionSaveAsc->setStatusTip("Save ASC file"); + connect(actionSaveAsc, SIGNAL(triggered()), this, SLOT(save_asc())); + actionSaveAsc->setEnabled(false); + QToolBar *taskFPGABar = new QToolBar(); addToolBar(Qt::TopToolBarArea, taskFPGABar); @@ -115,12 +124,14 @@ void MainWindow::createMenu() taskFPGABar->addAction(actionAssignBudget); taskFPGABar->addAction(actionPlace); taskFPGABar->addAction(actionRoute); + taskFPGABar->addAction(actionSaveAsc); menu_Design->addAction(actionLoadPCF); menu_Design->addAction(actionPack); menu_Design->addAction(actionAssignBudget); menu_Design->addAction(actionPlace); menu_Design->addAction(actionRoute); + menu_Design->addAction(actionSaveAsc); actionPlay = new QAction("Play", this); QIcon iconPlay; @@ -169,7 +180,7 @@ void MainWindow::open() void MainWindow::open_pcf() { - QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), QString("*.pcf")); + QString fileName = QFileDialog::getOpenFileName(this, QString("Open PCF"), QString(), QString("*.pcf")); if (!fileName.isEmpty()) { tabWidget->setCurrentWidget(info); @@ -181,6 +192,16 @@ void MainWindow::open_pcf() bool MainWindow::save() { return false; } +void MainWindow::save_asc() +{ + QString fileName = QFileDialog::getSaveFileName(this, QString("Save ASC"), QString(), QString("*.asc")); + if (!fileName.isEmpty()) { + std::string fn = fileName.toStdString(); + disableActions(); + Q_EMIT task->saveasc(fn); + } +} + void MainWindow::disableActions() { actionLoadPCF->setEnabled(false); @@ -188,6 +209,7 @@ void MainWindow::disableActions() actionAssignBudget->setEnabled(false); actionPlace->setEnabled(false); actionRoute->setEnabled(false); + actionSaveAsc->setEnabled(false); actionPlay->setEnabled(false); actionPause->setEnabled(false); @@ -217,6 +239,16 @@ void MainWindow::loadpcf_finished(bool status) } } +void MainWindow::saveasc_finished(bool status) +{ + disableActions(); + if (status) { + log("Saving ASC successful.\n"); + } else { + log("Saving ASC failed.\n"); + } +} + void MainWindow::pack_finished(bool status) { disableActions(); @@ -253,9 +285,10 @@ void MainWindow::place_finished(bool status) void MainWindow::route_finished(bool status) { disableActions(); - if (status) + if (status) { log("Routing design successful.\n"); - else + actionSaveAsc->setEnabled(true); + } else log("Routing design failed.\n"); } diff --git a/gui/ice40/mainwindow.h b/gui/ice40/mainwindow.h index 66814d32..1e20f892 100644 --- a/gui/ice40/mainwindow.h +++ b/gui/ice40/mainwindow.h @@ -43,9 +43,11 @@ class MainWindow : public BaseMainWindow void open_pcf(); void budget(); void place(); + void save_asc(); void loadfile_finished(bool status); void loadpcf_finished(bool status); + void saveasc_finished(bool status); void pack_finished(bool status); void budget_finish(bool status); void place_finished(bool status); @@ -64,6 +66,7 @@ class MainWindow : public BaseMainWindow QAction *actionAssignBudget; QAction *actionPlace; QAction *actionRoute; + QAction *actionSaveAsc; QAction *actionPlay; QAction *actionPause; QAction *actionStop; diff --git a/gui/ice40/nextpnr.qrc b/gui/ice40/nextpnr.qrc index 4a73d791..40966dba 100644 --- a/gui/ice40/nextpnr.qrc +++ b/gui/ice40/nextpnr.qrc @@ -8,5 +8,6 @@ resources/route.png resources/time_add.png resources/open_pcf.png + resources/save_asc.png diff --git a/gui/ice40/resources/save_asc.png b/gui/ice40/resources/save_asc.png new file mode 100644 index 0000000000000000000000000000000000000000..15b59ca141903691c7545347d08b643b82ce3470 GIT binary patch literal 1384 zcmV-u1(*7XP)NLtaC5@ZgHmQdJ( z4?zae2O649gHtIIAth0SG7=fwCcv+uo54^6h=a@c3@ zv(|t8|Np)Abr@x|wY4c@Ft%^s?%Zh2|EG_enws!D57%|^JrB?K@%mFi=%oz7##wCc?p8Pl?OcFTS+tuP?ivv>S!@<>2@h+AcNf6UIZXoF_vwz;+{$ed;a_d_s;JlF0;izauO1q((USiqfz5gMN&Y~Mx!tiDuD=L2!SY}D4|4*iA1R# z2V4i{OsuW|z-U^*&aR967vtf^Nf?FDXgPquXw+QdwU5@#8`I=#cAtt8I}l0*0AV5l z720Ur!6Y`45#o9DKADFS(QP#Hlt^U2Ig@g+&jb`gBjo@Jq1v{l=-MQ)YO!HS0xAPW zH8Oa1Z>CsGJTa9{L13g}|I?(2SV0v{5|d#m43=}FdU?K^!i=Z4oKNvHh zR&|MwjKoz-3?lA$N%GlKYst!-6k7&hBou}N;p+8}Y)PtSR^Zx*DKnw_ zNhgTleb$+3UbCf@e8+zJ@&P@A0U}WM@=Gv0%!O}%;M}pZ_9JlRl=fv{IQQ*FN?kBhY8S)ET=w9^%!&B;MIrKT-95~8ISc3$> zQ*F%51S}XWyTvR31u3t-$qZ6;r5D}t2ICuNFfSY=oY6pV=rD5h2$T1BGVO)O=sj`* z&vlqJrIzrH37GgeS|%)sUnW5zRLg{_;CAlA?eC|y_7=SUesZ7gi%x;-G5pXXuB~2& z-*W*Y@W-Ren7nlpT>b^}d8TgLZ2dJT7)gCl5kO!hJt~O=VS76#Iu7yO*#VAs96~!j z=Et5q^|e0J>&8*HY6WN3Z{cj;AV;6yNxSPK5b(W+-sF4gel)y-d1d2I* zhM5v~wP{QFYx!yB3aRlzg=&F0s>sv{TzhX1`Ivem_RSZR#4iI7gkpI_lQTU^!;wtG zF;Z;VlDXbXkKqjgB$tHmMlf!za>w*S3Ph1n0mKyfuE(0)r^fs`4vdb@z>0gPaI;4W q;I*v>`9DVDx!J(d_<1wOxxWE8x-`zNhrt{G0000 Date: Tue, 26 Jun 2018 14:17:17 +0200 Subject: [PATCH 2/2] Preps for more UI functionality --- gui/basewindow.cc | 36 +++++++++++++++++++----------- gui/basewindow.h | 5 +++-- gui/dummy/mainwindow.cc | 6 +++-- gui/dummy/mainwindow.h | 5 +++-- gui/ice40/mainwindow.cc | 34 +++++++++++++++++++++++++--- gui/ice40/mainwindow.h | 7 ++++-- gui/ice40/nextpnr.qrc | 1 + gui/ice40/resources/open_json.png | Bin 0 -> 2093 bytes 8 files changed, 70 insertions(+), 24 deletions(-) create mode 100644 gui/ice40/resources/open_json.png diff --git a/gui/basewindow.cc b/gui/basewindow.cc index 8e90a8ea..20b48dd3 100644 --- a/gui/basewindow.cc +++ b/gui/basewindow.cc @@ -90,27 +90,35 @@ void BaseMainWindow::writeInfo(std::string text) { info->info(text); } void BaseMainWindow::createMenusAndBars() { + QAction *actionNew = new QAction("New", this); + QIcon iconNew; + iconNew.addFile(QStringLiteral(":/icons/resources/new.png")); + actionNew->setIcon(iconNew); + actionNew->setShortcuts(QKeySequence::New); + actionNew->setStatusTip("New project file"); + connect(actionNew, SIGNAL(triggered()), this, SLOT(new_proj())); + QAction *actionOpen = new QAction("Open", this); - QIcon icon1; - icon1.addFile(QStringLiteral(":/icons/resources/open.png")); - actionOpen->setIcon(icon1); + QIcon iconOpen; + iconOpen.addFile(QStringLiteral(":/icons/resources/open.png")); + actionOpen->setIcon(iconOpen); actionOpen->setShortcuts(QKeySequence::Open); - actionOpen->setStatusTip("Open an existing JSON file"); - connect(actionOpen, SIGNAL(triggered()), this, SLOT(open())); + actionOpen->setStatusTip("Open an existing project file"); + connect(actionOpen, SIGNAL(triggered()), this, SLOT(open_proj())); QAction *actionSave = new QAction("Save", this); - QIcon icon2; - icon2.addFile(QStringLiteral(":/icons/resources/save.png")); - actionSave->setIcon(icon2); + QIcon iconSave; + iconSave.addFile(QStringLiteral(":/icons/resources/save.png")); + actionSave->setIcon(iconSave); actionSave->setShortcuts(QKeySequence::Save); - actionSave->setStatusTip("Save the ASC to disk"); - connect(actionSave, SIGNAL(triggered()), this, SLOT(save())); + actionSave->setStatusTip("Save existing project to disk"); + connect(actionSave, SIGNAL(triggered()), this, SLOT(save_proj())); actionSave->setEnabled(false); QAction *actionExit = new QAction("Exit", this); - QIcon icon3; - icon3.addFile(QStringLiteral(":/icons/resources/exit.png")); - actionExit->setIcon(icon3); + QIcon iconExit; + iconExit.addFile(QStringLiteral(":/icons/resources/exit.png")); + actionExit->setIcon(iconExit); actionExit->setShortcuts(QKeySequence::Quit); actionExit->setStatusTip("Exit the application"); connect(actionExit, SIGNAL(triggered()), this, SLOT(close())); @@ -131,12 +139,14 @@ void BaseMainWindow::createMenusAndBars() statusBar = new QStatusBar(); setStatusBar(statusBar); + menu_File->addAction(actionNew); menu_File->addAction(actionOpen); menu_File->addAction(actionSave); menu_File->addSeparator(); menu_File->addAction(actionExit); menu_Help->addAction(actionAbout); + mainToolBar->addAction(actionNew); mainToolBar->addAction(actionOpen); mainToolBar->addAction(actionSave); } diff --git a/gui/basewindow.h b/gui/basewindow.h index f4ca5129..038b82c5 100644 --- a/gui/basewindow.h +++ b/gui/basewindow.h @@ -49,8 +49,9 @@ class BaseMainWindow : public QMainWindow protected Q_SLOTS: void writeInfo(std::string text); - virtual void open() = 0; - virtual bool save() = 0; + virtual void new_proj() = 0; + virtual void open_proj() = 0; + virtual bool save_proj() = 0; protected: Context *ctx; diff --git a/gui/dummy/mainwindow.cc b/gui/dummy/mainwindow.cc index e72d4f96..c57d0db0 100644 --- a/gui/dummy/mainwindow.cc +++ b/gui/dummy/mainwindow.cc @@ -41,8 +41,10 @@ void MainWindow::createMenu() menuBar->addAction(menu_Custom->menuAction()); } -void MainWindow::open() {} +void MainWindow::new_proj() {} -bool MainWindow::save() { return false; } +void MainWindow::open_proj() {} + +bool MainWindow::save_proj() { return false; } NEXTPNR_NAMESPACE_END diff --git a/gui/dummy/mainwindow.h b/gui/dummy/mainwindow.h index f16b7ad3..b1b9598f 100644 --- a/gui/dummy/mainwindow.h +++ b/gui/dummy/mainwindow.h @@ -36,8 +36,9 @@ class MainWindow : public BaseMainWindow void createMenu(); protected Q_SLOTS: - virtual void open(); - virtual bool save(); + virtual void new_proj(); + virtual void open_proj(); + virtual bool save_proj(); }; NEXTPNR_NAMESPACE_END diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc index 4c9ef0ef..61ceb3e6 100644 --- a/gui/ice40/mainwindow.cc +++ b/gui/ice40/mainwindow.cc @@ -68,6 +68,14 @@ void MainWindow::createMenu() QMenu *menu_Design = new QMenu("&Design", menuBar); menuBar->addAction(menu_Design->menuAction()); + actionLoadJSON = new QAction("Open JSON", this); + QIcon iconLoadJSON; + iconLoadJSON.addFile(QStringLiteral(":/icons/resources/open_json.png")); + actionLoadJSON->setIcon(iconLoadJSON); + actionLoadJSON->setStatusTip("Open an existing JSON file"); + connect(actionLoadJSON, SIGNAL(triggered()), this, SLOT(open_json())); + actionLoadJSON->setEnabled(false); + actionLoadPCF = new QAction("Open PCF", this); QIcon iconLoadPCF; iconLoadPCF.addFile(QStringLiteral(":/icons/resources/open_pcf.png")); @@ -119,6 +127,7 @@ void MainWindow::createMenu() QToolBar *taskFPGABar = new QToolBar(); addToolBar(Qt::TopToolBarArea, taskFPGABar); + taskFPGABar->addAction(actionLoadJSON); taskFPGABar->addAction(actionLoadPCF); taskFPGABar->addAction(actionPack); taskFPGABar->addAction(actionAssignBudget); @@ -126,6 +135,7 @@ void MainWindow::createMenu() taskFPGABar->addAction(actionRoute); taskFPGABar->addAction(actionSaveAsc); + menu_Design->addAction(actionLoadJSON); menu_Design->addAction(actionLoadPCF); menu_Design->addAction(actionPack); menu_Design->addAction(actionAssignBudget); @@ -165,9 +175,26 @@ void MainWindow::createMenu() taskToolBar->addAction(actionStop); } -void MainWindow::open() +void MainWindow::new_proj() { - QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), QString("*.json")); + disableActions(); + actionLoadJSON->setEnabled(true); +} + +void MainWindow::open_proj() +{ + QString fileName = QFileDialog::getOpenFileName(this, QString("Open Project"), QString(), QString("*.npnr")); + if (!fileName.isEmpty()) { + tabWidget->setCurrentWidget(info); + + std::string fn = fileName.toStdString(); + disableActions(); + } +} + +void MainWindow::open_json() +{ + QString fileName = QFileDialog::getOpenFileName(this, QString("Open JSON"), QString(), QString("*.json")); if (!fileName.isEmpty()) { tabWidget->setCurrentWidget(info); @@ -190,7 +217,7 @@ void MainWindow::open_pcf() } } -bool MainWindow::save() { return false; } +bool MainWindow::save_proj() { return false; } void MainWindow::save_asc() { @@ -204,6 +231,7 @@ void MainWindow::save_asc() void MainWindow::disableActions() { + actionLoadJSON->setEnabled(false); actionLoadPCF->setEnabled(false); actionPack->setEnabled(false); actionAssignBudget->setEnabled(false); diff --git a/gui/ice40/mainwindow.h b/gui/ice40/mainwindow.h index 1e20f892..f4037a47 100644 --- a/gui/ice40/mainwindow.h +++ b/gui/ice40/mainwindow.h @@ -37,9 +37,11 @@ class MainWindow : public BaseMainWindow void createMenu(); protected Q_SLOTS: - virtual void open(); - virtual bool save(); + virtual void new_proj(); + virtual void open_proj(); + virtual bool save_proj(); + void open_json(); void open_pcf(); void budget(); void place(); @@ -61,6 +63,7 @@ class MainWindow : public BaseMainWindow void disableActions(); TaskManager *task; + QAction *actionLoadJSON; QAction *actionLoadPCF; QAction *actionPack; QAction *actionAssignBudget; diff --git a/gui/ice40/nextpnr.qrc b/gui/ice40/nextpnr.qrc index 40966dba..3c86057d 100644 --- a/gui/ice40/nextpnr.qrc +++ b/gui/ice40/nextpnr.qrc @@ -9,5 +9,6 @@ resources/time_add.png resources/open_pcf.png resources/save_asc.png + resources/open_json.png diff --git a/gui/ice40/resources/open_json.png b/gui/ice40/resources/open_json.png new file mode 100644 index 0000000000000000000000000000000000000000..90c07267351ba64f30fd125aecfc0b7826de506f GIT binary patch literal 2093 zcmV+|2-5e7P)GYDP-_4UeyM5NLJgwvSz}{sT5Fot zXe_Ou2MLp@TnyLJWAxq%X3l!cd2xJy8eo! zll*)v9$RhOc59#m+>$$5o-Q9M^c9|zcVr(&$O8I*3ZU**OB1QY{ml){n-|Spq~^EG zXFm}>Zm3DstjZ1LhWg&> z%XA;;o|d$vo6=3HvAU6_x+a#jFC$x(T|UOx3Yn0DWS9hkj}Pz}Rl_MVE>+?v43D0p|=`Z@;efw`{lF60pVfZT^c#Lk|0dsk{++~!xd z&AKz^jX-y=Y~S>3`7z*)$hF8{<o0GutEod9O|mgbVNqeNzsUa_ zz3c*p&UF+O9=QA3c;BoGwk&O3@c<1AzDPsI)iktUMMK*qG^S3k?3_Q@{F}e&J<*1f zK!yqW3tpjrs&4A4rq(8>WJ(MdhcU)je$h{Jm{)-@!2d`Q_C1%9g;zcSMuT`DWyBOv zK@PledS2N{wjd|tw#r);8Wp})u7G{d3BS!W4Kc;YJWDk(~Xa=yV%Na z_(pj{1YP{lBLKi30|`Lqz|Ek%3>3!@vxh~C0ho985@X=jYItyD7$;c^3Y4W#7O~ny zFjq+&;0m=x*|J-9N1D**1}G1LmxKICME^0In>jrJOw>7J&N8qh3Ert3ZX`E5ZsX2N z@cZK~uZ{*-cUnIcUk(HR07igZC4d0MKBVy5_s3d7UO(!aGg3^{7hg~r2#m%;P?o}S zEMl!GUQ1YDD-sQ+rTjwq0I(#Aj7k7w2#uR)b6=n+h$rC9I4)F=D50+mCtMhE6+g=}Yl$ag@5|c?b%21G@aW3gH5;x;ZCuwCzj}7MJihvl@`efk9SD>K z-0+QqlHf^ZM z)7)Rn`i|w+hV|{KR^>8hPE43TOGqb^%x%1s*WPL5=iRT_BsVyG3KYK%mJ? z>EK|m83rb;iZoz^MC}}i377&MOFw71+sd+S}`_Hb%QvE_z)S$fek zTzB(BjEtsHV(3`fP4j;_vk`N0pr7K#(t{>$s}+&BPD z^^kBhScY=J=h!Kk0tw{1m<7oC}ph>w`yy)nQo*FVL!CvFX=Bmk{JH07e^t$rB= zCeG;rWyNq(4wQPqJ08xN0Ne6dv+4~tZ+f1=q1lLdT)O5Bwmp6g`Mk~co!9c&HT#eV zVC`jlN!Mq>^)mtv0;coE9OwxJSmA+#I}+zPsTwRM5$`0T-7qtVNBadYu;9Wy-15~2 z`OaP2L0rCn-%mL3<`Pz~d!B>cOZnbC54~4&C<1QY@EV_aXC_%)~Hfxw?cHWK{9o|w(qr`Bcy8|Vf z8?W8TjhlBMqEVKnTny+NmTY9aaE^LFE=g6#!Uzzm!=H|1X>qpJWGXc&v@+n|Fu=qpk#gE_mfxSQv5S$HA1+)M)pWp{^F)Gmu|H((}C)WN6 Xq!9H;Z!in300000NkvXXu0mjf8JyhK literal 0 HcmV?d00001