From 3e95c57317c8cea5f40a546b8dff9d2b63211611 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 27 Feb 2020 09:37:09 +0100 Subject: [PATCH] Add SVG option to gui --- gui/base.qrc | 1 + gui/basewindow.cc | 27 +++++++++++++++++++++++++++ gui/basewindow.h | 2 ++ gui/resources/save_svg.png | Bin 0 -> 1569 bytes 4 files changed, 30 insertions(+) create mode 100644 gui/resources/save_svg.png diff --git a/gui/base.qrc b/gui/base.qrc index 0671fa9e..509a584f 100644 --- a/gui/base.qrc +++ b/gui/base.qrc @@ -30,5 +30,6 @@ resources/group.png resources/camera.png resources/film.png + resources/save_svg.png diff --git a/gui/basewindow.cc b/gui/basewindow.cc index 7f767c58..91edc310 100644 --- a/gui/basewindow.cc +++ b/gui/basewindow.cc @@ -266,6 +266,11 @@ void BaseMainWindow::createMenusAndBars() actionMovie->setChecked(false); connect(actionMovie, &QAction::triggered, this, &BaseMainWindow::saveMovie); + actionSaveSVG = new QAction("Save SVG", this); + actionSaveSVG->setIcon(QIcon(":/icons/resources/save_svg.png")); + actionSaveSVG->setStatusTip("Saving a SVG"); + connect(actionSaveSVG, &QAction::triggered, this, &BaseMainWindow::saveSVG); + // set initial state fpgaView->enableDisableDecals(actionDisplayBel->isChecked(), actionDisplayWire->isChecked(), actionDisplayPip->isChecked(), actionDisplayGroups->isChecked()); @@ -334,6 +339,7 @@ void BaseMainWindow::createMenusAndBars() deviceViewToolBar->addSeparator(); deviceViewToolBar->addAction(actionScreenshot); deviceViewToolBar->addAction(actionMovie); + deviceViewToolBar->addAction(actionSaveSVG); // Add status bar with progress bar statusBar = new QStatusBar(); @@ -416,6 +422,27 @@ void BaseMainWindow::saveMovie() fpgaView->movieStop(); } } + +void BaseMainWindow::saveSVG() +{ + QString fileName = QFileDialog::getSaveFileName(this, QString("Save SVG"), QString(), QString("*.svg")); + if (!fileName.isEmpty()) { + if (!fileName.endsWith(".svg")) + fileName += ".svg"; + bool ok; + QString options = + QInputDialog::getText(this, "Save SVG", tr("Save options:"), QLineEdit::Normal, "scale=500", &ok); + if (ok) { + try { + ctx->writeSVG(fileName.toStdString(), options.toStdString()); + log("Saving SVG successful.\n"); + } catch (const log_execution_error_exception &ex) { + log("Saving SVG failed.\n"); + } + } + } +} + void BaseMainWindow::pack_finished(bool status) { disableActions(); diff --git a/gui/basewindow.h b/gui/basewindow.h index fe9dfdf2..f90991e1 100644 --- a/gui/basewindow.h +++ b/gui/basewindow.h @@ -85,6 +85,7 @@ class BaseMainWindow : public QMainWindow void screenshot(); void saveMovie(); + void saveSVG(); Q_SIGNALS: void contextChanged(Context *ctx); @@ -134,6 +135,7 @@ class BaseMainWindow : public QMainWindow QAction *actionScreenshot; QAction *actionMovie; + QAction *actionSaveSVG; }; NEXTPNR_NAMESPACE_END diff --git a/gui/resources/save_svg.png b/gui/resources/save_svg.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a5da5ef7bb411f6aed339f4de2493d13911056 GIT binary patch literal 1569 zcmV++2HyFJP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rf0viYu0i+^Ob^rhcB}qgD*SfdGC4Or$63v&OPtFSNDg*7w$d0=Y8Ji`+dI8k9!@ivFhvV zg+W*wHf(UNcIFLqxvHuP*L6uG5_qnQ>v?!y63_EUCS5!)NzzN=dM=*p;dw3z*NyIM z+qUhR{v!evv)-QRxZZxCD0_UyJj52l!QM--Z$8w_#S0fW)zQJql`Et3+w0zoU63oi zXIkd|ef*PVpw~0t8>=1H`@VifU9z^i948R$qjz49AmdNL!2v{q_fA$}aU8U^qip(k zVMKZVf!~X^Y?Y>T|Apl}r@q~r0C3!7^NQs&leN|5QNUKvPEIN0;5sp5M}$PeHV^%Y zhS}36Q8#-^a%9Ehn}O=kwD`gMDi8!6eqv4~7hejHijmXU5-2hL6oM9bZhj5LLyBBr znrDHCagYayUBqIv&Q?O~*xa=x$W4g={e5YGvWS3|z_E@Xav`I)4uUw6#mzO>`3l6C zTjp5;S_=9yh#^$grch(o)J(_oObc3k0s^8z92+D@0V6}4L|a=M*SnMwBuuRqi+w~u z1+od*8koDJ!B#~;$4JJ5G3tt`_FMwNOR>_NOCU^>NSLbpaT7xm?DKFh!I#)qgY*0} zTMC4o5auZ|7Y7_MgGU4%5i*8K;EFF~w8r-#qXl0JzBYQf zg1vbk?tN|KR$^*OYg2%e%aTTA(IDU}olhX`i(S@at2P7{$qpdebxpd+*7iZMby?7N`gnNH%;MnPI#_ih8+1f`L-q^?= zbLMlgvj+qwELz5xF)7$_gtU^pUone7TC2S1tHzg_+?G#6{qPf|KesUIt48>)kxOrF z#=CzyQ_r8^rlW`HeEtPStT~8VKAO_e!ztUio}%OJkP>)oHJKd$kn_(W?Tb}}@v2X~ zu^#u}0n#-y=w0_F-qALc2>;HV$I$ItP$i|PREo>B4>4@-=V*b>7hmSwvrDu7m5%D5 zpaL1CEs3@v=Wo1x=1Jr=sf~NKEzOBRzo3SORFZSSwkk(Kt!p$0dfzFn8hKn#v z%&0||gg+8q!q6C6 zlwdGdMhm$VYyyEqUczO;jw6E#4%tzBRRT{`jv92(fmTFd?V6?=4i4F-n+QA-Ja6PW z@jnh)H6Zgy$B6&{03~!qSaf7zbY(hYa%Ew3WdJfTGB7PLF)c7RR53O>F)%taGAl4J zIxsN9^XYy7001R)MObuXVRU6WZEs|0W_bWIFfuSLFflDKH&ih;Ix#RhGcqeMFgh?W TvaV6W00000NkvXXu0mjfXraa( literal 0 HcmV?d00001