]> git.sven.stormbind.net Git - sven/vym.git/commitdiff
New upstream version 2.9.581 upstream/2.9.581
authorSven Hoexter <sven@stormbind.net>
Sun, 6 Jul 2025 08:51:21 +0000 (10:51 +0200)
committerSven Hoexter <sven@stormbind.net>
Sun, 6 Jul 2025 08:51:21 +0000 (10:51 +0200)
20 files changed:
CMakeLists.txt
README.md
demos/vym-contribute.vym
src/aboutdialog.cpp
src/branch-wrapper.cpp
src/branch-wrapper.h
src/export-confluence-dialog.cpp
src/export-firefox.cpp
src/file.cpp
src/main.cpp
src/mainwindow.cpp
src/mainwindow.h
src/mapdesign.cpp
src/mapeditor.cpp
src/texteditor.cpp
src/texteditor.h
src/version.h
src/vymmodel.cpp
test/start-internal-tests.sh
test/vym-selftest.vys

index 211d83417745a3d14b8b12bfe1aea9dfd3966356..3a41b39be1e852bf71d27675f97b4371ef3eb4cd 100644 (file)
@@ -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
index 0555db00130b3775a2e61882fe00a2df672a758d..a7d60f29cefc36f5bc467d39743383f8dfab9384 100644 (file)
--- 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
 ----------------------
index fe770e4038168a062a99fd4bbf6e83da7cccc728..c7001273fe5efff84163635605da8d511b41b410 100644 (file)
Binary files a/demos/vym-contribute.vym and b/demos/vym-contribute.vym differ
index 1442522c27080947c75ea713797c34b28c6aaed1..d3b765139e943ed1ead2bc9823c0ceffe8e9d154 100644 (file)
@@ -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(
-            "<style>a:link { color: " + vymBlue.name() + "; background-color: transparent;}</style>"
+            "<style>a:link { color: " + vymBlueColor.name() + "; background-color: transparent;}</style>"
             "<center><img src=\"" + iconPath + "vym-128x128.png\"></center>"
             "<h3><center>VYM - View Your Mind </h3>"
             "<p align=\"center\"> A tool to put the things you have got in your mind into a map.</p>"
index ea2f4983d9810ca49c2b808091352fd5f1dda173..367c7de853e65ade3274dfc57df0e2ea18f2b973 100644 (file)
@@ -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;
index aad33907ea27cf2087f04534d5110f23a3739c2f..394c7935950ecd6790d8fe125651cc04f101f4a2 100644 (file)
@@ -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);
index cd2f99be33e96262c5421b36e247db137e64bfb3..5c33837e30e094d77d21de032ddeddd681987205 100644 (file)
@@ -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; }
index 3e89e54642e39f74d9560e388b18f69ac9a1bf58..6289dbd8a28b4ae8fbba71e3f97fe557ad6fb2f4 100644 (file)
@@ -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;
     }
index 77e834c8defd1e4befc18c80bc983495752b4a00..c8f22d39b49cad2cd1eb102a41a4ff16d856bb80 100644 (file)
@@ -13,7 +13,7 @@
 #include <windows.h>
 #endif
 
-#if defined(Q_OS_MACX)
+#if defined(Q_OS_MACOS)
 #include "unistd.h"
 #endif
 
index 25139d866663b118dac2e90a7d5101c5f57d0175..86b86101af7bc0659a9a98b128349d55a62fbe96 100644 (file)
@@ -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");
index 9c6fc30d6dfe176698d7b6939dd7d68d89585cf9..43ca326819cae0527116cf7ee7a7dbba1c53495d 100644 (file)
@@ -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 <QStyleFactory>
     //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;
index 37ee69bbde7548dfabc9bbf5209674a3d01b9c4f..fd77089ff0b32ae4f6b69f52c7996fe493e65d18 100644 (file)
@@ -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;
index bdba73a477846f06a484767290cad53abd8e3737..e47317938cc19ac918336e24811598c7c6ef2e47 100644 (file)
@@ -114,7 +114,7 @@ FIXME-3 currently not used template <typename T> void ConfigList<T>::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, ...
 {
index 2bedeaede9532ea66cfea6eca7b57c68c9a629b1..3b5c232c1d529ef23070ee8f459990ab9f0ace2e 100644 (file)
@@ -3,6 +3,7 @@
 #include <QApplication>
 #include <QGraphicsProxyWidget>
 #include <QMenuBar>
+#include <QMessageBox>
 #include <QObject>
 #include <QPrintDialog>
 #include <QPrinter>
@@ -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<QImage>(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();
index b3b838f298b56a344e5d8c9af28f52f5a6f2a20e..bfa2aa4d7f50b8ddb65d5848aa1e53a2899b2503 100644 (file)
@@ -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);
 }
 
index fb29cd294787aed827367967614de1caf81e665f..0c13457fba2a565307f4f050876d995747039ece 100644 (file)
@@ -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;
index 09004fdcefd12b2293f09f6bb20f9ce20401aa4f..a75e7338bf3c01c71dbfd754c8606faa3c3e9749 100644 (file)
@@ -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
index 9a4756ef11cb658060c70dbde415df5a8a164e23..bf1d88974136ce4b903cdd007c2090ecaa217b85 100644 (file)
@@ -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<BranchItem *> 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<BranchItem *> 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);
index 6ca0f4b2c55443269f3a7a13fe75223e48ecf2a0..296a4b24d04d7afb329794850278f27701942cdd 100644 (file)
@@ -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=$!
 
index abb02c8c4cfb4c29c31920b9c249c6d5c583b00d..a26e83f416a222b9b51526439b6edc18cb2eb15c 100644 (file)
@@ -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(); }