From 14e0ff4a8df69dd6d4b5782628e65ba6ab520014 Mon Sep 17 00:00:00 2001 From: Daniel Nicoletti Date: Tue, 9 Apr 2024 13:37:24 -0300 Subject: [PATCH 1/3] gvedit remove getopt dependecy Tried to build graphviz with cmake on Windows and it failed to find getopt headers from the vcpkg submodule, since Qt is used there I made the code a bit more modern and used QCommandLineParser instead, which fixed my build. --- cmd/gvedit/main.cpp | 85 ++++++++++++++++----------------------- cmd/gvedit/mainwindow.cpp | 70 ++++++++++++++------------------ cmd/gvedit/mainwindow.h | 6 +-- cmd/gvedit/mdichild.cpp | 2 +- 4 files changed, 68 insertions(+), 95 deletions(-) diff --git a/cmd/gvedit/main.cpp b/cmd/gvedit/main.cpp index 47d07af7e1..d1643a7b5b 100644 --- a/cmd/gvedit/main.cpp +++ b/cmd/gvedit/main.cpp @@ -20,15 +20,14 @@ #endif #include #include +#include #include #include "mainwindow.h" -#include #include #include #include - #ifdef _MSC_VER #pragma comment( lib, "cgraph.lib" ) #pragma comment( lib, "gvc.lib" ) @@ -36,62 +35,48 @@ QTextStream errout(stderr, QIODevice::WriteOnly); -static char useString[] = "Usage: gvedit [-v?] \n\ - -s - Scale input by 72\n\ - -v - verbose\n\ - -? - print usage\n"; - -static void usage(int v) +int main(int argc, char *argv[]) { - printf("%s",useString); - graphviz_exit(v); -} + Q_INIT_RESOURCE(mdi); -static char **parseArgs(int argc, char *argv[]) -{ - int c; - - const char *cmd = argv[0]; - while ((c = getopt(argc, argv, ":sv?")) != -1) { - switch (c) { - case 's': - PSinputscale = POINTS_PER_INCH; - break; - case 'v': - Verbose = 1; - break; - case '?': - if (optopt == '\0' || optopt == '?') - usage(0); - else { - errout << cmd << " : option -" << ((char) optopt) << - " unrecognized\n"; - errout.flush(); - usage(1); - } - break; - } + QApplication app(argc, argv); + + QCommandLineParser parser; + parser.setApplicationDescription(QStringLiteral("gvedit - simple graph editor and viewer")); + const QCommandLineOption helpOption = parser.addHelpOption(); + parser.addPositionalArgument(QStringLiteral("files"), QCoreApplication::translate("main", "files to open."), "[files...]"); + + const QCommandLineOption scaleInputBy72Option({ + QStringLiteral("s"), + QStringLiteral("scale-input-by-72"), + }, QCoreApplication::translate("main", "Scale input by 72")); + parser.addOption(scaleInputBy72Option); + + const QCommandLineOption verboseOption({ + QStringLiteral("v"), + QStringLiteral("verbose"), + }, QCoreApplication::translate("main", "Verbose mode")); + parser.addOption(verboseOption); + + if (!parser.parse(app.arguments())) { + parser.showHelp(1); } - argv += optind; - argc -= optind; + if (parser.isSet(helpOption)) { + parser.showHelp(0); + } - if (argc) - return argv; - else - return nullptr; -} + if (parser.isSet(scaleInputBy72Option)) { + PSinputscale = POINTS_PER_INCH; + } -int main(int argc, char *argv[]) -{ - Q_INIT_RESOURCE(mdi); - int ret; + if (parser.isSet(verboseOption)) { + Verbose = 1; + } - char **files = parseArgs(argc, argv); - QApplication app(argc, argv); - CMainWindow mainWin(files); + CMainWindow mainWin(parser.positionalArguments()); mainWin.show(); - ret = app.exec(); + const int ret = app.exec(); graphviz_exit(ret); } diff --git a/cmd/gvedit/mainwindow.cpp b/cmd/gvedit/mainwindow.cpp index e18f2de54f..e98a66e695 100644 --- a/cmd/gvedit/mainwindow.cpp +++ b/cmd/gvedit/mainwindow.cpp @@ -9,14 +9,13 @@ *************************************************************************/ #include -#include #include #include "mainwindow.h" #include "mdichild.h" #include "csettings.h" #include "config.h" -#include +#include QTextEdit *globTextEdit; @@ -69,7 +68,7 @@ void CMainWindow::createConsole() QVBoxLayout *vL = new QVBoxLayout(); - textEdit->setObjectName(QString::fromUtf8("textEdit")); + textEdit->setObjectName(QStringLiteral("textEdit")); globTextEdit = textEdit; agseterrf(errorPipe); @@ -104,16 +103,16 @@ void CMainWindow::createConsole() static const QStringList xtra = {"NONE"}; -CMainWindow::CMainWindow(char **files) { +CMainWindow::CMainWindow(const QStringList &files) { QWidget *centralwidget = new QWidget(this); - centralwidget->setObjectName(QString::fromUtf8("centralwidget")); + centralwidget->setObjectName(QStringLiteral("centralwidget")); QVBoxLayout *verticalLayout_2 = new QVBoxLayout(centralwidget); - verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2")); + verticalLayout_2->setObjectName(QStringLiteral("verticalLayout_2")); QVBoxLayout *verticalLayout = new QVBoxLayout(); - verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); + verticalLayout->setObjectName(QStringLiteral("verticalLayout")); mdiArea = new QMdiArea(centralwidget); - mdiArea->setObjectName(QString::fromUtf8("mdiArea")); + mdiArea->setObjectName(QStringLiteral("mdiArea")); verticalLayout->addWidget(mdiArea); verticalLayout_2->setContentsMargins(1, 1, 1, 1); @@ -124,12 +123,7 @@ CMainWindow::CMainWindow(char **files) { createConsole(); - connect(mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow *)), - this, SLOT(slotRefreshMenus())); - windowMapper = new QSignalMapper(this); - connect(windowMapper, SIGNAL(mapped(QWidget *)), - this, SLOT(activateChild(QWidget *))); - + connect(mdiArea, &QMdiArea::subWindowActivated, this, &CMainWindow::slotRefreshMenus); frmSettings = new CFrmSettings(); actions(); @@ -144,20 +138,17 @@ CMainWindow::CMainWindow(char **files) { this->resize(1024, 900); this->move(0, 0); setUnifiedTitleAndToolBarOnMac(true); - QComboBox *cb = - (QComboBox *) frmSettings->findChild < QComboBox * >("cbLayout"); + auto cb = frmSettings->findChild < QComboBox * >("cbLayout"); dfltLayoutIdx = LoadPlugins(*cb, frmSettings->gvc, "layout", {}, "dot"); - cb = (QComboBox *) frmSettings->findChild < + cb = frmSettings->findChild < QComboBox * >("cbExtension"); dfltRenderIdx = LoadPlugins(*cb, frmSettings->gvc, "device", xtra, "png"); statusBar()->showMessage(tr("Ready")); setWindowIcon(QIcon(":/images/icon.png")); //load files specified in command line , one time task - if (files) - while (*files) { - addFile(QString(*files)); - files++; - } + for (const auto &file : files) { + addFile(file); + } } void CMainWindow::closeEvent(QCloseEvent * event) @@ -178,14 +169,14 @@ void CMainWindow::slotNew() child->show(); } -void CMainWindow::addFile(QString fileName) +void CMainWindow::addFile(const QString &fileName) { if (!fileName.isEmpty()) { QMdiSubWindow *existing = findMdiChild(fileName); - if (existing) { - mdiArea->setActiveSubWindow(existing); - return; - } + if (existing) { + mdiArea->setActiveSubWindow(existing); + return; + } MdiChild *child = createMdiChild(); if (child->loadFile(fileName)) { @@ -193,7 +184,7 @@ void CMainWindow::addFile(QString fileName) child->show(); slotRun(child); } else { - child->close(); + child->close(); } } } @@ -386,13 +377,14 @@ void CMainWindow::updateWindowMenu() mWindow->addAction(previousAct); mWindow->addAction(separatorAct); - QList < QMdiSubWindow * >windows = mdiArea->subWindowList(); + const QList < QMdiSubWindow * >windows = mdiArea->subWindowList(); separatorAct->setVisible(!windows.isEmpty()); for (int i = 0; i < windows.size(); ++i) { - if (windows.at(i)->widget()->inherits("MdiChild")) { + const auto window = windows.at(i); + if (window->widget()->inherits("MdiChild")) { MdiChild *child = - qobject_cast < MdiChild * >(windows.at(i)->widget()); + qobject_cast < MdiChild * >(window->widget()); QString text; if (i < 9) { text = tr("&%1 %2").arg(i + 1) @@ -404,9 +396,9 @@ void CMainWindow::updateWindowMenu() QAction *action = mWindow->addAction(text); action->setCheckable(true); action->setChecked(child == activeMdiChild()); - connect(action, SIGNAL(triggered()), windowMapper, - SLOT(map())); - windowMapper->setMapping(action, windows.at(i)); + connect(action, &QAction::triggered, this, [this, window] { + activateChild(window); + }); } } } @@ -641,21 +633,19 @@ QMdiSubWindow *CMainWindow::findMdiChild(const QString & fileName) MdiChild *mdiChild = qobject_cast < MdiChild * >(window->widget()); - if (mdiChild->currentFile() == canonicalFilePath) + + if (mdiChild->currentFile() == canonicalFilePath) return window; } else { MdiChild *mdiChild = qobject_cast < - ImageViewer * >(window->widget())->graphWindow; + ImageViewer * >(window->widget())->graphWindow; if (mdiChild->currentFile() == canonicalFilePath) return window; } - - - } - return 0; + return nullptr; } void CMainWindow::activateChild(QWidget * window) diff --git a/cmd/gvedit/mainwindow.h b/cmd/gvedit/mainwindow.h index 4eb10c5205..421d5331a3 100644 --- a/cmd/gvedit/mainwindow.h +++ b/cmd/gvedit/mainwindow.h @@ -29,7 +29,6 @@ class QAction; class QMenu; class QMdiArea; class QMdiSubWindow; -class QSignalMapper; QT_END_NAMESPACE class CMainWindow : public QMainWindow @@ -37,9 +36,9 @@ class CMainWindow : public QMainWindow Q_OBJECT public: - CMainWindow(char **files = nullptr); + CMainWindow(const QStringList &files = {}); QMdiArea *mdiArea; - void addFile (QString fileName); + void addFile (const QString &fileName); private slots: void slotSettings(); void slotRun(MdiChild* m = nullptr); @@ -75,7 +74,6 @@ private: MdiChild *activeMdiChild(); MdiChild* prevChild; QMdiSubWindow *findMdiChild(const QString &fileName); - QSignalMapper *windowMapper; int dfltRenderIdx, dfltLayoutIdx; QToolBar *tbFile; diff --git a/cmd/gvedit/mdichild.cpp b/cmd/gvedit/mdichild.cpp index c4390fbd97..2bc0b05f37 100644 --- a/cmd/gvedit/mdichild.cpp +++ b/cmd/gvedit/mdichild.cpp @@ -42,7 +42,7 @@ bool MdiChild::loadFile(const QString & fileName) QFile file(fileName); if (!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this, tr("MDI"), - tr("Cannot read file %1:\n%2.") + tr("Cannot read file %1:\n%2.") .arg(fileName) .arg(file.errorString())); return false; -- GitLab From 9feda9e2e5da0c5da4a76bc10e7d8dd747788f60 Mon Sep 17 00:00:00 2001 From: Daniel Nicoletti Date: Thu, 11 Apr 2024 16:58:31 -0300 Subject: [PATCH 2/3] Use scoped QCoreApplication so cmd line args work without DISPLAY --- cmd/gvedit/main.cpp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/cmd/gvedit/main.cpp b/cmd/gvedit/main.cpp index d1643a7b5b..dedf803e1b 100644 --- a/cmd/gvedit/main.cpp +++ b/cmd/gvedit/main.cpp @@ -37,9 +37,12 @@ QTextStream errout(stderr, QIODevice::WriteOnly); int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(mdi); + Q_INIT_RESOURCE(mdi); - QApplication app(argc, argv); + QStringList files; + { + // Scoped QCoreApplication for when X11 DISPLAY is not available + QCoreApplication app(argc, argv); QCommandLineParser parser; parser.setApplicationDescription(QStringLiteral("gvedit - simple graph editor and viewer")); @@ -47,15 +50,15 @@ int main(int argc, char *argv[]) parser.addPositionalArgument(QStringLiteral("files"), QCoreApplication::translate("main", "files to open."), "[files...]"); const QCommandLineOption scaleInputBy72Option({ - QStringLiteral("s"), - QStringLiteral("scale-input-by-72"), - }, QCoreApplication::translate("main", "Scale input by 72")); + QStringLiteral("s"), + QStringLiteral("scale-input-by-72"), + }, QCoreApplication::translate("main", "Scale input by 72")); parser.addOption(scaleInputBy72Option); const QCommandLineOption verboseOption({ - QStringLiteral("v"), - QStringLiteral("verbose"), - }, QCoreApplication::translate("main", "Verbose mode")); + QStringLiteral("v"), + QStringLiteral("verbose"), + }, QCoreApplication::translate("main", "Verbose mode")); parser.addOption(verboseOption); if (!parser.parse(app.arguments())) { @@ -74,10 +77,15 @@ int main(int argc, char *argv[]) Verbose = 1; } - CMainWindow mainWin(parser.positionalArguments()); - mainWin.show(); - const int ret = app.exec(); - graphviz_exit(ret); + files = parser.positionalArguments(); + } + + QApplication app(argc, argv); + + CMainWindow mainWin(files); + mainWin.show(); + const int ret = app.exec(); + graphviz_exit(ret); } /** -- GitLab From b330c9fde59575035d6870892682339f81234c77 Mon Sep 17 00:00:00 2001 From: Daniel Nicoletti Date: Thu, 11 Apr 2024 17:47:25 -0300 Subject: [PATCH 3/3] gvedit add -? cmd line option --- cmd/gvedit/main.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/gvedit/main.cpp b/cmd/gvedit/main.cpp index dedf803e1b..5930aac267 100644 --- a/cmd/gvedit/main.cpp +++ b/cmd/gvedit/main.cpp @@ -46,9 +46,15 @@ int main(int argc, char *argv[]) QCommandLineParser parser; parser.setApplicationDescription(QStringLiteral("gvedit - simple graph editor and viewer")); - const QCommandLineOption helpOption = parser.addHelpOption(); parser.addPositionalArgument(QStringLiteral("files"), QCoreApplication::translate("main", "files to open."), "[files...]"); + const QCommandLineOption helpOption({ + QStringLiteral("?"), + QStringLiteral("h"), + QStringLiteral("help"), + }, QCoreApplication::translate("main", "Displays help on commandline options.")); + parser.addOption(helpOption); + const QCommandLineOption scaleInputBy72Option({ QStringLiteral("s"), QStringLiteral("scale-input-by-72"), -- GitLab