From f1ee8aa56f280872c77e1caad8ed61ad28067804 Mon Sep 17 00:00:00 2001 From: Sven Hoexter Date: Sun, 6 Jul 2025 10:51:21 +0200 Subject: [PATCH] New upstream version 2.9.581 --- CMakeLists.txt | 13 +- README.md | 14 ++- demos/vym-contribute.vym | Bin 6057 -> 9824 bytes src/aboutdialog.cpp | 4 +- src/branch-wrapper.cpp | 24 ++++ src/branch-wrapper.h | 4 + src/export-confluence-dialog.cpp | 2 +- src/export-firefox.cpp | 8 +- src/file.cpp | 2 +- src/main.cpp | 18 ++- src/mainwindow.cpp | 206 ++++++++++++++++++------------- src/mainwindow.h | 22 ++-- src/mapdesign.cpp | 2 +- src/mapeditor.cpp | 25 +++- src/texteditor.cpp | 141 +++++++++++++-------- src/texteditor.h | 2 + src/version.h | 11 +- src/vymmodel.cpp | 63 ++++++---- test/start-internal-tests.sh | 8 +- test/vym-selftest.vys | 61 ++++++++- 20 files changed, 415 insertions(+), 215 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 211d834..3a41b39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,8 +49,14 @@ if (CMAKE_SYSTEM_NAME STREQUAL Linux) find_package(DBus1) if(DBus1_FOUND) + message(STATUS "Deteced DBUS1 available, adding DBUS interfaces") + LIST(APPEND QtComponents DBus) LIST(APPEND QtLibraries Qt6::DBus) + + list(APPEND VymSources src/dbus/adaptormodel.cpp src/dbus/adaptorvym.cpp) + include_directories(${CMAKE_SOURCE_DIR}/src/dbus ${CMAKE_SOURCE_DIR}/src) + ADD_COMPILE_DEFINITIONS(VYM_DBUS) endif() endif() @@ -102,13 +108,6 @@ if(WIN32) endif() -# Add DBUS interfaces, if DBUS is available on platform -if(DBus1_FOUND) - list(APPEND VymSources src/dbus/adaptormodel.cpp src/dbus/adaptorvym.cpp) - include_directories(${CMAKE_SOURCE_DIR}/src/dbus ${CMAKE_SOURCE_DIR}/src) - ADD_COMPILE_DEFINITIONS(VYM_DBUS) -endif() - # Translations (release) # To update the translation files based on source code changes diff --git a/README.md b/README.md index 0555db0..a7d60f2 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,14 @@ VYM is a mind mapping application. You can use it to visualize your thoughts in tree-like structures. It is also useful for time management, self-organization and sorting through new ideas and complex contexts. +VYM includes a powerful personal task manager, which allows to adjust +priorities or reminds you after easily defined time spans. + You can use the scripting capabilities for interesting presentations. VYM can also retrieve data from the Jira issue tracking system and talk to the Concluence documentation system. -VYM runs on Apple and Windows and of course mose Linux platforms. +VYM runs on Apple and Windows and of course most Linux platforms. Documentation ------------- @@ -95,11 +98,18 @@ Installation make make install - or using Qt Creator: + or using Qt Creator (recommended on Mac and Windows): In "File" do "Open file or project" and select the "CMakeLists.txt". This will setup the project. + + For testing you probably need to tell vym where to find various + files like macros, demos, etc. On the commandline you can do this + with the "-l" option. Using Qt Creator you can add a variable + VYMHOME to the execution environment pointing to your path to vym + sources. + Questions and feedback ---------------------- diff --git a/demos/vym-contribute.vym b/demos/vym-contribute.vym index fe770e4038168a062a99fd4bbf6e83da7cccc728..c7001273fe5efff84163635605da8d511b41b410 100644 GIT binary patch literal 9824 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 literal 6057 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 diff --git a/src/aboutdialog.cpp b/src/aboutdialog.cpp index 1442522..d3b7651 100644 --- a/src/aboutdialog.cpp +++ b/src/aboutdialog.cpp @@ -13,7 +13,7 @@ extern QString vymBuildDate; extern QString vymCodeName; extern QString vymCodeQuality; -extern QColor vymBlue; +extern QColor vymBlueColor; AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) { @@ -29,7 +29,7 @@ AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) credits->setHtml( QString( - "" + "" "
" "

VYM - View Your Mind

" "

A tool to put the things you have got in your mind into a map.

" diff --git a/src/branch-wrapper.cpp b/src/branch-wrapper.cpp index ea2f498..367c7de 100644 --- a/src/branch-wrapper.cpp +++ b/src/branch-wrapper.cpp @@ -250,6 +250,13 @@ void BranchWrapper::detach() model()->detach(branchItemInt); } +QString BranchWrapper::getBranchesLayout() +{ + QString r = Container::layoutString(branchItemInt->getBranchContainer()->branchesContainerLayout()); + mainWindow->setScriptResult(r); + return r; +} + bool BranchWrapper::getFrameAutoDesign(const bool &useInnerFrame) { bool r = branchItemInt->getBranchContainer()->frameAutoDesign(useInnerFrame); @@ -306,6 +313,13 @@ QString BranchWrapper::getHeadingXML() return r; } +QString BranchWrapper::getImagesLayout() +{ + QString r = branchItemInt->getImagesContainer()->layoutString(); + mainWindow->setScriptResult(r); + return r; +} + void BranchWrapper::getJiraData(bool subtree) { model()->getJiraData(subtree, branchItemInt); @@ -690,6 +704,11 @@ void BranchWrapper::setAttribute(const QString &key, const QString &value) model()->setAttribute(branchItemInt, key, value); } +void BranchWrapper::setBranchesLayout(const QString &layout) +{ + model()->setBranchesLayout(layout, branchItemInt); +} + void BranchWrapper::setFlagByName(const QString &s) { model()->setFlagByName(s, branchItemInt); @@ -764,6 +783,11 @@ void BranchWrapper::setHideLinkUnselected(bool b) model()->setHideLinkUnselected(b, branchItemInt); } +void BranchWrapper::setImagesLayout(const QString &layout) +{ + model()->setImagesLayout(layout, branchItemInt); +} + void BranchWrapper::setNoteRichText(const QString &s) { VymNote vn; diff --git a/src/branch-wrapper.h b/src/branch-wrapper.h index aad3390..394c793 100644 --- a/src/branch-wrapper.h +++ b/src/branch-wrapper.h @@ -38,6 +38,7 @@ class BranchWrapper : public QObject { void deleteConfluencePageLabel(const QString &labelName); int depth(); void detach(); + QString getBranchesLayout(); bool getFrameAutoDesign(const bool & useInnerFrame); QString getFrameBrushColor(const bool & useInnerFrame); int getFramePadding(const bool & useInnerFrame); @@ -46,6 +47,7 @@ class BranchWrapper : public QObject { QString getFrameType(const bool & useInnerFrame); QString getHeading(); QString getHeadingXML(); + QString getImagesLayout(); void getJiraData(bool subtree); QString getNoteText(); QString getNoteXML(); @@ -96,6 +98,7 @@ class BranchWrapper : public QObject { bool selectXLink(int n); bool selectXLinkOtherEnd(int n); void setAttribute(const QString &key, const QString &value); + void setBranchesLayout(const QString &layout); void setFlagByName(const QString &); void setFrameAutoDesign(const bool, const bool); void setFrameBrushColor(const bool & useInnerFrame, const QString &color); @@ -110,6 +113,7 @@ class BranchWrapper : public QObject { void setHeadingText(const QString &); void setHideExport(bool b); void setHideLinkUnselected(bool b); + void setImagesLayout(const QString &layout); void setNoteRichText(const QString &); void setNoteText(const QString &); void setOnlyFlags(QJSValueList args); diff --git a/src/export-confluence-dialog.cpp b/src/export-confluence-dialog.cpp index cd2f99b..5c33837 100644 --- a/src/export-confluence-dialog.cpp +++ b/src/export-confluence-dialog.cpp @@ -45,7 +45,7 @@ bool ExportConfluenceDialog::getCreateNewPage() { return ui.createPageButton->is void ExportConfluenceDialog::openUrl() { - mainWindow->openURL(ui.lineEditURL->text()); + mainWindow->openUrl(ui.lineEditURL->text()); } QString ExportConfluenceDialog::getUrl() { return url; } diff --git a/src/export-firefox.cpp b/src/export-firefox.cpp index 3e89e54..6289dbd 100644 --- a/src/export-firefox.cpp +++ b/src/export-firefox.cpp @@ -47,14 +47,12 @@ QJsonObject ExportFirefox::buildList(BranchItem *bi) // Export values if (key == "postData") jsobj[key] = QJsonValue::Null; - else if (ai->value().typeName() == "QDateTime") + else if (strcmp(ai->value().typeName(), "QDateTime") == 0) jsobj[key] = QJsonValue(ai->value().toDateTime().toMSecsSinceEpoch() * 1000); - else if (ai->value().typeName() == "QString") + else if (strcmp(ai->value().typeName(), "QString") == 0) jsobj[key] = ai->value().toString(); - else if (ai->value().typeName() == "Integer") - { + else if (strcmp(ai->value().typeName(), "Integer") == 0) jsobj[key] = QJsonValue(ai->value().toInt()); - } else qWarning() << "ExportFirefox Unknown attribute type in " << bi->headingPlain() << "Key: " << key; } diff --git a/src/file.cpp b/src/file.cpp index 77e834c..c8f22d3 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -13,7 +13,7 @@ #include #endif -#if defined(Q_OS_MACX) +#if defined(Q_OS_MACOS) #include "unistd.h" #endif diff --git a/src/main.cpp b/src/main.cpp index 25139d8..86b8610 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -126,7 +126,11 @@ ImageIO imageIO; bool usingDarkTheme; // Influences some color schemes bool systemSeemsDark; // Text brighter than background? QString iconTheme; // "bright" or "dark" depending on usingDarkTheme -QColor vymBlue; + +// Some colors used more often and depending on dark mode +QColor vymBlueColor; +QColor vymForegroundColor; +QColor vymBaseColor; int warningCount = 0; int criticalCount = 0; @@ -300,7 +304,7 @@ int main(int argc, char *argv[]) } else { // ok, let's find vymBaseDir on my own -#if defined(Q_OS_MACX) +#if defined(Q_OS_MACOS) // Executable is in vym.app/Contents/MacOS, so go up first: vymBaseDir.setPath(QCoreApplication::applicationDirPath()); vymBaseDir.cdUp(); @@ -374,13 +378,13 @@ int main(int argc, char *argv[]) } } + QPalette palette; if (usingDarkTheme && settingsDarkTheme == "always") { qApp->setStyle(QStyleFactory::create("fusion")); //qApp->setStyle(QStyleFactory::create("Windows")); //qApp->setStyle(QStyleFactory::create("windowsvista")); // On Windows, there is no dark palette predefined, let's do that on our own - QPalette palette; palette.setColor(QPalette::Window, QColor(53,53,53)); palette.setColor(QPalette::WindowText, Qt::white); palette.setColor(QPalette::Base, QColor(27, 30, 32)); @@ -399,7 +403,13 @@ int main(int argc, char *argv[]) //palette.setColor(QPalette::Light, Qt::green); //palette.setColor(QPalette::Midlight, Qt::red); qApp->setPalette(palette); - } + + vymBlueColor =QColor::fromString("#00aaff"); + } else + vymBlueColor =QColor::fromString("#0000ff"); + + vymForegroundColor = palette.color(QPalette::WindowText); + vymBaseColor = palette.color(QPalette::Base); // Prepare and check translations vymTranslationsDir = QDir(vymBaseDir.path() + "/translations"); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9c6fc30..43ca326 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -149,7 +149,7 @@ extern QDir lastMapDir; extern QDir vymInstallDir; #endif -extern QColor vymBlue; +extern QColor vymBlueColor; Main::Main(QWidget *parent) : QMainWindow(parent) { @@ -206,7 +206,7 @@ Main::Main(QWidget *parent) : QMainWindow(parent) // Explorer automagically opens up the URL // in the user's preferred browser. s = settings.value(p, "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe").toString(); -#elif defined(Q_OS_MACX) +#elif defined(Q_OS_MACOS) s = settings.value(p, "/usr/bin/open").toString(); #else s = settings.value(p, "xdg-open").toString(); @@ -217,7 +217,7 @@ Main::Main(QWidget *parent) : QMainWindow(parent) p = "/system/readerPDF"; #if defined(Q_OS_WIN) s = settings.value(p, "explorer").toString(); -#elif defined(Q_OS_MACX) +#elif defined(Q_OS_MACOS) s = settings.value(p, "/usr/bin/open").toString(); #else s = settings.value(p, "xdg-open").toString(); @@ -863,10 +863,6 @@ void Main::setupAPI() c = new Command("selectedBranch", Command::AnySel, Command::BranchPar); modelCommands.append(c); - c = new Command("selectID", Command::AnySel, Command::BoolPar); - c->addParameter(Command::StringPar, false, "Unique ID"); - modelCommands.append(c); - c = new Command("selectLatestAdded", Command::AnySel, Command::BoolPar); modelCommands.append(c); @@ -1277,6 +1273,10 @@ void Main::setupAPI() c->addParameter(Command::StringPar, false, "Name of flag"); branchCommands.append(c); + c = new Command("setBranchesLayout", Command::BranchSel); + c->addParameter(Command::StringPar, false, "Layout of branches in subtree"); + branchCommands.append(c); + c = new Command("setFrameAutoDesign", Command::BranchSel); c->addParameter(Command::BoolPar, false, useInnerFrameDesc); c->addParameter(Command::BoolPar, false, "Flag for using automatic frame design"); @@ -1336,6 +1336,10 @@ void Main::setupAPI() "Set if links of items should be visible for unselected items"); branchCommands.append(c); + c = new Command("setImagesLayout", Command::BranchSel); + c->addParameter(Command::StringPar, false, "Layout of images"); + branchCommands.append(c); + c = new Command("setNoteRichText", Command::BranchSel); c->addParameter(Command::StringPar, false, "Note of branch"); branchCommands.append(c); @@ -1925,7 +1929,7 @@ void Main::setupEditActions() // Shortcut to delete selection a = new QAction(tr("Delete Selection", "Edit menu"), this); -#if defined(Q_OS_MACX) +#if defined(Q_OS_MACOS) a->setShortcut(Qt::Key_Backspace); #else a->setShortcut(Qt::Key_Delete); @@ -2059,7 +2063,7 @@ void Main::setupEditActions() a = new QAction(QPixmap(":up-diagonal-right.png"), tr("Move branch diagonally up", "Edit menu"), this); -#if defined(Q_OS_MACX) +#if defined(Q_OS_MACOS) a->setShortcut(Qt::SHIFT | Qt::Key_PageUp); #else a->setShortcut(Qt::CTRL | Qt::Key_PageUp); @@ -2077,7 +2081,7 @@ void Main::setupEditActions() a = new QAction(QPixmap(":down-diagonal-left.png"), tr("Move branch diagonally down", "Edit menu"), this); -#if defined(Q_OS_MACX) +#if defined(Q_OS_MACOS) a->setShortcut(Qt::SHIFT | Qt::Key_PageDown); #else a->setShortcut(Qt::CTRL | Qt::Key_PageDown); @@ -2227,33 +2231,32 @@ void Main::setupEditActions() ADD_SHORTCUT switchboard.addSwitch("mapOpenUrl", shortcutScope, a, tag); addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(editOpenURL())); + connect(a, SIGNAL(triggered()), this, SLOT(openUrl())); actionListBranches.append(a); - actionOpenURL = a; + actionOpenUrl = a; - a = new QAction(tr("Open URL in new tab", "Edit menu"), this); - // a->setShortcut (Qt::CTRL+Qt::Key_U ); - switchboard.addSwitch("mapOpenUrlTab", shortcutScope, a, tag); - addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(editOpenURLTab())); - actionListBranches.append(a); - actionOpenURLTab = a; - - a = new QAction(tr("Open all URLs in subtree (including scrolled branches)", - "Edit menu"), - this); + a = new QAction(tr("Open all visible URLs in subtree", "Edit menu"), this); switchboard.addSwitch("mapOpenUrlsSubTree", shortcutScope, a, tag); addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(editOpenMultipleVisURLTabs())); + connect(a, SIGNAL(triggered()), this, SLOT(editOpenMultipleVisUrls())); actionListBranches.append(a); - actionOpenMultipleVisURLTabs = a; + actionOpenMultipleVisUrls = a; a = new QAction(tr("Open all URLs in subtree", "Edit menu"), this); - switchboard.addSwitch("mapOpenMultipleUrlTabs", shortcutScope, a, tag); + switchboard.addSwitch("mapOpenMultipleUrls", shortcutScope, a, tag); addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(editOpenMultipleURLTabs())); + connect(a, SIGNAL(triggered()), this, SLOT(editOpenMultipleUrls())); actionListBranches.append(a); - actionOpenMultipleURLTabs = a; + actionOpenMultipleUrls = a; + + a = new QAction(tr("Open all URLs in subtree in private mode", "Edit menu"), this); + if (settings.value("/mainwindow/showTestMenu", false).toBool()) { + switchboard.addSwitch("mapOpenMultipleUrls", shortcutScope, a, tag); + addAction(a); + connect(a, SIGNAL(triggered()), this, SLOT(editOpenMultipleUrlsPrivate())); + actionListBranches.append(a); + } + actionOpenMultipleUrlsPrivate = a; a = new QAction(QPixmap(), tr("Extract URLs from note", "Edit menu"), this); a->setShortcut(Qt::SHIFT | Qt::Key_N); @@ -3869,10 +3872,10 @@ void Main::setupContextMenus() branchLinksContextMenu = branchContextMenu->addMenu( tr("References (URLs, vymLinks, ...)", "Context menu name")); - branchLinksContextMenu->addAction(actionOpenURL); - branchLinksContextMenu->addAction(actionOpenURLTab); - branchLinksContextMenu->addAction(actionOpenMultipleVisURLTabs); - branchLinksContextMenu->addAction(actionOpenMultipleURLTabs); + branchLinksContextMenu->addAction(actionOpenUrl); + branchLinksContextMenu->addAction(actionOpenMultipleVisUrls); + branchLinksContextMenu->addAction(actionOpenMultipleUrls); + branchLinksContextMenu->addAction(actionOpenMultipleUrlsPrivate); branchLinksContextMenu->addAction(actionURLNew); branchLinksContextMenu->addAction(actionLocalURL); branchLinksContextMenu->addAction(actionGetURLsFromNote); @@ -4120,7 +4123,7 @@ void Main::setupToolbars() c = QColor::fromString("#aa00ff"); quickColors << c; // Purple c = QColor::fromString("#0000ff"); quickColors << c; // Blue c = QColor::fromString("#00aaff"); quickColors << c; // LightBlue - usingDarkTheme ? vymBlue = c : vymBlue = quickColors.count() - 2; + usingDarkTheme ? vymBlueColor = c : vymBlueColor = quickColors.count() - 2; c = QColor::fromString("#000000"); quickColors << c; // Black c = QColor::fromString("#444444"); quickColors << c; // Dark gray c = QColor::fromString("#aaaaaa"); quickColors << c; // Light gray @@ -4153,17 +4156,21 @@ void Main::setupToolbars() else addToolBar (colorsToolbar); - // Zoom - zoomToolbar = addToolBar(tr("View toolbar", "View Toolbar name")); - zoomToolbar->setObjectName("viewTB"); - zoomToolbar->addAction(actionTogglePresentationMode); - zoomToolbar->addAction(actionToggleHideTmpMode); - zoomToolbar->addAction(actionZoomIn); - zoomToolbar->addAction(actionZoomOut); - zoomToolbar->addAction(actionZoomReset); - zoomToolbar->addAction(actionCenterOn); - zoomToolbar->addAction(actionRotateCounterClockwise); - zoomToolbar->addAction(actionRotateClockwise); + // View transformations (shrink/grow/rotate) + viewTransformationsToolbar = addToolBar(tr("View toolbar", "View Toolbar name")); + viewTransformationsToolbar->setObjectName("viewTB"); + viewTransformationsToolbar->addAction(actionZoomIn); + viewTransformationsToolbar->addAction(actionZoomOut); + viewTransformationsToolbar->addAction(actionZoomReset); + viewTransformationsToolbar->addAction(actionCenterOn); + viewTransformationsToolbar->addAction(actionRotateCounterClockwise); + viewTransformationsToolbar->addAction(actionRotateClockwise); + + // Modified special view, e.g. presentation mode or temporary hiding of branches + limitedViewToolbar = addToolBar(tr("Limited view toolbar", "View Toolbar name")); + limitedViewToolbar->setObjectName("limitedViewTB"); + limitedViewToolbar->addAction(actionTogglePresentationMode); + limitedViewToolbar->addAction(actionToggleHideTmpMode); // Editors editorsToolbar = addToolBar(tr("Editors toolbar", "Editor Toolbar name")); @@ -4205,7 +4212,8 @@ void Main::setupToolbars() toolbarsMenu->addAction(editActionsToolbar->toggleViewAction()); toolbarsMenu->addAction(selectionToolbar->toggleViewAction()); toolbarsMenu->addAction(colorsToolbar->toggleViewAction()); - toolbarsMenu->addAction(zoomToolbar->toggleViewAction()); + toolbarsMenu->addAction(viewTransformationsToolbar->toggleViewAction()); + toolbarsMenu->addAction(limitedViewToolbar->toggleViewAction()); toolbarsMenu->addAction(modModesToolbar->toggleViewAction()); toolbarsMenu->addAction(referencesToolbar->toggleViewAction()); toolbarsMenu->addAction(editorsToolbar->toggleViewAction()); @@ -4218,12 +4226,13 @@ void Main::setupToolbars() toolbarStates[editActionsToolbar] = true; toolbarStates[selectionToolbar] = false; toolbarStates[colorsToolbar] = true; - toolbarStates[zoomToolbar] = true; + toolbarStates[viewTransformationsToolbar] = true; + toolbarStates[limitedViewToolbar] = false; toolbarStates[modModesToolbar] = false; - toolbarStates[referencesToolbar] = true; + toolbarStates[referencesToolbar] = false; toolbarStates[editorsToolbar] = false; toolbarStates[standardFlagsToolbar] = true; - toolbarStates[userFlagsToolbar] = true; + toolbarStates[userFlagsToolbar] = false; // Initialize toolbar visibilities and switch off presentation mode presentationMode = true; @@ -4731,6 +4740,7 @@ void Main::fileSave(VymModel *m) { fileSave(m, File::CompleteMap); } void Main::fileSaveAs(const File::SaveMode &savemode) { + std::cout << __func__ << " ok0" << std::endl; // FIXME-2 debugging VymModel *m = currentModel(); if (!m) return; @@ -4745,6 +4755,7 @@ void Main::fileSaveAs(const File::SaveMode &savemode) QString fn = QFileDialog::getSaveFileName( this, tr("Save map as"), lastMapDir.path(), filter, nullptr, QFileDialog::DontConfirmOverwrite); + std::cout << __func__ << " ok1" << std::endl; // FIXME-2 debugging if (!fn.isEmpty()) { // Check for existing file if (QFile(fn).exists()) { @@ -5272,17 +5283,44 @@ void Main::editCut() m->cut(); } -bool Main::openURL(const QString &url) // FIXME-3 settings for URL and PDF are not really any longer used, only fallback below +bool Main::openUrl(const QString &url, bool privateMode) // FIXME-3 settings for URL and PDF are not really any longer used, only fallback below { - if (url.isEmpty()) - return false; + if (url.isEmpty()) { + VymModel *m = currentModel(); + if (m) { + QString url = m->getUrl(); + if (url == "") + return false; + } else + return false; + } + + if (privateMode) { // FIXME-3 Currently only Firefox is supported to open private Urls + QString browser = settings.value( + "/system/readerUrlPrivate", + "/Applications/Firefox.app/Contents/MacOS/firefox").toString(); + QStringList args; + args << "--private-window"; + args << url; + if (!QProcess::startDetached(browser, args, QDir::currentPath())) { + // try to set path to browser + QMessageBox::warning( + 0, tr("Warning"), + tr("Couldn't find a viewer to open %1.\n").arg(url) + + tr("Please use Settings->") + + tr("Set application to open an URL")); + settingsURL(); + return false; + } + return true; + } // Use system settings to open file bool b = QDesktopServices::openUrl(QUrl(url, QUrl::TolerantMode)); if (b) return true; // Fallback to old vym method to open Url - QString browser = settings.value("/system/readerURL").toString(); + QString browser = settings.value("/system/readerUrl").toString(); QStringList args; args << url; if (!QProcess::startDetached(browser, args, QDir::currentPath(), @@ -5299,7 +5337,7 @@ bool Main::openURL(const QString &url) // FIXME-3 settings for URL and PDF are return true; } -void Main::openTabs(QStringList urls) +void Main::openTabs(QStringList urls, bool privateMode) { if (urls.isEmpty()) return; @@ -5307,41 +5345,22 @@ void Main::openTabs(QStringList urls) // Other browser, e.g. xdg-open // Just open all urls and leave it to the system to cope with it foreach (QString u, urls) - openURL(u); + openUrl(u, privateMode); } -void Main::editOpenURL() -{ - // Open new browser - VymModel *m = currentModel(); - if (m) { - QString url = m->getUrl(); - if (url == "") - return; - openURL(url); - } -} -void Main::editOpenURLTab() -{ - VymModel *m = currentModel(); - if (m) { - QStringList urls; - urls.append(m->getUrl()); - openTabs(urls); - } -} - -void Main::editOpenMultipleVisURLTabs(bool ignoreScrolled) +void Main::editOpenMultipleVisUrls(bool ignoreScrolled, bool privateMode) { VymModel *m = currentModel(); if (m) { QStringList urls; urls = m->getUrls(ignoreScrolled); - openTabs(urls); + openTabs(urls, privateMode); } } -void Main::editOpenMultipleURLTabs() { editOpenMultipleVisURLTabs(false); } +void Main::editOpenMultipleUrls() { editOpenMultipleVisUrls(false); } + +void Main::editOpenMultipleUrlsPrivate() { editOpenMultipleVisUrls(false, true); } void Main::editNote2URLs() { @@ -5956,7 +5975,7 @@ void Main::editDeleteSelection() m->deleteSelection(); } -void Main::editLoadImage() +void Main::editLoadImage() // FIXME-2 filter is not used { VymModel *m = currentModel(); if (m) { @@ -6546,6 +6565,8 @@ void Main::settingsMacroPath() fd.setNameFilters(filters); fd.setWindowTitle(vymName + " - " + tr("Load vym script")); fd.setAcceptMode(QFileDialog::AcceptOpen); + fd.show(); // FIXME-2 added to debug #146 + fd.activateWindow(); // FIXME-2 added to debug #146 if (fd.exec() == QDialog::Accepted) { if (macros.setPath( fd.selectedFiles().first())) @@ -6769,7 +6790,7 @@ void Main::windowToggleTaskEditor() } } -void Main::windowToggleSlideEditors() // FIXME-2 not ported yet like TreeEditor +void Main::windowToggleSlideEditors() { windowSetSlideEditorsVisibility(actionViewToggleSlideEditor->isChecked()); } @@ -7045,7 +7066,8 @@ void Main::updateActions() selectionToolbar->setEnabled(false); editorsToolbar->setEnabled(false); colorsToolbar->setEnabled(false); - zoomToolbar->setEnabled(false); + viewTransformationsToolbar->setEnabled(false); + limitedViewToolbar->setEnabled(false); modModesToolbar->setEnabled(false); referencesToolbar->setEnabled(false); standardFlagsToolbar->setEnabled(false); @@ -7066,7 +7088,8 @@ void Main::updateActions() selectionToolbar->setEnabled(true); editorsToolbar->setEnabled(true); colorsToolbar->setEnabled(true); - zoomToolbar->setEnabled(true); + viewTransformationsToolbar->setEnabled(true); + limitedViewToolbar->setEnabled(true); modModesToolbar->setEnabled(true); referencesToolbar->setEnabled(true); standardFlagsToolbar->setEnabled(true); @@ -7246,13 +7269,11 @@ void Main::updateActions() QString url; if (selti) url = selti->url(); if (url.isEmpty()) { - actionOpenURL->setEnabled(false); - actionOpenURLTab->setEnabled(false); + actionOpenUrl->setEnabled(false); actionGetConfluencePageDetails->setEnabled(false); } else { - actionOpenURL->setEnabled(true); - actionOpenURLTab->setEnabled(true); + actionOpenUrl->setEnabled(true); if (ConfluenceAgent::available()) actionGetConfluencePageDetails->setEnabled(true); else @@ -7321,7 +7342,7 @@ void Main::updateActions() standardFlagsMaster->setEnabled(false); userFlagsMaster->setEnabled(false); - actionOpenURL->setEnabled(false); + actionOpenUrl->setEnabled(false); actionOpenVymLink->setEnabled(false); actionOpenVymLinkBackground->setEnabled(false); actionDeleteVymLink->setEnabled(false); @@ -7383,7 +7404,8 @@ void Main::updateActions() selectionToolbar->setEnabled(false); editorsToolbar->setEnabled(false); colorsToolbar->setEnabled(false); - zoomToolbar->setEnabled(false); + viewTransformationsToolbar->setEnabled(false); + limitedViewToolbar->setEnabled(false); modModesToolbar->setEnabled(false); referencesToolbar->setEnabled(false); standardFlagsToolbar->setEnabled(false); @@ -7586,6 +7608,12 @@ void Main::testFunction1() //#include //qApp->setStyle(QStyleFactory::create("windowsvista")); + const char *s1 = "Foo"; + const char *s2 = "Foo"; + + qDebug() << strcmp(s1,s2); + return; + VymModel *m = currentModel(); if (m) { m->test(); @@ -7635,7 +7663,7 @@ void Main::helpDoc() docname = "vym.pdf"; QStringList searchList; -#if defined(Q_OS_MACX) +#if defined(Q_OS_MACOS) searchList << vymBaseDir.path() + "/doc"; #elif defined(Q_OS_WIN32) searchList << vymInstallDir.path() + "doc/" + docname; diff --git a/src/mainwindow.h b/src/mainwindow.h index 37ee69b..fd77089 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -174,14 +174,13 @@ class Main : public QMainWindow { public slots: void updateQueries(VymModel *); - bool openURL(const QString &url); - void openTabs(QStringList); - void editOpenURL(); - void editOpenURLTab(); + bool openUrl(const QString &url = "", bool privateMode = false); + void openTabs(QStringList, bool privateMode = false); private slots: - void editOpenMultipleVisURLTabs(bool ignoreScrolled = true); - void editOpenMultipleURLTabs(); + void editOpenMultipleVisUrls(bool ignoreScrolled = true, bool privateMode = false); + void editOpenMultipleUrls(); + void editOpenMultipleUrlsPrivate(); void editNote2URLs(); void editURL(); void editLocalURL(); @@ -467,7 +466,8 @@ class Main : public QMainWindow { QToolBar *selectionToolbar; QToolBar *editorsToolbar; QToolBar *colorsToolbar; - QToolBar *zoomToolbar; + QToolBar *viewTransformationsToolbar; + QToolBar *limitedViewToolbar; QToolBar *modModesToolbar; QToolBar *referencesToolbar; QToolBar *standardFlagsToolbar; @@ -506,10 +506,10 @@ class Main : public QMainWindow { QAction *actionExpandOneLevel; QAction *actionCollapseOneLevel; QAction *actionCollapseUnselected; - QAction *actionOpenURL; - QAction *actionOpenURLTab; - QAction *actionOpenMultipleVisURLTabs; - QAction *actionOpenMultipleURLTabs; + QAction *actionOpenUrl; + QAction *actionOpenMultipleVisUrls; + QAction *actionOpenMultipleUrls; + QAction *actionOpenMultipleUrlsPrivate; QAction *actionGetURLsFromNote; QAction *actionURLNew; QAction *actionLocalURL; diff --git a/src/mapdesign.cpp b/src/mapdesign.cpp index bdba73a..e473179 100644 --- a/src/mapdesign.cpp +++ b/src/mapdesign.cpp @@ -114,7 +114,7 @@ FIXME-3 currently not used template void ConfigList::setDefault( // MapDesign ///////////////////////////////////////////////////////////////// -MapDesign::MapDesign() // FIXME-1 add options to update styles when relinking (Triggers, Actors) +MapDesign::MapDesign() // FIXME-3 add options to update styles when relinking (Triggers, Actors) // Triggers: Never, DepthChanged, Always // Actors: Inner/Outer-Frames,Fonts,HeadingColor,Rotation Heading/Subtree, ... { diff --git a/src/mapeditor.cpp b/src/mapeditor.cpp index 2bedeae..3b5c232 100644 --- a/src/mapeditor.cpp +++ b/src/mapeditor.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -26,6 +27,7 @@ extern QString clipboardDir; extern QString clipboardFile; extern bool debug; extern QPrinter *printer; +extern QDir tmpVymDir; extern QMenu *branchContextMenu; extern QMenu *canvasContextMenu; @@ -1908,10 +1910,11 @@ void MapEditor::mousePressEvent(QMouseEvent *e) // FIXME-3 Drop down dialog, if // systemFlag clicked if (sysFlagName.contains("system-url") || sysFlagName.contains("system-jira") ) { - if (e->modifiers() & Qt::ControlModifier) - mainWindow->editOpenURLTab(); - else - mainWindow->editOpenURL(); + + // Open in private mode if ALT is pressed + mainWindow->openUrl( + model->getUrl(), + e->modifiers() & Qt::AltModifier); } else if (sysFlagName == "system-note") mainWindow->windowToggleNoteEditor(); else if (sysFlagName == "hideInExport") @@ -2652,7 +2655,19 @@ void MapEditor::dropEvent(QDropEvent *event) qDebug() << "-------------------------------------------"; } - if (event->mimeData()->hasUrls()) { + if (event->mimeData()->hasImage()) { + QImage image = qvariant_cast(event->mimeData()->imageData()); + QTemporaryFile tmpFile(tmpVymDir.path() + "/pasted-image-XXXXXX"); + tmpFile.setAutoRemove( false); // tmpFile is within tmpDir, removed automatically later + if (!tmpFile.open()) + QMessageBox::warning(0, tr("Warning"), + "Couldn't open tmpFile " + tmpFile.fileName()); + else { + image.save(tmpFile.fileName(), "PNG", 100); + model->loadImage(selbi, tmpFile.fileName()); + } + + } else if (event->mimeData()->hasUrls()) { // Try text representation first, which works on windows, but in // Linux only for https, not local images QString url = event->mimeData()->text(); diff --git a/src/texteditor.cpp b/src/texteditor.cpp index b3b838f..bfa2aa4 100644 --- a/src/texteditor.cpp +++ b/src/texteditor.cpp @@ -26,7 +26,8 @@ extern Settings settings; extern QFont fixedFont; extern QFont varFont; extern QString iconTheme; - +extern QColor vymForegroundColor; +extern QColor vymBaseColor; extern QAction *actionViewToggleNoteEditor; extern QString vymName; @@ -42,6 +43,7 @@ extern bool debug; TextEditor::TextEditor(const QString eName) // FEATURE #137 insert images with drag & drop // https://stackoverflow.com/questions/3254652/several-ways-of-placing-an-image-in-a-qtextedit { + //qDebug() << "TE::constr of " << eName; statusBar()->hide(); // Hide sizeGrip on default, which comes with statusBar editor = new QTextEdit(this); @@ -55,20 +57,20 @@ TextEditor::TextEditor(const QString eName) // FEATURE #137 insert images with connect(editor, SIGNAL(currentCharFormatChanged(const QTextCharFormat &)), this, SLOT(formatChanged(const QTextCharFormat &))); - // Don't show menubar per default - menuBar()->hide(); - // Load settings init (eName); setWindowIcon(QPixmap(":/vym-editor.png")); // Various states + richTextMode = false; blockChangedSignal = false; blockTextUpdate = false; setInactive(); editorName = "Text editor"; setEditorTitle(""); + + menuBar()->setNativeMenuBar(false); } TextEditor::~TextEditor() @@ -97,14 +99,31 @@ void TextEditor::init(const QString &scope) { shortcutScope = scope; + QString n = QString("/satellite/%1/").arg(shortcutScope); + colorRichTextEditorBackground = QColor::fromString( + settings.value(n + "colors/richTextEditorBackground", vymBaseColor.name()).toString()); + + colorRichTextForeground = QColor::fromString( + settings.value(n + "colors/richTextForeground", vymForegroundColor.name()).toString()); + + colorRichTextBackground = QColor::fromString( + settings.value(n + "colors/richTextBackground", vymBaseColor.name()).toString()); + + /* + qDebug() << "TE::init" << scope; + qDebug() << " TEBG=" << colorRichTextEditorBackground.name() << vymBaseColor.name(); + qDebug() << " RTFG=" << colorRichTextForeground.name() << vymForegroundColor.name(); + qDebug() << " RTBG=" << colorRichTextBackground.name(); + */ + // Toolbars setupFileActions(); setupEditActions(); setupFormatActions(); setupSettingsActions(); - QString n = QString("/satellite/%1/").arg(shortcutScope); restoreState(settings.value(n + "state", 0).toByteArray()); + filenameHint = ""; fixedFontInt = fixedFont; varFontInt = varFont; @@ -119,26 +138,12 @@ void TextEditor::init(const QString &scope) editor->setCurrentFont(varFontInt); } - // Default colors for RichText - QPixmap pix(16, 16); - colorRichTextEditorBackground.fromString( - settings.value(n + "colors/richTextEditorBackground", "#ffffff").toString()); - pix.fill(colorRichTextEditorBackground); - actionActiveEditorBGColor->setIcon(pix); - - - colorRichTextForeground.fromString( - settings.value(n + "colors/richTextForeground", "#000000").toString()); - pix.fill(colorRichTextForeground); - actionRichTextFGColor->setIcon(pix); - - colorRichTextBackground.fromString( - settings.value(n + "colors/richTextBackground", "#000000").toString()); - pix.fill(colorRichTextBackground); - actionRichTextBGColor->setIcon(pix); - // Default is PlainText actionFormatRichText->setChecked(false); + + // Hide RichText format actions on default + setRichTextMode(false); + clear(); } @@ -365,7 +370,7 @@ void TextEditor::setupFileActions() actionFileDeleteAll = a; } -void TextEditor::setupEditActions() // FIXME-2 Rework (default) toolbars and RT colors +void TextEditor::setupEditActions() { QString tag = tr("Texteditor", "Shortcuts"); QToolBar *editToolBar = addToolBar(tr("Edit Actions")); @@ -475,9 +480,11 @@ void TextEditor::setupFormatActions() connect(a, SIGNAL(triggered()), this, SLOT(toggleRichText())); formatMenu->addAction(a); fontHintsToolBar->addAction(a); - filledEditorActions << a; + //filledEditorActions << a; actionFormatRichText = a; + addToolBarBreak(); + fontToolBar = addToolBar(tr("Fonts", "toolbar in texteditor")); fontToolBar->setObjectName("noteEditorFontToolBar"); @@ -502,20 +509,24 @@ void TextEditor::setupFormatActions() formatMenu->addSeparator(); + addToolBarBreak(); + formatToolBar = addToolBar(tr("Format", "toolbar in texteditor")); formatToolBar->setObjectName("noteEditorFormatToolBar"); - QPixmap pix(16, 16); - pix.fill(editor->textColor()); - a = new QAction(pix, tr("&Text Color..."), this); + //QPixmap pix(16, 16); + //pix.fill(editor->textColor()); + //a = new QAction(pix, tr("&Text Color..."), this); + a = new QAction(tr("&Text Color..."), this); formatMenu->addAction(a); formatToolBar->addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(selectTextFGColor())); filledEditorRichTextActions << a; actionTextFGColor = a; - pix.fill(editor->textBackgroundColor()); - a = new QAction(pix, tr("&Text highlight color..."), this); + //pix.fill(editor->textBackgroundColor()); + //a = new QAction(pix, tr("&Text background color..."), this); + a = new QAction(tr("&Text background color..."), this); formatMenu->addAction(a); formatToolBar->addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(selectTextBGColor())); @@ -746,6 +757,7 @@ void TextEditor::editorChanged() void TextEditor::setRichText(const QString &t) { blockChangedSignal = true; + richTextMode = true; editor->setReadOnly(false); editor->setHtml(t); actionFormatRichText->setChecked(true); @@ -761,6 +773,7 @@ void TextEditor::setRichText(const QString &t) void TextEditor::setPlainText(const QString &t) { blockChangedSignal = true; + richTextMode = false; editor->setReadOnly(false); editor->setPlainText(t); @@ -769,7 +782,7 @@ void TextEditor::setPlainText(const QString &t) // Reset also text format QTextCharFormat textformat; - textformat.setForeground(qApp->palette().color(QPalette::WindowText)); + textformat.setForeground(vymForegroundColor); textformat.setFont(varFontInt); editor->setCurrentCharFormat(textformat); @@ -961,8 +974,6 @@ void TextEditor::toggleFonthint() void TextEditor::setRichTextMode(bool b) { - //qDebug() << "TE::setRichTextMode b=" << b; - actionFormatUseFixedFont->setEnabled(false); if (b) { setRichText(editor->toHtml()); @@ -972,9 +983,13 @@ void TextEditor::setRichTextMode(bool b) editor->setTextColor(colorRichTextForeground); editor->setTextBackgroundColor(colorRichTextBackground); editor->setTextCursor(cursor); - } else { setPlainText(editor->toPlainText()); + QTextCursor cursor = editor->textCursor(); + editor->selectAll(); + editor->setTextColor(qApp->palette().color(QPalette::WindowText)); + editor->setTextBackgroundColor(QColor::fromString("00000000")); + editor->setTextCursor(cursor); } emit textHasChanged(getVymText()); } @@ -1027,28 +1042,26 @@ void TextEditor::textSize(const QString &p) { editor->setFontPointSize(p.toInt() void TextEditor::selectTextFGColor() { - QColor col = QColorDialog::getColor(editor->textColor(), this); + QColor col = QColorDialog::getColor( + editor->textColor(), + this, + tr("Text color","TextEditor windows"), + QColorDialog::ShowAlphaChannel); if (!col.isValid()) return; editor->setTextColor(col); - /* - QPixmap pix( 16, 16 ); - pix.fill( col ); - actionTextColor->setIcon( pix ); - */ } void TextEditor::selectTextBGColor() { - QColor col = QColorDialog::getColor(editor->textBackgroundColor(), this); + QColor col = QColorDialog::getColor( + editor->textBackgroundColor(), + this, + tr("Text background color","TextEditor windows"), + QColorDialog::ShowAlphaChannel); if (!col.isValid()) return; editor->setTextBackgroundColor(col); - /* - QPixmap pix( 16, 16 ); - pix.fill( col ); - actionTextColor->setIcon( pix ); - */ } void TextEditor::textAlign(QAction *a) @@ -1169,6 +1182,11 @@ void TextEditor::updateActions() a->setEnabled(false); foreach (QAction* a, filledEditorRichTextActions) a->setEnabled(false); + + fontToolBar->hide(); + formatToolBar->hide(); + actionFormatUseFixedFont->setEnabled(false); + actionFormatRichText->setEnabled(false); return; } @@ -1185,6 +1203,17 @@ void TextEditor::updateActions() b = (state == filledEditor && actionFormatRichText->isChecked()) ? true : false; foreach (QAction* a, filledEditorRichTextActions) a->setEnabled(b); + + actionFormatRichText->setEnabled(true); + if (richTextMode) { + actionFormatUseFixedFont->setEnabled(false); // FIXME-3 Maybe even hide it in RT mode + fontToolBar->show(); + formatToolBar->show(); + } else { + actionFormatUseFixedFont->setEnabled(true); + fontToolBar->hide(); + formatToolBar->hide(); + } } void TextEditor::setState(EditorState s) @@ -1208,7 +1237,7 @@ void TextEditor::setState(EditorState s) else baseColor = colorRichTextEditorBackground; } else { - baseColor = p.color(QPalette::Base); + baseColor = vymBaseColor; } editor->setReadOnly(false); break; @@ -1233,7 +1262,11 @@ void TextEditor::updateState() void TextEditor::selectRichTextEditorBackgroundColor() { - QColor col = QColorDialog::getColor(colorRichTextEditorBackground, nullptr); + QColor col = QColorDialog::getColor( + colorRichTextEditorBackground, + nullptr, + tr("Text editor background color","TextEditor windows"), + QColorDialog::ShowAlphaChannel); if (!col.isValid()) return; colorRichTextEditorBackground = col; @@ -1244,13 +1277,21 @@ void TextEditor::selectRichTextEditorBackgroundColor() void TextEditor::selectRichTextForegroundColor() { - QColor col = QColorDialog::getColor(colorRichTextForeground, nullptr); + QColor col = QColorDialog::getColor( + colorRichTextForeground, + nullptr, + tr("Text editor default text color","TextEditor windows"), + QColorDialog::ShowAlphaChannel); setRichTextForegroundColor(col); } void TextEditor::selectRichTextBackgroundColor() { - QColor col = QColorDialog::getColor(colorRichTextBackground, nullptr); + QColor col = QColorDialog::getColor( + colorRichTextBackground, + nullptr, + tr("Text editor default text background color","TextEditor windows"), + QColorDialog::ShowAlphaChannel); setRichTextBackgroundColor(col); } diff --git a/src/texteditor.h b/src/texteditor.h index fb29cd2..0c13457 100644 --- a/src/texteditor.h +++ b/src/texteditor.h @@ -120,6 +120,8 @@ class TextEditor : public QMainWindow { bool blockChangedSignal; bool blockTextUpdate; // Set *while* textHasChanged is still being emitted + bool richTextMode; + QColor colorRichTextEditorBackground; QColor colorRichTextBackground; QColor colorRichTextForeground; diff --git a/src/version.h b/src/version.h index 09004fd..a75e733 100644 --- a/src/version.h +++ b/src/version.h @@ -1,15 +1,16 @@ #ifndef VERSION_H #define VERSION_H -#define __VYM_VERSION "2.9.577" -#define __VYM_BUILD_DATE "2025-06-24" +#define __VYM_VERSION "2.9.581" +#define __VYM_BUILD_DATE "2025-07-04" #define __VYM_NAME "VYMng" // FIXME "next generation" in in window title #define __VYM_HOME "http://www.insilmaril.de/vym" // //#define __VYM_CODE_QUALITY "Production" -//#define __VYM_CODE_QUALITY "*Experimental*" -#define __VYM_CODE_QUALITY "*Beta*" -#define __VYM_CODENAME "Beta release of upcoming 3.0.0" +#define __VYM_CODE_QUALITY "*Experimental*" +//#define __VYM_CODE_QUALITY "*Beta*" +//#define __VYM_CODENAME "Beta release of upcoming 3.0.0" +#define __VYM_CODENAME "Debug version of upcoming 33.0.0" #endif diff --git a/src/vymmodel.cpp b/src/vymmodel.cpp index 9a4756e..bf1d889 100644 --- a/src/vymmodel.cpp +++ b/src/vymmodel.cpp @@ -106,7 +106,7 @@ extern Settings settings; extern QTextStream vout; extern bool usingDarkTheme; -extern QColor vymBlue; +extern QColor vymBlueColor; uint VymModel::idLast = 0; // make instance @@ -3136,14 +3136,12 @@ void VymModel::shrinkSelectionSize() setScale(- 0.05, true); } -void VymModel::resetSelectionSize() // FIXME-3 missing saveState. Switch (back?) to autodesign? +void VymModel::resetSelectionSize() { - ImageItem *selii = getSelectedImage(); - if (selii) - setScale(1, false); + setScale(1, false); } -void VymModel::setBranchesLayout(const QString &s, BranchItem *bi) // FIXME-2 no saveState yet (save: positions, auto, layout!) +void VymModel::setBranchesLayout(const QString &s, BranchItem *bi) { // qDebug() << "VM::setBranchesLayout for " << headingText(bi) << s; QList selbis = getSelectedBranches(bi); @@ -3158,15 +3156,22 @@ void VymModel::setBranchesLayout(const QString &s, BranchItem *bi) // FIXME-2 n // Get layout from mapDesign layout = mapDesignInt->branchesContainerLayout(selbi->depth()); - if (bc->branchesContainerLayout() != layout) - bc->setBranchesContainerLayout(layout); } else { bc->branchesContainerAutoLayout = false; layout = Container::layoutFromString(s); - if (layout != Container::UndefinedLayout) - bc->setBranchesContainerLayout(layout); } - emitDataChanged(selbi); + if (bc->branchesContainerLayout() != layout && layout != Container::UndefinedLayout) { + QString bv = setBranchVar(bi); + QString uc = bv + "map.loadBranchReplace(\"UNDO_PATH\", b);"; + QString rc = bv + QString("b.setBranchesLayout (\"%1\")").arg(s); + QString com = QString("Set branches layout of %1 to %2").arg(getObjectName(bi), layout); + logAction(rc, com, __func__); + + saveState(uc, rc, com, bi); + + bc->setBranchesContainerLayout(layout); + emitDataChanged(selbi); + } } // Links might have been added or removed, Nested lists, etc... @@ -3182,24 +3187,33 @@ void VymModel::setBranchesLayout(const QString &s, BranchItem *bi) // FIXME-2 n } -void VymModel::setImagesLayout(const QString &s, BranchItem *bi) // FIXME-2 no saveState yet (save positions, too!) +void VymModel::setImagesLayout(const QString &s, BranchItem *bi) { BranchContainer *bc; QList selbis = getSelectedBranches(bi); foreach (BranchItem *selbi, selbis) { + Container::Layout layout; bc = selbi->getBranchContainer(); if (s == "Auto") { bc->imagesContainerAutoLayout = true; - bc->setImagesContainerLayout( - mapDesignInt->imagesContainerLayout(selbi->depth())); + layout = mapDesignInt->imagesContainerLayout(selbi->depth()); } else { bc->imagesContainerAutoLayout = false; - Container::Layout layout; layout = Container::layoutFromString(s); - if (layout != Container::UndefinedLayout) - bc->setImagesContainerLayout(layout); } - emitDataChanged(selbi); + + if (bc->imagesContainerLayout() != layout && layout != Container::UndefinedLayout) { + QString bv = setBranchVar(selbi); + QString uc = bv + "map.loadBranchReplace(\"UNDO_PATH\", b);"; + QString rc = bv + QString("b.setImagesLayout (\"%1\")").arg(s); + QString com = QString("Set images layout of %1 to %2").arg(getObjectName(selbi), s); + logAction(rc, com, __func__); + + saveState(uc, rc, com, selbi); + + bc->setImagesContainerLayout(layout); + emitDataChanged(selbi); + } } if (!selbis.isEmpty()) { @@ -5622,7 +5636,7 @@ void VymModel::processJiraTicket(QJsonObject jsobj) QString keyName = ji.key(); if (ji.isFinished()) { keyName = "(" + keyName + ")"; - colorSubtree (vymBlue, bi); + colorSubtree (vymBlueColor, bi); } setHeadingPlainText(keyName + ": " + ji.summary(), bi); @@ -5679,7 +5693,7 @@ void VymModel::processJiraJqlQuery(QJsonObject jsobj) QString keyName = ji.key(); if (ji.isFinished()) { keyName = "(" + keyName + ")"; - colorSubtree (vymBlue, bi2); + colorSubtree (vymBlueColor, bi2); } setHeadingPlainText(keyName + ": " + ji.summary(), bi2); @@ -6567,7 +6581,7 @@ MapDesign* VymModel::mapDesign() return mapDesignInt; } -void VymModel::applyDesign( // FIXME-1 Check handling of autoDesign option +void VymModel::applyDesign( // FIXME-2 Check handling of autoDesign option MapDesign::UpdateMode updateMode, BranchItem *bi) { @@ -7140,12 +7154,11 @@ void VymModel::downloadImage(const QUrl &url, BranchItem *bi) return; } - // FIXME-3 download img to tmpfile and delete after running script in - // mainWindow + // FIXME-4 delete tmp file of image download after running script QString script; - script += QString("m = vym.currentMap();m.selectID(\"%1\");") + script += QString("m = vym.currentMap();b = m.findBranchBySelection(\"%1\");") .arg(bi->getUuid().toString()); - script += QString("m.loadImage(\"$TMPFILE\");"); + script += QString("b.loadImage(\"$TMPFILE\");"); DownloadAgent *agent = new DownloadAgent(url); agent->setFinishedAction(this, script); diff --git a/test/start-internal-tests.sh b/test/start-internal-tests.sh index 6ca0f4b..296a4b2 100644 --- a/test/start-internal-tests.sh +++ b/test/start-internal-tests.sh @@ -1,15 +1,17 @@ #!/bin/bash -SRCDIR=test +SRCDIR=$PWD VYMTESTDIR=$(mktemp -d /tmp/vym-test-XXXX) -DEFAULTMAP=$SRCDIR/test/default.vym +DEFAULTMAP=$SRCDIR/test/maps/test-default.vym TESTMAP=$VYMTESTDIR/testmap.vym echo Copying $DEFAULTMAP to $TESTMAP cp $DEFAULTMAP $TESTMAP -vym -l -t -n test -R test/vym-selftest.vys $TESTMAP -geometry 768x576-0+0 & +echo "Copy ok. $PWD" +vym -l -t -n test -R test/vym-selftest.vys $TESTMAP #-geometry 768x576-0+0 & +#vym -l -t -n test -R test/vym-selftest.vys $TESTMAP -geometry 768x576-0+0 & #PID=$! diff --git a/test/vym-selftest.vys b/test/vym-selftest.vys index abb02c8..a26e83f 100644 --- a/test/vym-selftest.vys +++ b/test/vym-selftest.vys @@ -15,6 +15,7 @@ all_tests = [ "extrainfo", "frames", "history", + "layouts", "load_legacy_maps", "mapdesign", "modify_branches", @@ -35,7 +36,7 @@ not_yet_ported_tests = [ ]; tests = all_tests; -//tests = ["scrolling"]; +//tests = ["layouts"]; var verbosity = 0; @@ -49,7 +50,8 @@ var tests_failed = 0; var vymBaseDir = vym.vymBaseDir(); -var testDir = vymBaseDir + "/selftests"; +var testDirName = "selftests"; +var testDir = vymBaseDir + "/" + testDirName; var currentMapPath = "undefined." var testMapDefault = vymBaseDir + "/test/maps/test-default.vym"; var testMapFrames = vymBaseDir + "/test/maps/test-frames.vym"; @@ -827,6 +829,56 @@ function test_history() closeCurrentMap(); } +function test_layouts() +{ + heading("Layouts"); + + map = initMap(testMapDefault); + + // branchesContainerLayout + b = map.findBranchBySelection(main_A_string); + expect("Initial branches layout is vertical", b.getBranchesLayout(), "Vertical"); + + layout = "Horizontal"; + b.setBranchesLayout(layout); + expect(layout + " layout of branches in subtree", b.getBranchesLayout(), layout); + map.undo(); + b = map.findBranchBySelection(main_A_string); + expect("After undo layout of branches in subtree is Vertical", b.getBranchesLayout(), "Vertical"); + + map.redo(); + b = map.findBranchBySelection(main_A_string); + expect("After redo layout of branches in subtree is " + layout, b.getBranchesLayout(), layout); + + // imagesContainerLayout + b = map.findBranchBySelection(branch_0Aa_string); + n = b.imageCount(); + + success = b.loadImage(vymBaseDir + "/icons/vym.png"); + expect("loadImage() returns true for first image", success, true); + expect("Image count increased after for first image loading", b.imageCount(), n + 1); + + success = b.loadImage(vymBaseDir + "/icons/vym.png"); + expect("loadImage() returns true for second image", success, true); + expect("Image count increased after for second image loading", b.imageCount(), n + 2); + + expect("Initial images layout is grid", b.getImagesLayout(), "GridColumns"); + + layout = "Vertical"; + b.setImagesLayout(layout); + expect(layout + " layout of images", b.getImagesLayout(), layout); + + map.undo(); + b = map.findBranchBySelection(branch_0Aa_string); + expect("After undo layout of images is restored", b.getImagesLayout(), "GridColumns"); + + map.redo(); + b = map.findBranchBySelection(branch_0Aa_string); + expect("After redo layout of images is " + layout, b.getImagesLayout(), layout); + + closeCurrentMap(); +} + function test_load_legacy_maps() { heading("Load legacy maps"); @@ -1069,7 +1121,7 @@ function test_modify_images() success = b.loadImage(vymBaseDir + "/icons/vym.png"); expect("loadImage() returns true for existing image", success, true); - expect("Image cound increased after loading", b.imageCount(), n + 1); + expect("Image count increased after loading", b.imageCount(), n + 1); success = b.loadImage(vymBaseDir + "/foobar"); expect("loadImage() returns false for not existing image", success, false); @@ -1368,7 +1420,7 @@ function test_references() expect("setUrl: unset Url with empty string", main_A.getUrl(), ""); // Try to link to myself using a relative path - vl = "selftests/maps/current-map.vym"; + vl = testDirName + "/maps/current-map.vym"; main_A.setVymLink(vl); s = main_A.getVymLink(); expect("setVymLink returns absolute path", map.getFileDir() + "/" + vl, s); @@ -1742,6 +1794,7 @@ if (tests.includes("export")) { test_export(); } if (tests.includes("extrainfo")) { test_extrainfo(); } if (tests.includes("frames")) { test_frames(); } if (tests.includes("history")) { test_history(); } +if (tests.includes("layouts")) { test_layouts(); } if (tests.includes("load_legacy_maps")) { test_load_legacy_maps(); } if (tests.includes("mapdesign")) { test_mapdesign(); } if (tests.includes("modify_branches")) { test_modify_branches(); } -- 2.47.3