]> git.sven.stormbind.net Git - sven/vym.git/commitdiff
New upstream version 3.0.0+git20260819 upstream upstream/3.0.0+git20260819-1
authorSven Hoexter <sven@stormbind.net>
Wed, 19 Aug 2026 12:37:55 +0000 (14:37 +0200)
committerSven Hoexter <sven@stormbind.net>
Wed, 19 Aug 2026 12:37:55 +0000 (14:37 +0200)
89 files changed:
.gitignore
CMakeLists.txt
README.md
demos/default-dark.vym
demos/default.vym
demos/frames.vym
demos/lifeforms.vym
demos/math.vym
demos/scripts/stats.vys [new file with mode: 0644]
demos/task-management.vym
demos/time-management.vym
demos/vym-contribute.vym
doc/vym.pdf
lang/vym_de.ts
macros/macros.vys
release-notes-3.0.md [new file with mode: 0644]
src/branch-container-base.cpp
src/branch-container.cpp
src/branch-container.h
src/branch-wrapper.cpp
src/branch-wrapper.h
src/branchitem.cpp
src/buildinfo.h [new file with mode: 0644]
src/buildinfo.h.in [new file with mode: 0644]
src/confluence-agent.cpp
src/container.cpp
src/container.h
src/debuginfo.cpp
src/export-base.cpp
src/export-base.h
src/export-html.cpp
src/export-impress.cpp
src/findcontrolswidget.cpp
src/findcontrolswidget.h
src/findresultwidget.cpp
src/findresultwidget.h
src/flag-container.cpp
src/flagrow-container.cpp
src/frame-container.cpp
src/git.h [new file with mode: 0644]
src/git.h.in [new file with mode: 0644]
src/heading-container.cpp
src/historywindow.cpp
src/historywindow.h
src/image-container.cpp
src/imageitem.cpp
src/itemlist-wrapper.cpp
src/itemlist-wrapper.h
src/link-container.cpp
src/linkobj.cpp
src/linkobj.h
src/main.cpp
src/mainwindow.cpp
src/mainwindow.h
src/mapeditor.cpp
src/mapeditor.h
src/misc.cpp
src/scripteditor.cpp
src/scriptoutput.cpp
src/scriptoutput.h
src/shortcuts.cpp
src/shortcuts.h
src/taskeditor.cpp
src/texteditor.cpp
src/texteditor.h
src/tmp-parent-container.cpp
src/treeeditor.cpp
src/version.h
src/vym-wrapper.cpp
src/vym-wrapper.h
src/vymmodel.cpp
src/vymmodel.h
src/vymmodelwrapper.cpp
src/vymmodelwrapper.h
src/xml-vym.cpp
src/zip-agent.cpp
src/zip-agent.h
styles/vym-dark.css [deleted file]
styles/vym.css
test/vym-selftest.vys
test/vym-test-legacy.rb
test/vym-test.rb
tex/icons/camera-photo.pdf [new file with mode: 0644]
tex/icons/converted-icons.txt [new file with mode: 0644]
tex/icons/edit-delete.pdf [new file with mode: 0644]
tex/icons/edit-find.pdf [new file with mode: 0644]
tex/icons/edit-find.svg [new file with mode: 0644]
tex/icons/formatrichtext.pdf [new file with mode: 0644]
tex/vym.tex

index d2f186c27f1b27bfd0d0dce636a0d8d2e1baf64d..2e6d22713212e56a75df702644cee58a36d6043f 100644 (file)
@@ -14,3 +14,6 @@ vym
 
 # Qt translation artifacts
 translations/*.qm
+
+# Temporary files
+tmp/
index f87dd744bf25d7f4d724974a63ab30fca359d32e..3055ba8c9cea41211d063a363d6dde18429245bc 100644 (file)
@@ -57,32 +57,101 @@ if (CMAKE_SYSTEM_NAME STREQUAL Linux)
     endif()
 endif()
 
-if(WIN32)
-    set(OPENSSL_ROOT_DIR "C:/OpenSSL-Win64")
-    find_package(OpenSSL)
 
-    if( OPENSSL_FOUND )
-        include_directories(${OPENSSL_INCLUDE_DIRS})
-        link_directories(${OPENSSL_LIBRARIES})
-        message(STATUS "vym: Using OpenSSL version: ${OPENSSL_VERSION}")
+# https://doc.qt.io/qt-6/qt-standard-project-setup.html
+find_package(Qt6 REQUIRED COMPONENTS Core)
+find_package(Qt6 COMPONENTS ${QtComponents} REQUIRED)
+
+# Build date
+string(TIMESTAMP BUILD_DATE_IN "%Y-%m-%d")
+add_compile_definitions(BUILD_DATE_IN="${BUILD_DATE_IN}")
+configure_file(
+    ${CMAKE_SOURCE_DIR}/src/buildinfo.h.in
+    ${CMAKE_SOURCE_DIR}/src/buildinfo.h)
+
+# Check if git is installed AND if we are inside a git repo, to get the
+# current branch and commit hash
+#
+# If not, fall back to use the default values in src/git.h.in
+#
+find_package (Git)
+if (GIT_FOUND)
+    message(STATUS "vym: found git ${GIT_EXECUTABLE} with version ${GIT_VERSION_STRING}")
+
+    execute_process(
+        COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_SOURCE_DIR} rev-parse --is-inside-work-tree
+        RESULT_VARIABLE RESULT
+        OUTPUT_VARIABLE GIT_REPO_FOUND)
+    string (STRIP ${GIT_REPO_FOUND} GIT_REPO_FOUND)
+
+    if (GIT_REPO_FOUND STREQUAL "true")
+        message(STATUS "vym: git repo found in ${CMAKE_SOURCE_DIR}")
+
+        execute_process(
+            COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_SOURCE_DIR} branch --show-current
+            RESULT_VARIABLE RESULT
+            OUTPUT_VARIABLE GIT_BRANCH)
+
+        execute_process(
+            COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_SOURCE_DIR} rev-parse --short HEAD
+            RESULT_VARIABLE RESULT
+            OUTPUT_VARIABLE GIT_COMMIT_HASH)
+
+        string (STRIP ${GIT_BRANCH} GIT_BRANCH)
+        string (STRIP ${GIT_COMMIT_HASH} GIT_COMMIT_HASH)
+
+        message(STATUS "vym: git branch: \"${GIT_BRANCH}\" - commit ${GIT_COMMIT_HASH}")
+
+        add_compile_definitions(
+            GIT_BRANCH="${GIT_BRANCH}"
+            GIT_COMMIT_HASH="${GIT_COMMIT_HASH}")
+
+        configure_file(${CMAKE_SOURCE_DIR}/src/git.h.in ${CMAKE_SOURCE_DIR}/src/git.h)
     else()
-        message(STATUS "vym: No openSSL found?!")
-        # Error; with REQUIRED, pkg_search_module() will throw an error by it's own
-    endif()
+        message(STATUS "vym: no git repo found in ${CMAKE_SOURCE_DIR}")
+        message(STATUS "vym: GIT_REPO_FOUND=${GIT_REPO_FOUND}")
+    endif ()
+endif ()
 
-    set(CMAKE_INSTALL_DATAROOTDIR ".")
- endif()
+# Translations
+#
+# To update the translation files based on source code changes
+# add the targest update_translations and release_translations
+#
+# See also (for Qt 6):
+# https://doc.qt.io/qt-6/qtlinguist-cmake-qt-add-lrelease.html
+# https://doc.qt.io/qt-6/qtlinguist-cmake-qt-add-translations.html
 
+file(GLOB ts_files RELATIVE ${CMAKE_SOURCE_DIR} "lang/*.ts")
 
-# https://doc.qt.io/qt-6/qt-standard-project-setup.html
-find_package(Qt6 REQUIRED COMPONENTS Core)
-qt_standard_project_setup( I18N_TRANSLATED_LANGUAGES
-    el cs_CZ de en es fr hr_HR ia it ja pt_BR ru sv zh_CN zh_TW
-) # FIXME add missing translations
+message(STATUS "vym: Creating ${CMAKE_BINARY_DIR}/translations")
+file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/translations")
 
-include(GNUInstallDirs)
+set_source_files_properties(${ts_files} PROPERTIES OUTPUT_LOCATION ${CMAKE_BINARY_DIR}/translations)
 
-find_package(Qt6 COMPONENTS ${QtComponents} REQUIRED)
+
+#qt_add_lrelease(target TS_FILES ${ts_files} QM_FILES_OUTPUT_VARIABLE ${CMAKE_BINARY_DIR}/translations) 
+
+message(STATUS "vym: Found Qt version: ${Qt6_VERSION}")
+
+if(Qt6_VERSION VERSION_GREATER_EQUAL 6.7)
+    qt_standard_project_setup( I18N_TRANSLATED_LANGUAGES
+        el cs_CZ de en es fr hr_HR ia it ja pt_BR ru sv zh_CN zh_TW
+    ) # FIXME add missing translations
+
+    qt_add_translations( vym
+        TS_FILE_DIR ${CMAKE_SOURCE_DIR}/lang    # TS_OUTPUT_DIRECTORY in Qt 6.9
+        RESOURCE_PREFIX ${CMAKE_BINARY_DIR}/translations
+        #QM_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/translations  # Only in Qt 6.9
+    )
+    # qm files will be created
+    # - for APPLE in # ${CMAKE_BINARY_DIR}/translations
+else()
+    # Fallback without translations for the time being
+    qt_standard_project_setup()
+endif()
+
+include(GNUInstallDirs)
 
 list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS "${CMAKE_SOURCE_DIR}/forms")
 
@@ -100,9 +169,9 @@ include_directories(
 # Source files
 file(GLOB VymSources RELATIVE ${CMAKE_SOURCE_DIR} "src/*.cpp")
 
-if(WIN32)
+if(WIN32) # FIXME still needed?
     list(APPEND VymSources
-        src/mkdtemp.cpp
+        #src/mkdtemp.cpp
         vym.rc
     )
     ADD_COMPILE_DEFINITIONS(_USE_MATH_DEFINES)
@@ -115,31 +184,9 @@ if(DBus1_FOUND)
     ADD_COMPILE_DEFINITIONS(VYM_DBUS)
 endif()
 
-# Translations
-#
-# To update the translation files based on source code changes
-# add the targest update_translations and release_translations
-#
-# See also (for Qt 6):
-# https://doc.qt.io/qt-6/qtlinguist-cmake-qt-add-lrelease.html
-
-file(GLOB ts_files RELATIVE ${CMAKE_SOURCE_DIR} "lang/*.ts")
-#message(STATUS "vym: Creating ${CMAKE_BINARY_DIR}/translations")
-
-#file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/translations")
-set_source_files_properties(${ts_files} PROPERTIES OUTPUT_LOCATION ${CMAKE_BINARY_DIR}/translations)
-
-qt_add_translations(TARGETS vym
-    TS_FILE_DIR ${CMAKE_SOURCE_DIR}/lang    # TS_OUTPUT_DIRECTORY in Qt 6.9
-    RESOURCE_PREFIX ${CMAKE_BINARY_DIR}/translations
-    #QM_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/translations  # Only in Qt 6.9
-)
-
-#qt_add_lrelease(target TS_FILES ${ts_files} QM_FILES_OUTPUT_VARIABLE ${CMAKE_BINARY_DIR}/translations) 
 
 add_compile_definitions(CMAKE_SOURCE_DIR)
 
-message(STATUS "vym: CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
 message(STATUS "vym: ts_files: ${ts_files}")
 message(STATUS "vym: qm_files: ${qm_files}")
 
@@ -170,7 +217,7 @@ else()
 endif()
 
 if(APPLE)
-    message(STATUS "vym: Detected APPLE")
+    message(STATUS "vym: Detected APPLE, preparing bundle:")
 
     set(MACOSX_BUNDLE_EXECUTABLE_NAME ${PROJECT_NAME})
 
@@ -184,12 +231,14 @@ if(APPLE)
         MACOSX_BUNDLE TRUE
     )
 
-    # Root paths to be copied to vym.app bundle (adjust if needed)
+    # Root paths from sources to be copied to vym.app bundle (adjust if needed)
     set(DIRLIST demos doc exports flags icons macros styles)
 
+    # Copy above directories from sources to bundle
+    set(RESOURCE_DIR "${CMAKE_BINARY_DIR}/vym.app/Contents/Resources")
     foreach(CURRENT_DIR ${DIRLIST})
         set(SOURCE_DIR "${CMAKE_SOURCE_DIR}/${CURRENT_DIR}")
-        set(RESOURCE_DIR "${CMAKE_BINARY_DIR}/vym.app/Contents/Resources/${CURRENT_DIR}")
+        set(TARGET_DIR "${RESOURCE_DIR}/${CURRENT_DIR}")
 
         # --- 1. Add all subdirectories of SOURCE to the include path ---
 
@@ -209,26 +258,27 @@ if(APPLE)
         # Add them to your target
         target_include_directories(vym PRIVATE ${INCLUDE_DIRS})
 
-        message(STATUS "CURRENT_DIR=${CURRENT_DIR}  includeDirs=${INCLUDE_DIRS}")
+        message(STATUS "CURRENT_DIR=${CURRENT_DIR}  includeDirs=${INCLUDE_DIRS}")
 
-        # --- 2. Copy SOURCE_DIR -> RESOURCE_DIR at build time ---
+        # --- 2. Copy SOURCE_DIR -> TARGET_DIR at build time ---
 
         add_custom_command(
             TARGET vym POST_BUILD
             COMMAND ${CMAKE_COMMAND} -E copy_directory
                     "${SOURCE_DIR}"
-                    "${RESOURCE_DIR}"
-            COMMENT "Copying SOURCE directory ${SOURCE_DIR} to RESOURCE directory ${RESOURCE_DIR}..."
+                    "${TARGET_DIR}"
+            COMMENT "Copying SOURCE directory ${SOURCE_DIR} to TARGET directory ${TARGET_DIR}..."
         )
     endforeach()
 
     # Finally copy generated translations to bundle
+    set(SOURCE_DIR "${CMAKE_BINARY_DIR}/translations")
+    set(TARGET_DIR "${RESOURCE_DIR}/translations")
     add_custom_command(
         TARGET vym POST_BUILD
-        COMMAND ${CMAKE_COMMAND} -E copy_directory
-                "${CMAKE_BINARY_DIR}/translations"
-                "${RESOURCE_DIR}"
-        COMMENT "Copying translations directory to RESOURCE directory ${RESOURCE_DIR}..."
+        COMMAND ${CMAKE_COMMAND} -E copy_directory "${SOURCE_DIR}" "${TARGET_DIR}"
+        # COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --blue "vym: Copying ${SOURCE_DIR} to ${TARGET_DIR}..."
+        COMMENT "Copying translations directory to TARGET directory ${TARGET_DIR}..."
     )
 endif()
 
index e3b6b1059d6e3e412c5c35ec66ea4ab71160595a..e4ea0aa19cb20ee674a5574452935c6096e82821 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-VYM - View Your Mind (c) 2004-2025 by Uwe Drechsel
+VYM - View Your Mind (c) 2004-2026 by Uwe Drechsel
 ==================================================
 
 About
index 2d5570045c1589a6c86e067649ab55bc0f39fca7..c22c515a004d49ed13643d970dc320dcb3a2177f 100644 (file)
Binary files a/demos/default-dark.vym and b/demos/default-dark.vym differ
index 545a3c99bb91552cab39d8eb0d79deb626d1fd72..d2d7b073b4398676aaec61114978c17f5c255150 100644 (file)
Binary files a/demos/default.vym and b/demos/default.vym differ
index d1d91e02e7a712e14c8d2263aed847b80bd71068..4dbd870eb35284258b6b4b9d7b50ba07250c3e8b 100644 (file)
Binary files a/demos/frames.vym and b/demos/frames.vym differ
index 9601d2b9c27a72d849160485fe56e0395fce1006..0c8c86aadec581ffe4f1e3ceee61c1c73c216f38 100644 (file)
Binary files a/demos/lifeforms.vym and b/demos/lifeforms.vym differ
index 873206340938336e2392ed3e96e1792dda8b6684..9419a8eda333bfc6217b32434a172551b4f27ddd 100644 (file)
Binary files a/demos/math.vym and b/demos/math.vym differ
diff --git a/demos/scripts/stats.vys b/demos/scripts/stats.vys
new file mode 100644 (file)
index 0000000..34c2e0d
--- /dev/null
@@ -0,0 +1,104 @@
+// VYM script to identify the size of subtrees in a big map
+//
+// The script will set two attributes for each branch:
+//  - stats_sum_subtree: the number of branches in the subtree of the branch
+//    (including itself) 
+//  - stats_percent_total: the percentage of branches in the
+//    subtree compared to the total number of branches in the map
+//
+// For leaf branches no attributes will be set, as they have no subtree. If you
+// want to set the percentage for leaf branches as well, set the variable
+// setAttributesForLeafBranches to true.
+//
+// The script will first clean up old data by removing the attributes if they
+// already exist. Then it will calculate the stats and set the attributes for
+// each branch.
+//
+// You can then use the TreeEditor to see the subtree sizes in the new attributes
+// 
+// Note: The script assumes that the map is not modified while it is running,
+// as it relies on the order of branches in the item list. If you modify the
+// map while the script is running, the results may be incorrect.
+
+function cleanupOldData() {
+    vym.print("Cleaning up old data, if available (" + il.count() + " items)");
+    counted = 0;
+    while (b = il.nextBranch() ) {
+        counted++;
+
+        vym.print (" - [" + (counted / sum_total * 100).toFixed(2) + "%]  Current branch: " + b.headingText());
+        a = ["stats_sum_subtree", "stats_percent_total"];
+        for (let s of a) {
+            if (b.hasAttributeWithKey(s)) {
+                vym.print ("   - Removing old attribute: " + s);
+                b.deleteAttribute(s);
+            }
+        }
+    }
+}
+
+function calculateStatsAndSetAttributes() {
+    vym.print("Setting attributes for " + sum_total + " branches");
+    last_depth = -1;
+    last_parent = null;
+    counted = 0;
+    percent_single_branch = (1 / sum_total).toFixed(1) + "%";
+
+    il.reset();
+    while (b = il.nextBranch() )
+    {
+        counted++;
+        vym.print (" - [" + (counted / sum_total * 100).toFixed(2) + "%]  Current branch: " + b.headingText());
+
+        // Determine type of movement
+        if (last_depth < 0) {
+            // vym.print ("   - First item");
+            last_depth = b.depth();
+            if (setAttributesForLeafBranches)
+                b.setAttribute("stats_percent_total", percent_single_branch);
+        } else if (b.parentBranch() == last_parent) {
+            // vym.print ("   - Same parent");
+            if (setAttributesForLeafBranches)
+                b.setAttribute("stats_percent_total", percent_single_branch);
+        } else if (b.depth() < last_depth) {
+            // vym.print ("   - Moved up");
+            n = 0;
+            for (i = 0; i < b.branchCount(); i++) {
+                c = b.branchAt(i);
+                if (!c) {
+                    vym.print ("     - No child at index " + i);
+                    continue;
+                }
+                // vym.print ("     - c " + c.headingText()); 
+                if (c.hasAttributeWithKey("stats_sum_subtree")) {
+                    n += c.attributeAsInt("stats_sum_subtree");
+                }
+            }
+            b.setAttribute("stats_sum_subtree", n + b.branchCount());
+            b.setAttribute("stats_percent_total", ((n + b.branchCount() + 1) / sum_total * 100).toFixed(1) + "%");
+        } else {
+            // vym.print ("   - Moved down");
+            if (setAttributesForLeafBranches)
+                b.setAttribute("stats_percent_total", percent_single_branch);
+        }
+
+        last_parent = b.parentBranch();
+
+        last_depth = b.depth();
+    }
+}
+
+vym.clearConsole();
+map = vym.currentMap();
+
+il = map.itemList();
+il.setModeBranches(true);
+
+setAttributesForLeafBranches = false;
+
+sum_total = il.count();
+
+cleanupOldData();
+
+calculateStatsAndSetAttributes();
+
index 2023e8a17054d25e65c0306cdeb4f55988e77f2a..496df571cb59d7ee2cb152200f1719596fccc996 100644 (file)
Binary files a/demos/task-management.vym and b/demos/task-management.vym differ
index b9ec08f2cdfddad9b78d6ffbd79cec0af4e33df7..4530495769027d1b22629bc6600dfbb1423ded72 100644 (file)
Binary files a/demos/time-management.vym and b/demos/time-management.vym differ
index c7001273fe5efff84163635605da8d511b41b410..25be5b8872a4fd518dcc345216b4ffd8547553ba 100644 (file)
Binary files a/demos/vym-contribute.vym and b/demos/vym-contribute.vym differ
index c276efe6bce1f164b135a7d325bcc62ae1eca860..e48586d776beaf3c325092e8f552766214a8a357 100644 (file)
Binary files a/doc/vym.pdf and b/doc/vym.pdf differ
index c0c571677cec49ff7c805b32988ef52bb54500b0..a20427c106a6fdec93fed98af9882c9f0065b14a 100644 (file)
@@ -4,19 +4,19 @@
 <context>
     <name>AboutDialog</name>
     <message>
-        <location filename="../src/aboutdialog.cpp" line="+141"/>
+        <location filename="../src/aboutdialog.cpp" line="141"/>
         <source>Credits</source>
         <comment>Help-&gt;About vym dialog</comment>
         <translation>Mitwirkende</translation>
     </message>
     <message>
-        <location line="+350"/>
+        <location filename="../src/aboutdialog.cpp" line="491"/>
         <source>License</source>
         <comment>Help-&gt;About vym dialog</comment>
         <translation>Lizenz</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/aboutdialog.cpp" line="496"/>
         <source>Ok</source>
         <comment>Ok Button</comment>
         <translation>Ok</translation>
 <context>
     <name>AboutTextBrowser</name>
     <message>
-        <location line="+21"/>
+        <location filename="../src/aboutdialog.cpp" line="517"/>
         <source>Please use Settings-&gt;</source>
         <translation>Bitte setzen sie einen Pfad in Einstellungen-&gt;</translation>
     </message>
     <message>
-        <location line="-3"/>
+        <location filename="../src/aboutdialog.cpp" line="514"/>
         <source>Warning</source>
         <comment>About window</comment>
         <translation>Warnung</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/aboutdialog.cpp" line="515"/>
         <source>Couldn&apos;t find a viewer to open %1.
 </source>
         <comment>About window</comment>
         <translation>Konnte kein Programm zum Ã–ffnen von %1 finden.</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/aboutdialog.cpp" line="518"/>
         <source>Set application to open an URL...</source>
         <translation>Anwendung zum Offnen einer URL...</translation>
     </message>
 <context>
     <name>ActionLogDialog</name>
     <message>
-        <location filename="../src/actionlog-dialog.cpp" line="+21"/>
+        <location filename="../src/actionlog-dialog.cpp" line="21"/>
         <source>Logfile settings</source>
         <comment>Dialog to set if and where logfile is used</comment>
         <translation>Log Einstellungen</translation>
     </message>
     <message>
-        <location line="+36"/>
+        <location filename="../src/actionlog-dialog.cpp" line="57"/>
         <source>Logfiles</source>
         <translation>Log Datein</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/actionlog-dialog.cpp" line="61"/>
         <source>Set path to logfile</source>
         <translation>Pfad zur Logdatei</translation>
     </message>
 <context>
     <name>BackgroundDialog</name>
     <message>
-        <location filename="../src/background-dialog.cpp" line="+22"/>
+        <location filename="../src/background-dialog.cpp" line="22"/>
         <source>Set background</source>
         <comment>Dialog to set background color or image</comment>
         <translation>Hintergrund Einstellungen</translation>
     </message>
     <message>
-        <location line="+27"/>
+        <location filename="../src/background-dialog.cpp" line="49"/>
         <source>Map backgroundcolor</source>
         <comment>Map background dialog</comment>
         <translation>Hintergrundfarbe</translation>
     </message>
     <message>
-        <location line="+28"/>
+        <location filename="../src/background-dialog.cpp" line="77"/>
         <source>Load background image</source>
         <translation>Hintergrundbild laden</translation>
     </message>
         <translation type="vanished">-</translation>
     </message>
     <message>
-        <location filename="../src/branchpropeditor.cpp" line="+22"/>
+        <location filename="../src/branchpropeditor.cpp" line="22"/>
         <source>Property Editor</source>
         <comment>Window caption</comment>
         <translation>Eigenschaften</translation>
     </message>
     <message>
-        <location line="+26"/>
+        <location filename="../src/branchpropeditor.cpp" line="48"/>
         <source>Name</source>
         <comment>Branchprop window: Attribute name</comment>
         <translation>Name</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/branchpropeditor.cpp" line="51"/>
         <source>Value</source>
         <comment>Branchprop window: Attribute value</comment>
         <translation>Wert</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/branchpropeditor.cpp" line="54"/>
         <source>Type</source>
         <comment>Branchprop window: Attribute type</comment>
         <translation>Typ</translation>
     </message>
     <message>
-        <location line="+241"/>
-        <location line="+6"/>
+        <location filename="../src/branchpropeditor.cpp" line="295"/>
+        <location filename="../src/branchpropeditor.cpp" line="301"/>
         <source>%1 days ago</source>
         <comment>task related times</comment>
         <translation>vor %1 Tagen</translation>
     </message>
     <message>
-        <location line="+12"/>
+        <location filename="../src/branchpropeditor.cpp" line="313"/>
         <source>sleeping %1 days</source>
         <comment>task related times</comment>
         <translation>Wiedervorlage in %1 Tagen</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/branchpropeditor.cpp" line="316"/>
         <source>Task is awake</source>
         <comment>task related times</comment>
         <translation>Aufgabe ist aktiv</translation>
     </message>
     <message>
-        <location line="+281"/>
+        <location filename="../src/branchpropeditor.cpp" line="597"/>
         <source>Frame border color</source>
         <comment>Branch property dialog</comment>
         <translation>Rahmenfarbe</translation>
     </message>
     <message>
-        <location line="+36"/>
+        <location filename="../src/branchpropeditor.cpp" line="633"/>
         <source>Color of frame background</source>
         <comment>Branch property dialog</comment>
         <translation>Hintergrundfarbe Rahmen</translation>
 <context>
     <name>ConfluenceAgent</name>
     <message>
-        <location filename="../src/confluence-agent.cpp" line="+390"/>
-        <location line="+74"/>
+        <location filename="../src/confluence-agent.cpp" line="390"/>
+        <location filename="../src/confluence-agent.cpp" line="464"/>
         <source>Update existing confluence page</source>
         <translation>Existierende Confluence Seite updaten</translation>
     </message>
     <message>
-        <location line="+563"/>
-        <location line="+75"/>
-        <location line="+29"/>
-        <location line="+89"/>
+        <location filename="../src/confluence-agent.cpp" line="1027"/>
+        <location filename="../src/confluence-agent.cpp" line="1102"/>
+        <location filename="../src/confluence-agent.cpp" line="1131"/>
+        <location filename="../src/confluence-agent.cpp" line="1220"/>
         <source>Warning</source>
         <translation>Warnung</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/confluence-agent.cpp" line="1221"/>
         <source>Authentication problem when contacting Confluence</source>
         <translation>Authentifizierungsproblem beim Versuch Confluence zu kontaktieren</translation>
     </message>
 <context>
     <name>ConfluenceSettingsDialog</name>
     <message>
-        <location filename="../src/confluence-settings-dialog.cpp" line="+12"/>
+        <location filename="../src/confluence-settings-dialog.cpp" line="12"/>
         <source>Confluence settings</source>
         <comment>Confluence settings dialog title</comment>
         <translation>Confluence Einstellungen</translation>
         <translation type="vanished">Dialog</translation>
     </message>
     <message>
-        <location filename="../src/confluence-userdialog.cpp" line="+13"/>
+        <location filename="../src/confluence-userdialog.cpp" line="13"/>
         <source>Find Confluence user</source>
         <comment>dialog window title</comment>
         <translation>Confluence Benutzer suchen</translation>
         <translation type="vanished">System Einstellungen für dunkles Design verwenden</translation>
     </message>
     <message>
-        <location filename="../src/darktheme-settings-dialog.cpp" line="+13"/>
+        <location filename="../src/darktheme-settings-dialog.cpp" line="13"/>
         <source>DarkThemeSettingsDialog dialog</source>
         <comment>dialog window title</comment>
         <translation>Dunkles Design Einstellungen</translation>
 <context>
     <name>DefaultMapSettingsDialog</name>
     <message>
-        <location filename="../src/default-map-settings-dialog.cpp" line="+58"/>
+        <location filename="../src/default-map-settings-dialog.cpp" line="58"/>
         <source>Set vym default map to be loaded on startup</source>
         <translation>Default map setzen, die beim Start geladen wird</translation>
     </message>
 <context>
     <name>DownloadAgent</name>
     <message>
-        <location filename="../src/download-agent.cpp" line="+188"/>
-        <location line="+4"/>
+        <location filename="../src/download-agent.cpp" line="188"/>
+        <location filename="../src/download-agent.cpp" line="192"/>
         <source>Warning</source>
         <translation>Warnung</translation>
     </message>
         <translation type="vanished">Abbrechen</translation>
     </message>
     <message>
-        <location filename="../src/export-html-dialog.cpp" line="+130"/>
+        <location filename="../src/export-html-dialog.cpp" line="130"/>
         <source>Warning</source>
         <translation>Warnung</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/export-html-dialog.cpp" line="131"/>
         <source>The settings saved in the map would like to run script:
 
 %1
@@ -584,7 +584,7 @@ want to allow this in your system!</source>
 Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
     </message>
     <message>
-        <location line="+21"/>
+        <location filename="../src/export-html-dialog.cpp" line="152"/>
         <source>VYM - Export HTML to directory</source>
         <translation>VYM - Exportiere HTML in Verzeichnis</translation>
     </message>
@@ -702,7 +702,7 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
 <context>
     <name>FindControlsWidget</name>
     <message>
-        <location filename="../src/findcontrolswidget.cpp" line="+26"/>
+        <location filename="../src/findcontrolswidget.cpp" line="26"/>
         <source>Find:</source>
         <comment>FindControlsWidget</comment>
         <translation>Suchen nach:</translation>
@@ -739,7 +739,7 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
         <translation type="vanished">Rückgängig</translation>
     </message>
     <message>
-        <location filename="../src/historywindow.cpp" line="+170"/>
+        <location filename="../src/historywindow.cpp" line="170"/>
         <source>Current state</source>
         <comment>Current bar in history hwindow</comment>
         <translation>Aktueller Zustand</translation>
@@ -753,19 +753,19 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
         <translation type="vanished">Zeit</translation>
     </message>
     <message>
-        <location line="-145"/>
+        <location filename="../src/historywindow.cpp" line="25"/>
         <source>Action</source>
         <comment>Table with actions</comment>
         <translation>Befehl</translation>
     </message>
     <message>
-        <location line="-3"/>
+        <location filename="../src/historywindow.cpp" line="22"/>
         <source>Comment</source>
         <comment>Table with actions</comment>
         <translation>Bemerkungen</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/historywindow.cpp" line="28"/>
         <source>Undo action</source>
         <comment>Table with actions</comment>
         <translation>Rückgängig</translation>
@@ -774,14 +774,14 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
 <context>
     <name>JiraAgent</name>
     <message>
-        <location filename="../src/jira-agent.cpp" line="+379"/>
-        <location line="+96"/>
+        <location filename="../src/jira-agent.cpp" line="379"/>
+        <location filename="../src/jira-agent.cpp" line="475"/>
         <source>Warning</source>
         <translation>Warnung</translation>
     </message>
     <message>
-        <location line="-95"/>
-        <location line="+96"/>
+        <location filename="../src/jira-agent.cpp" line="380"/>
+        <location filename="../src/jira-agent.cpp" line="476"/>
         <source>Authentication problem when contacting JIRA</source>
         <translation>Authentifizierungsproblem beim Versuch JIRA zu kontaktieren</translation>
     </message>
@@ -805,12 +805,12 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
         <translation type="vanished">Entfernen</translation>
     </message>
     <message>
-        <location filename="../src/jira-settings-dialog.cpp" line="+165"/>
+        <location filename="../src/jira-settings-dialog.cpp" line="165"/>
         <source>Email:</source>
         <translation>Email:</translation>
     </message>
     <message>
-        <location line="+23"/>
+        <location filename="../src/jira-settings-dialog.cpp" line="188"/>
         <source>Username:</source>
         <translation>Benutzername:</translation>
     </message>
@@ -828,7 +828,7 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
         <translation type="vanished">JIRA Einstellungen</translation>
     </message>
     <message>
-        <location line="-173"/>
+        <location filename="../src/jira-settings-dialog.cpp" line="15"/>
         <source>Jira settings</source>
         <comment>Jira settings dialog title</comment>
         <translation>Jira Einstellungen</translation>
@@ -845,12 +845,12 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
         <translation type="vanished">TextLabel</translation>
     </message>
     <message>
-        <location filename="../src/lineeditdialog.cpp" line="+16"/>
+        <location filename="../src/lineeditdialog.cpp" line="16"/>
         <source>Cancel</source>
         <translation>Abbrechen</translation>
     </message>
     <message>
-        <location line="-7"/>
+        <location filename="../src/lineeditdialog.cpp" line="9"/>
         <source>Ok</source>
         <translation>Ok</translation>
     </message>
@@ -862,12 +862,12 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
         <translation type="vanished">Dialog</translation>
     </message>
     <message>
-        <location filename="../src/lockedfiledialog.cpp" line="+7"/>
+        <location filename="../src/lockedfiledialog.cpp" line="7"/>
         <source>Delete lockfile</source>
         <translation>Lockdatei entfernen</translation>
     </message>
     <message>
-        <location line="-1"/>
+        <location filename="../src/lockedfiledialog.cpp" line="6"/>
         <source>Open readonly</source>
         <translation>Nur zum Lesen Ã¶ffnen</translation>
     </message>
@@ -875,17 +875,17 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
 <context>
     <name>Main</name>
     <message>
-        <location filename="../src/mainwindow.cpp" line="+2678"/>
+        <location filename="../src/mainwindow.cpp" line="2694"/>
         <source>Linkstyle Line</source>
         <translation>Verbindungsstil Linie</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location filename="../src/mainwindow.cpp" line="2708"/>
         <source>Linkstyle Thick Line</source>
         <translation>Verbindungsstil gefülltes Polygon</translation>
     </message>
     <message>
-        <location line="+33"/>
+        <location filename="../src/mainwindow.cpp" line="2741"/>
         <source>Set &amp;Link Color</source>
         <translation>&amp;Farbe der Verbindungen</translation>
     </message>
@@ -894,25 +894,25 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
         <translation type="vanished">&amp;Hintergrundfarbe</translation>
     </message>
     <message>
-        <location line="-2508"/>
+        <location filename="../src/mainwindow.cpp" line="217"/>
         <source>&amp;View</source>
         <translation>&amp;Ansicht</translation>
     </message>
     <message>
-        <location line="+5052"/>
-        <location line="+21"/>
+        <location filename="../src/mainwindow.cpp" line="5262"/>
+        <location filename="../src/mainwindow.cpp" line="5283"/>
         <source>Set application to open an URL</source>
         <translation>URLs Ã¶ffnen mit...</translation>
     </message>
     <message>
-        <location line="-571"/>
+        <location filename="../src/mainwindow.cpp" line="4738"/>
         <source>Overwrite</source>
         <translation>Überschreiben</translation>
     </message>
     <message>
-        <location line="-329"/>
-        <location line="+67"/>
-        <location line="+263"/>
+        <location filename="../src/mainwindow.cpp" line="4415"/>
+        <location filename="../src/mainwindow.cpp" line="4482"/>
+        <location filename="../src/mainwindow.cpp" line="4739"/>
         <source>Cancel</source>
         <translation>Abbrechen</translation>
     </message>
@@ -929,58 +929,56 @@ Bitte prüfen Sie, ob Sie das wirklich erlauben wollen!</translation>
         <translation type="vanished">Änderungen verwerfen</translation>
     </message>
     <message>
-        <location line="-407"/>
-        <location line="+395"/>
-        <location line="+35"/>
-        <location line="+8"/>
-        <location line="+70"/>
-        <location line="+7"/>
-        <location line="+671"/>
+        <location filename="../src/mainwindow.cpp" line="4350"/>
+        <location filename="../src/mainwindow.cpp" line="4726"/>
+        <location filename="../src/mainwindow.cpp" line="4761"/>
+        <location filename="../src/mainwindow.cpp" line="4771"/>
+        <location filename="../src/mainwindow.cpp" line="5492"/>
         <source>Critical Error</source>
         <translation>Kritischer Fehler</translation>
     </message>
     <message>
-        <location line="-1110"/>
+        <location filename="../src/mainwindow.cpp" line="4414"/>
         <source>Open anyway</source>
         <translation>Trotzdem Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="+3420"/>
+        <location filename="../src/mainwindow.cpp" line="7825"/>
         <source>Critcal error</source>
         <translation>Kritischer Fehler</translation>
     </message>
     <message>
-        <location line="-3353"/>
+        <location filename="../src/mainwindow.cpp" line="4481"/>
         <source>Create</source>
         <translation>Anlegen</translation>
     </message>
     <message>
-        <location line="+2123"/>
+        <location filename="../src/mainwindow.cpp" line="6584"/>
         <source>VYM -Information:</source>
         <translation>vym-Information:</translation>
     </message>
     <message>
-        <location line="-2038"/>
+        <location filename="../src/mainwindow.cpp" line="4571"/>
         <source>Load vym map</source>
         <translation>Lade vym Map</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="4577"/>
         <source>Import: Add vym map to selection</source>
         <translation>Import: Füge Map zu Auswahl hinzu</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="4581"/>
         <source>Import: Replace selection with vym map</source>
         <translation>Import: Ersetze Auswahl mit Map</translation>
     </message>
     <message>
-        <location line="-829"/>
+        <location filename="../src/mainwindow.cpp" line="3742"/>
         <source>Add</source>
         <translation>Hinzufügen</translation>
     </message>
     <message>
-        <location line="+663"/>
+        <location filename="../src/mainwindow.cpp" line="4410"/>
         <source>The map %1
 is already opened.Opening the same map in multiple editors may lead 
 to confusion when finishing working with vym.Do you want to</source>
@@ -990,7 +988,7 @@ zu bearbeiten kann beim Beenden von vym zu Verwirrung führen.
 Wollen Sie</translation>
     </message>
     <message>
-        <location line="+68"/>
+        <location filename="../src/mainwindow.cpp" line="4478"/>
         <source>This map does not exist:
   %1
 Do you want to create a new one?</source>
@@ -1003,147 +1001,146 @@ Wollen Sie eine neue anlegen?</translation>
         <translation type="vanished">%1 gespeichert</translation>
     </message>
     <message>
-        <location line="+265"/>
-        <location line="+84"/>
+        <location filename="../src/mainwindow.cpp" line="4737"/>
         <source>The file %1
 exists already. Do you want to</source>
         <translation>Die Datei %1 gibt es bereits.
 Wollen Sie sie Ã¼berschreiben?</translation>
     </message>
     <message>
-        <location line="+322"/>
+        <location filename="../src/mainwindow.cpp" line="5124"/>
         <source>The map %1 has been modified but not saved yet. Do you want to</source>
         <translation>Die Map %1 wurde geändert,
 aber noch nicht gespeichert. Wollen Sie </translation>
     </message>
     <message>
-        <location line="+376"/>
+        <location filename="../src/mainwindow.cpp" line="5493"/>
         <source>Couldn&apos;t open map %1</source>
         <translation>Konnte die Map %1 nicht Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="-2288"/>
+        <location filename="../src/mainwindow.cpp" line="3232"/>
         <source>Take care!</source>
         <comment>Standardflag</comment>
         <translation>Vorsicht!</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="3237"/>
         <source>Really?</source>
         <comment>Standardflag</comment>
         <translation>Wirklich?</translation>
     </message>
     <message>
-        <location line="-24"/>
+        <location filename="../src/mainwindow.cpp" line="3213"/>
         <source>This won&apos;t work!</source>
         <comment>Standardflag</comment>
         <translation>Das geht nicht!</translation>
     </message>
     <message>
-        <location line="+38"/>
+        <location filename="../src/mainwindow.cpp" line="3251"/>
         <source>Good</source>
         <comment>Standardflag</comment>
         <translation>Gut</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="3255"/>
         <source>Bad</source>
         <comment>Standardflag</comment>
         <translation>Schlecht</translation>
     </message>
     <message>
-        <location line="+47"/>
+        <location filename="../src/mainwindow.cpp" line="3302"/>
         <source>Time critical</source>
         <comment>Standardflag</comment>
         <translation>Zeitkritisch</translation>
     </message>
     <message>
-        <location line="-57"/>
+        <location filename="../src/mainwindow.cpp" line="3245"/>
         <source>Idea!</source>
         <comment>Standardflag</comment>
         <translation>Idee!</translation>
     </message>
     <message>
-        <location line="-373"/>
+        <location filename="../src/mainwindow.cpp" line="2868"/>
         <source>Windows</source>
         <comment>Mainwindow view shortcut groups</comment>
         <translation>Fenster</translation>
     </message>
     <message>
-        <location line="+84"/>
+        <location filename="../src/mainwindow.cpp" line="2952"/>
         <source>Script output</source>
         <comment>View action</comment>
         <translation>Skript Ausgabe</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2959"/>
         <source>History window</source>
         <comment>View action</comment>
         <translation>Verlaufsfenster</translation>
     </message>
     <message>
-        <location line="+307"/>
+        <location filename="../src/mainwindow.cpp" line="3270"/>
         <source>Important</source>
         <comment>Standardflag</comment>
         <translation>Wichtig</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="3275"/>
         <source>Unimportant</source>
         <comment>Standardflag</comment>
         <translation>Unwichtig</translation>
     </message>
     <message>
-        <location line="+15"/>
+        <location filename="../src/mainwindow.cpp" line="3290"/>
         <source>I like this</source>
         <comment>Standardflag</comment>
         <translation>Finde ich gut</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3293"/>
         <source>I do not like this</source>
         <comment>Standardflag</comment>
         <translation>Finde ich schlecht</translation>
     </message>
     <message>
-        <location line="-26"/>
+        <location filename="../src/mainwindow.cpp" line="3267"/>
         <source>Dangerous</source>
         <comment>Standardflag</comment>
         <translation>Gefährlich</translation>
     </message>
     <message>
-        <location line="+30"/>
+        <location filename="../src/mainwindow.cpp" line="3297"/>
         <source>This will help</source>
         <comment>Standardflag</comment>
         <translation>Das könnte helfen</translation>
     </message>
     <message>
-        <location line="+1605"/>
-        <location line="+82"/>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="4865"/>
+        <location filename="../src/mainwindow.cpp" line="4947"/>
+        <location filename="../src/mainwindow.cpp" line="4948"/>
         <source>Import</source>
         <translation>Importieren</translation>
     </message>
     <message>
-        <location line="-3299"/>
-        <location line="+6"/>
-        <location line="+4"/>
-        <location line="+4"/>
-        <location line="+5"/>
-        <location line="+23"/>
-        <location line="+8"/>
-        <location line="+13"/>
-        <location line="+7"/>
-        <location line="+36"/>
-        <location line="+5"/>
-        <location line="+5"/>
-        <location line="+5"/>
-        <location line="+1200"/>
+        <location filename="../src/mainwindow.cpp" line="1678"/>
+        <location filename="../src/mainwindow.cpp" line="1684"/>
+        <location filename="../src/mainwindow.cpp" line="1688"/>
+        <location filename="../src/mainwindow.cpp" line="1692"/>
+        <location filename="../src/mainwindow.cpp" line="1697"/>
+        <location filename="../src/mainwindow.cpp" line="1720"/>
+        <location filename="../src/mainwindow.cpp" line="1728"/>
+        <location filename="../src/mainwindow.cpp" line="1741"/>
+        <location filename="../src/mainwindow.cpp" line="1748"/>
+        <location filename="../src/mainwindow.cpp" line="1784"/>
+        <location filename="../src/mainwindow.cpp" line="1789"/>
+        <location filename="../src/mainwindow.cpp" line="1794"/>
+        <location filename="../src/mainwindow.cpp" line="1799"/>
+        <location filename="../src/mainwindow.cpp" line="3007"/>
         <source>(still experimental)</source>
         <translation>(noch experimentelle Funktion)</translation>
     </message>
     <message>
-        <location line="-1184"/>
+        <location filename="../src/mainwindow.cpp" line="1815"/>
         <source>&amp;Print</source>
         <translation>&amp;Drucken</translation>
     </message>
@@ -1152,77 +1149,76 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Exportieren als</translation>
     </message>
     <message>
-        <location line="+2990"/>
-        <location line="+473"/>
-        <location line="+21"/>
-        <location line="+367"/>
-        <location line="+1064"/>
-        <location line="+20"/>
-        <location line="+1085"/>
-        <location line="+240"/>
-        <location line="+175"/>
+        <location filename="../src/mainwindow.cpp" line="5259"/>
+        <location filename="../src/mainwindow.cpp" line="5280"/>
+        <location filename="../src/mainwindow.cpp" line="5647"/>
+        <location filename="../src/mainwindow.cpp" line="6723"/>
+        <location filename="../src/mainwindow.cpp" line="6743"/>
+        <location filename="../src/mainwindow.cpp" line="7839"/>
+        <location filename="../src/mainwindow.cpp" line="8079"/>
+        <location filename="../src/mainwindow.cpp" line="8254"/>
         <source>Warning</source>
         <translation>Warnung</translation>
     </message>
     <message>
-        <location line="-2971"/>
-        <location line="+21"/>
-        <location line="+2536"/>
+        <location filename="../src/mainwindow.cpp" line="5260"/>
+        <location filename="../src/mainwindow.cpp" line="5281"/>
+        <location filename="../src/mainwindow.cpp" line="7840"/>
         <source>Couldn&apos;t find a viewer to open %1.
 </source>
         <translation>Konnte kein Programm zum Ã–ffnen von %1 finden.</translation>
     </message>
     <message>
-        <location line="-2556"/>
-        <location line="+21"/>
-        <location line="+2536"/>
+        <location filename="../src/mainwindow.cpp" line="5261"/>
+        <location filename="../src/mainwindow.cpp" line="5282"/>
+        <location filename="../src/mainwindow.cpp" line="7841"/>
         <source>Please use Settings-&gt;</source>
         <translation>Bitte setzen sie einen Pfad in Einstellungen-&gt;</translation>
     </message>
     <message>
-        <location line="-2170"/>
+        <location filename="../src/mainwindow.cpp" line="5648"/>
         <source>Couldn&apos;t set sleep time to %1.
 </source>
         <translation>Konnte Wiedervorlage nicht setzen auf %1</translation>
     </message>
     <message>
-        <location line="+871"/>
-        <location line="+1300"/>
+        <location filename="../src/mainwindow.cpp" line="6531"/>
+        <location filename="../src/mainwindow.cpp" line="7842"/>
         <source>Set application to open PDF files</source>
         <translation>PDFs Ã¶ffnen mit</translation>
     </message>
     <message>
-        <location line="-4583"/>
+        <location filename="../src/mainwindow.cpp" line="3263"/>
         <source>Oh no!</source>
         <comment>Standardflag</comment>
         <translation>Oh nein!</translation>
     </message>
     <message>
-        <location line="-2977"/>
+        <location filename="../src/mainwindow.cpp" line="266"/>
         <source>Search results list</source>
         <comment>FindResultWidget</comment>
         <translation>Liste der Suchergebnisse</translation>
     </message>
     <message>
-        <location line="+3717"/>
+        <location filename="../src/mainwindow.cpp" line="4004"/>
         <source>File actions toolbar</source>
         <comment>Toolbar for file actions</comment>
         <translation>Datei Werkzeugleiste</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location filename="../src/mainwindow.cpp" line="4026"/>
         <source>Edit actions toolbar</source>
         <comment>Toolbar name</comment>
         <translation>Editieren Werkzeugleiste</translation>
     </message>
     <message>
-        <location line="-3712"/>
+        <location filename="../src/mainwindow.cpp" line="292"/>
         <source>Property Editor</source>
         <comment>PropertyEditor</comment>
         <translation>Eigenschaften</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="301"/>
         <source>History window</source>
         <comment>HistoryWidget</comment>
         <translation>Verlaufsfenster</translation>
@@ -1238,13 +1234,13 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Map Editor</translation>
     </message>
     <message>
-        <location line="-93"/>
+        <location filename="../src/mainwindow.cpp" line="209"/>
         <source>Text Editors</source>
         <comment>Shortcut group</comment>
         <translation>Text Editor</translation>
     </message>
     <message>
-        <location line="+77"/>
+        <location filename="../src/mainwindow.cpp" line="285"/>
         <source>Script output window</source>
         <translation>Script Ausgabe</translation>
     </message>
@@ -1254,55 +1250,55 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">&amp;Map</translation>
     </message>
     <message>
-        <location line="+1325"/>
+        <location filename="../src/mainwindow.cpp" line="1616"/>
         <source>&amp;Restore last session</source>
         <comment>Edit menu</comment>
         <translation>&amp;Letzte Session wiederherstellen</translation>
     </message>
     <message>
-        <location line="+29"/>
+        <location filename="../src/mainwindow.cpp" line="1645"/>
         <source>Save as default map</source>
         <comment>File menu</comment>
         <translation>Datei als standard map speichern</translation>
     </message>
     <message>
-        <location line="+44"/>
+        <location filename="../src/mainwindow.cpp" line="1696"/>
         <source>Import Dir...</source>
         <comment>Import Filters</comment>
         <translation>Verzeichnis importieren</translation>
     </message>
     <message>
-        <location line="+18"/>
+        <location filename="../src/mainwindow.cpp" line="1714"/>
         <source>Webpage (HTML)...</source>
         <comment>File export menu</comment>
         <translation>Webseite (HTML)</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="1719"/>
         <source>Confluence (HTML)...</source>
         <comment>File export menu</comment>
         <translation>Confluence (HTML)</translation>
     </message>
     <message>
-        <location line="+16"/>
+        <location filename="../src/mainwindow.cpp" line="1735"/>
         <source>Text (ASCII)...</source>
         <comment>File export menu</comment>
         <translation>Text (ASCII)</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="1740"/>
         <source>Text (Markdown)...</source>
         <comment>File export menu</comment>
         <translation>Text (Markdown)</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="1747"/>
         <source>Text with tasks</source>
         <comment>File export menu</comment>
         <translation>Text mit Aufgaben</translation>
     </message>
     <message>
-        <location line="+37"/>
+        <location filename="../src/mainwindow.cpp" line="1784"/>
         <source>CSV...</source>
         <translation>CSV...</translation>
     </message>
@@ -1311,84 +1307,84 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Attribut hinzufügen</translation>
     </message>
     <message>
-        <location line="+285"/>
+        <location filename="../src/mainwindow.cpp" line="2073"/>
         <source>&amp;Detach</source>
         <comment>Context menu</comment>
         <translation>Loslösen</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="2074"/>
         <source>Detach branch and use as mapcenter</source>
         <comment>Context menu</comment>
         <translation>Zweig loslösen und als Zentrum verwenden</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location filename="../src/mainwindow.cpp" line="2088"/>
         <source>Sort children backwards</source>
         <comment>Edit menu</comment>
         <translation>Unterzweige aufsteigend sortieren</translation>
     </message>
     <message>
-        <location line="+454"/>
+        <location filename="../src/mainwindow.cpp" line="2536"/>
         <source>Follow reference</source>
         <comment>Context menu</comment>
         <translation>Referenz folgen</translation>
     </message>
     <message>
-        <location line="+209"/>
+        <location filename="../src/mainwindow.cpp" line="2751"/>
         <source>Set &amp;Background color and image</source>
         <translation>Hintergrundfarbe und -bild setzen</translation>
     </message>
     <message>
-        <location line="+11"/>
+        <location filename="../src/mainwindow.cpp" line="2762"/>
         <source>Views</source>
         <comment>Mainwindow view shortcut groups</comment>
         <translation>Ansichten</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="2765"/>
         <source>Toggle mode to temporary hide parts</source>
         <comment>View action</comment>
         <translation>Teile temporär verbergen</translation>
     </message>
     <message>
-        <location line="+28"/>
+        <location filename="../src/mainwindow.cpp" line="2793"/>
         <source>Rotate clockwise</source>
         <comment>View action</comment>
         <translation>Rotieren im Uhrzeigersinn</translation>
     </message>
     <message>
-        <location line="+26"/>
+        <location filename="../src/mainwindow.cpp" line="2819"/>
         <source>Rotate view to selection</source>
         <comment>View action</comment>
         <translation>Ansicht rotieren zu Auswahl</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="2825"/>
         <source>Tree editor expand/collapse</source>
         <comment>Mainwindow view shortcut groups</comment>
         <translation>Baumeditor aus- und einklappen</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/mainwindow.cpp" line="2827"/>
         <source>Expand all branches</source>
         <comment>Edit menu</comment>
         <translation>Alle Zweige ausklappen</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="2835"/>
         <source>Expand one level</source>
         <comment>Edit menu</comment>
         <translation>Ausklappen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="2844"/>
         <source>Collapse one level</source>
         <comment>Edit menu</comment>
         <translation>Einklappen</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="2854"/>
         <source>Collapse unselected levels</source>
         <comment>Edit menu</comment>
         <translation>Nicht selektierte Ebenen einklappen</translation>
@@ -1399,43 +1395,43 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Unterzweige ausrollen</translation>
     </message>
     <message>
-        <location line="-742"/>
+        <location filename="../src/mainwindow.cpp" line="2112"/>
         <source>Grow selection</source>
         <comment>Edit menu</comment>
         <translation>Auswahl vergössern</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2119"/>
         <source>Shrink selection</source>
         <comment>Edit menu</comment>
         <translation>Auswahl verkleinern</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2126"/>
         <source>Reset selection size</source>
         <comment>Edit menu</comment>
         <translation>Grösse der Auswahl zurücksetzen</translation>
     </message>
     <message>
-        <location line="+453"/>
+        <location filename="../src/mainwindow.cpp" line="2579"/>
         <source>Toggle target...</source>
         <comment>Edit menu</comment>
         <translation>Ziel einschalten/ausschalten</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="2588"/>
         <source>Goto target...</source>
         <comment>Edit menu</comment>
         <translation>Gehe zu Ziel</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="2597"/>
         <source>Move to target...</source>
         <comment>Edit menu</comment>
         <translation>Verschiebe zu Ziel</translation>
     </message>
     <message>
-        <location line="+15"/>
+        <location filename="../src/mainwindow.cpp" line="2612"/>
         <source>Find duplicate URLs</source>
         <comment>Edit menu</comment>
         <translation>Doppelte URLs finden</translation>
@@ -1446,85 +1442,85 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Alle URLs im Unterbaum Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="-433"/>
+        <location filename="../src/mainwindow.cpp" line="2179"/>
         <source>Extract URLs from note</source>
         <comment>Edit menu</comment>
         <translation>Extrahiere URLs aus Notiz</translation>
     </message>
     <message>
-        <location line="+277"/>
+        <location filename="../src/mainwindow.cpp" line="2449"/>
         <source>Add timestamp</source>
         <comment>Edit menu</comment>
         <translation>Zeitstempel hinzufügen</translation>
     </message>
     <message>
-        <location line="-10"/>
+        <location filename="../src/mainwindow.cpp" line="2439"/>
         <source>Remove children</source>
         <comment>Edit menu</comment>
         <translation>Unterzweige entfernen</translation>
     </message>
     <message>
-        <location line="+361"/>
+        <location filename="../src/mainwindow.cpp" line="2807"/>
         <source>Center on selection</source>
         <comment>View action</comment>
         <translation>Zeige Auswahl</translation>
     </message>
     <message>
-        <location line="+1318"/>
+        <location filename="../src/mainwindow.cpp" line="4130"/>
         <source>Editors toolbar</source>
         <comment>Editor Toolbar name</comment>
         <translation>Werkzeugleiste Editoren</translation>
     </message>
     <message>
-        <location line="+13"/>
+        <location filename="../src/mainwindow.cpp" line="4143"/>
         <source>Modifier modes toolbar</source>
         <comment>Modifier Toolbar name</comment>
         <translation>Werkzeugleiste Modifizierer</translation>
     </message>
     <message>
-        <location line="-3908"/>
+        <location filename="../src/mainwindow.cpp" line="214"/>
         <source>E&amp;dit</source>
         <comment>Edit menu</comment>
         <translation>E&amp;dit</translation>
     </message>
     <message>
-        <location line="+2389"/>
+        <location filename="../src/mainwindow.cpp" line="2619"/>
         <source>Select previous</source>
         <comment>Edit menu</comment>
         <translation>vorherige Auswahl</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="2628"/>
         <source>Select next</source>
         <comment>Edit menu</comment>
         <translation>nächste Auswahl</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="2638"/>
         <source>Unselect all</source>
         <comment>Edit menu</comment>
         <translation>Nichts auswählen</translation>
     </message>
     <message>
-        <location line="+45"/>
+        <location filename="../src/mainwindow.cpp" line="2683"/>
         <source>Select default font</source>
         <comment>Branch attribute</comment>
         <translation>Default Zeichensatz auswählen</translation>
     </message>
     <message>
-        <location line="-2448"/>
+        <location filename="../src/mainwindow.cpp" line="219"/>
         <source>Toolbars</source>
         <comment>Toolbars overview in view menu</comment>
         <translation>Werkzeugleisten</translation>
     </message>
     <message>
-        <location line="+2767"/>
+        <location filename="../src/mainwindow.cpp" line="3006"/>
         <source>Toggle Presentation mode</source>
         <comment>View action</comment>
         <translation>Präsentationsmodus an/abschalten</translation>
     </message>
     <message>
-        <location line="-216"/>
+        <location filename="../src/mainwindow.cpp" line="2786"/>
         <source>Rotate counterclockwise</source>
         <comment>View action</comment>
         <translation>Rotieren gegen Uhrzeigersinn</translation>
@@ -1535,25 +1531,25 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Rotieren im Uhrzeigersinn</translation>
     </message>
     <message>
-        <location line="+114"/>
+        <location filename="../src/mainwindow.cpp" line="2900"/>
         <source>Tree editor</source>
         <comment>View action</comment>
         <translation>Baum Editor</translation>
     </message>
     <message>
-        <location line="+16"/>
+        <location filename="../src/mainwindow.cpp" line="2916"/>
         <source>Task editor</source>
         <comment>View action</comment>
         <translation>Aufgaben Editor</translation>
     </message>
     <message>
-        <location line="+15"/>
+        <location filename="../src/mainwindow.cpp" line="2931"/>
         <source>Slide editor</source>
         <comment>View action</comment>
         <translation>Folien Editor</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="2939"/>
         <source>Script editor</source>
         <comment>View action</comment>
         <translation>Skript Editor</translation>
@@ -1564,85 +1560,85 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Script Ausgabe</translation>
     </message>
     <message>
-        <location line="+71"/>
+        <location filename="../src/mainwindow.cpp" line="3014"/>
         <source>Next slide</source>
         <comment>View action</comment>
         <translation>Nächste Folie</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="3020"/>
         <source>Previous slide</source>
         <comment>View action</comment>
         <translation>Vorherige Folie</translation>
     </message>
     <message>
-        <location line="+173"/>
+        <location filename="../src/mainwindow.cpp" line="3193"/>
         <source>Map target</source>
         <comment>SystemFlag</comment>
         <translation>Ziel</translation>
     </message>
     <message>
-        <location line="+961"/>
+        <location filename="../src/mainwindow.cpp" line="4155"/>
         <source>Standard Flags toolbar</source>
         <comment>Standard Flag Toolbar</comment>
         <translation>Werkzeugleiste Standardflags</translation>
     </message>
     <message>
-        <location line="-936"/>
+        <location filename="../src/mainwindow.cpp" line="3218"/>
         <source>Status - ok,done</source>
         <comment>Standardflag</comment>
         <translation>Status - ok, erledigt</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="3222"/>
         <source>Status - work in progress</source>
         <comment>Standardflag</comment>
         <translation>Status - In Arbeit</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="3227"/>
         <source>Status - missing, not started</source>
         <comment>Standardflag</comment>
         <translation>Status - unvollständig, nicht begonnen</translation>
     </message>
     <message>
-        <location line="+72"/>
+        <location filename="../src/mainwindow.cpp" line="3299"/>
         <source>Call...</source>
         <comment>Standardflag</comment>
         <translation>Anrufen...</translation>
     </message>
     <message>
-        <location line="-19"/>
+        <location filename="../src/mainwindow.cpp" line="3280"/>
         <source>Very important!</source>
         <comment>Standardflag</comment>
         <translation>Sehr wichtig!</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="3285"/>
         <source>Very unimportant!</source>
         <comment>Standardflag</comment>
         <translation>Sehr unwichtig!</translation>
     </message>
     <message>
-        <location line="+23"/>
+        <location filename="../src/mainwindow.cpp" line="3308"/>
         <source>Rose</source>
         <comment>Standardflag</comment>
         <translation>Rose</translation>
     </message>
     <message>
-        <location line="-3"/>
+        <location filename="../src/mainwindow.cpp" line="3305"/>
         <source>Surprise!</source>
         <comment>Standardflag</comment>
         <translation>Überraschung!</translation>
     </message>
     <message>
-        <location line="-63"/>
+        <location filename="../src/mainwindow.cpp" line="3242"/>
         <source>Info</source>
         <comment>Standardflag</comment>
         <translation>Info</translation>
     </message>
     <message>
-        <location line="+264"/>
+        <location filename="../src/mainwindow.cpp" line="3506"/>
         <source>Check for release notes and updates</source>
         <comment>Settings action</comment>
         <translation>Release notes und Updates prüfen</translation>
@@ -1653,118 +1649,118 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Anwendung um Daten zu speichern (zip/unzip)</translation>
     </message>
     <message>
-        <location line="+192"/>
+        <location filename="../src/mainwindow.cpp" line="3698"/>
         <source>Download and show release notes</source>
         <comment>Help action</comment>
         <translation>Release Notes herunterladen und anzeigen</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="3702"/>
         <source>Check, if updates are available</source>
         <comment>Help action</comment>
         <translation>Prüfen, ob Updates verfügbar sind</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="3711"/>
         <source>Show keyboard macros</source>
         <comment>Help action</comment>
         <translation>Tatstur Makros anzeigen</translation>
     </message>
     <message>
-        <location line="+128"/>
+        <location filename="../src/mainwindow.cpp" line="3840"/>
         <source>XLinks</source>
         <comment>Menu for file actions</comment>
         <translation>XLinks</translation>
     </message>
     <message>
-        <location line="+882"/>
+        <location filename="../src/mainwindow.cpp" line="4804"/>
         <source>Untitled</source>
         <comment>Default name in FileSaveAs dialog</comment>
         <translation>unbenannt</translation>
     </message>
     <message>
-        <location line="+206"/>
-        <location line="+28"/>
+        <location filename="../src/mainwindow.cpp" line="4890"/>
+        <location filename="../src/mainwindow.cpp" line="4918"/>
         <source>Open %1 map</source>
         <translation>Öffne Map %1</translation>
     </message>
     <message>
-        <location line="+399"/>
+        <location filename="../src/mainwindow.cpp" line="5327"/>
         <source>Enter Url:</source>
         <translation>Url eingeben:</translation>
     </message>
     <message>
-        <location line="+1300"/>
+        <location filename="../src/mainwindow.cpp" line="6639"/>
         <source>unknown user</source>
         <comment>default name for map author in settings</comment>
         <translation>unbekannter Benutzer</translation>
     </message>
     <message>
-        <location line="+53"/>
+        <location filename="../src/mainwindow.cpp" line="6692"/>
         <source>Number of parents shown for a task:</source>
         <translation>Anzahl der Elternzweige, die bei Aufgabe gezeigt werden:</translation>
     </message>
     <message>
-        <location line="-1809"/>
+        <location filename="../src/mainwindow.cpp" line="4861"/>
         <source>Firefox Bookmarks</source>
         <translation>Firefox Lesezeichen</translation>
     </message>
     <message>
-        <location line="-4665"/>
+        <location filename="../src/mainwindow.cpp" line="213"/>
         <source>&amp;Map</source>
         <comment>Map menu</comment>
         <translation>&amp;Map</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="221"/>
         <source>Toggle window</source>
         <comment>Toggle visibility of editor windows overview in view menu</comment>
         <translation>Fenster zeigen</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/mainwindow.cpp" line="223"/>
         <source>Focus window</source>
         <comment>Toggle visibility of editor windows overview in view menu</comment>
         <translation>Fenster fokussieren</translation>
     </message>
     <message>
-        <location line="+1363"/>
+        <location filename="../src/mainwindow.cpp" line="1591"/>
         <source>File actions</source>
         <comment>MainWindow shortcut groups</comment>
         <translation>Datei Aktionen</translation>
     </message>
     <message>
-        <location line="+17"/>
+        <location filename="../src/mainwindow.cpp" line="1608"/>
         <source>&amp;Open...</source>
         <comment>File menu</comment>
         <translation>&amp;Öffnen...</translation>
     </message>
     <message>
-        <location line="+15"/>
+        <location filename="../src/mainwindow.cpp" line="1623"/>
         <source>Open Recent</source>
         <comment>File menu</comment>
         <translation>Zuletzt geöffnete Dateien</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="1626"/>
         <source>&amp;Clear</source>
         <comment>Clear recent files menu</comment>
         <translation>Liste leeren</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="1632"/>
         <source>&amp;Save...</source>
         <comment>File menu</comment>
         <translation>&amp;Speichern...</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="1640"/>
         <source>Save &amp;As...</source>
         <comment>File menu</comment>
         <translation>Speichern &amp;unter...</translation>
     </message>
     <message>
-        <location line="+11"/>
+        <location filename="../src/mainwindow.cpp" line="1658"/>
         <source>Import</source>
         <comment>File menu</comment>
         <translation>Importieren</translation>
@@ -1774,270 +1770,270 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">(noch experimentell)</translation>
     </message>
     <message>
-        <location line="+44"/>
+        <location filename="../src/mainwindow.cpp" line="1702"/>
         <source>Export</source>
         <comment>File menu</comment>
         <translation>Exportieren</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/mainwindow.cpp" line="1704"/>
         <source>Exports</source>
         <comment>MainWindow shortcut groups</comment>
         <translation>Exports</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/mainwindow.cpp" line="1706"/>
         <source>Repeat last export</source>
         <translation>Wiederhole letzten Export</translation>
     </message>
     <message>
-        <location line="+53"/>
+        <location filename="../src/mainwindow.cpp" line="1759"/>
         <source>Image%1</source>
         <comment>File export menu</comment>
         <translation>Bild %1</translation>
     </message>
     <message>
-        <location line="+47"/>
+        <location filename="../src/mainwindow.cpp" line="1806"/>
         <source>Map properties</source>
         <translation>Map Eigenschaften...</translation>
     </message>
     <message>
-        <location line="+17"/>
+        <location filename="../src/mainwindow.cpp" line="1823"/>
         <source>&amp;Close Map</source>
         <comment>File menu</comment>
         <translation>Schlie&amp;ßen</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="1830"/>
         <source>Exit</source>
         <comment>MainWindow shortcut groups</comment>
         <translation>B&amp;eenden</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="1831"/>
         <source>E&amp;xit</source>
         <comment>File menu</comment>
         <translation>B&amp;eenden</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="1837"/>
         <source>Miscellaneous</source>
         <comment>MainWindow shortcut groups</comment>
         <translation>Verschiedenes</translation>
     </message>
     <message>
-        <location line="+17"/>
+        <location filename="../src/mainwindow.cpp" line="1854"/>
         <source>Undo/Redo</source>
         <comment>MainWindow shortcut groups</comment>
         <translation>Rückgängig und Wiederholen</translation>
     </message>
     <message>
-        <location line="+1"/>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="1855"/>
+        <location filename="../src/mainwindow.cpp" line="1864"/>
         <source>&amp;Undo</source>
         <comment>Edit menu</comment>
         <translation>&amp;Rückgängig</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="1874"/>
         <source>&amp;Redo</source>
         <comment>Edit menu</comment>
         <translation>Wieder&amp;herstellen</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="1882"/>
         <source>Repeat last action</source>
         <comment>Edit menu</comment>
         <translation>Wiederhole letzte Aktion</translation>
     </message>
     <message>
-        <location line="+8"/>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="1890"/>
+        <location filename="../src/mainwindow.cpp" line="1899"/>
         <source>&amp;Copy</source>
         <comment>Edit menu</comment>
         <translation>&amp;Kopieren</translation>
     </message>
     <message>
-        <location line="+9"/>
-        <location line="+12"/>
+        <location filename="../src/mainwindow.cpp" line="1909"/>
+        <location filename="../src/mainwindow.cpp" line="1921"/>
         <source>Cu&amp;t</source>
         <comment>Edit menu</comment>
         <translation>&amp;Ausschneiden</translation>
     </message>
     <message>
-        <location line="+7"/>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="1929"/>
+        <location filename="../src/mainwindow.cpp" line="1939"/>
         <source>&amp;Paste</source>
         <comment>Edit menu</comment>
         <translation>Ein&amp;fügen</translation>
     </message>
     <message>
-        <location line="+11"/>
+        <location filename="../src/mainwindow.cpp" line="1951"/>
         <source>Delete Selection</source>
         <comment>Edit menu</comment>
         <translation>Entfernen</translation>
     </message>
     <message>
-        <location line="+11"/>
+        <location filename="../src/mainwindow.cpp" line="1962"/>
         <source>Add</source>
         <comment>MainWindow shortcut groups</comment>
         <translation>Hinzufügen</translation>
     </message>
     <message>
-        <location line="+11"/>
+        <location filename="../src/mainwindow.cpp" line="1973"/>
         <source>Add branch as child</source>
         <comment>Edit menu</comment>
         <translation>Neuer Zweig </translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="1982"/>
         <source>Add branch (insert)</source>
         <comment>Edit menu</comment>
         <translation>Neuen Zweig einfügen</translation>
     </message>
     <message>
-        <location line="+7"/>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="1989"/>
+        <location filename="../src/mainwindow.cpp" line="1997"/>
         <source>Add branch above</source>
         <comment>Edit menu</comment>
         <translation>Neuer Zweig - oben</translation>
     </message>
     <message>
-        <location line="+7"/>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2004"/>
+        <location filename="../src/mainwindow.cpp" line="2011"/>
         <source>Add branch below</source>
         <comment>Edit menu</comment>
         <translation>Neuer Zweig - unten</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2018"/>
         <source>Move</source>
         <comment>MainWindow shortcut groups</comment>
         <translation>Bewegen</translation>
     </message>
     <message>
-        <location line="+62"/>
+        <location filename="../src/mainwindow.cpp" line="2080"/>
         <source>Sort and display</source>
         <comment>MainWindow shortcut groups</comment>
         <translation>Sortieren und Anzeigen</translation>
     </message>
     <message>
-        <location line="+16"/>
+        <location filename="../src/mainwindow.cpp" line="2096"/>
         <source>Scroll branch</source>
         <comment>Edit menu</comment>
         <translation>Zweig einrollen</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="2106"/>
         <source>Unscroll branch and subtree</source>
         <comment>Edit menu</comment>
         <translation>Zweig und Unterzweige ausklappen</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="2111"/>
         <source>Geometry of items</source>
         <comment>MainWindow shortcut groups</comment>
         <translation>Geometrie von Objekten</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location filename="../src/mainwindow.cpp" line="2133"/>
         <source>Rotate subtree clockwise</source>
         <comment>Edit menu</comment>
         <translation>Rotiere Unterbaum im Uhrzeigersinn</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="2139"/>
         <source>Rotate subtree counter-clockwise</source>
         <comment>Edit menu</comment>
         <translation>Rotiere Unterbaum gegen Uhrzeigersinn</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="2147"/>
         <source>URLs</source>
         <comment>Shortcuts in references context menu</comment>
         <translation>URLs</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="2156"/>
         <source>Open all visible URLs in subtree</source>
         <comment>Edit menu</comment>
         <translation>Alle URLs im Unterbaum Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location filename="../src/mainwindow.cpp" line="2170"/>
         <source>Open all URLs in subtree in private mode</source>
         <comment>Edit menu</comment>
         <translation>Alle URLs in Unterbaum in privatem Modus Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="+39"/>
+        <location filename="../src/mainwindow.cpp" line="2209"/>
         <source>Connect</source>
         <comment>Connection shortcuts in MainWindow</comment>
         <translation>Verbindungen</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="2212"/>
         <source>Get data from Jira for subtree</source>
         <comment>Edit menu</comment>
         <translation>Daten von JIRA für Unterbaum holen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="2221"/>
         <source>Set Jira query</source>
         <comment>Edit menu</comment>
         <translation>Jira Suche setzen</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2228"/>
         <source>Get page name and details from Confluence</source>
         <comment>Edit menu</comment>
         <translation>Titel der Seite von Confluence Ã¼bernehmen</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="2236"/>
         <source>Get page name and details from Confluence for child pages</source>
         <comment>Edit menu</comment>
         <translation>Titel der Seiten in Unterbaum  von Confluence Ã¼bernehmen</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="2244"/>
         <source>vymlinks - linking maps</source>
         <comment>Shortcuts for vymLinks in MainWindow</comment>
         <translation>vym-Verbindungen zwischen Maps</translation>
     </message>
     <message>
-        <location line="+52"/>
+        <location filename="../src/mainwindow.cpp" line="2296"/>
         <source>Tasks</source>
         <comment>Shortcuts for tasks in MainWindow</comment>
         <translation>Aufgaben</translation>
     </message>
     <message>
-        <location line="+175"/>
+        <location filename="../src/mainwindow.cpp" line="2464"/>
         <source>Add image</source>
         <comment>Edit and context menus</comment>
         <translation>Bild hinzufügen</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2471"/>
         <source>Item properties</source>
         <comment>Dialog to edit properties of selected item</comment>
         <translation>Eigenschaften</translation>
     </message>
     <message>
-        <location line="+50"/>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2521"/>
+        <location filename="../src/mainwindow.cpp" line="2528"/>
         <source>Find...</source>
         <comment>Edit menu</comment>
         <translation>Suchen</translation>
     </message>
     <message>
-        <location line="-387"/>
+        <location filename="../src/mainwindow.cpp" line="2148"/>
         <source>Open URL</source>
         <comment>Edit menu</comment>
         <translation>URL Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="-1982"/>
+        <location filename="../src/mainwindow.cpp" line="150"/>
         <source>Main window</source>
         <comment>Shortcut scope</comment>
         <translation>Hauptfenster</translation>
@@ -2048,139 +2044,139 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">URL in neuen Tab Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="+1997"/>
+        <location filename="../src/mainwindow.cpp" line="2163"/>
         <source>Open all URLs in subtree</source>
         <comment>Edit menu</comment>
         <translation>Alle URLs in Unterbaum Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="+24"/>
+        <location filename="../src/mainwindow.cpp" line="2187"/>
         <source>Edit URL...</source>
         <comment>Edit menu</comment>
         <translation>URL editieren...</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location filename="../src/mainwindow.cpp" line="2201"/>
         <source>Use heading for URL</source>
         <comment>Edit menu</comment>
         <translation>Beschriftung als URL Ã¼bernehmen</translation>
     </message>
     <message>
-        <location line="+45"/>
+        <location filename="../src/mainwindow.cpp" line="2246"/>
         <source>Open linked map</source>
         <comment>Edit menu</comment>
         <translation>Verlinkte Map Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="+16"/>
+        <location filename="../src/mainwindow.cpp" line="2262"/>
         <source>Open all vym links in subtree</source>
         <comment>Edit menu</comment>
         <translation>Alle Verbindungen zu vym maps  in Unterbaum Ã¶ffnen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="2271"/>
         <source>Edit vym link...</source>
         <comment>Edit menu</comment>
         <translation>vym Verknüpfung editieren</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2278"/>
         <source>Delete vym link</source>
         <comment>Edit menu</comment>
         <translation>vym Verknüpfung löschen</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="2286"/>
         <source>Hide in exports</source>
         <comment>Edit menu</comment>
         <translation>In Export nicht anzeigen</translation>
     </message>
     <message>
-        <location line="-621"/>
+        <location filename="../src/mainwindow.cpp" line="1661"/>
         <source>Add map (insert)</source>
         <comment>Edit menu</comment>
         <translation>Map einfügen (An Selektion hinzufügen)</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="1669"/>
         <source>Add map (replace)</source>
         <comment>Edit menu</comment>
         <translation>Map einfügen (Selektion austauschen)</translation>
     </message>
     <message>
-        <location line="+754"/>
+        <location filename="../src/mainwindow.cpp" line="1649"/>
         <source>Save selection</source>
         <comment>Edit menu</comment>
         <translation>Auswahl speichern</translation>
     </message>
     <message>
-        <location line="-2195"/>
+        <location filename="../src/mainwindow.cpp" line="216"/>
         <source>F&amp;ormat</source>
         <comment>Format menu</comment>
         <translation>F&amp;ormat</translation>
     </message>
     <message>
-        <location line="+2423"/>
+        <location filename="../src/mainwindow.cpp" line="2655"/>
         <source>Pic&amp;k color</source>
         <comment>Edit menu</comment>
         <translation>Farbe &amp;übernehmen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="2664"/>
         <source>Color &amp;branch</source>
         <comment>Edit menu</comment>
         <translation>Zweig &amp;färben</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="2673"/>
         <source>Color sub&amp;tree</source>
         <comment>Edit menu</comment>
         <translation>&amp;Unterbaum färben</translation>
     </message>
     <message>
-        <location line="+52"/>
+        <location filename="../src/mainwindow.cpp" line="2725"/>
         <source>Hide link if object is not selected</source>
         <comment>Branch attribute</comment>
         <translation>Verbindung verbergen, falls Objekt nicht selektiert ist</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2732"/>
         <source>&amp;Use color of heading for link</source>
         <comment>Branch attribute</comment>
         <translation>&amp;Verbindungen haben Farbe der Beschriftungen</translation>
     </message>
     <message>
-        <location line="+68"/>
+        <location filename="../src/mainwindow.cpp" line="2800"/>
         <source>reset Zoom</source>
         <comment>View action</comment>
         <translation>Keine Vergrösserung</translation>
     </message>
     <message>
-        <location line="-28"/>
+        <location filename="../src/mainwindow.cpp" line="2772"/>
         <source>Zoom in</source>
         <comment>View action</comment>
         <translation>Vergrössern</translation>
     </message>
     <message>
-        <location line="-2434"/>
+        <location filename="../src/mainwindow.cpp" line="321"/>
         <source>Task list</source>
         <comment>TaskEditor</comment>
         <translation>Aufgabenliste</translation>
     </message>
     <message>
-        <location line="-44"/>
+        <location filename="../src/mainwindow.cpp" line="277"/>
         <source>Script Editor</source>
         <comment>ScriptEditor</comment>
         <translation>Skript Editor</translation>
     </message>
     <message>
-        <location line="+1387"/>
+        <location filename="../src/mainwindow.cpp" line="1677"/>
         <source>Firefox Bookmarks</source>
         <comment>Import filters</comment>
         <translation>Firefox Lesezeichen</translation>
     </message>
     <message>
-        <location line="+77"/>
+        <location filename="../src/mainwindow.cpp" line="1754"/>
         <source>Text (A&amp;O report)...</source>
         <comment>Export format</comment>
         <translation>Text (A&amp;O Format)</translation>
@@ -2190,13 +2186,13 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Eigenschaften</translation>
     </message>
     <message>
-        <location line="+261"/>
+        <location filename="../src/mainwindow.cpp" line="2019"/>
         <source>Move branch up</source>
         <comment>Edit menu</comment>
         <translation>Zweig nach oben bewegen</translation>
     </message>
     <message>
-        <location line="+12"/>
+        <location filename="../src/mainwindow.cpp" line="2031"/>
         <source>Move branch down</source>
         <comment>Edit menu</comment>
         <translation>Zweig nach unten bewegen</translation>
@@ -2212,7 +2208,7 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">vym-Verbindungen zwischen Maps</translation>
     </message>
     <message>
-        <location line="+224"/>
+        <location filename="../src/mainwindow.cpp" line="2255"/>
         <source>Open linked map in background tab</source>
         <comment>Edit menu</comment>
         <translation>Verbundene Map im Hintergrund Ã¶ffnen</translation>
@@ -2228,97 +2224,97 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Aufgaben</translation>
     </message>
     <message>
-        <location line="+42"/>
+        <location filename="../src/mainwindow.cpp" line="2297"/>
         <source>Toggle task</source>
         <comment>Edit menu</comment>
         <translation>Aufgabe einschalten/ausschalten</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="2307"/>
         <source>Cycle task status</source>
         <comment>Edit menu</comment>
         <translation>Aufgabenstatus weiterschalten</translation>
     </message>
     <message>
-        <location line="+18"/>
+        <location filename="../src/mainwindow.cpp" line="2325"/>
         <source>Reset sleep</source>
         <comment>Task sleep</comment>
         <translation>Aufgabe aufwecken</translation>
     </message>
     <message>
-        <location line="+11"/>
-        <location line="+20"/>
-        <location line="+10"/>
-        <location line="+10"/>
-        <location line="+10"/>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="2336"/>
+        <location filename="../src/mainwindow.cpp" line="2356"/>
+        <location filename="../src/mainwindow.cpp" line="2366"/>
+        <location filename="../src/mainwindow.cpp" line="2376"/>
+        <location filename="../src/mainwindow.cpp" line="2386"/>
+        <location filename="../src/mainwindow.cpp" line="2396"/>
         <source>Sleep %1 days</source>
         <comment>Task sleep</comment>
         <translation>Wiedervorlage in %1 Tagen</translation>
     </message>
     <message>
-        <location line="-50"/>
+        <location filename="../src/mainwindow.cpp" line="2346"/>
         <source>Sleep %1 day</source>
         <comment>Task sleep</comment>
         <translation>Wiedervorlage in %1 Tagen</translation>
     </message>
     <message>
-        <location line="+60"/>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="2406"/>
+        <location filename="../src/mainwindow.cpp" line="2416"/>
         <source>Sleep %1 weeks</source>
         <comment>Task sleep</comment>
         <translation>Wiedervorlage in %1 Wochen</translation>
     </message>
     <message>
-        <location line="+17"/>
+        <location filename="../src/mainwindow.cpp" line="2426"/>
         <source>Removing parts of a map</source>
         <comment>Shortcuts</comment>
         <translation>Teile einer Map entfernen</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="2430"/>
         <source>Remove only branch and keep its children </source>
         <comment>Edit menu</comment>
         <translation>Zweig entfernen und Unterzweige behalten</translation>
     </message>
     <message>
-        <location line="+18"/>
+        <location filename="../src/mainwindow.cpp" line="2448"/>
         <source>Various</source>
         <comment>Shortcuts</comment>
         <translation>Verschiedene</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="2458"/>
         <source>Map properties...</source>
         <comment>Edit menu</comment>
         <translation>Map Eigenschaften...</translation>
     </message>
     <message>
-        <location line="+59"/>
+        <location filename="../src/mainwindow.cpp" line="2517"/>
         <source>Selections</source>
         <comment>Shortcuts</comment>
         <translation>Auswahl</translation>
     </message>
     <message>
-        <location line="-2293"/>
+        <location filename="../src/mainwindow.cpp" line="215"/>
         <source>Select</source>
         <comment>Select menu</comment>
         <translation>Auswählen</translation>
     </message>
     <message>
-        <location line="+2374"/>
+        <location filename="../src/mainwindow.cpp" line="2605"/>
         <source>Goto linked map...</source>
         <comment>Edit menu</comment>
         <translation>Verlinkte Map Ã¶ffnen...</translation>
     </message>
     <message>
-        <location line="-78"/>
+        <location filename="../src/mainwindow.cpp" line="2520"/>
         <source>Search functions</source>
         <comment>Shortcuts</comment>
         <translation>Suchfunktionen</translation>
     </message>
     <message>
-        <location line="+123"/>
+        <location filename="../src/mainwindow.cpp" line="2650"/>
         <source>Formatting</source>
         <comment>Shortcuts</comment>
         <translation>Formattierung</translation>
@@ -2329,19 +2325,19 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Ansichten</translation>
     </message>
     <message>
-        <location line="+129"/>
+        <location filename="../src/mainwindow.cpp" line="2779"/>
         <source>Zoom out</source>
         <comment>View action</comment>
         <translation>Verkleinern</translation>
     </message>
     <message>
-        <location line="+90"/>
+        <location filename="../src/mainwindow.cpp" line="2869"/>
         <source>Note editor</source>
         <comment>View action</comment>
         <translation>Notiz Editor</translation>
     </message>
     <message>
-        <location line="+15"/>
+        <location filename="../src/mainwindow.cpp" line="2884"/>
         <source>Heading editor</source>
         <comment>View action</comment>
         <translation>Beschriftungs Editor</translation>
@@ -2356,19 +2352,19 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Alle</translation>
     </message>
     <message>
-        <location line="+299"/>
+        <location filename="../src/mainwindow.cpp" line="3187"/>
         <source>URL</source>
         <comment>SystemFlag</comment>
         <translation>URL</translation>
     </message>
     <message>
-        <location line="+973"/>
+        <location filename="../src/mainwindow.cpp" line="4161"/>
         <source>User Flags toolbar</source>
         <comment>user Flags Toolbar</comment>
         <translation>Werzeugleiste Benuzterflags</translation>
     </message>
     <message>
-        <location line="-901"/>
+        <location filename="../src/mainwindow.cpp" line="3259"/>
         <source>Hm...</source>
         <comment>Standardflag</comment>
         <translation>Hm...</translation>
@@ -2378,42 +2374,42 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">(experimentell)</translation>
     </message>
     <message>
-        <location line="-1524"/>
+        <location filename="../src/mainwindow.cpp" line="1727"/>
         <source>Firefox Bookmarks</source>
         <comment>File export menu</comment>
         <translation>Firefox Lesezeichen</translation>
     </message>
     <message>
-        <location line="+312"/>
+        <location filename="../src/mainwindow.cpp" line="2043"/>
         <source>Move branch diagonally up</source>
         <comment>Edit menu</comment>
         <translation>Zeig schräg nach oben bewegen</translation>
     </message>
     <message>
-        <location line="+15"/>
+        <location filename="../src/mainwindow.cpp" line="2058"/>
         <source>Move branch diagonally down</source>
         <comment>Edit menu</comment>
         <translation>Zweig schräg nach unten bewegen</translation>
     </message>
     <message>
-        <location line="-1815"/>
+        <location filename="../src/mainwindow.cpp" line="227"/>
         <source>&amp;Connect</source>
         <translation>Verbindungen</translation>
     </message>
     <message>
-        <location line="+2797"/>
+        <location filename="../src/mainwindow.cpp" line="3044"/>
         <source>Connect</source>
         <comment>Shortcuts</comment>
         <translation>Verbindungen</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="3048"/>
         <source>Get Confluence user data</source>
         <comment>Connect action</comment>
         <translation>Nutzer Infos von Confluence holen</translation>
     </message>
     <message>
-        <location line="+30"/>
+        <location filename="../src/mainwindow.cpp" line="3078"/>
         <source>Use modifier to select and reorder objects</source>
         <comment>Mode modifier</comment>
         <translation>Auswählen und Anordnen</translation>
@@ -2424,152 +2420,152 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Einfärben mit der Farbe eines anderen Zweiges</translation>
     </message>
     <message>
-        <location line="+31"/>
+        <location filename="../src/mainwindow.cpp" line="3109"/>
         <source>Use modifier to move branches without linking</source>
         <comment>Mode modifier</comment>
         <translation>Zweige bewegen ohne sie umzuhängen</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="3119"/>
         <source>Use modifier to move view without selecting</source>
         <comment>Mode modifier</comment>
         <translation>Ansicht verschieben ohne Zweige auszuwählen</translation>
     </message>
     <message>
-        <location line="+193"/>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="3312"/>
+        <location filename="../src/mainwindow.cpp" line="3318"/>
         <source>Important</source>
         <comment>Freemind flag</comment>
         <translation>Wichtig</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="3323"/>
         <source>Back</source>
         <comment>Freemind flag</comment>
         <translation>Zurück</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3326"/>
         <source>Forward</source>
         <comment>Freemind flag</comment>
         <translation>Vorwärts</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3329"/>
         <source>Look here</source>
         <comment>Freemind flag</comment>
         <translation>Schau hier</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3332"/>
         <source>Dangerous</source>
         <comment>Freemind flag</comment>
         <translation>Gefährlich</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3335"/>
         <source>Don&apos;t forget</source>
         <comment>Freemind flag</comment>
         <translation>Nicht vergessen</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3338"/>
         <source>Flag</source>
         <comment>Freemind flag</comment>
         <translation>Flag</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3341"/>
         <source>Home</source>
         <comment>Freemind flag</comment>
         <translation>Startseite</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3344"/>
         <source>Telephone</source>
         <comment>Freemind flag</comment>
         <translation>Telefon</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3347"/>
         <source>Music</source>
         <comment>Freemind flag</comment>
         <translation>Musik</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3350"/>
         <source>Mailbox</source>
         <comment>Freemind flag</comment>
         <translation>Briefkasten</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="3356"/>
         <source>Password</source>
         <comment>Freemind flag</comment>
         <translation>Passwort</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3359"/>
         <source>To be improved</source>
         <comment>Freemind flag</comment>
         <translation>Zu verbessern</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3362"/>
         <source>Stop</source>
         <comment>Freemind flag</comment>
         <translation>Stop</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3365"/>
         <source>Magic</source>
         <comment>Freemind flag</comment>
         <translation>Magie</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3368"/>
         <source>To be discussed</source>
         <comment>Freemind flag</comment>
         <translation>Zu Ã¼berlegen</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3371"/>
         <source>Reminder</source>
         <comment>Freemind flag</comment>
         <translation>Erinnerung</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3374"/>
         <source>Excellent</source>
         <comment>Freemind flag</comment>
         <translation>Ausgezeichnet</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3377"/>
         <source>Linux</source>
         <comment>Freemind flag</comment>
         <translation>Linux</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3380"/>
         <source>Sweet</source>
         <comment>Freemind flag</comment>
         <translation>Süß</translation>
     </message>
     <message>
-        <location line="+133"/>
+        <location filename="../src/mainwindow.cpp" line="3513"/>
         <source>Set author for new maps</source>
         <comment>Settings action</comment>
         <translation>Author für neue Maps angeben</translation>
     </message>
     <message>
-        <location line="+19"/>
+        <location filename="../src/mainwindow.cpp" line="3532"/>
         <source>Confluence Credentials</source>
         <comment>Settings action</comment>
         <translation>Confluence Zugangsdaten</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="3538"/>
         <source>JIRA Credentials</source>
         <comment>Settings action</comment>
         <translation>JIRA Zugangsdaten</translation>
@@ -2580,25 +2576,25 @@ aber noch nicht gespeichert. Wollen Sie </translation>
         <translation type="vanished">Pfad festlegen für Standardmap</translation>
     </message>
     <message>
-        <location line="+89"/>
+        <location filename="../src/mainwindow.cpp" line="3627"/>
         <source>Number of visible parents in task editor</source>
         <comment>Settings action</comment>
         <translation>Anzahl sichtbarer Elternzweige im Aufgaben Editor</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="3634"/>
         <source>Number of visible parents in find results window</source>
         <comment>Settings action</comment>
         <translation>Anzahl sichtbarer Elternzweige im Ergebnisfenster der Suche</translation>
     </message>
     <message>
-        <location line="+85"/>
+        <location filename="../src/mainwindow.cpp" line="3719"/>
         <source>Debug info</source>
         <comment>Option to show debugging info</comment>
         <translation>Infos zur Fehlersuche</translation>
     </message>
     <message>
-        <location line="+615"/>
+        <location filename="../src/mainwindow.cpp" line="4351"/>
         <source>Couldn&apos;t load default map:
 
 %1
@@ -2608,14 +2604,13 @@ vym will create an empty map now.</source>
         <translation>Konnte Standardmap nicht laden</translation>
     </message>
     <message>
-        <location line="+395"/>
+        <location filename="../src/mainwindow.cpp" line="4727"/>
         <source>Couldn&apos;t save %1,
 because file exists and cannot be changed.</source>
         <translation>Konnte %1 nicht speichern, da die Datei bereits existiert und nicht geändert werden darf.</translation>
     </message>
     <message>
-        <location line="+35"/>
-        <location line="+78"/>
+        <location filename="../src/mainwindow.cpp" line="4762"/>
         <source>Couldn&apos;t save %1,
 because of existing lockfile:
 
@@ -2631,47 +2626,47 @@ da die Lockdatei nicht angelegt werden konnte:
 </translation>
     </message>
     <message>
-        <location line="+883"/>
+        <location filename="../src/mainwindow.cpp" line="5698"/>
         <source>branches</source>
         <comment>Info about map</comment>
         <translation>Zweige</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="5705"/>
         <source>notes</source>
         <comment>Info about map</comment>
         <translation>Notizen</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="5706"/>
         <source>images</source>
         <comment>Info about map</comment>
         <translation>Bilder</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="5709"/>
         <source>slides</source>
         <comment>Info about map</comment>
         <translation>Folien</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/mainwindow.cpp" line="5711"/>
         <source>xLinks</source>
         <comment>Info about map</comment>
         <translation>Querverbindungen</translation>
     </message>
     <message>
-        <location line="+913"/>
+        <location filename="../src/mainwindow.cpp" line="6636"/>
         <source>Set author for new maps (used in lockfile)</source>
         <translation>Author für neue Maps angeben (zur Verwendung in Lockdatei)</translation>
     </message>
     <message>
-        <location line="+45"/>
+        <location filename="../src/mainwindow.cpp" line="6681"/>
         <source>Number of parents shown in find results:</source>
         <translation>Anzahl sichtbarer Elternzweige im Ergebnisfenster der Suche</translation>
     </message>
     <message>
-        <location line="-2394"/>
+        <location filename="../src/mainwindow.cpp" line="4319"/>
         <source>(readonly)</source>
         <translation>(nur lesen)</translation>
     </message>
@@ -2691,51 +2686,50 @@ da die Lockdatei nicht angelegt werden konnte:
         <translation type="vanished">Bild hinzufügen</translation>
     </message>
     <message>
-        <location line="-191"/>
+        <location filename="../src/mainwindow.cpp" line="4112"/>
         <source>View toolbar</source>
         <comment>View Toolbar name</comment>
         <translation>Werkzeugleiste ANsicht</translation>
     </message>
     <message>
-        <location line="+692"/>
+        <location filename="../src/mainwindow.cpp" line="4819"/>
         <source>Save map as new default map</source>
         <translation>
 Map als standard map speichern</translation>
     </message>
     <message>
-        <location line="+11"/>
         <source>You have no permissions to write to </source>
-        <translation>Keine Berechtigung zum Schreiben von</translation>
+        <translation type="vanished">Keine Berechtigung zum Schreiben von</translation>
     </message>
     <message>
         <source>Overwrite as new default map</source>
         <translation type="vanished">Als neue standard map Ã¼berschreiben</translation>
     </message>
     <message>
-        <location line="+87"/>
+        <location filename="../src/mainwindow.cpp" line="4864"/>
         <source>Import Firefox Bookmarks into new map</source>
         <translation>Importiere Firefox Lesezeichen in neue Map</translation>
     </message>
     <message>
-        <location line="+754"/>
+        <location filename="../src/mainwindow.cpp" line="5628"/>
         <source>Enter sleep time (number of days, hours with &apos;h&apos; or date YYYY-MM-DD or DD.MM[.YYYY]</source>
         <comment>task sleep time dialog</comment>
         <translation>Wiedervorlage (als Anzahl Tage oder als Datum: JJJJ-MM-TT oder  TT.MM[JJJJ])</translation>
     </message>
     <message>
-        <location line="+73"/>
+        <location filename="../src/mainwindow.cpp" line="5701"/>
         <source>tasks total</source>
         <comment>Info about map</comment>
         <translation>Aufgaben insgesamt</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="5704"/>
         <source>tasks in map</source>
         <comment>Info about map</comment>
         <translation>Aufgaben in Map</translation>
     </message>
     <message>
-        <location line="+851"/>
+        <location filename="../src/mainwindow.cpp" line="6567"/>
         <source>Load vym script</source>
         <translation>Script laden</translation>
     </message>
@@ -2744,13 +2738,13 @@ Map als standard map speichern</translation>
         <translation type="vanished">Default map setzen, die beim Start geladen wird</translation>
     </message>
     <message>
-        <location line="+157"/>
-        <location line="+20"/>
+        <location filename="../src/mainwindow.cpp" line="6724"/>
+        <location filename="../src/mainwindow.cpp" line="6744"/>
         <source>No SSL support available for this build of vym</source>
         <translation>SSL nicht unterstützt</translation>
     </message>
     <message>
-        <location line="+554"/>
+        <location filename="../src/mainwindow.cpp" line="7309"/>
         <source>Repeat last Export %1
 Format: %2 to
 %3</source>
@@ -2760,85 +2754,85 @@ Format: %2 nach
 %3</translation>
     </message>
     <message>
-        <location line="+53"/>
+        <location filename="../src/mainwindow.cpp" line="7362"/>
         <source>Branch</source>
         <comment>Context menu to follow links</comment>
         <translation>Zweig</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/mainwindow.cpp" line="7372"/>
         <source>Url</source>
         <comment>Context menu to follow links</comment>
         <translation>Url</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="7381"/>
         <source>Map</source>
         <comment>Context menu to follow links</comment>
         <translation>Map</translation>
     </message>
     <message>
-        <location line="+699"/>
+        <location filename="../src/mainwindow.cpp" line="8080"/>
         <source>Please allow vym to download release notes!</source>
         <translation>Bitte erlauben Sie vym die  Release-Anmerkungen herunterzuladen!</translation>
     </message>
     <message>
-        <location line="+58"/>
+        <location filename="../src/mainwindow.cpp" line="8138"/>
         <source>Allow</source>
         <translation>Erlauben</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="8139"/>
         <source>Do not allow</source>
         <translation>Nicht erlauben</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="8145"/>
         <source>Thank you for enabling downloads!</source>
         <translation>Danke für das Erlauben der Downloads!</translation>
     </message>
     <message>
-        <location line="+28"/>
+        <location filename="../src/mainwindow.cpp" line="8173"/>
         <source>Update information</source>
         <translation>Update Information</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="8177"/>
         <source>vym is up to date.</source>
         <comment>MainWindow</comment>
         <translation>vym ist auf dem neuesten Stand.</translation>
     </message>
     <message>
-        <location line="+48"/>
+        <location filename="../src/mainwindow.cpp" line="8225"/>
         <source>Checking for updates...</source>
         <comment>MainWindow</comment>
         <translation>Prüfen auf Updates...</translation>
     </message>
     <message>
-        <location line="+30"/>
+        <location filename="../src/mainwindow.cpp" line="8255"/>
         <source>Please allow vym to check for updates!</source>
         <translation>Bitte vym erlauben nach Updates zu sehen!</translation>
     </message>
     <message>
-        <location line="-5160"/>
+        <location filename="../src/mainwindow.cpp" line="3099"/>
         <source>Use modifier to draw xLinks</source>
         <comment>Mode modifier</comment>
         <translation>Modifizierer zum Anlegen von xLinks verwenden</translation>
     </message>
     <message>
-        <location line="+421"/>
+        <location filename="../src/mainwindow.cpp" line="3520"/>
         <source>Set application to open pdf files</source>
         <comment>Settings action</comment>
         <translation>pdf-Dateien Ã¶ffnen mit...</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="3527"/>
         <source>Set application to open external links</source>
         <comment>Settings action</comment>
         <translation>Anwendung zum Ã–ffnen externen Verweise</translation>
     </message>
     <message>
-        <location line="+67"/>
+        <location filename="../src/mainwindow.cpp" line="3594"/>
         <source>Select branch after adding it</source>
         <comment>Settings action</comment>
         <translation>Zweig nach dem Einfügen auswählen</translation>
@@ -2849,85 +2843,85 @@ Format: %2 nach
         <translation type="vanished">Beschriftung vor dem editieren auswählen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="3603"/>
         <source>Exclusive flags</source>
         <comment>Settings action</comment>
         <translation>Exklusive Flags</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="3610"/>
         <source>Use hide flags</source>
         <comment>Settings action</comment>
         <translation>Während des Exports das &quot;Verbergen&quot; Flag verwenden </translation>
     </message>
     <message>
-        <location line="+76"/>
+        <location filename="../src/mainwindow.cpp" line="3686"/>
         <source>&amp;Help</source>
         <comment>Help menubar entry</comment>
         <translation>&amp;Hilfe</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3689"/>
         <source>Open VYM Documentation (pdf) </source>
         <comment>Help action</comment>
         <translation>VYM Handbuch (pdf)</translation>
     </message>
     <message>
-        <location line="+38"/>
+        <location filename="../src/mainwindow.cpp" line="3727"/>
         <source>About VYM</source>
         <comment>Help action</comment>
         <translation>Über VYM</translation>
     </message>
     <message>
-        <location line="-4"/>
+        <location filename="../src/mainwindow.cpp" line="3723"/>
         <source>About QT</source>
         <comment>Help action</comment>
         <translation>Über QT</translation>
     </message>
     <message>
-        <location line="+35"/>
+        <location filename="../src/mainwindow.cpp" line="3759"/>
         <source>Remove</source>
         <comment>Context menu name</comment>
         <translation>Entfernen</translation>
     </message>
     <message>
-        <location line="+84"/>
+        <location filename="../src/mainwindow.cpp" line="3843"/>
         <source>Edit XLink</source>
         <comment>Context menu name</comment>
         <translation>xLink Ã¤ndern</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="3848"/>
         <source>Follow XLink</source>
         <comment>Context menu name</comment>
         <translation>XLink folgen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="3857"/>
         <source>Save image</source>
         <comment>Context action</comment>
         <translation>Speichere Bild</translation>
     </message>
     <message>
-        <location line="-2249"/>
+        <location filename="../src/mainwindow.cpp" line="1592"/>
         <source>&amp;New map</source>
         <comment>File menu</comment>
         <translation>Neue map</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="1601"/>
         <source>&amp;Copy to new map</source>
         <comment>File menu</comment>
         <translation>Kopieren in neue Map</translation>
     </message>
     <message>
-        <location line="+156"/>
+        <location filename="../src/mainwindow.cpp" line="1764"/>
         <source>PDF%1</source>
         <comment>File export menu</comment>
         <translation>PDF%1</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="1769"/>
         <source>SVG%1</source>
         <comment>File export menu</comment>
         <translation>SVG%1</translation>
@@ -2937,19 +2931,19 @@ Format: %2 nach
         <translation type="vanished">Letzten Export wiederholen (%1)</translation>
     </message>
     <message>
-        <location line="+192"/>
+        <location filename="../src/mainwindow.cpp" line="1965"/>
         <source>Add mapcenter</source>
         <comment>Canvas context menu</comment>
         <translation>Mapcenter hinzufügen</translation>
     </message>
     <message>
-        <location line="+116"/>
+        <location filename="../src/mainwindow.cpp" line="2081"/>
         <source>Sort children</source>
         <comment>Edit menu</comment>
         <translation>Unterzweige aufsteigend sortieren</translation>
     </message>
     <message>
-        <location line="+113"/>
+        <location filename="../src/mainwindow.cpp" line="2194"/>
         <source>Edit local URL...</source>
         <comment>Edit menu</comment>
         <translation>Lokale URL editieren</translation>
@@ -2960,17 +2954,17 @@ Format: %2 nach
         <translation type="vanished">Eigenschaften</translation>
     </message>
     <message>
-        <location line="+507"/>
+        <location filename="../src/mainwindow.cpp" line="2701"/>
         <source>Linkstyle Curve</source>
         <translation>Verbindungsstil Parabel</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location filename="../src/mainwindow.cpp" line="2715"/>
         <source>Linkstyle Thick Curve</source>
         <translation>Verbindungsstil Parabel</translation>
     </message>
     <message>
-        <location line="+31"/>
+        <location filename="../src/mainwindow.cpp" line="2746"/>
         <source>Set &amp;Selection Color</source>
         <translation>Farbe der Auswahlmarkierung</translation>
     </message>
@@ -2979,7 +2973,7 @@ Format: %2 nach
         <translation type="vanished">Hintergrundbild laden</translation>
     </message>
     <message>
-        <location line="+67"/>
+        <location filename="../src/mainwindow.cpp" line="2813"/>
         <source>Fit view to selection</source>
         <comment>View action</comment>
         <translation>Zeige Auwahl und vergrößere</translation>
@@ -2990,197 +2984,197 @@ Format: %2 nach
         <translation type="vanished">Verlaufsfenster</translation>
     </message>
     <message>
-        <location line="+167"/>
+        <location filename="../src/mainwindow.cpp" line="2984"/>
         <source>Antialiasing</source>
         <comment>View action</comment>
         <translation>Antialiasing</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="2991"/>
         <source>Smooth pixmap transformations</source>
         <comment>View action</comment>
         <translation>Weiche Bild Transformationen</translation>
     </message>
     <message>
-        <location line="+13"/>
+        <location filename="../src/mainwindow.cpp" line="3004"/>
         <source>Presentation mode</source>
         <comment>Mainwindow presentation shortcut groups</comment>
         <translation>Präsentations Modus</translation>
     </message>
     <message>
-        <location line="+23"/>
+        <location filename="../src/mainwindow.cpp" line="3027"/>
         <source>Navigation between maps</source>
         <comment>Mainwindow view shortcut groups</comment>
         <translation>Navigieren in Maps</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="3028"/>
         <source>Next Map</source>
         <comment>View action</comment>
         <translation>Nächste Map</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="3034"/>
         <source>Previous Map</source>
         <comment>View action</comment>
         <translation>Vorherige Map</translation>
     </message>
     <message>
-        <location line="+37"/>
+        <location filename="../src/mainwindow.cpp" line="3071"/>
         <source>Modifier modes</source>
         <comment>Shortcuts</comment>
         <translation>Tasten Modifizierer</translation>
     </message>
     <message>
-        <location line="+18"/>
+        <location filename="../src/mainwindow.cpp" line="3089"/>
         <source>Use modifier to pick color from another branch</source>
         <comment>Mode modifier</comment>
         <translation>Verwende Modifizierer um Farbe eines anderen Zweiges zu erhalten</translation>
     </message>
     <message>
-        <location line="+44"/>
+        <location filename="../src/mainwindow.cpp" line="3133"/>
         <source>Load user flag</source>
         <translation>Lade benutzerdefiniertes Flag</translation>
     </message>
     <message>
-        <location line="+21"/>
-        <location line="+4"/>
-        <location line="+4"/>
-        <location line="+5"/>
-        <location line="+4"/>
-        <location line="+4"/>
-        <location line="+5"/>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="3154"/>
+        <location filename="../src/mainwindow.cpp" line="3158"/>
+        <location filename="../src/mainwindow.cpp" line="3162"/>
+        <location filename="../src/mainwindow.cpp" line="3167"/>
+        <location filename="../src/mainwindow.cpp" line="3171"/>
+        <location filename="../src/mainwindow.cpp" line="3175"/>
+        <location filename="../src/mainwindow.cpp" line="3180"/>
+        <location filename="../src/mainwindow.cpp" line="3184"/>
         <source>Note</source>
         <comment>SystemFlag</comment>
         <translation>Notiz</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="3190"/>
         <source>Jira</source>
         <comment>SystemFlag</comment>
         <translation>Jira</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="3196"/>
         <source>Link to another vym map</source>
         <comment>SystemFlag</comment>
         <translation>Verweis zu einer anderen Map</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3199"/>
         <source>subtree is scrolled</source>
         <comment>SystemFlag</comment>
         <translation>Teilbaum ist eingerollt</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="3203"/>
         <source>subtree is temporary scrolled</source>
         <comment>SystemFlag</comment>
         <translation>Teilbaum ist momentan ausgerollt</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="3206"/>
         <source>Hide object in exported maps</source>
         <comment>SystemFlag</comment>
         <translation>Objekt beim Exportieren nicht anzeigen</translation>
     </message>
     <message>
-        <location line="+295"/>
+        <location filename="../src/mainwindow.cpp" line="3501"/>
         <source>Settings</source>
         <translation>Einstellungen</translation>
     </message>
     <message>
-        <location line="+45"/>
+        <location filename="../src/mainwindow.cpp" line="3546"/>
         <source>Set path for new maps</source>
         <comment>Settings action</comment>
         <translation>Pfad für neue Maps setzen</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="3551"/>
         <source>Set path for macros</source>
         <comment>Settings action</comment>
         <translation>Pfad für Makros</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="3555"/>
         <source>Set number of undo levels</source>
         <comment>Settings action</comment>
         <translation>Anzahl der Rückgängig Aktionen</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="3562"/>
         <source>Autosave</source>
         <comment>Settings action</comment>
         <translation>Automatisch speichern</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="3568"/>
         <source>Autosave time</source>
         <comment>Settings action</comment>
         <translation>Zeit für automatisches speichern</translation>
     </message>
     <message>
-        <location line="+12"/>
+        <location filename="../src/mainwindow.cpp" line="3580"/>
         <source>Write backup file on save</source>
         <comment>Settings action</comment>
         <translation>Beim Verlassen Sicherungskopie anlegen</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/mainwindow.cpp" line="3588"/>
         <source>Logfile settings</source>
         <comment>Settings action</comment>
         <translation>Log Einstellungen</translation>
     </message>
     <message>
-        <location line="+54"/>
+        <location filename="../src/mainwindow.cpp" line="3642"/>
         <source>Animation</source>
         <comment>Settings action</comment>
         <translation>Animation</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="3649"/>
         <source>Automatic layout</source>
         <comment>Settings action</comment>
         <translation>Autolayout</translation>
     </message>
     <message>
-        <location line="+11"/>
+        <location filename="../src/mainwindow.cpp" line="3660"/>
         <source>Test</source>
         <translation>Test</translation>
     </message>
     <message>
-        <location line="+33"/>
+        <location filename="../src/mainwindow.cpp" line="3693"/>
         <source>Open VYM example maps </source>
         <comment>Help action</comment>
         <translation>VYM Beispielmaps</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location filename="../src/mainwindow.cpp" line="3707"/>
         <source>Show keyboard shortcuts</source>
         <comment>Help action</comment>
         <translation>Zeige Tastaturkürzel</translation>
     </message>
     <message>
-        <location line="+61"/>
+        <location filename="../src/mainwindow.cpp" line="3769"/>
         <source>Hierarchy</source>
         <comment>Context menu name</comment>
         <translation>Hierarchie</translation>
     </message>
     <message>
-        <location line="+13"/>
+        <location filename="../src/mainwindow.cpp" line="3782"/>
         <source>Geometry</source>
         <comment>Context menu name</comment>
         <translation>Geometrie</translation>
     </message>
     <message>
-        <location line="+13"/>
+        <location filename="../src/mainwindow.cpp" line="3795"/>
         <source>Tasks</source>
         <comment>Context menu</comment>
         <translation>Aufgaben</translation>
     </message>
     <message>
-        <location line="+22"/>
+        <location filename="../src/mainwindow.cpp" line="3817"/>
         <source>References (URLs, vymLinks, ...)</source>
         <comment>Context menu name</comment>
         <translation>Verweise (URLS, vym, ...)</translation>
@@ -3191,48 +3185,48 @@ Format: %2 nach
         <translation type="vanished">XLink folgen</translation>
     </message>
     <message>
-        <location line="+198"/>
+        <location filename="../src/mainwindow.cpp" line="4015"/>
         <source>Undo and clipboard toolbar</source>
         <comment>Toolbar for redo/undo and clipboard</comment>
         <translation>Rückgängig Werkzeugleiste</translation>
     </message>
     <message>
-        <location line="+32"/>
+        <location filename="../src/mainwindow.cpp" line="4047"/>
         <source>Selection toolbar</source>
         <comment>Toolbar name</comment>
         <translation>Auswahl Werkzeugleiste</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/mainwindow.cpp" line="4056"/>
         <source>URLs and vymLinks toolbar</source>
         <comment>Toolbar for URLs and vymlinks</comment>
         <translation>URLs und vymLinks Werkzeugleiste</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="4063"/>
         <source>Colors toolbar</source>
         <comment>Colors toolbar name</comment>
         <translation>Farben Werkzeugleiste</translation>
     </message>
     <message>
-        <location line="+60"/>
+        <location filename="../src/mainwindow.cpp" line="4123"/>
         <source>Limited view toolbar</source>
         <comment>View Toolbar name</comment>
         <translation>Vereinfachte Werkzeugleiste Ansicht</translation>
     </message>
     <message>
-        <location line="+387"/>
+        <location filename="../src/mainwindow.cpp" line="4514"/>
         <source>Loading: %1</source>
         <comment>Progress dialog while loading maps</comment>
         <translation>Lade: %1</translation>
     </message>
     <message>
-        <location line="+38"/>
+        <location filename="../src/mainwindow.cpp" line="4557"/>
         <source>Loaded %1</source>
         <translation>%1 geladen</translation>
     </message>
     <message>
-        <location line="+29"/>
+        <location filename="../src/mainwindow.cpp" line="4586"/>
         <source>or</source>
         <comment>File Dialog</comment>
         <translation>oder</translation>
@@ -3242,7 +3236,7 @@ Format: %2 nach
         <translation type="vanished">Speichere %1...</translation>
     </message>
     <message>
-        <location line="+144"/>
+        <location filename="../src/mainwindow.cpp" line="4803"/>
         <source>Save map as</source>
         <translation>Speichern &amp;unter...</translation>
     </message>
@@ -3255,47 +3249,47 @@ Format: %2 nach
         <translation type="vanished">Neue URL:</translation>
     </message>
     <message>
-        <location line="+657"/>
+        <location filename="../src/mainwindow.cpp" line="5350"/>
         <source>HTML</source>
         <comment>Filedialog</comment>
         <translation>HTML</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="5351"/>
         <source>Text</source>
         <comment>Filedialog</comment>
         <translation>Text</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="5352"/>
         <source>Spreadsheet</source>
         <comment>Filedialog</comment>
         <translation>Tabellendokument</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="5353"/>
         <source>Textdocument</source>
         <comment>Filedialog</comment>
         <translation>Textdokument</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mainwindow.cpp" line="5354"/>
         <source>Images</source>
         <comment>Filedialog</comment>
         <translation>Bilder</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/mainwindow.cpp" line="5358"/>
         <source>Set URL to a local file</source>
         <translation>URL zu einer lokalen Datei setzen</translation>
     </message>
     <message>
-        <location line="+25"/>
+        <location filename="../src/mainwindow.cpp" line="5383"/>
         <source>Enter Jira query:</source>
         <translation>Jira Suche:</translation>
     </message>
     <message>
-        <location line="+294"/>
+        <location filename="../src/mainwindow.cpp" line="5677"/>
         <source>%1 items on map
 </source>
         <comment>Info about map</comment>
@@ -3303,64 +3297,69 @@ Format: %2 nach
 </translation>
     </message>
     <message>
-        <location line="+274"/>
+        <location filename="../src/mainwindow.cpp" line="5932"/>
+        <source>Save part of map</source>
+        <translation>Teil einer Map speichern</translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow.cpp" line="5963"/>
         <source>Load images</source>
         <translation>Lade Bilder</translation>
     </message>
     <message>
-        <location line="+439"/>
+        <location filename="../src/mainwindow.cpp" line="6402"/>
         <source>Color of selection box</source>
         <comment>Mainwindow</comment>
         <translation>Farbe der Auswahlmarkierung</translation>
     </message>
     <message>
-        <location line="+141"/>
+        <location filename="../src/mainwindow.cpp" line="6543"/>
         <source>Set application to open external links</source>
         <translation>Anwendung zum Ã–ffnen externen Verweise</translation>
     </message>
     <message>
-        <location line="+37"/>
+        <location filename="../src/mainwindow.cpp" line="6580"/>
         <source>Number of undo/redo levels:</source>
         <translation>Anzahl der Rückgängig Aktionen</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/mainwindow.cpp" line="6585"/>
         <source>Settings have been changed. The next map opened will have &quot;%1&quot; undo/redo levels</source>
         <translation>Die Einstellungen wurden geändert. Die nächste geöffnete Map
 wird %1 Rückgängig Schritte haben.</translation>
     </message>
     <message>
-        <location line="+40"/>
+        <location filename="../src/mainwindow.cpp" line="6625"/>
         <source>Number of seconds before autosave:</source>
         <translation>Anzahl der Sekunden vor automatischem Speichern</translation>
     </message>
     <message>
-        <location line="+47"/>
+        <location filename="../src/mainwindow.cpp" line="6672"/>
         <source>Information</source>
         <translation>Information</translation>
     </message>
     <message>
-        <location line="+577"/>
+        <location filename="../src/mainwindow.cpp" line="7260"/>
         <source>Undo (%1)</source>
         <translation>Rückgängig (%1)</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/mainwindow.cpp" line="7263"/>
         <source>Undo: %1 (%2)</source>
         <translation>Rückgängig (%1)-(%2)</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/mainwindow.cpp" line="7269"/>
         <source>Redo (%1)</source>
         <translation>Wiederholen(%1)</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/mainwindow.cpp" line="7271"/>
         <source>Redo: %1 (%2)</source>
         <translation>Wiederholen: %1 (%2)</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/mainwindow.cpp" line="7278"/>
         <source>History for %1</source>
         <comment>Window Caption</comment>
         <translation>Verlauf von %1</translation>
@@ -3371,25 +3370,25 @@ wird %1 Rückgängig Schritte haben.</translation>
         <translation type="obsolete">Exportiere im zuletzt genutzten Format (%1) nach: %2</translation>
     </message>
     <message>
-        <location line="+548"/>
+        <location filename="../src/mainwindow.cpp" line="7826"/>
         <source>Couldn&apos;t find the documentation %1 in:
 %2</source>
         <translation>Konnte die Dokumentation %1 nicht finden in
 %2</translation>
     </message>
     <message>
-        <location line="+30"/>
+        <location filename="../src/mainwindow.cpp" line="7856"/>
         <source>Load vym example map</source>
         <translation>Lade vym Beispiel Map</translation>
     </message>
     <message>
-        <location line="-4612"/>
+        <location filename="../src/mainwindow.cpp" line="3248"/>
         <source>I just love...</source>
         <comment>Standardflag</comment>
         <translation>Ich liebe das</translation>
     </message>
     <message>
-        <location line="+105"/>
+        <location filename="../src/mainwindow.cpp" line="3353"/>
         <source>Mail</source>
         <comment>Freemind flag</comment>
         <translation>Post</translation>
@@ -3399,63 +3398,62 @@ wird %1 Rückgängig Schritte haben.</translation>
         <translation type="vanished">Öffne Freemind map</translation>
     </message>
     <message>
-        <location line="+2210"/>
+        <location filename="../src/mainwindow.cpp" line="5536"/>
         <source>Link to another vym map</source>
         <translation>Verbindung zu weiterer vym map</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/mainwindow.cpp" line="5538"/>
         <source>Set as link to vym map</source>
         <translation>Verbindung zu vym map</translation>
     </message>
     <message>
-        <location line="-3245"/>
+        <location filename="../src/mainwindow.cpp" line="2316"/>
         <source>Reset delta priority for visible tasks</source>
         <comment>Reset delta</comment>
         <translation>Delta Priorität für sichtbare Aufgaben zurücksetzen</translation>
     </message>
     <message>
-        <location line="+1770"/>
+        <location filename="../src/mainwindow.cpp" line="4091"/>
         <source>Select color (Press Shift for more options)</source>
         <translation>Farbe auswählen (Drücke Shift für mehr Optionen)</translation>
     </message>
     <message>
-        <location line="+682"/>
+        <location filename="../src/mainwindow.cpp" line="4772"/>
         <source>Saving the map failed:
 Couldn&apos;t rename map to %1</source>
         <translation>Map konnte nicht gespeichert werden
 Konnte nicht umbenennen zu %1</translation>
     </message>
     <message>
-        <location line="+77"/>
         <source>Couldn&apos;t save as default, failed to rename to
 %1</source>
-        <translation>Konnte nicht als Standard speichern, das umbennen ist fehlgeschlagen:
+        <translation type="vanished">Konnte nicht als Standard speichern, das umbennen ist fehlgeschlagen:
 %1</translation>
     </message>
     <message>
-        <location line="-1230"/>
+        <location filename="../src/mainwindow.cpp" line="3619"/>
         <source>Dark theme</source>
         <comment>Settings action</comment>
         <translation>Dunkles Design</translation>
     </message>
     <message>
-        <location line="+3069"/>
+        <location filename="../src/mainwindow.cpp" line="6673"/>
         <source>Restart vym to apply the changed dark theme setting</source>
         <translation>Bitte vym neu starten um die Einstellungen für dunkles Design zu verwenden</translation>
     </message>
     <message>
-        <location line="+1419"/>
+        <location filename="../src/mainwindow.cpp" line="8103"/>
         <source>&lt;html&gt;&lt;h3&gt;Do you allow vym to check online for updates or release notes?&lt;/h3&gt;If you allow, vym will &lt;ul&gt;&lt;li&gt;check once for release notes&lt;/li&gt;&lt;li&gt;check regulary for updates and notify you in case you should update, e.g. if there are important bug fixes available&lt;/li&gt;&lt;li&gt;receive a cookie with a random ID and send some anonymous data, like:&lt;ul&gt;&lt;li&gt;vym version&lt;/li&gt;&lt;li&gt;platform name and the ID (e.g. &quot;Windows&quot; or &quot;Linux&quot;)&lt;/li&gt;&lt;li&gt;if you are using dark theme&lt;/li&gt;&lt;/ul&gt;This data is sent to me, Uwe Drechsel.&lt;p&gt;As vym developer I am motivated to see many people using vym. Of course I am curious to see, on which system vym is used. Maintaining each of the systems requires a lot of my (spare) time.&lt;/p&gt; &lt;p&gt;No other data than above will be sent, especially no private data will be collected or sent.(Check the source code, if you don&apos;t believe.)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;If you do not allow, &lt;ul&gt;&lt;li&gt;nothing will be downloaded and especially I will &lt;b&gt;not be motivated&lt;/b&gt; to spend some more thousands of hours on developing a free software tool.&lt;/ul&gt;Please allow vym to check for updates :-)</source>
         <translation>&lt;html&gt;&lt;h3&gt;Erlauben Sie vym online nach Updates oder Release Anmerkungen zu suchen?&lt;/h3&gt;Wenn Sie es erlauben, wird vym &lt;ul&gt;&lt;li&gt;einmalig online nach Release Anmerkungen suchen&lt;/li&gt;&lt;li&gt;regelmäßig nach Updates suchen und Sie benachrichtigen, sollten Updates wie z.B. wichtige Fehlerbehebungen verfügbar sein&lt;/li&gt;&lt;li&gt;ein cookie erhalten mit eineer zufällig erzeugten ID und einige anonymisierte Daten senden, wie z.B.&lt;ul&gt;&lt;li&gt;vym Version&lt;/li&gt;&lt;li&gt;Plattform Name und ID &quot;Windows&quot; oder &quot;Linux&quot;)&lt;/li&gt;&lt;li&gt;Einstellungen wie z.B. Sprache und ob dunkles Design verwendet wird&lt;/li&gt;&lt;/ul&gt;Diese Daten werden geschickt zum Author von vym: Uwe Drechsel.&lt;p&gt;Als vym Entwickler motiviert es mich zu sehen, wenn viele Menschen vym benutzen. Natürlich bin ich neugierig, auf welchen Plattformen vym verwendet wird. Jede dieser Plattformen benötigt eine Menge meiner (Frei-)zeit.&lt;/p&gt; &lt;p&gt;Abgesehen von obigen Daten wird nichts weiteres gesendet, insbesondere keine privaten Daten. (Bitte bei Zweifel gerne die Quellen prüfen!)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;Falls Sie es nicht zulassen, wird&lt;ul&gt;&lt;li&gt;nichts heruntergeladen und &lt;b&gt;besonders werde ich nicht motiviert&lt;/b&gt; weiter tausende Stunden meiner Zeit in die Entwicklung einer freien Software zu stecken.&lt;/ul&gt;Bitte erlauben Sie vym nach Updates zu sehen :-)</translation>
     </message>
     <message>
-        <location line="+49"/>
+        <location filename="../src/mainwindow.cpp" line="8152"/>
         <source>That&apos;s ok, though I would be happy to see many users working with vym and also on which platforms.</source>
         <translation>Schade, ich würde mich wirklich freuen, wenn ich viele Menschen vym benutzen sehe und auch auf welchen Plattformen vym genutzt wird.</translation>
     </message>
     <message>
-        <location line="-4441"/>
+        <location filename="../src/mainwindow.cpp" line="3715"/>
         <source>Show scripting commands</source>
         <comment>Help action</comment>
         <translation>Skript Befehle anzeigen</translation>
@@ -3464,32 +3462,32 @@ Konnte nicht umbenennen zu %1</translation>
 <context>
     <name>MapEditor</name>
     <message>
-        <location filename="../src/mapeditor.cpp" line="+130"/>
+        <location filename="../src/mapeditor.cpp" line="130"/>
         <source>Map Editor</source>
         <comment>Shortcut scope</comment>
         <translation>Map Editor</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/mapeditor.cpp" line="131"/>
         <source>Map Editors</source>
         <comment>Shortcut group</comment>
         <translation>Map Editoren</translation>
     </message>
     <message>
-        <location line="+51"/>
-        <location line="+5"/>
+        <location filename="../src/mapeditor.cpp" line="182"/>
+        <location filename="../src/mapeditor.cpp" line="187"/>
         <source>Edit heading</source>
         <comment>MapEditor</comment>
         <translation>Zweig-Überschrift bearbeiten</translation>
     </message>
     <message>
-        <location line="+600"/>
+        <location filename="../src/mapeditor.cpp" line="795"/>
         <source>Print vym map</source>
         <comment>MapEditor</comment>
         <translation>Map drucken</translation>
     </message>
     <message>
-        <location line="+1913"/>
+        <location filename="../src/mapeditor.cpp" line="2724"/>
         <source>Warning</source>
         <translation>Warnung</translation>
     </message>
@@ -3498,6 +3496,21 @@ Konnte nicht umbenennen zu %1</translation>
         <translation type="vanished">%1 Objekte ausgewählt</translation>
     </message>
 </context>
+<context>
+    <name>MyTextEdit</name>
+    <message>
+        <location filename="../src/my-textedit.cpp" line="14"/>
+        <source>Open URL</source>
+        <comment>TextEdit menu</comment>
+        <translation>URL Ã¶ffnen</translation>
+    </message>
+    <message>
+        <location filename="../src/my-textedit.cpp" line="20"/>
+        <source>Insert or edit URL</source>
+        <comment>TextEdit menu</comment>
+        <translation>URL einfügen</translation>
+    </message>
+</context>
 <context>
     <name>NoteEditor</name>
     <message>
@@ -3509,123 +3522,124 @@ Konnte nicht umbenennen zu %1</translation>
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../src/export-ao.cpp" line="+21"/>
+        <location filename="../src/export-ao.cpp" line="21"/>
         <source>Export as AO report</source>
         <translation>Map AO report exportieren</translation>
     </message>
     <message>
-        <location line="+13"/>
-        <location filename="../src/export-ascii.cpp" line="+28"/>
-        <location filename="../src/export-confluence.cpp" line="+351"/>
-        <location filename="../src/export-csv.cpp" line="+26"/>
-        <location filename="../src/export-firefox.cpp" line="+68"/>
-        <location filename="../src/export-html.cpp" line="+393"/>
-        <location filename="../src/export-impress.cpp" line="+64"/>
-        <location line="+73"/>
-        <location line="+17"/>
-        <location line="+25"/>
-        <location line="+12"/>
-        <location line="+21"/>
-        <location line="+8"/>
-        <location line="+9"/>
-        <location filename="../src/export-latex.cpp" line="+58"/>
-        <location filename="../src/export-markdown.cpp" line="+28"/>
-        <location filename="../src/export-orgmode.cpp" line="+25"/>
+        <location filename="../src/export-ao.cpp" line="34"/>
+        <location filename="../src/export-ascii.cpp" line="28"/>
+        <location filename="../src/export-confluence.cpp" line="351"/>
+        <location filename="../src/export-csv.cpp" line="26"/>
+        <location filename="../src/export-firefox.cpp" line="68"/>
+        <location filename="../src/export-html.cpp" line="393"/>
+        <location filename="../src/export-impress.cpp" line="64"/>
+        <location filename="../src/export-impress.cpp" line="137"/>
+        <location filename="../src/export-impress.cpp" line="152"/>
+        <location filename="../src/export-impress.cpp" line="160"/>
+        <location filename="../src/export-impress.cpp" line="187"/>
+        <location filename="../src/export-impress.cpp" line="199"/>
+        <location filename="../src/export-impress.cpp" line="220"/>
+        <location filename="../src/export-impress.cpp" line="228"/>
+        <location filename="../src/export-impress.cpp" line="237"/>
+        <location filename="../src/export-latex.cpp" line="58"/>
+        <location filename="../src/export-markdown.cpp" line="28"/>
+        <location filename="../src/export-orgmode.cpp" line="25"/>
         <source>Critical Export Error</source>
         <translation>Kritischer Fehler beim Exportieren</translation>
     </message>
     <message>
-        <location filename="../src/export-confluence.cpp" line="+2"/>
-        <location filename="../src/export-html.cpp" line="+2"/>
-        <location filename="../src/export-impress.cpp" line="-91"/>
+        <location filename="../src/export-confluence.cpp" line="353"/>
+        <location filename="../src/export-html.cpp" line="395"/>
+        <location filename="../src/export-impress.cpp" line="138"/>
         <source>Could not write %1</source>
         <translation>%1 konnte nicht </translation>
     </message>
     <message>
-        <location filename="../src/export-base.cpp" line="+118"/>
+        <location filename="../src/export-base.cpp" line="118"/>
         <source>Exporting to %1 will overwrite the existing file:
 %2</source>
         <translation>Die Datei %2 gibt es bereits.
 Wollen Sie sie Ã¼berschreiben für einen Export nach %1?</translation>
     </message>
     <message>
-        <location line="-2"/>
+        <location filename="../src/export-base.cpp" line="116"/>
         <source>Warning: Overwriting file</source>
         <translation>Warnung: Ãœberschreiben einer Datei</translation>
     </message>
     <message>
-        <location filename="../src/export-ao.cpp" line="+1"/>
+        <location filename="../src/export-ao.cpp" line="35"/>
         <source>Could not export as AO to %1</source>
         <translation>Konnte nicht als AO nach %1 exportieren</translation>
     </message>
     <message>
-        <location filename="../src/export-ascii.cpp" line="+1"/>
+        <location filename="../src/export-ascii.cpp" line="29"/>
         <source>Could not export as ASCII to %1</source>
         <translation>Konnte nicht als ASCII nach %1 exportieren</translation>
     </message>
     <message>
-        <location filename="../src/export-csv.cpp" line="-8"/>
+        <location filename="../src/export-csv.cpp" line="18"/>
         <source>Export as CSV</source>
         <translation>Exportiere als CSV</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/export-csv.cpp" line="27"/>
         <source>Could not export as CSV to %1</source>
         <translation>Konnte nicht als CSV nach %1 exportieren</translation>
     </message>
     <message>
-        <location filename="../src/export-confluence.cpp" line="-59"/>
-        <location filename="../src/export-html.cpp" line="-93"/>
+        <location filename="../src/export-confluence.cpp" line="294"/>
+        <location filename="../src/export-html.cpp" line="302"/>
         <source>Contents:</source>
         <comment>Used in HTML export</comment>
         <translation>Inhalt</translation>
     </message>
     <message>
-        <location filename="../src/export-html.cpp" line="+54"/>
+        <location filename="../src/export-html.cpp" line="356"/>
         <source>Export aborted.</source>
         <translation>Export fehlgeschlagen.</translation>
     </message>
     <message>
-        <location line="+90"/>
+        <location filename="../src/export-html.cpp" line="446"/>
         <source>Trying to create directory for flags:</source>
         <translation>Versuche Verzeichnis für Flags anzulegen</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/export-html.cpp" line="447"/>
         <source>Could not create %1</source>
         <translation>%1 konnte nicht angelegt werden</translation>
     </message>
     <message>
-        <location line="-342"/>
+        <location filename="../src/export-html.cpp" line="105"/>
         <source>Flag: %1</source>
         <comment>Alt tag in HTML export</comment>
         <translation>Flag: %1</translation>
     </message>
     <message>
-        <location line="+34"/>
+        <location filename="../src/export-html.cpp" line="139"/>
         <source>Flag: url</source>
         <comment>Alt tag in HTML export</comment>
         <translation>Flag: URL</translation>
     </message>
     <message>
-        <location line="+231"/>
-        <location line="+75"/>
+        <location filename="../src/export-html.cpp" line="370"/>
+        <location filename="../src/export-html.cpp" line="445"/>
         <source>Critical</source>
         <translation>Kritisch</translation>
     </message>
     <message>
-        <location line="-74"/>
+        <location filename="../src/export-html.cpp" line="371"/>
         <source>Could not find stylesheet %1</source>
         <translation>Konnte stylesheet %1 nicht finden</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/export-html.cpp" line="381"/>
         <source>Error</source>
         <comment>ExportHTML</comment>
         <translation>Fehler</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/export-html.cpp" line="382"/>
         <source>Could not copy
 %1 to
 %2</source>
@@ -3635,110 +3649,115 @@ Wollen Sie sie Ã¼berschreiben für einen Export nach %1?</translation>
 %2</translation>
     </message>
     <message>
-        <location filename="../src/export-confluence.cpp" line="+58"/>
-        <location filename="../src/export-html.cpp" line="+12"/>
+        <location filename="../src/export-confluence.cpp" line="352"/>
+        <location filename="../src/export-html.cpp" line="394"/>
         <source>Trying to save HTML file:</source>
         <translation>Versuche HTML Datei zu speichern:</translation>
     </message>
     <message>
-        <location filename="../src/export-ao.cpp" line="+1"/>
-        <location filename="../src/export-ascii.cpp" line="+1"/>
-        <location filename="../src/export-csv.cpp" line="+1"/>
-        <location filename="../src/export-firefox.cpp" line="+2"/>
-        <location filename="../src/export-html.cpp" line="+2"/>
-        <location filename="../src/export-impress.cpp" line="+1"/>
-        <location filename="../src/export-latex.cpp" line="+2"/>
-        <location filename="../src/export-markdown.cpp" line="+2"/>
-        <location filename="../src/export-orgmode.cpp" line="+2"/>
+        <location filename="../src/export-ao.cpp" line="36"/>
+        <location filename="../src/export-ascii.cpp" line="30"/>
+        <location filename="../src/export-csv.cpp" line="28"/>
+        <location filename="../src/export-firefox.cpp" line="70"/>
+        <location filename="../src/export-html.cpp" line="396"/>
+        <location filename="../src/export-impress.cpp" line="139"/>
+        <location filename="../src/export-latex.cpp" line="60"/>
+        <location filename="../src/export-markdown.cpp" line="30"/>
+        <location filename="../src/export-orgmode.cpp" line="27"/>
         <source>Export failed.</source>
         <translation>Export fehlgeschlagen.</translation>
     </message>
     <message>
-        <location filename="../src/export-orgmode.cpp" line="-1"/>
+        <location filename="../src/export-orgmode.cpp" line="26"/>
         <source>Could not export as OrgMode to %1</source>
         <translation>Konnte nicht als OrgMode  nach %1 exportieren</translation>
     </message>
     <message>
-        <location filename="../src/export-latex.cpp" line="-1"/>
+        <location filename="../src/export-latex.cpp" line="59"/>
         <source>Could not export as LaTeX to %1</source>
         <translation>Konnte nicht als LaTeX  nach %1 exportieren</translation>
     </message>
     <message>
-        <location filename="../src/export-impress.cpp" line="-121"/>
+        <location filename="../src/export-impress.cpp" line="18"/>
         <source>Export as LibreOffice Impress presentation</source>
         <translation>Exportieren als LibreOffice Impress Präsentation</translation>
     </message>
     <message>
-        <location line="+47"/>
+        <location filename="../src/export-impress.cpp" line="65"/>
         <source>No objects in map!</source>
         <translation>Keine Objekte in Map!</translation>
     </message>
     <message>
-        <location line="+90"/>
+        <location filename="../src/export-impress.cpp" line="153"/>
+        <source>Could not start compressing file %1</source>
+        <translation>Konnte das Komprimieren der Datei nicht starten</translation>
+    </message>
+    <message>
+        <location filename="../src/export-impress.cpp" line="161"/>
         <source>Could not compress file %1</source>
         <translation>Konnte Datei nicht komprimieren %1</translation>
     </message>
     <message>
-        <location line="+25"/>
+        <location filename="../src/export-impress.cpp" line="188"/>
         <source>Couldn&apos;t read settings from &quot;%1&quot;</source>
         <translation>Konnte Einstellungen nicht lesen von %1</translation>
     </message>
     <message>
-        <location line="+12"/>
+        <location filename="../src/export-impress.cpp" line="200"/>
         <source>Check &quot;%1&quot; in
 %2</source>
         <translation>Bitte &quot;%1&quot; prüfen in
 %2</translation>
     </message>
     <message>
-        <location line="+21"/>
-        <location line="+8"/>
-        <location line="+9"/>
+        <location filename="../src/export-impress.cpp" line="221"/>
+        <location filename="../src/export-impress.cpp" line="229"/>
+        <location filename="../src/export-impress.cpp" line="238"/>
         <source>Could not read %1</source>
         <translation>%1 konnte nicht gelesen werden</translation>
     </message>
     <message>
-        <location filename="../src/main.cpp" line="+578"/>
+        <location filename="../src/main.cpp" line="586"/>
         <source>Note Editor</source>
         <comment>Name of editor shown as window title</comment>
         <translation>Notiz Editor</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/main.cpp" line="588"/>
         <source>Heading Editor</source>
         <comment>Name of editor shown as window title</comment>
         <translation>Editor Zweigbeschriftungen</translation>
     </message>
     <message>
-        <location line="+46"/>
-        <location line="+7"/>
-        <location line="+4"/>
-        <location filename="../src/xsltproc.cpp" line="+85"/>
-        <location line="+7"/>
-        <location filename="../src/zip-agent.cpp" line="+84"/>
-        <location line="+10"/>
-        <location line="+6"/>
-        <location line="+21"/>
-        <location line="+41"/>
-        <location line="+6"/>
-        <location line="+41"/>
-        <location line="+9"/>
-        <location line="+5"/>
+        <location filename="../src/main.cpp" line="635"/>
+        <location filename="../src/main.cpp" line="642"/>
+        <location filename="../src/main.cpp" line="646"/>
+        <location filename="../src/xsltproc.cpp" line="85"/>
+        <location filename="../src/xsltproc.cpp" line="92"/>
+        <location filename="../src/zip-agent.cpp" line="85"/>
+        <location filename="../src/zip-agent.cpp" line="96"/>
+        <location filename="../src/zip-agent.cpp" line="103"/>
+        <location filename="../src/zip-agent.cpp" line="120"/>
+        <location filename="../src/zip-agent.cpp" line="161"/>
+        <location filename="../src/zip-agent.cpp" line="167"/>
+        <location filename="../src/zip-agent.cpp" line="208"/>
+        <location filename="../src/zip-agent.cpp" line="217"/>
+        <location filename="../src/zip-agent.cpp" line="222"/>
         <source>Critical Error</source>
         <translation>Kritischer Fehler</translation>
     </message>
     <message>
-        <location line="-10"/>
+        <location filename="../src/main.cpp" line="636"/>
         <source>Couldn&apos;t find tool to zip/unzip data,or your Windows version is older than Windows 10.</source>
         <translation>Konnte Tool zum Auspacken oder Komprimieren der Daten nicht finden, oder Windows Version ist Ã¤lter als Windows 10.</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/main.cpp" line="643"/>
         <source>Couldn&apos;t find tar tool to zip data. </source>
         <translation>Konnte das tar Werkzeug zum Komprimieren der Daten nicht finden.</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/main.cpp" line="647"/>
         <source>Couldn&apos;t find tar tool to unzip data. </source>
         <translation>Konnte das tar Werkzeug zum Entpacken der Daten nicht finden.</translation>
     </message>
@@ -3753,7 +3772,7 @@ The map could not be saved, please check if backup file is available or export a
 Die Map konnte nicht gespeichert werden: Bitte prüfen, ob eine Backup Datei vorhanden ist oder die Map als XML Datei exportieren!</translation>
     </message>
     <message>
-        <location filename="../src/zip-agent.cpp" line="-138"/>
+        <location filename="../src/zip-agent.cpp" line="86"/>
         <source>Couldn&apos;t start to compress data!
 The map could not be saved, please check if backup file is available or export as XML file!
 
@@ -3765,15 +3784,15 @@ ob ein Backup existiert oder exportiere die Map als XML-Datei!
 </translation>
     </message>
     <message>
-        <location line="+10"/>
-        <location line="+27"/>
-        <location line="+41"/>
-        <location line="+56"/>
+        <location filename="../src/zip-agent.cpp" line="97"/>
+        <location filename="../src/zip-agent.cpp" line="121"/>
+        <location filename="../src/zip-agent.cpp" line="162"/>
+        <location filename="../src/zip-agent.cpp" line="218"/>
         <source>zip didn&apos;t exit normally</source>
         <translation>zip wurde nicht richtig beendet</translation>
     </message>
     <message>
-        <location line="-9"/>
+        <location filename="../src/zip-agent.cpp" line="209"/>
         <source>Couldn&apos;t start tool to decompress data!
 
 </source>
@@ -3805,68 +3824,68 @@ ob ein Backup existiert oder exportiere die Map als XML-Datei!
         <translation type="vanished">Konnte %1 nicht starten, um die Daten auszupacken!</translation>
     </message>
     <message>
-        <location filename="../src/xsltproc.cpp" line="-6"/>
+        <location filename="../src/xsltproc.cpp" line="86"/>
         <source>Could not start %1</source>
         <translation>%1 konnte nicht gestartet werden</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/xsltproc.cpp" line="93"/>
         <source>%1 didn&apos;t exit normally</source>
         <translation>%1 wurde nicht richtig beendet</translation>
     </message>
     <message>
-        <location filename="../src/file.cpp" line="+71"/>
+        <location filename="../src/file.cpp" line="71"/>
         <source>Images</source>
         <translation>Bilder</translation>
     </message>
     <message>
-        <location line="+32"/>
+        <location filename="../src/file.cpp" line="103"/>
         <source>Overwrite</source>
         <translation>Überschreiben</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/file.cpp" line="104"/>
         <source>Cancel</source>
         <translation>Abbrechen</translation>
     </message>
     <message>
-        <location filename="../src/macros.cpp" line="+47"/>
+        <location filename="../src/macros.cpp" line="47"/>
         <source>Warning</source>
         <translation>Warnung</translation>
     </message>
     <message>
-        <location filename="../src/export-base.cpp" line="-59"/>
-        <location filename="../src/imports.cpp" line="+41"/>
-        <location filename="../src/main.cpp" line="+54"/>
-        <location line="+14"/>
-        <location filename="../src/scripteditor.cpp" line="+194"/>
-        <location line="+26"/>
-        <location line="+22"/>
-        <location line="+17"/>
-        <location filename="../src/zip-agent.cpp" line="-74"/>
-        <location line="+12"/>
+        <location filename="../src/export-base.cpp" line="57"/>
+        <location filename="../src/imports.cpp" line="41"/>
+        <location filename="../src/main.cpp" line="701"/>
+        <location filename="../src/main.cpp" line="715"/>
+        <location filename="../src/scripteditor.cpp" line="194"/>
+        <location filename="../src/scripteditor.cpp" line="220"/>
+        <location filename="../src/scripteditor.cpp" line="242"/>
+        <location filename="../src/scripteditor.cpp" line="259"/>
+        <location filename="../src/zip-agent.cpp" line="135"/>
+        <location filename="../src/zip-agent.cpp" line="147"/>
         <source>Error</source>
         <translation>Fehler</translation>
     </message>
     <message>
-        <location line="+1"/>
-        <location filename="../src/imports.cpp" line="+1"/>
+        <location filename="../src/export-base.cpp" line="58"/>
+        <location filename="../src/imports.cpp" line="42"/>
         <source>Couldn&apos;t access temporary directory
 </source>
         <translation>Auf das temporäre Verzeichnis konnte nicht zugegriffen werden</translation>
     </message>
     <message>
-        <location filename="../src/export-ascii.cpp" line="-10"/>
+        <location filename="../src/export-ascii.cpp" line="20"/>
         <source>Export as ASCII</source>
         <translation>Exportiere als ASCII</translation>
     </message>
     <message>
-        <location filename="../src/export-ao.cpp" line="-14"/>
+        <location filename="../src/export-ao.cpp" line="22"/>
         <source>(still experimental)</source>
         <translation>(noch experimentelle Funktion)</translation>
     </message>
     <message>
-        <location filename="../src/file.cpp" line="-6"/>
+        <location filename="../src/file.cpp" line="98"/>
         <source>The directory %1 is not empty.
 Do you risk to overwrite its contents?</source>
         <comment>write directory</comment>
@@ -3874,12 +3893,12 @@ Do you risk to overwrite its contents?</source>
 Riskieren Sie es dessen Inhalt zu Ã¼berschreiben?</translation>
     </message>
     <message>
-        <location filename="../src/xml-vym.cpp" line="+70"/>
+        <location filename="../src/xml-vym.cpp" line="70"/>
         <source>Warning: Version Problem</source>
         <translation>Warnung: Versionsproblem</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/xml-vym.cpp" line="71"/>
         <source>&lt;h3&gt;Map is newer than VYM&lt;/h3&gt;&lt;p&gt;The map you are just trying to load was saved using vym %1. The version of this vym is %2. If you run into problems after pressing the ok-button below, updating vym should help.&lt;/p&gt;</source>
         <translation>&lt;h3&gt;Map ist neuer als VYM&lt;/h3&gt;&lt;p&gt;Die Map, die Sie gerade versuchen zu laden wurde mit vym %1 gespeichert. Die vorliegende Version von vym ist %2. Falls nach dem Fortfahren mit Ok Probleme autauchen, sollte ein Update von vym helfen.&lt;/p&gt;</translation>
     </message>
@@ -3893,29 +3912,29 @@ Riskieren Sie es dessen Inhalt zu Ã¼berschreiben?</translation>
         <translation type="vanished">Konnte Makro nicht finden in %1.</translation>
     </message>
     <message>
-        <location filename="../src/macros.cpp" line="+1"/>
+        <location filename="../src/macros.cpp" line="48"/>
         <source>Couldn&apos;t find macros at  %1.
 </source>
         <comment>Macros::pathExists</comment>
         <translation>Konnte Makro nicht finden in %1.</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/macros.cpp" line="49"/>
         <source>Please use Settings-&gt;</source>
         <translation>Bitte setzen sie einen Pfad in Einstellungen-&gt;</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/macros.cpp" line="50"/>
         <source>Set directory for vym macros</source>
         <translation>Verzeichnis für vym Makros</translation>
     </message>
     <message>
-        <location filename="../src/export-markdown.cpp" line="-10"/>
+        <location filename="../src/export-markdown.cpp" line="20"/>
         <source>Export as Markdown</source>
         <translation>Als Markdown exportieren</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/export-markdown.cpp" line="29"/>
         <source>Could not export as Markdown to %1</source>
         <translation>Konnte nicht als Markdown nach %1 exportieren</translation>
     </message>
@@ -3930,8 +3949,8 @@ Riskieren Sie es dessen Inhalt zu Ã¼berschreiben?</translation>
         <translation type="vanished">Konnte Tool zum Auspacken oder Komprimieren der Daten nicht finden. Bitte passend zur Plattform installieren und Pfad in den Einstellungen setzen.</translation>
     </message>
     <message>
-        <location filename="../src/main.cpp" line="-13"/>
-        <location line="+14"/>
+        <location filename="../src/main.cpp" line="702"/>
+        <location filename="../src/main.cpp" line="716"/>
         <source>Couldn&apos;t open &quot;%1&quot;
 .</source>
         <translation>Konnte %1 nicht Ã¶ffnen.
@@ -3944,57 +3963,57 @@ Riskieren Sie es dessen Inhalt zu Ã¼berschreiben?</translation>
 </translation>
     </message>
     <message>
-        <location filename="../src/scripteditor.cpp" line="-64"/>
+        <location filename="../src/scripteditor.cpp" line="195"/>
         <source>Couldn&apos;t write macros to &quot;%1&quot;
 .</source>
         <translation>Konnte Makros nicht speichern nach &quot;%1&quot;
 </translation>
     </message>
     <message>
-        <location line="+27"/>
-        <location line="+22"/>
+        <location filename="../src/scripteditor.cpp" line="222"/>
+        <location filename="../src/scripteditor.cpp" line="244"/>
         <source>Couldn&apos;t read script from &quot;%1&quot;
 .</source>
         <translation>Konnte script nicht lesen von &quot;%1&quot;
 </translation>
     </message>
     <message>
-        <location line="+16"/>
+        <location filename="../src/scripteditor.cpp" line="260"/>
         <source>Couldn&apos;t write script to &quot;%1&quot;
 .</source>
         <translation>Konnte script nicht speichern in &quot;%1&quot;
 </translation>
     </message>
     <message>
-        <location filename="../src/export-firefox.cpp" line="-53"/>
+        <location filename="../src/export-firefox.cpp" line="17"/>
         <source>Export as Firefox bookmarks</source>
         <translation>Exportieren als Firefox Lesezeichen</translation>
     </message>
     <message>
-        <location line="+52"/>
+        <location filename="../src/export-firefox.cpp" line="69"/>
         <source>Could not export as Firefox bookmarks to %1</source>
         <translation>Konnte Firefox Lesezeichen nicht exportieren nach %1</translation>
     </message>
     <message>
-        <location filename="../src/imports.cpp" line="+26"/>
+        <location filename="../src/imports.cpp" line="68"/>
         <source>Import Firefox bookmarks</source>
         <comment>Import dialog</comment>
         <translation>Importiere Firefox Lesezeichen</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/imports.cpp" line="70"/>
         <source>Loading bookmarks:</source>
         <comment>Progress dialog while importing bookmarks</comment>
         <translation>Importiere Lesezeichen:</translation>
     </message>
     <message>
-        <location line="+26"/>
+        <location filename="../src/imports.cpp" line="97"/>
         <source>Imported %1 bookmarks</source>
         <comment>Import dialog</comment>
         <translation>%1 Lesezeichen importiert.</translation>
     </message>
     <message>
-        <location filename="../src/mainwindow.cpp" line="+916"/>
+        <location filename="../src/mainwindow.cpp" line="4641"/>
         <source>Existing lockfiles have been ignored for the maps listed below. Please check, if the maps might be openend in another instance of vym:
 
 </source>
@@ -4002,24 +4021,30 @@ Riskieren Sie es dessen Inhalt zu Ã¼berschreiben?</translation>
 </translation>
     </message>
     <message>
-        <location filename="../src/vymmodel.cpp" line="+5552"/>
+        <location filename="../src/vymmodel.cpp" line="5650"/>
         <source>JIRA agent not setup.</source>
         <translation>JIRA agent ist nicht eingerichtet</translation>
     </message>
     <message>
-        <location filename="../src/export-html.cpp" line="-215"/>
+        <location filename="../src/export-html.cpp" line="181"/>
         <source>Image: %1</source>
         <comment>Alt tag in HTML export</comment>
         <translation>Bild: %1</translation>
     </message>
     <message>
-        <location filename="../src/xml-base.cpp" line="+24"/>
+        <location filename="../src/xml-base.cpp" line="24"/>
         <source>%1
 Line %2, column %3</source>
         <comment>Error message while parsing XML</comment>
         <translation>%1
 Zeile %2, Spalte %3</translation>
     </message>
+    <message>
+        <location filename="../src/shortcuts.cpp" line="106"/>
+        <source>(Vim alternative shortcut)</source>
+        <comment>Shortcut help dialog</comment>
+        <translation>(Vim - alternatives Tastenkürzel)</translation>
+    </message>
 </context>
 <context>
     <name>ScriptEditor</name>
@@ -4052,63 +4077,68 @@ Zeile %2, Spalte %3</translation>
         <translation type="vanished">Speichern</translation>
     </message>
     <message>
-        <location filename="../src/scripteditor.cpp" line="-117"/>
-        <location line="+7"/>
+        <location filename="../src/scripteditor.cpp" line="143"/>
+        <location filename="../src/scripteditor.cpp" line="150"/>
         <source>Warning</source>
         <translation>Warnung</translation>
     </message>
     <message>
-        <location line="-78"/>
+        <location filename="../src/scripteditor.cpp" line="72"/>
         <source>Slide</source>
         <comment>Mode in scriptEditor</comment>
         <translation>Folie</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/scripteditor.cpp" line="73"/>
         <source>Macro</source>
         <comment>Mode in scriptEditor</comment>
         <translation>Makro</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/scripteditor.cpp" line="74"/>
         <source>Script</source>
         <comment>Mode in scriptEditor</comment>
         <translation>Script</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/scripteditor.cpp" line="77"/>
         <source>No script selected</source>
         <comment>scriptname in scriptEditor</comment>
         <translation>Kein script geladen</translation>
     </message>
     <message>
-        <location line="+28"/>
         <source>Script Editor</source>
         <comment>Shortcut scope</comment>
+        <translation type="vanished">Skript Editor</translation>
+    </message>
+    <message>
+        <location filename="../src/scripteditor.cpp" line="105"/>
+        <source>Script editor</source>
+        <comment>Shortcut scope</comment>
         <translation>Skript Editor</translation>
     </message>
     <message>
-        <location line="+39"/>
+        <location filename="../src/scripteditor.cpp" line="144"/>
         <source>Couldn&apos;t get model to save script into slide!</source>
         <translation>Konnte Datenmodell zum Speichern des Scripts nicht auffinden!</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/scripteditor.cpp" line="151"/>
         <source>Couldn&apos;t find slide to save script into slide!</source>
         <translation>Konnte Folie zum Speichern des Scripts nicht finden!</translation>
     </message>
     <message>
-        <location line="+41"/>
+        <location filename="../src/scripteditor.cpp" line="192"/>
         <source>Macros saved to %1</source>
         <translation>Makros gespeichert nach %1</translation>
     </message>
     <message>
-        <location line="+65"/>
+        <location filename="../src/scripteditor.cpp" line="257"/>
         <source>Script saved to %1</source>
         <translation>Script gespeichert nach %1</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location filename="../src/scripteditor.cpp" line="271"/>
         <source>Save script</source>
         <translation>Script speichern</translation>
     </message>
@@ -4129,7 +4159,7 @@ Wollen Sie sie Ã¼berschreiben?</translation>
         <translation type="vanished">Abbrechen</translation>
     </message>
     <message>
-        <location line="-65"/>
+        <location filename="../src/scripteditor.cpp" line="206"/>
         <source>Load script</source>
         <translation>Script laden</translation>
     </message>
@@ -4148,44 +4178,44 @@ Wollen Sie sie Ã¼berschreiben?</translation>
 <context>
     <name>TaskEditor</name>
     <message>
-        <location filename="../src/taskeditor.cpp" line="+52"/>
+        <location filename="../src/taskeditor.cpp" line="52"/>
         <source>Show only tasks from current map</source>
         <comment>Filters in task Editor</comment>
         <translation>Nur Aufgaben aus aktuelle Map anzeigen</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/taskeditor.cpp" line="62"/>
         <source>Show only active tasks</source>
         <comment>Filters in task Editor</comment>
         <translation>Nur aktive Aufgaben anzeigen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/taskeditor.cpp" line="71"/>
         <source>Show only new tasks</source>
         <comment>Filters in task Editor</comment>
         <translation>Nur neue Aufgaben anzeigen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/taskeditor.cpp" line="80"/>
         <source>Show only blocker tasks</source>
         <comment>Filters in task Editor</comment>
         <translation>Nur Blocker Aufgaben anzeigen</translation>
     </message>
     <message>
-        <location line="+9"/>
-        <location line="+10"/>
+        <location filename="../src/taskeditor.cpp" line="89"/>
+        <location filename="../src/taskeditor.cpp" line="99"/>
         <source>Show only tasks marked with this arrow-up flag</source>
         <comment>Filters in task Editor</comment>
         <translation>Nur Aufgaben mit diesem Pfeil anzeigen</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/taskeditor.cpp" line="109"/>
         <source>Show only tasks marked without any arrow-up flag</source>
         <comment>Filters in task Editor</comment>
         <translation>Nur Aufgaben ohne Pfeil anzeigen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/taskeditor.cpp" line="118"/>
         <source>Task Editor</source>
         <comment>Shortcut group</comment>
         <translation>Aufgaben Editor</translation>
@@ -4194,55 +4224,55 @@ Wollen Sie sie Ã¼berschreiben?</translation>
 <context>
     <name>TaskModel</name>
     <message>
-        <location filename="../src/taskmodel.cpp" line="+204"/>
+        <location filename="../src/taskmodel.cpp" line="204"/>
         <source>Prio</source>
         <comment>TaskEditor</comment>
         <translation>Priorität</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/taskmodel.cpp" line="206"/>
         <source>Delta</source>
         <comment>TaskEditor</comment>
         <translation>Delta</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/taskmodel.cpp" line="208"/>
         <source>Status</source>
         <comment>TaskEditor</comment>
         <translation>Status</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/taskmodel.cpp" line="210"/>
         <source>Age total</source>
         <comment>TaskEditor</comment>
         <translation>Alter insg.</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/taskmodel.cpp" line="212"/>
         <source>Age mod.</source>
         <comment>TaskEditor</comment>
         <translation>Alter letzte Ã„nderung</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/taskmodel.cpp" line="214"/>
         <source>Sleep</source>
         <comment>TaskEditor</comment>
         <translation>Wiedervorlage</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/taskmodel.cpp" line="216"/>
         <source>Map</source>
         <comment>TaskEditor</comment>
         <translation>Map</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/taskmodel.cpp" line="218"/>
         <source>Flags</source>
         <comment>TaskEditor</comment>
         <translation>Flaggen</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/taskmodel.cpp" line="220"/>
         <source>Task</source>
         <comment>TaskEditor</comment>
         <translation>Aufgabe</translation>
@@ -4251,32 +4281,32 @@ Wollen Sie sie Ã¼berschreiben?</translation>
 <context>
     <name>TextEditor</name>
     <message>
-        <location filename="../src/texteditor.cpp" line="+327"/>
+        <location filename="../src/texteditor.cpp" line="324"/>
         <source>&amp;Import...</source>
         <translation>&amp;Importiere</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/texteditor.cpp" line="333"/>
         <source>&amp;Export...</source>
         <translation>&amp;Export</translation>
     </message>
     <message>
-        <location line="+19"/>
+        <location filename="../src/texteditor.cpp" line="344"/>
         <source>&amp;Print...</source>
         <translation>&amp;Drucken</translation>
     </message>
     <message>
-        <location line="+33"/>
+        <location filename="../src/texteditor.cpp" line="377"/>
         <source>&amp;Undo</source>
         <translation>R&amp;ückgängig</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/texteditor.cpp" line="386"/>
         <source>&amp;Redo</source>
         <translation>Wieder&amp;herstellen</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/texteditor.cpp" line="396"/>
         <source>Select and copy &amp;all</source>
         <translation>&amp;Alles auswählen und kopieren</translation>
     </message>
@@ -4293,27 +4323,47 @@ Wollen Sie sie Ã¼berschreiben?</translation>
         <translation type="vanished">Ein&amp;fügen</translation>
     </message>
     <message>
-        <location line="-44"/>
+        <location filename="../src/texteditor.cpp" line="352"/>
         <source>&amp;Delete All</source>
         <translation>Alles &amp;löschen</translation>
     </message>
     <message>
-        <location line="+262"/>
+        <location filename="../src/texteditor.cpp" line="514"/>
+        <source>&amp;Color text using foreground color</source>
+        <translation>Text mit Vordergrundfarbe einfärben</translation>
+    </message>
+    <message>
+        <location filename="../src/texteditor.cpp" line="522"/>
+        <source>&amp;Select text foreground color...</source>
+        <translation>Text Vordergrundfarbe auswählen</translation>
+    </message>
+    <message>
+        <location filename="../src/texteditor.cpp" line="534"/>
+        <source>&amp;Mark text using background color...</source>
+        <translation>Text mit Hintergrundfarbe markieren</translation>
+    </message>
+    <message>
+        <location filename="../src/texteditor.cpp" line="542"/>
+        <source>&amp;Select text background color...</source>
+        <translation>Text Hintergrundfarbe auswählen</translation>
+    </message>
+    <message>
+        <location filename="../src/texteditor.cpp" line="645"/>
         <source>&amp;Settings</source>
         <translation>&amp;Einstellungen</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/texteditor.cpp" line="648"/>
         <source>Set &amp;fixed font</source>
         <translation>Wähle Zeichensatz mit f&amp;ixer Breite</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/texteditor.cpp" line="653"/>
         <source>Set &amp;variable font</source>
         <translation>Wähle Zeichensatz mit v&amp;ariabler Breite</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/texteditor.cpp" line="658"/>
         <source>&amp;fixed font is default</source>
         <translation>Verwende fixen Zeichensatz p&amp;er default</translation>
     </message>
@@ -4322,29 +4372,28 @@ Wollen Sie sie Ã¼berschreiben?</translation>
         <translation type="vanished">Exportiere Notiz &amp;als... (HTML)</translation>
     </message>
     <message>
-        <location line="-292"/>
         <source>Export &amp;As...(ASCII)</source>
-        <translation>Exportiere a&amp;ls (ASCII)</translation>
+        <translation type="vanished">Exportiere a&amp;ls (ASCII)</translation>
     </message>
     <message>
-        <location line="+39"/>
+        <location filename="../src/texteditor.cpp" line="374"/>
         <source>Edi&amp;t</source>
         <translation>Edi&amp;tieren</translation>
     </message>
     <message>
-        <location line="+71"/>
+        <location filename="../src/texteditor.cpp" line="453"/>
         <source>Font hints</source>
         <comment>toolbar in texteditor</comment>
         <translation>Zeichensatz Hint</translation>
     </message>
     <message>
-        <location line="+30"/>
+        <location filename="../src/texteditor.cpp" line="483"/>
         <source>Fonts</source>
         <comment>toolbar in texteditor</comment>
         <translation>Zeichensätze</translation>
     </message>
     <message>
-        <location line="+27"/>
+        <location filename="../src/texteditor.cpp" line="510"/>
         <source>Format</source>
         <comment>toolbar in texteditor</comment>
         <translation>Format</translation>
@@ -4354,84 +4403,83 @@ Wollen Sie sie Ã¼berschreiben?</translation>
         <translation type="vanished">&amp;Farbe...</translation>
     </message>
     <message>
-        <location line="+23"/>
+        <location filename="../src/texteditor.cpp" line="556"/>
         <source>&amp;Bold</source>
         <translation>F&amp;ett</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/texteditor.cpp" line="566"/>
         <source>&amp;Italic</source>
         <translation>K&amp;ursiv</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/texteditor.cpp" line="576"/>
         <source>&amp;Underline</source>
         <translation>&amp;Unterstrichen</translation>
     </message>
     <message>
-        <location line="+37"/>
+        <location filename="../src/texteditor.cpp" line="613"/>
         <source>&amp;Left</source>
         <translation>&amp;Linksbündig</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/texteditor.cpp" line="620"/>
         <source>C&amp;enter</source>
         <translation>&amp;Zentriert</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/texteditor.cpp" line="627"/>
         <source>&amp;Right</source>
         <translation>&amp;Rechtsbündig</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/texteditor.cpp" line="634"/>
         <source>&amp;Justify</source>
         <translation>&amp;Blocksatz</translation>
     </message>
     <message>
-        <location line="+238"/>
+        <location filename="../src/texteditor.cpp" line="889"/>
         <source>Export Note to single file</source>
         <translation>Notiz in eine einzelne Datei exportieren</translation>
     </message>
     <message>
-        <location line="-181"/>
-        <location line="+194"/>
+        <location filename="../src/texteditor.cpp" line="691"/>
+        <location filename="../src/texteditor.cpp" line="906"/>
         <source>Overwrite</source>
         <translation>Überschreiben</translation>
     </message>
     <message>
-        <location line="-193"/>
-        <location line="+194"/>
+        <location filename="../src/texteditor.cpp" line="692"/>
+        <location filename="../src/texteditor.cpp" line="907"/>
         <source>Cancel</source>
         <translation>Abbrechen</translation>
     </message>
     <message>
-        <location line="+58"/>
         <source>Export Note to single file (ASCII)</source>
-        <translation>Notiz als ASCII in eine einzelne Datei ausgeben</translation>
+        <translation type="vanished">Notiz als ASCII in eine einzelne Datei ausgeben</translation>
     </message>
     <message>
-        <location line="-461"/>
+        <location filename="../src/texteditor.cpp" line="460"/>
         <source>&amp;Font hint</source>
         <translation>Zeichensatz &amp;umschalten</translation>
     </message>
     <message>
-        <location line="+107"/>
+        <location filename="../src/texteditor.cpp" line="590"/>
         <source>Subs&amp;cript</source>
         <translation>&amp;Tiefgestellt</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/texteditor.cpp" line="599"/>
         <source>Su&amp;perscript</source>
         <translation>&amp;Hochgestellt</translation>
     </message>
     <message>
-        <location line="+90"/>
+        <location filename="../src/texteditor.cpp" line="689"/>
         <source>Note Editor</source>
         <translation>Notiz Editor</translation>
     </message>
     <message>
-        <location line="-210"/>
+        <location filename="../src/texteditor.cpp" line="456"/>
         <source>F&amp;ormat</source>
         <translation>F&amp;ormat</translation>
     </message>
@@ -4441,12 +4489,12 @@ Wollen Sie sie Ã¼berschreiben?</translation>
         <translation type="vanished">Text Editor</translation>
     </message>
     <message>
-        <location line="-78"/>
+        <location filename="../src/texteditor.cpp" line="370"/>
         <source>Edit Actions</source>
         <translation>Edit Actions</translation>
     </message>
     <message>
-        <location line="-61"/>
+        <location filename="../src/texteditor.cpp" line="317"/>
         <source>Note Actions</source>
         <translation>Note Actions</translation>
     </message>
@@ -4456,94 +4504,97 @@ Wollen Sie sie Ã¼berschreiben?</translation>
         <translation type="vanished">Bereit</translation>
     </message>
     <message>
-        <location line="-93"/>
         <source>No filename available for this note.</source>
         <comment>Statusbar message</comment>
-        <translation>Notiz hat keinen Dateinamen</translation>
+        <translation type="vanished">Notiz hat keinen Dateinamen</translation>
     </message>
     <message>
-        <location line="+96"/>
+        <location filename="../src/texteditor.cpp" line="320"/>
         <source>&amp;Note</source>
         <comment>Menubar</comment>
         <translation>&amp;Notiz</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/texteditor.cpp" line="322"/>
         <source>File actions</source>
         <comment>TextEditor shortcut groups</comment>
         <translation>Datei Aktionen</translation>
     </message>
     <message>
-        <location line="+55"/>
+        <location filename="../src/texteditor.cpp" line="369"/>
         <source>Edit actions</source>
         <comment>TextEditor shortcut groups</comment>
         <translation>Editier Aktionen</translation>
     </message>
     <message>
-        <location line="+36"/>
+        <location filename="../src/texteditor.cpp" line="405"/>
         <source>&amp;Copy</source>
         <comment>Edit menu</comment>
         <translation>&amp;Kopieren</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/texteditor.cpp" line="414"/>
         <source>Cu&amp;t</source>
         <comment>Edit menu</comment>
         <translation>&amp;Ausschneiden</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/texteditor.cpp" line="423"/>
         <source>&amp;Paste</source>
         <comment>Edit menu</comment>
         <translation>Ein&amp;fügen</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/texteditor.cpp" line="432"/>
+        <source>Insert or edit URL</source>
+        <comment>TextEditor</comment>
+        <translation>URL einfügen oder Ã¤ndern</translation>
+    </message>
+    <message>
+        <location filename="../src/texteditor.cpp" line="440"/>
         <source>Insert image</source>
         <comment>TextEditor</comment>
         <translation>Bild einfügen</translation>
     </message>
     <message>
-        <location line="+11"/>
+        <location filename="../src/texteditor.cpp" line="451"/>
         <source>Format actions</source>
         <comment>TextEditor shortcut groups</comment>
         <translation>Formatier Actions</translation>
     </message>
     <message>
-        <location line="+21"/>
+        <location filename="../src/texteditor.cpp" line="472"/>
         <source>&amp;Richtext</source>
         <translation>&amp;Richtext</translation>
     </message>
     <message>
-        <location line="+45"/>
         <source>&amp;Text Color...</source>
-        <translation>&amp;Text Farbe</translation>
+        <translation type="vanished">&amp;Text Farbe</translation>
     </message>
     <message>
-        <location line="+9"/>
         <source>&amp;Text background color...</source>
-        <translation>&amp;Text Hintergrundfarbe</translation>
+        <translation type="vanished">&amp;Text Hintergrundfarbe</translation>
     </message>
     <message>
-        <location line="+118"/>
+        <location filename="../src/texteditor.cpp" line="667"/>
         <source>Set RichText mode editor background color</source>
         <comment>TextEditor</comment>
         <translation>Setze Standardfarbe für Hintergrund mit RichText</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/texteditor.cpp" line="672"/>
         <source>Set RichText mode default text color</source>
         <comment>TextEditor</comment>
         <translation>Setze Standardfarbe für Hintergrund mit RichText</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location filename="../src/texteditor.cpp" line="677"/>
         <source>Set RichText mode default text background color</source>
         <comment>TextEditor</comment>
         <translation>Setze Standardfarbe für Hintergrund mit RichText</translation>
     </message>
     <message>
-        <location line="+206"/>
+        <location filename="../src/texteditor.cpp" line="904"/>
         <source>The file %1
 exists already.
 Do you want to overwrite it?</source>
@@ -4552,49 +4603,48 @@ Do you want to overwrite it?</source>
 Wollen Sie sie Ã¼berschreiben?</translation>
     </message>
     <message>
-        <location line="+19"/>
         <source>Couldn&apos;t export note </source>
         <comment>dialog &apos;save note as&apos;</comment>
-        <translation>Konnte Notiz nicht exportieren</translation>
+        <translation type="vanished">Konnte Notiz nicht exportieren</translation>
     </message>
     <message>
-        <location line="+72"/>
+        <location filename="../src/texteditor.cpp" line="937"/>
         <source>Print</source>
         <comment>TextEditor</comment>
         <translation>Drucken</translation>
     </message>
     <message>
-        <location line="+95"/>
+        <location filename="../src/texteditor.cpp" line="1042"/>
         <source>Text color</source>
         <comment>TextEditor windows</comment>
         <translation>&amp;Text Farbe</translation>
     </message>
     <message>
-        <location line="+12"/>
+        <location filename="../src/texteditor.cpp" line="1061"/>
         <source>Text background color</source>
         <comment>TextEditor windows</comment>
         <translation>&amp;Text Hintergrundfarbe</translation>
     </message>
     <message>
-        <location line="+208"/>
+        <location filename="../src/texteditor.cpp" line="1278"/>
         <source>Text editor background color</source>
         <comment>TextEditor windows</comment>
         <translation>Text Editor Hintergrundfarbe</translation>
     </message>
     <message>
-        <location line="+15"/>
+        <location filename="../src/texteditor.cpp" line="1296"/>
         <source>Text editor default text color</source>
         <comment>TextEditor windows</comment>
         <translation>Setze Standardzeichenfarbe für Texteditor</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/texteditor.cpp" line="1306"/>
         <source>Text editor default text background color</source>
         <comment>TextEditor windows</comment>
         <translation>Setze Standardhintergrundfarbe für Texteditor</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/texteditor.cpp" line="1383"/>
         <source>Load image</source>
         <comment>TextEditor</comment>
         <translation>Lade Bild</translation>
@@ -4613,13 +4663,13 @@ Wollen Sie sie Ã¼berschreiben?</translation>
 <context>
     <name>TreeEditor</name>
     <message>
-        <location filename="../src/treeeditor.cpp" line="+35"/>
+        <location filename="../src/treeeditor.cpp" line="35"/>
         <source>Select upper object</source>
         <comment>Tree Editor</comment>
         <translation>Zweig oben auswählen</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/treeeditor.cpp" line="41"/>
         <source>Select lower object</source>
         <comment>Tree Editor</comment>
         <translation>Zweig unten auswählen</translation>
@@ -4628,64 +4678,64 @@ Wollen Sie sie Ã¼berschreiben?</translation>
 <context>
     <name>VymModel</name>
     <message>
-        <location filename="../src/vymmodel.cpp" line="-5379"/>
+        <location filename="../src/vymmodel.cpp" line="179"/>
         <source>unknown user</source>
         <comment>default name for map author in settings</comment>
         <translation>unbekannter Benutzer</translation>
     </message>
     <message>
-        <location line="+26"/>
+        <location filename="../src/vymmodel.cpp" line="205"/>
         <source>unnamed</source>
         <translation>unbenannt</translation>
     </message>
     <message>
-        <location line="+291"/>
-        <location line="+119"/>
-        <location line="+74"/>
+        <location filename="../src/vymmodel.cpp" line="516"/>
+        <location filename="../src/vymmodel.cpp" line="635"/>
+        <location filename="../src/vymmodel.cpp" line="709"/>
         <source>Critical Parse Error</source>
         <translation>Kritischer Fehler beim Verarbeiten</translation>
     </message>
     <message>
-        <location line="-174"/>
-        <location line="+67"/>
-        <location line="+7"/>
-        <location line="+8"/>
-        <location line="+6"/>
+        <location filename="../src/vymmodel.cpp" line="535"/>
+        <location filename="../src/vymmodel.cpp" line="602"/>
+        <location filename="../src/vymmodel.cpp" line="609"/>
+        <location filename="../src/vymmodel.cpp" line="617"/>
+        <location filename="../src/vymmodel.cpp" line="623"/>
         <source>Critical Load Error</source>
         <translation>Kritischer Fehler beim Laden</translation>
     </message>
     <message>
-        <location line="-87"/>
+        <location filename="../src/vymmodel.cpp" line="536"/>
         <source>Couldn&apos;t create temporary directory before load
 </source>
         <translation>Konnte temporäres Verzeichnis vor dem Laden nicht erzeugen</translation>
     </message>
     <message>
-        <location line="+21"/>
+        <location filename="../src/vymmodel.cpp" line="557"/>
         <source>Uncompressing %1</source>
         <translation>Entpacke %1</translation>
     </message>
     <message>
-        <location line="+12"/>
+        <location filename="../src/vymmodel.cpp" line="569"/>
         <source>Loading %1</source>
         <translation>Lade: %1</translation>
     </message>
     <message>
-        <location line="+41"/>
+        <location filename="../src/vymmodel.cpp" line="610"/>
         <source>Couldn&apos;t find %1 in map file.
 </source>
         <translation>Konnte %1 in der Map Datei nicht finden
 </translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location filename="../src/vymmodel.cpp" line="624"/>
         <source>Couldn&apos;t find a map (*.xml) in .vym archive.
 </source>
         <translation>Konnte keine map (*.xml) in .vym Datei finden.
 </translation>
     </message>
     <message>
-        <location line="+156"/>
+        <location filename="../src/vymmodel.cpp" line="781"/>
         <source>The map %1
 did not use the compressed vym file format.
 Writing it uncompressed will also write images 
@@ -4700,97 +4750,103 @@ könnte damit Dateien im  Verzeichnis Ã¼berschreiben
 Soll die Map geschrieben werden?</translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/vymmodel.cpp" line="791"/>
         <source>uncompressed, potentially overwrite existing data</source>
         <translation>unkomprimiert, u.U werden Daten Ã¼berschrieben</translation>
     </message>
     <message>
-        <location line="+47"/>
+        <location filename="../src/vymmodel.cpp" line="826"/>
+        <source>%1
+could not be renamed as backup file before saving</source>
+        <translation>%1
+konnte nicht als Backupdatei umbenannt werden vor dem Speichern</translation>
+    </message>
+    <message>
+        <location filename="../src/vymmodel.cpp" line="838"/>
         <source>Couldn&apos;t access zipDir %1
 </source>
         <translation>Konnte nicht auf zipDir zugreifen: %1
 </translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/vymmodel.cpp" line="848"/>
         <source>Saving  %1...</source>
         <translation>Speichere %1...</translation>
     </message>
     <message>
-        <location line="+50"/>
+        <location filename="../src/vymmodel.cpp" line="898"/>
         <source>Couldn&apos;t save </source>
         <translation>Datei konnte nicht gespeichert werden </translation>
     </message>
     <message>
-        <location line="+10"/>
+        <location filename="../src/vymmodel.cpp" line="908"/>
         <source>Compressing %1</source>
         <translation>Komprimiere %1</translation>
     </message>
     <message>
-        <location line="+9"/>
-        <location line="+49"/>
-        <location line="+101"/>
+        <location filename="../src/vymmodel.cpp" line="923"/>
+        <location filename="../src/vymmodel.cpp" line="975"/>
+        <location filename="../src/vymmodel.cpp" line="1081"/>
         <source>Saved %1</source>
         <translation>%1 gespeichert</translation>
     </message>
     <message>
-        <location line="+176"/>
+        <location filename="../src/vymmodel.cpp" line="1298"/>
         <source>unknown user</source>
         <comment>Default for lockfiles of maps</comment>
         <translation>unbekannter Benutzer</translation>
     </message>
     <message>
-        <location line="+36"/>
+        <location filename="../src/vymmodel.cpp" line="1334"/>
         <source>Warning: Map already opended</source>
         <comment>VymModel</comment>
         <translation>Warnung: Map ist bereits geöffnet</translation>
     </message>
     <message>
-        <location line="+5126"/>
+        <location filename="../src/vymmodel.cpp" line="6476"/>
         <source>Couldn&apos;t find configuration for export to LibreOffice Impress
 </source>
         <translation>Konnte Konfiguration zum Exportieren nach LibreOffice nicht finden
 </translation>
     </message>
     <message>
-        <location line="+1036"/>
+        <location filename="../src/vymmodel.cpp" line="7523"/>
         <source>%1 items selected</source>
         <comment>Status message when selecting multiple items</comment>
         <translation>%1 Objekte ausgewählt</translation>
     </message>
     <message>
-        <location line="-6653"/>
+        <location filename="../src/vymmodel.cpp" line="788"/>
         <source>compressed (vym default)</source>
         <translation>komprimieren (vym default)</translation>
     </message>
     <message>
-        <location line="+6"/>
-        <location line="+263"/>
+        <location filename="../src/vymmodel.cpp" line="794"/>
+        <location filename="../src/vymmodel.cpp" line="1071"/>
         <source>Cancel</source>
         <translation>Abbrechen</translation>
     </message>
     <message>
-        <location line="-239"/>
-        <location line="+7"/>
+        <location filename="../src/vymmodel.cpp" line="818"/>
+        <location filename="../src/vymmodel.cpp" line="825"/>
         <source>Save Error</source>
         <translation>Fehler beim Speichern</translation>
     </message>
     <message>
-        <location line="-6"/>
+        <location filename="../src/vymmodel.cpp" line="819"/>
         <source>%1
 could not be removed before saving</source>
         <translation>%1
 konnte vor dem Speichern nicht entfernt werden</translation>
     </message>
     <message>
-        <location line="+7"/>
         <source>%1
 could not be renamed before saving</source>
-        <translation>%1
+        <translation type="vanished">%1
 konnte vor dem Speichern nicht umbenannt werden</translation>
     </message>
     <message>
-        <location line="+11"/>
+        <location filename="../src/vymmodel.cpp" line="837"/>
         <source>Critical Save Error</source>
         <translation>Kritischer Fehler beim Speichern</translation>
     </message>
@@ -4800,12 +4856,12 @@ konnte vor dem Speichern nicht umbenannt werden</translation>
         <translation type="vanished">Konnte temporäres Verzeichnis vor dem Speichern nicht erzeugen</translation>
     </message>
     <message>
-        <location line="+199"/>
+        <location filename="../src/vymmodel.cpp" line="1050"/>
         <source>Images</source>
         <translation>Bilder</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/vymmodel.cpp" line="1052"/>
         <source>All</source>
         <comment>Filedialog</comment>
         <translation>Alle</translation>
@@ -4815,51 +4871,51 @@ konnte vor dem Speichern nicht umbenannt werden</translation>
         <translation type="vanished">Lade Bild</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/vymmodel.cpp" line="1055"/>
         <source>Save image</source>
         <translation>Speichere Bild</translation>
     </message>
     <message>
-        <location line="+9"/>
+        <location filename="../src/vymmodel.cpp" line="1064"/>
         <source>The file %1 exists already.
 Do you want to overwrite it?</source>
         <translation>Die Datei %1 gibt es bereits.
 Wollen Sie sie Ã¼berschreiben?</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/vymmodel.cpp" line="1068"/>
         <source>Overwrite</source>
         <translation>Überschreiben</translation>
     </message>
     <message>
-        <location line="+10"/>
-        <location line="+4946"/>
+        <location filename="../src/vymmodel.cpp" line="1078"/>
+        <location filename="../src/vymmodel.cpp" line="6081"/>
         <source>Critical Error</source>
         <translation>Kritischer Fehler</translation>
     </message>
     <message>
-        <location line="-4945"/>
+        <location filename="../src/vymmodel.cpp" line="1079"/>
         <source>Couldn&apos;t save %1</source>
         <translation>Konnte %1 nicht speichern</translation>
     </message>
     <message>
-        <location line="+40"/>
+        <location filename="../src/vymmodel.cpp" line="1119"/>
         <source>Critical Import Error</source>
         <translation>Kritischer Fehler beim Importieren</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/vymmodel.cpp" line="1120"/>
         <source>Cannot find the directory %1</source>
         <translation>Konnte das Verzeichnis %1 nicht finden</translation>
     </message>
     <message>
-        <location line="+55"/>
-        <location line="+4"/>
+        <location filename="../src/vymmodel.cpp" line="1175"/>
+        <location filename="../src/vymmodel.cpp" line="1179"/>
         <source>Choose directory structure to import</source>
         <translation>Bitte Verzeichnis zum Importieren auswählen</translation>
     </message>
     <message>
-        <location line="+106"/>
+        <location filename="../src/vymmodel.cpp" line="1326"/>
         <source>Map seems to be already opened in another vym instance!
 
  Map is locked by &quot;%1&quot; on &quot;%2&quot;
@@ -4872,41 +4928,41 @@ Map ist gesperrt von &quot;%1&quot; auf &quot;%2&quot;
 Bitte Lockdatei nur entfernen, wenn wirklich niemand anderes diese Map momentan verwendet.</translation>
     </message>
     <message>
-        <location line="+4348"/>
+        <location filename="../src/vymmodel.cpp" line="5690"/>
         <source>Could not setup JiraAgent to retrieve data from Jira</source>
         <translation>Konnte JiraAgent nicht initialisieren um Daten von Jira zu holen</translation>
     </message>
     <message>
-        <location line="+8"/>
+        <location filename="../src/vymmodel.cpp" line="5698"/>
         <source>Contacting Jira...</source>
         <comment>VymModel</comment>
         <translation>Kontaktiere JIRA...</translation>
     </message>
     <message>
-        <location line="-4397"/>
+        <location filename="../src/vymmodel.cpp" line="1285"/>
         <source>Removed lockfile for %1</source>
         <translation>Lockdateo für %1 entfernt.</translation>
     </message>
     <message>
-        <location line="+55"/>
+        <location filename="../src/vymmodel.cpp" line="1340"/>
         <source>Couldn&apos;t remove lockfile for %1</source>
         <translation>Konnte Lockdatei für %1 nicht entfernen</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location filename="../src/vymmodel.cpp" line="1354"/>
         <source>Cannot create lockfile of map! It will be opened in readonly mode.
 
 </source>
         <translation>Konnte Lockdatei nicht anlegen! Map wird nur zum Lesen geöffnet.</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/vymmodel.cpp" line="1357"/>
         <source>Warning</source>
         <comment>VymModel</comment>
         <translation>Warnung</translation>
     </message>
     <message>
-        <location line="+116"/>
+        <location filename="../src/vymmodel.cpp" line="1474"/>
         <source>The file of the map  on disk has changed:
 
    %1
@@ -4919,29 +4975,29 @@ Do you want to reload that map with the new file?</source>
 Soll die Map durch die neue Datei ersetzt werden?</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location filename="../src/vymmodel.cpp" line="1480"/>
         <source>Reload</source>
         <translation>Neu laden</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location filename="../src/vymmodel.cpp" line="1483"/>
         <source>Ignore</source>
         <translation>Ignorieren</translation>
     </message>
     <message>
-        <location line="-143"/>
-        <location line="+4297"/>
-        <location line="+823"/>
+        <location filename="../src/vymmodel.cpp" line="1339"/>
+        <location filename="../src/vymmodel.cpp" line="5652"/>
+        <location filename="../src/vymmodel.cpp" line="6475"/>
         <source>Warning</source>
         <translation>Warnung</translation>
     </message>
     <message>
-        <location line="-4790"/>
+        <location filename="../src/vymmodel.cpp" line="1670"/>
         <source>Autosave disabled during undo.</source>
         <translation>Autosave ausgeschaltet während der Aktion &quot;Rückgängig&quot;</translation>
     </message>
     <message>
-        <location line="+961"/>
+        <location filename="../src/vymmodel.cpp" line="2640"/>
         <source>Note</source>
         <comment>FindAll in VymModel</comment>
         <translation>Notiz</translation>
@@ -4952,56 +5008,56 @@ Soll die Map durch die neue Datei ersetzt werden?</translation>
         <translation type="vanished">Neue Map</translation>
     </message>
     <message>
-        <location line="+3417"/>
+        <location filename="../src/vymmodel.cpp" line="6063"/>
         <source>Export map as image</source>
         <translation>Map als Bild exportieren</translation>
     </message>
     <message>
-        <location line="+19"/>
+        <location filename="../src/vymmodel.cpp" line="6082"/>
         <source>Couldn&apos;t save QImage %1 in format %2</source>
         <translation>Konnte Bild %1 nicht im Format %2 speichern</translation>
     </message>
     <message>
-        <location line="+33"/>
+        <location filename="../src/vymmodel.cpp" line="6115"/>
         <source>Export map as PDF</source>
         <translation>Als PDF exportieren</translation>
     </message>
     <message>
-        <location line="+56"/>
+        <location filename="../src/vymmodel.cpp" line="6171"/>
         <source>Export map as SVG</source>
         <translation>Als SVG exportieren</translation>
     </message>
     <message>
-        <location line="+45"/>
-        <location line="+243"/>
+        <location filename="../src/vymmodel.cpp" line="6216"/>
+        <location filename="../src/vymmodel.cpp" line="6459"/>
         <source>Export to</source>
         <translation>Exportieren als</translation>
     </message>
     <message>
-        <location line="-218"/>
+        <location filename="../src/vymmodel.cpp" line="6241"/>
         <source>Export map as XML</source>
         <translation>Als XML exportieren</translation>
     </message>
     <message>
-        <location line="+7"/>
+        <location filename="../src/vymmodel.cpp" line="6248"/>
         <source>Export XML to directory</source>
         <translation>Exportiere XML in Verzeichnis</translation>
     </message>
     <message>
-        <location line="+50"/>
+        <location filename="../src/vymmodel.cpp" line="6298"/>
         <source>Critical Export Error</source>
         <translation>Kritischer Fehler beim Exportieren</translation>
     </message>
     <message>
-        <location line="-81"/>
-        <location line="+167"/>
-        <location line="+27"/>
+        <location filename="../src/vymmodel.cpp" line="6217"/>
+        <location filename="../src/vymmodel.cpp" line="6384"/>
+        <location filename="../src/vymmodel.cpp" line="6411"/>
         <source>(still experimental)</source>
         <translation>(noch experimentelle Funktion)</translation>
     </message>
     <message>
-        <location line="-28"/>
-        <location line="+27"/>
+        <location filename="../src/vymmodel.cpp" line="6383"/>
+        <location filename="../src/vymmodel.cpp" line="6410"/>
         <source>Export as csv</source>
         <translation>Exportiere als CSV</translation>
     </message>
@@ -5015,8 +5071,8 @@ Soll die Map durch die neue Datei ersetzt werden?</translation>
         <translation type="vanished">Konnte keine JIRA Ticket Zeichenfolge finden in %1</translation>
     </message>
     <message>
-        <location line="-623"/>
-        <location line="+58"/>
+        <location filename="../src/vymmodel.cpp" line="5787"/>
+        <location filename="../src/vymmodel.cpp" line="5845"/>
         <source>Received Jira data.</source>
         <comment>VymModel</comment>
         <translation>Jira Daten empfangen</translation>
@@ -5025,35 +5081,31 @@ Soll die Map durch die neue Datei ersetzt werden?</translation>
 <context>
     <name>VymModelWrapper</name>
     <message>
-        <location filename="../src/vymmodelwrapper.cpp" line="+488"/>
-        <location line="+10"/>
         <source>Saving the selection in map failed:
 Couldn&apos;t rename map to %1</source>
-        <translation>Map konnte nicht gespeichert werden
+        <translation type="vanished">Map konnte nicht gespeichert werden
 Konnte nicht umbenennen zu %1</translation>
     </message>
     <message>
-        <location line="-8"/>
-        <location line="+10"/>
         <source>Critical Error</source>
-        <translation>Kritischer Fehler</translation>
+        <translation type="vanished">Kritischer Fehler</translation>
     </message>
 </context>
 <context>
     <name>VymProcess</name>
     <message>
-        <location filename="../src/vymprocess.cpp" line="+40"/>
-        <location line="+5"/>
+        <location filename="../src/vymprocess.cpp" line="40"/>
+        <location filename="../src/vymprocess.cpp" line="45"/>
         <source>Critical Error</source>
         <translation>Kritischer Fehler</translation>
     </message>
     <message>
-        <location line="+1"/>
+        <location filename="../src/vymprocess.cpp" line="46"/>
         <source>%1 didn&apos;t exit normally</source>
         <translation>%1 wurde nicht richtig beendet</translation>
     </message>
     <message>
-        <location line="-5"/>
+        <location filename="../src/vymprocess.cpp" line="41"/>
         <source>Could not start %1</source>
         <translation>Konnte nicht starten: %1</translation>
     </message>
@@ -5061,13 +5113,13 @@ Konnte nicht umbenennen zu %1</translation>
 <context>
     <name>VymView</name>
     <message>
-        <location filename="../src/vymview.cpp" line="+43"/>
+        <location filename="../src/vymview.cpp" line="43"/>
         <source>Tree Editor</source>
         <comment>Title of dockable editor widget</comment>
         <translation>Baum Editor</translation>
     </message>
     <message>
-        <location line="+18"/>
+        <location filename="../src/vymview.cpp" line="61"/>
         <source>Slide Editor</source>
         <comment>Title of dockable editor widget</comment>
         <translation>Folien Editor</translation>
@@ -5076,17 +5128,17 @@ Konnte nicht umbenennen zu %1</translation>
 <context>
     <name>WarningDialog</name>
     <message>
-        <location filename="../src/warningdialog.cpp" line="+10"/>
+        <location filename="../src/warningdialog.cpp" line="10"/>
         <source>Proceed</source>
         <translation>Weiter</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location filename="../src/warningdialog.cpp" line="12"/>
         <source>Show this message again</source>
         <translation>Diese Meldung das nächste Mal wieder zeigen</translation>
     </message>
     <message>
-        <location line="+4"/>
+        <location filename="../src/warningdialog.cpp" line="16"/>
         <source>Warning</source>
         <comment>Warning dialog default window name</comment>
         <translation>Warnung</translation>
@@ -5096,7 +5148,7 @@ Konnte nicht umbenennen zu %1</translation>
         <translation type="vanished">Dialog</translation>
     </message>
     <message>
-        <location line="+35"/>
+        <location filename="../src/warningdialog.cpp" line="51"/>
         <source>Cancel</source>
         <translation>Abbrechen</translation>
     </message>
index 364161cfde2b5310d90efe43c36749dc62abddbc..2ed2ffe2f3b607ac2d324970322872f896440a8b 100644 (file)
@@ -2,14 +2,15 @@
 
 // Macros called when function keys are pressed
 
+//! Helper function to toggle frame background color of a single branch
 
-//! Helper function to toggle frame
 function toggle_frame_branch(color, msg)
 {
     map = vym.currentMap();
     branches = map.selectedBranches();
-
     for (b of branches) {
+        // Make sure changes are saved
+        b.setFrameAutoDesign(true, false);
         if (b.getFrameType(true) == "NoFrame" ) {
             b.setFrameType (true, "RoundedRectangle");
             b.setFrameBrushColor(true, color);
@@ -21,12 +22,15 @@ function toggle_frame_branch(color, msg)
     }
 }
 
+//! Helper function to toggle frame background color of a whole subtree
+
 function toggle_frame_subtree(color, msg)
 {
     map = vym.currentMap();
     branches = map.selectedBranches();
-
     for (b of branches) {
+        // Make sure changes are saved
+        b.setFrameAutoDesign(false, false);
         if (b.getFrameType(false) == "NoFrame" ) {
             b.setFrameType (false, "RoundedRectangle");
             b.setFrameBrushColor(false, color);
@@ -38,29 +42,32 @@ function toggle_frame_subtree(color, msg)
     }
 }
 
+//! Helper function to color only the selected branch using a quick color slot
 
 function colorBranchWithQuickColor(n)
 {
     map = vym.currentMap();
     vym.selectQuickColor(n);
     c = vym.currentColor();
-
     branches = map.selectedBranches();
     for (b of branches)
         b.colorBranch(c);
 }
 
+//! Helper function to color the whole subtree using a quick color slot
+
 function colorSubtreeWithQuickColor(n)
 {
     map = vym.currentMap();
     vym.selectQuickColor(n);
     c = vym.currentColor();
-
     branches = map.selectedBranches();
     for (b of branches)
         b.colorSubtree(c);
 }
 
+// â”€â”€â”€ Plain function keys: color the whole subtree â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
+
 //! Macro F1: Color subtree red
 function macro_f1()
 {
@@ -71,7 +78,6 @@ function macro_f1()
 function macro_f2()
 {
     colorSubtreeWithQuickColor(1);
-
     // Or if you prefer to edit the heading of a branch using "F2"-key,
     // you can use below instead of above:
     // vym.editHeading();
@@ -83,7 +89,6 @@ function macro_f3()
     colorSubtreeWithQuickColor(2);
 }
 
-
 //! Macro F4: Color subtree purple
 function macro_f4()
 {
@@ -96,7 +101,7 @@ function macro_f5()
     colorSubtreeWithQuickColor(4);
 }
 
-//! Macro F6: Color subtree blue
+//! Macro F6: Color subtree cyan
 function macro_f6()
 {
     colorSubtreeWithQuickColor(5);
@@ -120,30 +125,30 @@ function macro_f9()
     colorSubtreeWithQuickColor(8);
 }
 
-//! Macro F10: Color subtree light white
+//! Macro F10: Color subtree white
 function macro_f10()
 {
     colorSubtreeWithQuickColor(9);
 }
 
-//! Macro F11:
+//! Macro F11: (unused)
 function macro_f11()
 {
     map = vym.currentMap();
     // Unused
 }
 
-//! Macro F12: toggle high prio task
+//! Macro F12: Toggle high-priority task state
 function macro_f12()
 {
-       // Assuming 3 states, which are cycled:
-       // 0 - nothing set
-       // 1 - high prio task with arrows
-       // 2 - done task without arrows, but green hook
+    // Assuming 3 states, which are cycled:
+    // 0 - nothing set
+    // 1 - high prio task with arrows
+    // 2 - done task without arrows, but green hook
     map = vym.currentMap();
     b = map.selectedBranch();
     if (b.hasTask() ) {
-        // Switch to state 2 
+        // Switch to state 2
         b.toggleTask();
         b.unsetFlagByName("2arrow-up");
         b.unsetFlagByName("stopsign");
@@ -164,218 +169,214 @@ function macro_f12()
     }
 }
 
+// â”€â”€â”€ Shift + function keys: color only the selected branch â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
 
-//! Macro Shift + F1: Frame background light red
+//! Macro Shift+F1: Color branch red
 function macro_shift_f1()
 {
-    toggle_frame_branch ( "#ffb3b4", "Branch frame background light red" );
+    colorBranchWithQuickColor(0);
 }
 
-//! Macro Shift + F2: Frame background light green
+//! Macro Shift+F2: Color branch orange
 function macro_shift_f2()
 {
-    toggle_frame_branch ( "#bdffd6", "Branch frame background light green");
+    colorBranchWithQuickColor(1);
 }
 
-//! Macro Shift + F3: Frame background light yellow
+//! Macro Shift+F3: Color branch green
 function macro_shift_f3()
 {
-    toggle_frame_branch ( "#efefb3", "Branch frame background light yellow");
+    colorBranchWithQuickColor(2);
 }
 
-//! Macro Shift + F4: Frame background light blue
+//! Macro Shift+F4: Color branch purple
 function macro_shift_f4()
 {
-    toggle_frame_branch ( "#e2e6ff", "Branch frame background light blue");
+    colorBranchWithQuickColor(3);
 }
 
-//! Macro Shift + F5: Frame background light grey
+//! Macro Shift+F5: Color branch blue
 function macro_shift_f5()
 {
-    toggle_frame_branch ( "#d6d6d6", "Branch frame background light grey");
+    colorBranchWithQuickColor(4);
 }
 
-//! Macro Shift + F6: Frame background purple
+//! Macro Shift+F6: Color branch cyan
 function macro_shift_f6()
 {
-    toggle_frame_branch ( "#ffaaff", "Branch frame background purple");
+    colorBranchWithQuickColor(5);
 }
 
-//! Macro Shift + F7: Frame background white
+//! Macro Shift+F7: Color branch black
 function macro_shift_f7()
 {
-    toggle_frame_branch ( "#ffffff", "Branch frame background white");
+    colorBranchWithQuickColor(6);
 }
 
-//! Macro Shift + F8: Frame background black
+//! Macro Shift+F8: Color branch dark gray
 function macro_shift_f8()
 {
-    toggle_frame_branch ( "#000000", "Branch frame background black");
+    colorBranchWithQuickColor(7);
 }
 
-// Macro Shift + F9:
+//! Macro Shift+F9: Color branch light gray
 function macro_shift_f9()
 {
+    colorBranchWithQuickColor(8);
 }
 
-//! Macro Shift + F10: 
+//! Macro Shift+F10: Color branch white
 function macro_shift_f10()
 {
+    colorBranchWithQuickColor(9);
 }
 
-//! Macro Shift + F11:
+//! Macro Shift+F11: (unused)
 function macro_shift_f11()
 {
 }
 
-//! Macro Shift + F12:
+//! Macro Shift+F12: (unused)
 function macro_shift_f12()
 {
 }
 
+// â”€â”€â”€ Ctrl + function keys: toggle frame background color of the branch â”€â”€â”€â”€â”€â”€â”€
 
-// New /////////////////////////////////////
-//! Macro Ctrl + F1: Subtree background light red
+//! Macro Ctrl+F1: Toggle branch frame background light red
 function macro_ctrl_f1()
 {
-    toggle_frame_subtree ( "#ffb3b4", "Branch frame background light red");
+    toggle_frame_branch ( "#ffb3b4", "Branch frame background light red" );
 }
 
-//! Macro Ctrl + F2: Subtree background light green
-
+//! Macro Ctrl+F2: Toggle branch frame background light green
 function macro_ctrl_f2()
 {
-    toggle_frame_subtree ( "#bdffd6", "Branch frame background light green");
+    toggle_frame_branch ( "#bdffd6", "Branch frame background light green" );
 }
 
-//! Macro Ctrl + F3: Subtree background light yellow
+//! Macro Ctrl+F3: Toggle branch frame background light yellow
 function macro_ctrl_f3()
 {
-    toggle_frame_subtree ( "#efefb3", "Branch frame background light yellow");
+    toggle_frame_branch ( "#efefb3", "Branch frame background light yellow" );
 }
 
-//! Macro Ctrl + F4: Subtree background light blue
+//! Macro Ctrl+F4: Toggle branch frame background light blue
 function macro_ctrl_f4()
 {
-    toggle_frame_subtree ( "#e2e6ff", "Branch frame background light yellow");
+    toggle_frame_branch ( "#e2e6ff", "Branch frame background light blue" );
 }
 
-//! Macro Ctrl + F5: Subtree  background light grey
+//! Macro Ctrl+F5: Toggle branch frame background light grey
 function macro_ctrl_f5()
 {
-    toggle_frame_subtree ( "#d6d6d6", "Branch frame background light grey");
+    toggle_frame_branch ( "#d6d6d6", "Branch frame background light grey" );
 }
 
-//! Macro Ctrl + F6: Subtree background purple
+//! Macro Ctrl+F6: Toggle branch frame background purple
 function macro_ctrl_f6()
 {
-    toggle_frame_subtree ( "#ffaaff", "Branch frame background light purple");
+    toggle_frame_branch ( "#ffaaff", "Branch frame background purple" );
 }
 
-//! Macro Ctrl + F7: Subtree background white
+//! Macro Ctrl+F7: Toggle branch frame background white
 function macro_ctrl_f7()
 {
-    toggle_frame_subtree ( "#ffffff", "Branch frame background light white");
+    toggle_frame_branch ( "#ffffff", "Branch frame background white" );
 }
 
-//! Macro Ctrl + F8: Subtree background black
+//! Macro Ctrl+F8: Toggle branch frame background black
 function macro_ctrl_f8()
 {
-    toggle_frame_subtree ( "#000000", "Branch frame background light black");
+    toggle_frame_branch ( "#000000", "Branch frame background black" );
 }
 
-//! Macro Ctrl + F9:
+//! Macro Ctrl+F9: (unused)
 function macro_ctrl_f9()
 {
-    vym.statusMessage("Macro F9 + Ctrl triggered");
 }
 
-//! Macro Ctrl + F10: 
+//! Macro Ctrl+F10: (unused)
 function macro_ctrl_f10()
 {
-    vym.statusMessage("Macro F10 + Ctrl triggered");
 }
 
-//! Macro Ctrl + F11:
+//! Macro Ctrl+F11: (unused)
 function macro_ctrl_f11()
 {
-    vym.statusMessage("Macro F11 + Ctrl triggered");
 }
 
-//! Macro Ctrl + F12:
+//! Macro Ctrl+F12: (unused)
 function macro_ctrl_f12()
 {
-    vym.statusMessage("Macro F12 + Ctrl triggered");
 }
 
-//! Macro Ctrl + Shift + F1:
+// â”€â”€â”€ Ctrl+Shift + function keys: toggle frame background color of subtree â”€â”€â”€â”€
+
+//! Macro Ctrl+Shift+F1: Toggle subtree frame background light red
 function macro_ctrl_shift_f1()
 {
-    vym.statusMessage("Macro F1 + Ctrl + Shift triggered");
+    toggle_frame_subtree ( "#ffb3b4", "Subtree frame background light red" );
 }
 
-//! Macro Ctrl + Shift + F2:
+//! Macro Ctrl+Shift+F2: Toggle subtree frame background light green
 function macro_ctrl_shift_f2()
 {
-    vym.statusMessage("Macro F2 + Ctrl + Shift triggered");
+    toggle_frame_subtree ( "#bdffd6", "Subtree frame background light green" );
 }
 
-//! Macro Ctrl + Shift + F3:
+//! Macro Ctrl+Shift+F3: Toggle subtree frame background light yellow
 function macro_ctrl_shift_f3()
 {
-    vym.statusMessage("Macro F3 + Ctrl + Shift triggered");
+    toggle_frame_subtree ( "#efefb3", "Subtree frame background light yellow" );
 }
 
-//! Macro Ctrl + Shift + F4:
+//! Macro Ctrl+Shift+F4: Toggle subtree frame background light blue
 function macro_ctrl_shift_f4()
 {
-    vym.statusMessage("Macro F4 + Ctrl + Shift triggered");
+    toggle_frame_subtree ( "#e2e6ff", "Subtree frame background light blue" );
 }
 
-//! Macro Ctrl + Shift + F5:
+//! Macro Ctrl+Shift+F5: Toggle subtree frame background light grey
 function macro_ctrl_shift_f5()
 {
-    vym.statusMessage("Macro F5 + Ctrl + Shift triggered");
+    toggle_frame_subtree ( "#d6d6d6", "Subtree frame background light grey" );
 }
 
-//! Macro Ctrl + Shift + F6:
+//! Macro Ctrl+Shift+F6: Toggle subtree frame background purple
 function macro_ctrl_shift_f6()
 {
-    vym.statusMessage("Macro F6 + Ctrl + Shift triggered");
+    toggle_frame_subtree ( "#ffaaff", "Subtree frame background purple" );
 }
 
-//! Macro Ctrl + Shift + F7:
+//! Macro Ctrl+Shift+F7: Toggle subtree frame background white
 function macro_ctrl_shift_f7()
 {
-    vym.statusMessage("Macro F7 + Ctrl + Shift triggered");
+    toggle_frame_subtree ( "#ffffff", "Subtree frame background white" );
 }
 
-//! Macro Ctrl + Shift + F8:
+//! Macro Ctrl+Shift+F8: Toggle subtree frame background black
 function macro_ctrl_shift_f8()
 {
-    vym.statusMessage("Macro F8 + Ctrl + Shift triggered");
+    toggle_frame_subtree ( "#000000", "Subtree frame background black" );
 }
 
-//! Macro Ctrl + Shift + F9:
+//! Macro Ctrl+Shift+F9: (unused)
 function macro_ctrl_shift_f9()
 {
-    vym.statusMessage("Macro F9 + Ctrl + Shift triggered");
 }
 
-//! Macro Ctrl + Shift + F10: 
+//! Macro Ctrl+Shift+F10: (unused)
 function macro_ctrl_shift_f10()
 {
-    vym.statusMessage("Macro F10 + Ctrl + Shift triggered");
 }
 
-//! Macro Ctrl + Shift + F11:
+//! Macro Ctrl+Shift+F11: (unused)
 function macro_ctrl_shift_f11()
 {
-    vym.statusMessage("Macro F11 + Ctrl + Shift triggered");
 }
 
-//! Macro Ctrl + Shift + F12:
+//! Macro Ctrl+Shift+F12: (unused)
 function macro_ctrl_shift_f12()
 {
-    vym.statusMessage("Macro F12 + Ctrl + Shift triggered");
-}
\ No newline at end of file
+}
diff --git a/release-notes-3.0.md b/release-notes-3.0.md
new file mode 100644 (file)
index 0000000..a93fd7a
--- /dev/null
@@ -0,0 +1,676 @@
+Release notes VYM - View Your Mind
+==================================
+
+
+The lists below shows main changes between the current 3.0 version of vym and
+the previous official release 2.9.27.
+
+vym has been rewritten in large parts:
+
+ * New layout engine
+   - Supports rotation and scaling of elements
+   - Supports frames around subtrees
+   - Transparency for frame colors
+
+ * Introducing MapDesign
+   - Mapdesign defines how a map looks visually, e.g. colors, frames,
+     links
+   - The design can be saved within the map, e.g. with the default map,
+     which is loaded initially
+   - MapDesign defines how elements look depending on depth, e.g.
+     MapCenters and first level MainBranches may have frames, other
+     branches not.
+
+ * More personalization options
+   - Mapdesign above allows to save personal preferences for designs in
+     default maps or easily share them
+   - Theming has improved
+     - Dark mode support
+     - New icons and additional icons for dark mode
+     - Even selection box can be styled (so far only be modifying
+       mapdesign in xml file, e.g. using vivym script)
+
+ * Improved text handling in NoteEditor and HeadingEditor
+     - RichText in headings of branches
+        - Copy & paste information including bulletpoints and even
+          images into the heading of a branch
+     - Improved color handling
+        - New shortcuts to color text (Ctrl-T) and "mark" background (Ctrl-M)
+        - Color buttons in toolbar no longer update to current cursor color,
+          but remember previously selected colors
+     - [#176](https://github.com/insilmaril/vym/issues/176)  Add and follow hyperlinks in TextEditors
+     - [#168](https://github.com/insilmaril/vym/issues/168)  Background style in TextEditors
+
+ * Keyboard shortcuts
+   - Unified shortcuts for satellite editors
+     - One key to open a specific editor, e.g. N for NoteEditor, B for Properties
+     - One key to close each editor: Ctrl-D
+   - More shortcuts inspired by vim editor without Ctrl/Cmd key:
+     - D to delete
+     - Y to yank/copy
+     - P to paste
+     - 0/$ to go to first/last branch in current subtree
+     - U Undo
+     - / Find
+     - Repeat last action with .
+   - Move a branch up/down "diagonally" by making it a sibling or a
+     child
+   - Zoom view easily with + and - (without Ctrl)  
+   - Resize items easily with Ctlr-+/-
+   - Center view on item and reset zoom factor with ,
+   - Center view and zoom in to item with Shift-,
+   - Move view to make item visible with #
+   - Heading editor and note editor: color text (Ctrl-T) and "mark" background (Ctrl-M)
+
+
+ * Speedup and optimizations
+   - The layout is calculated only once when data related to graphics
+     change (internally: less calls to reposition() function)
+   - When maps are saved, vym still zips the XML-data, but the
+     compression is done as background process, while vym already is
+     responsive to user input again.
+
+ * New scripting engine
+   - Internally the engine was migrated from (no longer supported)
+     QScriptEngine to QJSEngine
+   - Scripts can be nested now to improve undo/redo handling and
+     automated tests
+   - Various commands have been renamed
+   - Abstraction of vym, VymModel, and elements like Branch, Image etc.
+     has been implemented in classes available in scripting (See the
+     related wrapper classes in C++ source code for details)
+
+Feel free to report any bugs or feature requests on
+[https://github.com/insilmaril/vym/issues](https://github.com/insilmaril/vym/issues)
+
+Thanks for using vym!
+
+Uwe Drechsel - July 2026
+
+## Unreleased
+### Bugfixes
+ * [#150](https://github.com/insilmaril/vym/issues/150) No more redundant overwrite confirmation on macOS when saving a map, saving an image or exporting; the manual confirmation is kept on Windows and Linux
+ * [#174](https://github.com/insilmaril/vym/issues/174) Tasks now visible in a new map created from a command-line filename (TaskEditor map filter was left stale)
+ * [#218](https://github.com/insilmaril/vym/issues/218) Scroll/unscroll of a branch while it is animated no longer breaks its positioning
+ * Bugfix: MapEditor animation settings not only considered when map is created
+ * Fixed floating branches (e.g. mainbranches) jumping to a wrong position when dragged and released without relinking; they now stay where they are dropped
+ * Fixed the first (or a single) dragged branch briefly animating to a wrong position inside the temporary move container
+ * Fixed downlink to children starting at the branch center (as for a MapCenter) while a mainbranch is being dragged; the original downlink position is now kept
+ * Fixed orientation of floating children flipping and flickering while their parent branch is being dragged; the orientation is now kept stable during the drag
+
+## Version 3.0.1
+### Bugfixes
+ * Fixed wrong x/y positions of branches while moving multiple selected branches with the mouse; they are now animated into their stacked positions (if animations are enabled)
+ * [#217](https://github.com/insilmaril/vym/issues/217) Moving selected branches to a target can be repeated using "."-key
+ * [#216](https://github.com/insilmaril/vym/issues/216) Find results don't refresh when switching to another map
+
+## Version 2.9.617
+### Bugfixes
+ * [#210](https://github.com/insilmaril/vym/issues/210) BranchPropertyEditor not updated when changing maps
+
+## Version 2.9.616
+### Features
+ * Script stats.vys to analyze sizes of subtrees
+
+### Bugfixes
+ * [#207](https://github.com/insilmaril/vym/issues/207) Cmd-D not working to close Script output window
+ * [#206](https://github.com/insilmaril/vym/issues/206) Two dialogs when creating new vymLink
+ * Fix building with Qt 6.6
+
+## Version 2.9.614
+### Bugfixes
+ * [#189](https://github.com/insilmaril/vym/issues/189) Updated demo maps
+
+### Changes
+ * Only ask once to allow vym to download release notes and check for
+   updates
+
+## Version 2.9.613
+### Features
+ * Feature: Notes in Html export are collapsible
+
+### Bugfixes
+ * [#204](https://github.com/insilmaril/vym/issues/204) Crash after image/branch manipulation
+
+## Version 2.9.612
+### Features
+ * [#197](https://github.com/insilmaril/vym/issues/197) Improved function key handling
+   - Add shortcuts to color only branch, not whole subtree
+ * [#194](https://github.com/insilmaril/vym/issues/194) Group keyboard shortcuts
+
+### Bugfixes
+ * [#196](https://github.com/insilmaril/vym/issues/196) Xlink control points not accessible when "behind" heading
+ * Remove double overwrite confirmation on Mac for exporting notes
+ * Load translations on Mac
+
+## Version 2.9.610
+### Bugfixes
+ * [#195](https://github.com/insilmaril/vym/issues/195) Save background color when exporting RichText in TextEditor
+
+## Version 2.9.609
+### Features
+ * Improved color handling in text editors
+    - New shortcuts to color text (Ctrl-T) and "mark" background (Ctrl-M)
+    - Color buttons in toolbar no longer update to current cursor color,
+      but remember previously selected colors
+
+## Version 2.9.608
+### Bugfixes
+ * When importing maps, don't read mapdesign.
+ * [#191](https://github.com/insilmaril/vym/issues/191) AddMapReplace crashes for MapCenter 
+
+### Changes
+ * When clicking on the map, find branches before XLinks
+
+## Version 2.9.607
+### Bugfixes
+ * Branches without frames
+ * [#185](https://github.com/insilmaril/vym/issues/185)  After loading a zoomed map is not centered correctly
+
+## Version 2.9.606
+### Bugfixes
+ * [#181](https://github.com/insilmaril/vym/issues/181)  Relative positioning of images or branches
+
+## Version 2.9.605
+### Bugfixes
+ * autoDesign frame settings when loading/saving maps
+ * [#188](https://github.com/insilmaril/vym/issues/188)  save selection
+    - Added script command isBusy()
+    - Added script command setSaveAsBackgroundProcess()
+
+    Changed handling of zipping in background. Maps were renamed before zip
+    was finished. For testing added option to wait for finishing zip as
+    foreground process, otherwise tests would have failed.
+
+    Also re-added action to file menu to save selection.
+
+ * [#187](https://github.com/insilmaril/vym/issues/187)  Make sure zip processes are finished when leaving vym
+
+    Under certain circumstances vym had still background processes when
+    accepting e.g. a close event from window manager.
+
+    Now MainWindow requests closing a map directly from the vym map. The map
+    itself triggers it's removal from MainWindow once the zipProcess is done.
+
+ * [#187](https://github.com/insilmaril/vym/issues/187)  Missing image in xml of map modifies branches
+
+
+## Version 2.9.604
+### Bugfixes
+* [#180](https://github.com/insilmaril/vym/issues/180)  in TaskEditor adds heading of parent branch to selected branch
+* [#179](https://github.com/insilmaril/vym/issues/179)  Changes to frames via script are not saved 
+
+   e.g. when using macros bound to function keys to change frames.
+
+   Now autoDesign is disabled when script functions change frames.
+
+* [#186](https://github.com/insilmaril/vym/issues/186)  Exporting note might overwrite export of previous branch
+* [#182](https://github.com/insilmaril/vym/issues/182)  Zoom and rotation after loading map
+* [#183](https://github.com/insilmaril/vym/issues/183)  Rotation of subtree not save when changed with shortcut
+  - Disable autodesign option
+
+
+## Version 2.9.603
+### Features
+ * Set heading width also for RichText headings
+
+### Bugfixes
+ * QThreadStorage: entry 1 destroyed before end of thread when quitting via shortcut cut
+
+## Version 2.9.601
+### Features
+ * [#177](https://github.com/insilmaril/vym/issues/177)  Toggling frames of multiple selected branches
+ * [#176](https://github.com/insilmaril/vym/issues/176)  Open and edit Urls in TextEditors
+ * [#176](https://github.com/insilmaril/vym/issues/176)  Add and follow hyperlinks in TextEditors
+ * [#178](https://github.com/insilmaril/vym/issues/178)  Don't adapt view to show many selected items
+ * On Macs open history window with Shift-Cmd-H
+
+### Bugfixes
+ * [#175](https://github.com/insilmaril/vym/issues/175)  Enable GoTo target when nothing is selected
+ * Packaging for MACOSX
+
+
+## Version 2.9.599
+### Features
+ * [#165](https://github.com/insilmaril/vym/issues/165)  Switch focus between Find-LineEdit and Find-Results with tab
+ * [#169](https://github.com/insilmaril/vym/issues/169)  AppStream / Metainfo Improvements
+ * [#167](https://github.com/insilmaril/vym/issues/167)  cmake: install resources under share/vym and set VYMBASEDIR
+
+### Bugfixes
+ * [#153](https://github.com/insilmaril/vym/issues/153)  Center on selected item not subtree when selecting slide
+ * [#173](https://github.com/insilmaril/vym/issues/173)  Scroll to selected task in TaskEditor
+ * [#161](https://github.com/insilmaril/vym/issues/161) , [#165](https://github.com/insilmaril/vym/issues/165)  Focus handling with satellite windows 
+
+## Version 2.9.598
+### Changes
+ * Use CTRL-S for "Restore session" until map was changed
+
+    Then CTRL-S will become "Save map". This frees up the shortcut to rotate
+    subtrees with CTRL-R
+
+### Features
+ * Shortcuts to rotate subtree (Ctrl-R and Ctrl-Shift-R)
+ * [#160](https://github.com/insilmaril/vym/issues/160)  Support Jira Cloud
+ * Remember last searches in FindResultWidget
+ * "Delete" is now equivalent to "Cut"
+ * [#16](https://github.com/insilmaril/vym/issues/16)  Escape-key cancels editing heading of a branch
+
+### Bugfixes
+ * [#168](https://github.com/insilmaril/vym/issues/168)  Background style in TextEditors
+ * Undo colorSubtree
+
+Version 2.9.594
+### Features
+ * [#162](https://github.com/insilmaril/vym/issues/162)  Switch focus between editors using Tab-key
+
+### Bugfixes
+ * Bugfix: Forced bright theme when system uses dark theme
+
+## Version 2.9.593
+### Features
+ * Y-Key to yank (copy) in Vim style
+ * Draw border around editor which has keyboard focus
+ * Exit vym from script
+ * Repeat last action for multiple actions
+
+### Bugfixes
+ * [#80](https://github.com/insilmaril/vym/issues/80)  Improved handling of default colors
+ * [#161](https://github.com/insilmaril/vym/issues/161)  Switch back to MapEditor using Esc-Key
+ * Noteeditor has correct window name
+ * Consider penWidth of frame
+ * No bottomline for both inner/outer frame
+ * Frametype Pipe had wrong dimensions
+
+## Version 2.9.592
+### Features
+ * Easy following of references: xLinks, Urls and vymLinks
+
+    If a branch has exactly one reference, Key-F will just "follow" this
+    reference. Popup menu is only used if multiple references require a
+    decision.
+
+## Version 2.9.591
+### Features
+ * VIM-like shortcuts 0 and $ to select first/last sibling
+
+### Bugfixes
+ * Better selection color handling TaskEditor
+
+      Colors also no longer depend if selection was clicked in TE or in ME
+
+ * Allow macros to work on all selected branches
+ * Craah when closing map while loading
+
+## Version 2.9.590
+### Features
+ * Use Key U for undo like in vim
+
+### Bugfixes
+ * Avoid crash when zipAgent is no longer available and zipFinished called
+ * Always enable fileExitVym action
+ * HTML export correctly exports flags now
+ * [#158](https://github.com/insilmaril/vym/issues/158)  Update Appstream Data
+
+
+## Version 2.9.588
+### Features
+ * Improving HTML export with flags and dark theme css file
+
+## Version 2.9.587
+### Changes
+ * Linkstyle now refers to current branch depth
+
+### Bugfixes
+ * Undo/redo for setLinkStyle()
+ * Remove upLink when detaching mainBranch
+
+## Version 2.9.586
+### Features
+ * New scripting commands to iterate over branches
+
+### Bugfixes
+ * Missing whitespaces in "Goto linked map menu"
+ * Bigger circle for positioning when relinking to MapCenter
+
+## Version 2.9.585
+### Bugfixes
+ * Intermittent crash when dropping tasks in TaskEditor
+
+## Version 2.9.584
+### Bugfixes
+ * [#151](https://github.com/insilmaril/vym/issues/151)  Fixed permissions for new directories
+
+## Version 2.9.583
+### Features
+ * [#151](https://github.com/insilmaril/vym/issues/151)  Use shared renderer for svg flags
+
+### Bugfixes
+ * [#151](https://github.com/insilmaril/vym/issues/151)  Store vym temporary files in user directory
+ * Remove warnings by using new svg for "lifebelt" flag
+ * [#152](https://github.com/insilmaril/vym/issues/152)  signed bundle
+ * Toggle subtree frames with function keys
+
+
+## Version 2.9.582
+### Bugfixes
+ * [#149](https://github.com/insilmaril/vym/issues/149)  Building on Linux
+
+## Version 2.9.581
+### Bugfixes
+ * Menu entry to open visible Urls in subtree
+ * [#148](https://github.com/insilmaril/vym/issues/148)  Removed warnings related to old Q\_OS\_MACX macro
+
+## Version 2.9.580
+### Features
+ * On Macs Urls can be opened in private mode in Firefox
+ * Allow drag and drop of images without downloads
+ * Reset selection size with Ctrl-0 (or Cmd-0)
+
+### Bugfixes
+ * Undo/Redo of changing branches and images layouts
+ * Fixed script to download image after drop event
+
+## Version 2.9.578
+### Bugfixes
+ * [#147](https://github.com/insilmaril/vym/issues/147)  Default settings TextEditors
+
+## Version 2.9.577
+### Features
+ * Improve listing of keyboard shortcuts
+
+### Bugfixes
+ * Fixed history tests. 308 tests available
+ * Undo/Redo for scaling images
+    
+## Version 2.6.569
+### Bugfixes
+ * Undo/redo for heading column width and autodesign option
+ * Improved alignment of info in ExtraInfoDialog
+
+## Version 2.9.567
+### Features
+ * Initial support to import IThoughts maps
+
+## Version 2.9.564
+### Bugfixes
+ * [#136](https://github.com/insilmaril/vym/issues/136)  No longer ignore "Accept" in downloads dialog ([#136](https://github.com/insilmaril/vym/issues/136) )
+
+## Version 2.9.563
+### Bugfixes
+ * [#135](https://github.com/insilmaril/vym/issues/135)  Don't use STREQUAL on Max
+ * Minor improvements CMakeLists.txt
+
+## Version 2.9.562
+### Bugfixes
+ * Fixed when moving branches up
+
+## Version 2.9.560
+### Features
+ * Show keyboard shortcuts in context menus
+ * On Macs use backspace as shortcut instead of delete
+
+### Bugfixes
+ * Crashes when running scripts
+ * [#123](https://github.com/insilmaril/vym/issues/123)  Add io.github.insilmaril.vym.appdata.xml
+ * Remove shortkey conflict for Key\Plus
+ * Bugfix: Don't add command from last saveState script, if no script is used
+
+
+## Version 2.9.558
+### Features
+ * New dialog for logfile settings
+ * Toggle temporary hide mode
+ * Temporary hide parts of map
+
+   "Clouded" branches are not exported and can be temporary hidden.
+   This commit also fixes, that clouded parts are still saved, even while
+   invisible.
+
+### Bugfixes
+ * Stop view animations when wheel is used for scrolling
+ * Confluence export with Urls containing ampersands
+ * Deleting children in a new map without path, might cause hang
+ * Crash with dangling xlinks
+ * darkTheme handling
+
+## Version 2.9.557
+### Features
+ * New icons in MainWindow for more modern look
+   - based on KDE breeze
+   - prepared for theming (bright, dark, classic)
+ * [#35](https://github.com/insilmaril/vym/issues/35)  Insert images in NoteEditor
+ * New icons for NoteEditor and HeadingEditor
+ * New icon to edit fill color in TextEditors
+
+### Bugfixes
+ * Fixed crash related to QJSEngine
+   If a scriptEngine was destroyed in MainWindow, the engine also deleted
+   the vymWrapper due to wrong ownership.
+        
+   Subsequent scriptEngines got initialized with dangling vymWrapper
+   pointer
+
+## Version 2.9.555
+### Bugfixes
+ * Adjust viewport size when moving items
+
+## Version 2.9.554
+### Features
+ * Get Confluence page last edit details
+
+   Add attributes for
+    - Author
+    - Timestamp
+ * [#130](https://github.com/insilmaril/vym/issues/130)  Update about dialog to reflect current reality.
+ * Get labels from Confluence and modify them
+   - Recursively get page tree of a given page
+   - Update attributes with metadata from Confluence
+   - Added script command to delete label in Confluence
+   - Added demo scripts to find and delete labels from pages
+
+### Bugfixes
+ * Fixed iterating branches in scripts. Improved Confluence page details handling
+ * Updating heading from Confluence URL won't save color
+ * Get Confluence labels as part of pageInfo
+   - Updates heading of branch with page title
+   - Adds page labes as attributes to branch
+
+## Version 2.9.553
+
+### Bugfixes
+ * Crash when deleting XLinks
+ * Set and unset Url flag correctly
+
+## Version 2.9.551
+### Features
+ * Alignment of imagesContainer relative to branchesContainer
+
+### Bugfixes
+ * [#95](https://github.com/insilmaril/vym/issues/95)  LibreOffice Impress export improved
+ * Redo adding xlink
+ * Toggling flags in groups (incl. undo/redo)
+ * Ported tests for flags
+ * Partially update mainbranches and their children during load
+
+## Version 2.9.550
+### Features
+ * undo/redo modifying attributes
+ * Ported tests for legacy maps
+
+### Bugfixes
+ * undo/redo of setHideLinkUnselected() and setHideExport()
+ * undo/redo loadImage()
+ * undo/redo toggleTarget()
+ * undo/redo for rotations and scalings
+ * TaskJuggler export including XSL transformation
+ * Save position when moving images
+
+## Version 2.9.549
+### Bugfixes
+ * add branch before (including undo/redo in one step)
+
+## Version 2.9.548
+### Features
+ * Adding a branch and editing heading only has one undo step now
+ * Only one undo/redo step for adding MapCenters
+
+### Bugfixes
+ * [#126](https://github.com/insilmaril/vym/issues/126)  write flags and userflags in XML export
+ * deleting XLinkItem left XLink dangling around
+
+## Version 2.9.547
+ * Use multiple and local scriptEngines
+
+## Version 2.9.546
+### Features
+ * Use special Url flag for Jira tickets
+
+   If the attribute "Jira.issueUrl" is set, the system-jira flag will be
+   used instead of the system-url flag.
+        
+   TreeItem class has new methods to set and get the urlType, currently
+   GeneralUrl and JiraUrl.
+        
+   Queries are not really supported yet.
+
+ * [#121](https://github.com/insilmaril/vym/issues/121)  Improved editing of cells in the TaskEditor.
+
+### Changes
+ * Disabled shortcut to switch to RichText Ctrl-R in TextEditor
+   Conflicts with shortcut to restore session
+
+### Bugfixes
+ * [#120](https://github.com/insilmaril/vym/issues/120)  Crash when using bright theme 
+ * Added icon to Bleyddyns patch to clear recent files ([#95](https://github.com/insilmaril/vym/issues/95) )
+ * [#119](https://github.com/insilmaril/vym/issues/119)  Clear recent menu item
+   - Added a menu item to clear the recent map menu.
+   - Changed menu item name to just 'Clear'. For Issue ([#95](https://github.com/insilmaril/vym/issues/95) )
+
+## Version 2.9.545
+### Features
+ * New frame type "Pipe"
+ * Changing frame colors updates map instantly
+ * [#118](https://github.com/insilmaril/vym/issues/118)  While loading update MapEditor
+ * Use system services to open local and remote Urls
+
+   By default system specific apps will be used to open pdfs, webpages,
+   spreadsheets, ...
+
+### Bugfixes
+ * Finalized fix for ([#98](https://github.com/insilmaril/vym/issues/98) )
+   - Set lastMapDir also for Main::fileSaveAs()
+ * [#117](https://github.com/insilmaril/vym/issues/117)  Update lastMapDir in more places. Fix for [#98](https://github.com/insilmaril/vym/issues/98) .
+
+## Version 2.9.544
+### Features
+ * Improved selection of items in map with keyboard
+
+   Introduced selection modes based layout and geometry, e.g. navigating in
+   grids and orgcharts works now as expected. Also jumping from a branch to
+   nearest image.
+ * Select nearest branch below current one
+ * Set Jira ticket ID in heading
+
+## Version 2.9.543
+### Bugfixes
+ * Fixed XLink related scripting
+ * Fixed restoring window geometry on Windows
+
+## Version 2.9.542
+### Bugfixes
+ * Fixed test to add branch above/below
+ * Fixed adding above/below with undo/redo
+
+### Changes
+ * Unified shortcuts for adding branches
+
+   - [Key_A] with modifiers to add
+   - as child of selection
+   - insert before selection [Shift + Ctrl]
+   - above selection [Shift]
+   - below selection [Ctrl]
+
+## Version 2.9.538
+### Features
+ * [#115](https://github.com/insilmaril/vym/issues/115)  Update Russian translations vym.ru.ts
+
+### Bugfixes
+ * Fixed segfault when exiting vym after running selftests
+
+### Changes
+ * Reworked scripting commands:
+
+   Moved from VymModelWrapper to BranchWrapper
+    - branchCount()
+    - clearFlags()
+    - colorBranch()
+    - colorSubtree()
+    - selectFirstBranch()
+    - selectLastBranch()
+    - selectParent()
+        
+## Version 5.9.537
+### Features
+  * Macro to toggle task considers dark theme.
+
+    Use new mode file sync (-FS) when zipping directories on Linux and Mac.
+        Seems also to work similar on Windows 11 using tar.
+
+## Version 2.9.536
+### Changes
+ * Reworked saveState and handling of notes and headings
+   - Continues to work on new saveState function, which no longer uses
+     undo/redo selection, but uses uses script commands on specific
+     branches/images, which are found using Uuid.
+   - Removed parseVymText to to set notes and headings
+   - Introduced a number of new commands for branches and images
+   - Introduced ImageWrapper to allow applying commands on images
+   - Introduced command to check availability of dark theme
+
+
+## Version 2.9.535
+### Bugfixes
+ * [#113](https://github.com/insilmaril/vym/issues/113)  Heading color is lost when note is available
+
+## Version 2.9.534
+### Changes
+ * [#112](https://github.com/insilmaril/vym/issues/112)  XLinks now use UUID instead of selectionID
+
+   This allows processing XLinks also in XSL transformations. See
+
+## Version 2.9.533
+### Bugfixes
+ * Ampersands in notes exported to libreoffice impress
+ * Fixed unzip on Windows
+
+## Version 2.9.28
+### Features
+ * [#109](https://github.com/insilmaril/vym/issues/109)  Link app icon as a mimetype icon for the hicolor default theme
+
+ * On Linux/Unix systems cmake already installs the vym.png application
+   icon (what is referenced via the .desktop file) and a mime type definition
+   for `application/x-vym`. What is missing is the icon to use on `.vym`
+   files which are associated with this mime type. Instead of installing
+   the icon a second time, a relativ symlink is created referencing the app
+   icon.
+
+### Bugfixes
+ * [#107](https://github.com/insilmaril/vym/issues/107)  Do not install manpage in doc dir 
+ * Open french documention if required
+ * Don't autosave while still saving
+ * [#108](https://github.com/insilmaril/vym/issues/108)  Spelling fix: remove duplicate word
+
+## Version 2.9.532
+### Changes
+ * Run zip process in foreground when exporting to libreoffice impress.
+ * zip running as background process on Linux and Mac.
+
+   Windows not ported yet.
+
+### Features
+ * Only write images once to zipDir to save time and disk space
+
+### Bugfixes
+ * [#105](https://github.com/insilmaril/vym/issues/105)  Spelling fixes
+ * [#106](https://github.com/insilmaril/vym/issues/106)  Desktop file improvements
+
index a9eebd5cc0a8a1f592ce7121dc0a021c3ecb8642..ce5f49da3ec7393059f6548c3041b25cd8f9956f 100644 (file)
@@ -46,7 +46,7 @@ int BranchContainerBase::branchCount()
     if (!branchesContainer)
         return 0;
     else
-        return branchesContainer->childItems().count();
+        return branchesContainer->childContainers().count();
 }
 
 void BranchContainerBase::addToBranchesContainer(BranchContainer *bc) {}
@@ -61,7 +61,7 @@ int BranchContainerBase::imageCount()
     if (!imagesContainer)
         return 0;
     else
-        return imagesContainer->childItems().count();
+        return imagesContainer->childContainers().count();
 }
 
 void BranchContainerBase::createImagesContainer() {}
@@ -79,7 +79,7 @@ QList <BranchContainer*> BranchContainerBase::childBranches()
 
     if (!branchesContainer) return list;
 
-    foreach (QGraphicsItem *g_item, branchesContainer->childItems())
+    foreach (QGraphicsItem *g_item, branchesContainer->childContainers())
         list << (BranchContainer*)g_item;
 
     return list;
@@ -91,7 +91,7 @@ QList <ImageContainer*> BranchContainerBase::childImages()
 
     if (!imagesContainer) return list;
 
-    foreach (QGraphicsItem *g_item, imagesContainer->childItems())
+    foreach (QGraphicsItem *g_item, imagesContainer->childContainers())
         list << (ImageContainer*)g_item;
 
     return list;
index 5b616f45acefa635170205fe9b881de17e7dde62..5cfad2d240155361a671714500af2e47d952acf1 100644 (file)
@@ -58,7 +58,7 @@ void BranchContainer::init()
     // BranchContainer defaults
     // partially overwriting MinimalBranchContainer
     // can be overwritten by MapDesign later
-    containerType = Container::Branch;
+    setContainerType(Container::Branch);
 
     setLayout(Container::Horizontal);
 
@@ -95,12 +95,12 @@ void BranchContainer::init()
     outerFrame = nullptr;
 
     ornamentsContainer = new Container;
-    ornamentsContainer->containerType = OrnamentsContainer;
+    ornamentsContainer->setContainerType(OrnamentsContainer);
 
     linkContainer = new LinkContainer;
 
     innerContainer = new Container;
-    innerContainer->containerType = InnerContainer;
+    innerContainer->setContainerType(InnerContainer);
 
     standardFlagRowContainer = nullptr;
     systemFlagRowContainer = nullptr;
@@ -267,7 +267,7 @@ void BranchContainer::addToBranchesContainer(BranchContainer *bc)
         // (It will be deleted later in updateChildrenStructure(), if there
         // are no children)
         branchesContainer = new Container();
-        branchesContainer->containerType = Container::BranchesContainer;
+        branchesContainer->setContainerType(Container::BranchesContainer);
         branchesContainer->zPos = Z_BRANCHES;
         branchesContainer->setLayout(branchesContainerLayoutInt);
         branchesContainer->setVerticalAlignment(
@@ -289,8 +289,9 @@ void BranchContainer::createOuterContainer()
 {
     if (!outerContainer) {
         outerContainer = new Container;
-        outerContainer->containerType = OuterContainer;
+        outerContainer->setContainerType(OuterContainer);
         outerContainer->setLayout(BoundingFloats);
+        outerContainer->setCentralContainer(headingContainer);  // heading will be in origin
         addContainer(outerContainer);
 
         // Children structure is updated in updateChildrenStructure(), which is
@@ -309,12 +310,36 @@ void BranchContainer::deleteOuterContainer()
             addContainer(innerContainer);
         if (imagesContainer)
             innerContainer->addContainer(imagesContainer);
+        if (branchesContainer)
+            innerContainer->addContainer(branchesContainer);
 
         delete outerContainer;
         outerContainer = nullptr;
     }
 }
 
+void BranchContainer::createImagesAndBranchesContainer()
+{
+    if (imagesAndBranchesContainer)
+        return;
+
+    imagesAndBranchesContainer = new Container;
+    imagesAndBranchesContainer->setContainerType(Container::ImagesAndBranchesContainer);
+    innerContainer->addContainer(imagesAndBranchesContainer,
+                                 Z_IMAGE);
+}
+
+void BranchContainer::deleteImagesAndBranchesContainer()
+{
+    if (!imagesAndBranchesContainer)
+        return;
+
+    updateImagesContainerParent();
+    updateBranchesContainerParent();
+    delete imagesAndBranchesContainer;
+    imagesAndBranchesContainer = nullptr;
+}
+
 void BranchContainer::updateTransformations()
 {
     MapDesign *md = nullptr;
@@ -365,7 +390,6 @@ void BranchContainer::updateTransformations()
 
 void BranchContainer::updateChildrenStructure()
 {
-    logDebug("BC::updateChildrenStructure of " + info());
     if (branchesContainerLayoutInt == List) {
         if (!listContainer) {
             // Create and setup a listContainer *below* the ornamentsContainer
@@ -375,7 +399,7 @@ void BranchContainer::updateChildrenStructure()
             // listContainer has one linkSpaceContainer left of
             // branchesContainer
             listContainer = new Container;
-            listContainer->containerType = Container::ListContainer;
+            listContainer->setContainerType(Container::ListContainer);
             listContainer->setLayout(Horizontal);
             if (linkSpaceContainer)
                 listContainer->addContainer(linkSpaceContainer);
@@ -405,36 +429,26 @@ void BranchContainer::updateChildrenStructure()
     // depends on layouts of imagesContainer and branchesContainer:
     //
     // Usually both inagesContainer and branchesContainer are children of
-    // innerContainer.  The layout of innerContainer is either Horizontal or
-    // BoundingFloats. outerContainer is only needed in corner case d)
+    // innerContainer.  The layout of innerContainer is Horizontal.
     //
     // a) No FloatingBounded children
     //    - No outerContainer
-    //    - innerContainer is Horizontal
-    //    - branchesContainer is not FloatingBounded
-    //    - if imagesContainer is not floating:
-    //      - Check imagesPosition(), where images should be relative to
-    //      children branches
     //
     // b) Only branches are FloatingBounded
-    //    - No outerContainer
-    //    - innerContainer BoundingFloats
-    //    - branchesContainer is FloatingBounded
-    //    - imagesContainer is FloatingFree
+    //    - outerContainer contains
+    //      - innerContainer
+    //      - branchesContainer
     //
     // c) images and branches are FloatingBounded
-    //    - No outerContainer
-    //    - innerContainer BoundingFloats
-    //    - branchesContainer is FloatingBounded
-    //    - imagesContainer is FloatingBounded
+    //    - outerContainer contains
+    //      - innerContainer
+    //      - imagesContainer
+    //      - branchesContainer
     //
     // d) Only images are FloatingBounded
     //    - outerContainer contains
     //      - innerContainer
     //      - imagesContainer
-    //    - innerContainer is Horizontal
-    //    - branchesContainer is Vertical
-    //    - imagesContainer is FloatingBounded
 
     // qDebug() << "BC::updateChildrenStructure() of " << info();
 
@@ -460,15 +474,15 @@ void BranchContainer::updateChildrenStructure()
                         Container::Vertical; // FIXME-3 get from MapDesign
                     if (!imagesAndBranchesContainer) {
                         imagesAndBranchesContainer = new Container;
-                        imagesAndBranchesContainer->containerType =
-                            Container::ImagesAndBranchesContainer;
+                        imagesAndBranchesContainer->setContainerType(Container::ImagesAndBranchesContainer);
                         innerContainer->addContainer(imagesAndBranchesContainer,
                                                      Z_IMAGE);
-                        imagesAndBranchesContainer->addContainer(
-                            imagesContainer);
-                        imagesAndBranchesContainer->addContainer(
-                            branchesContainer);
                     }
+                    if (imagesContainer->parentContainer() != imagesAndBranchesContainer)
+                        imagesAndBranchesContainer->addContainer(imagesContainer);
+                    if (branchesContainer->parentContainer() != imagesAndBranchesContainer)
+                        imagesAndBranchesContainer->addContainer(branchesContainer);
+
                     imagesAndBranchesContainer->setLayout(ibcl);
                     if (imagesFirst) // FIXME-3 Check for imagesPosition
                                      // relative to branches, hardcoded for now
@@ -478,15 +492,8 @@ void BranchContainer::updateChildrenStructure()
                 }
                 else {
                     // No imagesAndBranchesContainer required
-                    //
-                    // TODO Remove imagesAndBranchesCont, relink imagesCont and
-                    // branchesCont
-                    if (imagesAndBranchesContainer) {
-                        updateImagesContainerParent();
-                        updateBranchesContainerParent();
-                        delete imagesAndBranchesContainer;
-                        imagesAndBranchesContainer = nullptr;
-                    }
+                    if (imagesAndBranchesContainer)
+                        deleteImagesAndBranchesContainer();
                 }
             }
         }
@@ -494,28 +501,35 @@ void BranchContainer::updateChildrenStructure()
     else if (branchesContainerLayoutInt == FloatingBounded &&
              imagesContainerLayoutInt != FloatingBounded) {
         // b) Only branches are FloatingBounded
-        deleteOuterContainer();
-        innerContainer->setLayout(BoundingFloats);
+        createOuterContainer();
+        if (imagesAndBranchesContainer)
+            deleteImagesAndBranchesContainer();
+        innerContainer->setLayout(Horizontal);
     }
     else if (branchesContainerLayoutInt == FloatingBounded &&
              imagesContainerLayoutInt == FloatingBounded) {
         // c) images and branches are FloatingBounded
-        deleteOuterContainer();
-        innerContainer->setLayout(BoundingFloats);
+        createOuterContainer();
+        if (imagesAndBranchesContainer)
+            deleteImagesAndBranchesContainer();
+        innerContainer->setLayout(Horizontal);
     }
     else if (branchesContainerLayoutInt != FloatingBounded &&
              imagesContainerLayoutInt == FloatingBounded) {
         // d) Only images are FloatingBounded
         createOuterContainer();
+        if (imagesAndBranchesContainer)
+            deleteImagesAndBranchesContainer();
+
         if (listContainer)
             innerContainer->setLayout(Vertical);
         else
             innerContainer->setLayout(Horizontal);
+
     }
     else {
-        // e) remaining cases
-        deleteOuterContainer();
-        innerContainer->setLayout(FloatingBounded);
+        // e) remaining cases, should not happen
+        qWarning() << __func__ << "  mess of layouts.";
     }
 
     updateTransformations();
@@ -528,8 +542,19 @@ void BranchContainer::updateChildrenStructure()
         else
             outerContainer->setParentItem(this);
         outerContainer->addContainer(innerContainer);
-        if (imagesContainer)
-            outerContainer->addContainer(imagesContainer);
+        if (imagesContainer) {
+            if (imagesContainer->layoutInt == FloatingBounded)
+                outerContainer->addContainer(imagesContainer);
+            else
+                innerContainer->addContainer(imagesContainer);
+        }
+
+        if (branchesContainer) {
+            if (branchesContainer->layoutInt == FloatingBounded)
+                outerContainer->addContainer(branchesContainer);
+            else
+                innerContainer->addContainer(branchesContainer);
+        }
     }
 
     // Structure for bullet point list layouts
@@ -606,7 +631,7 @@ void BranchContainer::updateChildrenStructure()
 
 void BranchContainer::updateImagesContainer()
 {
-    if (imagesContainer && imagesContainer->childItems().count() == 0) {
+    if (imagesContainer && imagesContainer->childContainers().count() == 0) {
         delete imagesContainer;
         imagesContainer = nullptr;
     }
@@ -626,7 +651,7 @@ void BranchContainer::createImagesContainer()
     // The destructor of ImageItem calls
     // updateChildrenStructure() in parentBranch()
     imagesContainer = new Container();
-    imagesContainer->containerType = ImagesContainer;
+    imagesContainer->setContainerType(ImagesContainer);
     imagesContainer->setLayout(imagesContainerLayoutInt);
 
     updateImagesContainerParent();
@@ -673,12 +698,12 @@ QPointF BranchContainer::getPositionHintNewChild(Container *c)
     bool useCircle = false;
     int n = 0;
     qreal radius;
-    if (c->containerType == Branch && hasFloatingBranchesLayout()) {
+    if (c->containerTypeInt == Branch && hasFloatingBranchesLayout()) {
         useCircle = true;
         radius = 190;
         n = branchCount();
     }
-    else if (c->containerType == Image && hasFloatingImagesLayout()) {
+    else if (c->containerTypeInt == Image && hasFloatingImagesLayout()) {
         useCircle = true;
         radius = 100;
         n = imageCount();
@@ -714,8 +739,10 @@ QPointF BranchContainer::downLinkPos(const Orientation &orientationChild)
             ornamentsContainer->bottomCenter());
 
     if (frameType(true) != FrameContainer::NoFrame) {
-        if (!parentBranchContainer())
+        if (!parentBranchContainer() && movingStateInt != Moving)
             // Framed MapCenter: Use center of frame    // FIXME-3 downLinkPos should depend on layout, not depth
+            // While moving, parentBranchContainer() also returns nullptr, but a
+            // moved branch must keep its edge downLinkPos, not the center.
             return ornamentsContainer->mapToScene(ornamentsContainer->center());
         else {
             // Framed branch: Use left or right edge
@@ -849,7 +876,7 @@ void BranchContainer::updateUpLink()
     }
 
     // Color of link (depends on current parent)
-    if (upLink->linkColorHint() == LinkObj::HeadingColor)
+    if (branchItem->mapDesign()->linkColorHint() == LinkObj::HeadingColor)
         upLink->setLinkColor(branchItem->headingColor());
     else {
         if (branchItem)
@@ -885,7 +912,7 @@ void BranchContainer::updateUpLink()
 
 void BranchContainer::setLayout(const Layout &l)
 {
-    if (containerType != Branch && containerType != TmpParent)
+    if (containerTypeInt != Branch && containerTypeInt != TmpParent)
         qWarning() << "BranchContainer::setLayout (...) called for non-branch: "
                    << info();
     Container::setLayout(l);
@@ -1416,7 +1443,13 @@ void BranchContainer::reposition()
         // on MovingState
         if (pbc) {
             if (pbc->hasFloatingBranchesLayout()) {
-                if (scenePos().x() > pbc->scenePos().x())   // FIXME-3 Potentially problematic for rotated elements...
+                if (pbc->movingState() == Moving) {
+                    // While the parent is being dragged its container origin
+                    // (used as reference below) is not stable, so recomputing
+                    // the orientation would make the children flip and flicker.
+                    // Keep the orientation the child had before the drag.
+                }
+                else if (scenePos().x() > pbc->scenePos().x())   // FIXME-3 Potentially problematic for rotated elements...
                                                             // but OTOH using relative coord
                                                             // often pos.x() == 0
                     orientation = RightOfParent;
@@ -1447,11 +1480,6 @@ void BranchContainer::reposition()
     if (depth == 0) {
         // MapCenter
         setHorizontalDirection(LeftToRight);
-        // FIXME-3 set in updateChildrenStructure:
-        // innerContainer->setHorizontalDirection(LeftToRight);
-
-        // FIXME-3 set in updateChildrenStructure:
-        // innerContainer->setLayout(BoundingFloats);
     }
     else {
         // Branch or mainbranch
index 8f0fe7cfa3139a4b73970525b52ff401236e6626..e4376095d48cf47fae88c3dc408c49b7f2101162 100644 (file)
@@ -50,6 +50,8 @@ class BranchContainer : public BranchContainerBase, public LinkableContainer {
   private:
     void createOuterContainer();        //! Used if only images have FloatingBounded layout
     void deleteOuterContainer();
+    void createImagesAndBranchesContainer();
+    void deleteImagesAndBranchesContainer();
     void updateTransformations();       //! Update rotation and scaling
 
   public:
index aa9e72c58713d80c04dafa8f404a3fde3db59ccf..e0983c61b7a8430f20d6c0aaf16511e675c12501 100644 (file)
@@ -172,6 +172,16 @@ QString BranchWrapper::attributeAsString(const QString &key)
     return r;
 }
 
+BranchWrapper* BranchWrapper::branchAt(int pos)
+{
+    BranchItem* bi = branchItemInt->getBranchNum(pos);
+    if (!bi) {
+        mainWindow->abortScript(QJSValue::GenericError,"Couldn't find branch at position " + QString::number(pos));
+        return nullptr;
+    } else
+        return bi->branchWrapper();
+}
+
 int BranchWrapper::branchCount()
 {
     int r = branchItemInt->branchCount();
index a7a386ba51b4f826120b022325e54d66114e06f2..ef07ee9b48f385c3a07f1c48455dd3bbf100e395 100644 (file)
@@ -29,6 +29,7 @@ class BranchWrapper : public QObject {
                   const QString &color, const QString &penstyle);
     int attributeAsInt(const QString &key);
     QString attributeAsString(const QString &key);
+    Q_INVOKABLE BranchWrapper* branchAt(int n);
     int branchCount();
     void clearFlags();
     void colorBranch(const QString &color);
index 394b45f9397ab919b1e12fd43c29bd7d905edf04..e98e436cf94ffa72441e18dfac0103639d5a9426 100644 (file)
@@ -160,32 +160,34 @@ QString BranchItem::saveToDir(const QString &tmpdir, const QString &prefix,
     else
         elementName = "branch";
 
+    // qDebug() << "BI::saveToDir elName=" << elementName << "  bc=" << branchContainer;
+
     // Free positioning of children
-    if (!branchContainer->branchesContainerAutoLayout)
+    if (branchContainer && !branchContainer->branchesContainerAutoLayout)
         // Save the manually set layout for children branches
         attr += attribute("branchesLayout", branchContainer->layoutString(branchContainer->branchesContainerLayout()));
 
-    if (!branchContainer->imagesContainerAutoLayout)
+    if (branchContainer && !branchContainer->imagesContainerAutoLayout)
         // Save the manually set layout for children Images
         attr += attribute("imagesLayout", branchContainer->Container::layoutString(branchContainer->imagesContainerLayout()));
 
-    if (!branchContainer->rotationsAutoDesign()) {
+    if (branchContainer && !branchContainer->rotationsAutoDesign()) {
         attr += attribute("rotHeading", QString("%1").arg(branchContainer->rotationHeading()));
 
         attr += attribute("rotSubtree", QString("%1").arg(branchContainer->rotationSubtree()));
     }
 
-    if (!branchContainer->scaleAutoDesign()) {
+    if (branchContainer && !branchContainer->scaleAutoDesign()) {
         attr += attribute("scaleHeading", QString("%1").arg(branchContainer->scaleHeading()));
 
         attr += attribute("scaleSubtree", QString("%1").arg(branchContainer->scaleSubtree()));
     }
 
     // width of heading
-    if (!branchContainer->columnWidthAutoDesign())
+    if (branchContainer && !branchContainer->columnWidthAutoDesign())
         attr += attribute("colWidth", QString("%1").arg(branchContainer->getHeadingContainer()->columnWidth()));
 
-    if (parentItem == rootItem || branchContainer->isFloating())
+    if (parentItem == rootItem || (branchContainer && branchContainer->isFloating()))
         attr += getPosAttr();
 
     QString s = beginElement(elementName + " " + attr);
@@ -199,9 +201,20 @@ QString BranchItem::saveToDir(const QString &tmpdir, const QString &prefix,
         s += note.saveToDir();
 
     // Save frame
-    if (branchContainer->frameType(true) != FrameContainer::NoFrame ||
-        branchContainer->frameType(false) != FrameContainer::NoFrame)
+    if (branchContainer && 
+            (branchContainer->frameType(true) != FrameContainer::NoFrame ||
+             branchContainer->frameType(false) != FrameContainer::NoFrame)
+       ) {
+            // Save if frame is used
         s += branchContainer->saveFrame();
+    } else {
+        if (branchContainer && 
+            model->mapDesign()->frameType(true, depth()) != FrameContainer::NoFrame &&
+            branchContainer->frameType(true) == FrameContainer::NoFrame
+        )
+        // Save if no frame is used and MapDesign would use one
+        s += singleElement("frame", "autoDesign=\"false\" frameType=\"NoFrame\"");
+    }
 
     // save names of flag set
     s += standardFlags.saveState();
diff --git a/src/buildinfo.h b/src/buildinfo.h
new file mode 100644 (file)
index 0000000..6a18241
--- /dev/null
@@ -0,0 +1 @@
+#define __VYM_BUILD_DATE "2026-07-21"
diff --git a/src/buildinfo.h.in b/src/buildinfo.h.in
new file mode 100644 (file)
index 0000000..4b86655
--- /dev/null
@@ -0,0 +1 @@
+#define __VYM_BUILD_DATE "${BUILD_DATE_IN}"
index aeb8a72dcd2a45ef4b8e43669ef74d9169040bf0..c3aaed8b31b763aac4a664dac0f041b55fc2157a 100644 (file)
@@ -207,7 +207,7 @@ void ConfluenceAgent::continueJob(int nextStep)
                 return;
             }
             if (jobStep == 3) {
-                model = mainWindow->getModel(modelID);
+                model = mainWindow->modelWithId(modelID);
                 if (model) {
                     BranchItem *bi = (BranchItem *)(model->findID(branchID));
 
@@ -264,7 +264,7 @@ void ConfluenceAgent::continueJob(int nextStep)
             }
 
             if (jobStep == 5) {
-                model = mainWindow->getModel(modelID);
+                model = mainWindow->modelWithId(modelID);
                 if (model) {
                     BranchItem *bi = (BranchItem *)(model->findID(branchID));
 
@@ -379,7 +379,7 @@ void ConfluenceAgent::continueJob(int nextStep)
             if (jobStep == 4) {
                 // qDebug() << "CA::finished  Created page with ID: " << pageObj["id"].toString();
                 // cout << QJsonDocument(pageObj).toJson(QJsonDocument::Indented).toStdString();
-                model = mainWindow->getModel(modelID);
+                model = mainWindow->modelWithId(modelID);
                 if (model) {
                     pageURL = QString("https://%1/pages/viewpage.action?pageId=%2")
                         .arg(baseURL).arg(pageObj["id"].toString());
@@ -453,7 +453,7 @@ void ConfluenceAgent::continueJob(int nextStep)
                 mainWindow->statusMessage(
                     QString("Updated Confluence page %1").arg(pageURL));
 
-                model = mainWindow->getModel(modelID);
+                model = mainWindow->modelWithId(modelID);
                 if (model) {
                     pageURL = QString("https://%1/pages/viewpage.action?pageId=%2")
                         .arg(baseURL).arg(pageObj["id"].toString());
index ea7a1f5afbb781ff62b4137c0148937d0cf04b04..8e62fc6b626fbddacb4ff6b7a67af2ea347ccfd5 100644 (file)
@@ -30,7 +30,7 @@ Container::~Container()
 
 void Container::copy(Container *other)
 {
-    containerType = other->containerType;
+    containerTypeInt = other->containerTypeInt;
 
     originalPos = other->originalPos;
     name = other->name;
@@ -43,7 +43,7 @@ void Container::copy(Container *other)
 
 void Container::init()
 {
-    containerType = UndefinedType;
+    containerTypeInt = UndefinedType;
     layoutInt = Horizontal;
 
     // subcontainers usually may influence position
@@ -71,9 +71,9 @@ void Container::init()
     show();
 }
 
-Container::ContainerType Container::getContainerType()
+Container::ContainerType Container::containerType()
 {
-    return containerType;
+    return containerTypeInt;
 }
 
 int Container::type() const
@@ -83,18 +83,28 @@ int Container::type() const
 
 void Container::setContainerType(const Container::ContainerType &t)
 {
-    containerType = t;
+    containerTypeInt = t;
+    /*
+    if ( t == Branch)
+        addDebugGraphics(Qt::blue);
+    else if ( t == InnerContainer)
+        addDebugGraphics(Qt::green);
+    else if ( t == ImagesContainer)
+        addDebugGraphics(Qt::red);
+    else if ( t == BranchesContainer)
+        addDebugGraphics(Qt::cyan);
+    */
 }
 
-void Container::setName(const QString &n)   // FIXME-4 debugging only
+void Container::setName(const QString &n)   // debugging only
 {
     name = n;
 }
 
-QString Container::getName()    // FIXME-4 debugging only
+QString Container::getName()    // debugging only
 {
     QString t;
-    switch (containerType) {
+    switch (containerTypeInt) {
         case Branch:
             t = "Branch";
             break;
@@ -116,6 +126,9 @@ QString Container::getName()    // FIXME-4 debugging only
         case Image:
             t = "Image";
             break;
+        case ImagesAndBranchesContainer:
+            t = "ImagesAndBranchesContainer";
+            break;
         case ImagesContainer:
             t = "ImagesContainer";
             break;
@@ -147,7 +160,7 @@ QString Container::getName()    // FIXME-4 debugging only
             t = "Undefined";
             break;
         default:
-            t = "Unknown";
+            t = QString("Unknown (%1)").arg(containerTypeInt);
             break;
     }
     return QString("[%1]").arg(t);
@@ -159,8 +172,8 @@ QString Container::info (const QString &prefix)
         + getName()
         + QString(" z: %1").arg(zPos)
         //+ QString(" a: %1").arg(qRound(rotation()))
-        //+ QString(" scenePos: %1").arg(toS(scenePos(), 0))
-        //+ QString(" pos: %1").arg(toS(pos(), 0))
+        + QString(" scenePos: %1").arg(toS(scenePos(), 0))
+        + QString(" pos: %1").arg(toS(pos(), 0))
         + QString(" rect: %1").arg(toS(rect(), 0))
         //+ QString(" sceneRect: %1").arg(toS(mapRectToScene(rect()), 0))
         //+ QString(" vis: %1").arg(isVisible());
@@ -210,6 +223,17 @@ QString Container::ind()
     return s;
 }
 
+void Container::addDebugGraphics(const QColor &col)
+{
+    setPen(col);
+    QGraphicsLineItem *line1 = new QGraphicsLineItem(this);
+    line1->setPen(col);
+    line1->setLine(0, -5, 0, 5);
+    QGraphicsLineItem *line2 = new QGraphicsLineItem(this);
+    line2->setPen(col);
+    line2->setLine(-5, 0, 5, 0);
+}
+
 QPointF Container::pointByName(PointName pn)
 {
     switch (pn) {
@@ -449,12 +473,12 @@ QPointF Container::alignTo(PointName ownPointName, Container* targetContainer, P
     return mapFromItem(targetContainer, targetContainer->pointByName(targetPointName)) - pointByName(ownPointName);
 }
 
-#include <QMessageBox>  // FIXME-2 debugging
+#include <QMessageBox>  // FIXME-3 debugging
 void Container::addContainer(Container *c, int z)
 {
     if (childContainers().contains(c)) return;
 
-    if (!c) {   // FIXME-2 debugging
+    if (!c) {   // FIXME-3 debugging. Still occured in 2.9.608, very rare
         logDebug("Container::addContainer  adding 0 to " + info() + " would crash");
         QMessageBox::warning(0, "Warning", "Would have crashed now in ::addContainer");
         return;
@@ -544,7 +568,7 @@ QPointF Container::getOriginalPos()
 
 void Container::reposition()
 {
-    // qdbg() << ind() << QString("### Reposition of %1").arg(info()) << " childCount=" << childContainers().count();
+    //qdbg() << ind() << QString("### Reposition of %1").arg(info()) << " childCount=" << childContainers().count();
 
     // Repositioning is done recursively:
     // First the size sizes of subcontainers are calculated,
@@ -573,16 +597,13 @@ void Container::reposition()
     switch (layoutInt) {
         case BoundingFloats:
             {
-                // qdbg() << ind() << " - BF starting for " << info();
+                //qdbg() << ind() << " - BoundingFloats starting for " << info();
 
-                // BoundingFloats is special case:
-                // Only used for innerContainer or outerContainer
-                // First child container is ornamentsContainer (or innerContainer),
-                // next children are imagesContainer and/or branchesContainer
+                // BoundingFloats is special case: Only used for outerContainer
 
-                if (childContainers().count() > 4 ) {
+                if (childContainers().count() > 3 ) {
                     qWarning() << "Container::reposition " << info();
-                    qWarning() << "Wrong number of children containers: " << childItems().count();
+                    qWarning() << "Too many children containers: " << childContainers().count();
                     foreach (Container *c, childContainers())
                         qdbg() << "  " << c->info();
 
@@ -599,6 +620,7 @@ void Container::reposition()
                 }
 
                 // Translate everything, so that center of rectangle is in origin
+                // Required, because vert/horiz layouts expect it so atm
                 QPointF t = bbox.center();
                 foreach (Container *c, childContainers())
                     c->setPos(c->pos() - t);
@@ -606,11 +628,11 @@ void Container::reposition()
 
                 setRect(bbox);
 
-                // qdbg() << ind() << " - BF finished for " << info();
+                //qdbg() << ind() << " - BF finished for " << info(); // << "  t=" << toS(t);
             } // BoundingFloats layout
             break;
 
-        case FloatingReservedSpace: // FIXME-3 not used at all... why?
+        case FloatingReservedSpace: // FIXME-3 Only used by TmpParentContainer
             {
                 // Size is calculated already in MapEditor:
 
@@ -681,7 +703,6 @@ void Container::reposition()
                 }
 
                 setRect(r);
-                //qdbg() << ind() << " + FloatingBounded r=" << toS(r) << "  pos=" << pos() << getName();
             }
             break;
 
@@ -696,7 +717,7 @@ void Container::reposition()
 
                 // qdbg() << ind() << " * HL starting for " << info();
                 foreach (Container *c, childContainers()) {
-                    if (!c->overlay) {
+                    if (!c->overlay && c->layoutInt != FloatingBounded) {
                         QRectF c_bbox = mapRectFromItem(c, c->rect());
 
                         w_total += c_bbox.width();
@@ -706,35 +727,36 @@ void Container::reposition()
                 }
 
                 // Left (or right) line, where next children will be aligned to
-                qreal x = - w_total / 2;
+                qreal x_current = - w_total / 2;
                 if (horizontalDirection == RightToLeft)
-                    x = -x;
+                    x_current = -x_current;
 
                 // Position children initially. (So far only centered vertically)
                 foreach (Container *c, childContainers()) {
-                    if (!c->overlay) {
+                    if (!c->overlay && c->layoutInt != FloatingBounded) {
                         QRectF c_bbox = mapRectFromItem(c, c->rect());
                         QPointF origin_mapped = mapFromItem(c, QPointF());
-                        qreal offset;
+                        QPointF offset;   // Upper left corner of c_bbox in my coords
 
                         // Pre alignment
                         if (horizontalDirection == LeftToRight)
-                            offset = - (c_bbox.left() - origin_mapped.x());
+                            offset.setX( - (c_bbox.left() - origin_mapped.x()));
                         else
-                            offset = - (c_bbox.right() - origin_mapped.x());
-
-                        // qdbg() << ind() << "    HL x=" << x << " offset=" << offset << " c: " << c->info();
+                            offset.setX( - (c_bbox.right() - origin_mapped.x()));
+                        //offset.setY(origin_mapped.y());
+                        //offset.setY( - 0.5 * (c_bbox.top() + c_bbox.bottom()));
 
+                        // qdbg() << ind() << "    HL x_current=" << x_current << " offset=" << offset << " c: " << c->info();
                         switch (verticalAlignmentInt) {
                             case VertAlignedTop:
-                                c->setPos (x + offset, - (h_max - c_bbox.height()) / 2);
+                                c->setPos (x_current + offset.x(), - (h_max - c_bbox.height()) / 2);
                                 break;
                             case VertAlignedBottom:
-                                c->setPos (x + offset, + (h_max - c_bbox.height()) / 2);
+                                c->setPos (x_current + offset.x(), + (h_max - c_bbox.height()) / 2);
                                 break;
                             case VertAlignedCentered:
                                 // consider mapped(!) dimensions
-                                c->setPos (x + offset, 0);
+                                c->setPos (x_current + offset.x(), offset.y());
                                 break;
                             default:
 
@@ -744,9 +766,9 @@ void Container::reposition()
 
                         // Post alignment
                         if (horizontalDirection == LeftToRight) {
-                            x += c_bbox.width();
+                            x_current += c_bbox.width();
                         } else
-                            x -= c_bbox.width();
+                            x_current -= c_bbox.width();
 
                         // qdbg() << ind() << "    HL Done positioning: " << c->info();
                     }   // No overlay container
@@ -755,7 +777,10 @@ void Container::reposition()
                 // Move everything, so that center of central container will be in origin
                 QPointF v_central;
 
+
                 if (centralContainer) {
+                   // qdbg() << ind() << " * centralContainer = " << centralContainer->info();
+
                    // Now we might want to adjust positions of children, so
                    // that centralContainer (==headingContainer) keeps its position
                    // This may happen, if
@@ -763,18 +788,24 @@ void Container::reposition()
                    // - I am a MapCenter myself
                     if ((parentContainer() && parentContainer()->hasFloatingLayout()) || !parentContainer() ) {
                         v_central = mapFromItem(centralContainer, centralContainer->rect().center());
+                       // qdbg() << ind() << " * v_central=" << toS(v_central);
                         if (!v_central.isNull()) {
                             foreach (Container *c, childContainers()) {
-                                if (!c->overlay)
+                                if (!c->overlay && c->layoutInt != FloatingBounded)
                                     c->setPos(c->pos() - v_central);
                             }
                         }
                    }
-                }
+                } //else
+                    //qdbg() << ind() << " * No central containe";
 
-                setRect(QRectF(- w_total / 2 - v_central.x(),  - h_max / 2 - v_central.y(), w_total, h_max));
+                setRect(QRectF(
+                           - w_total / 2 - v_central.x(),
+                           - h_max / 2 - v_central.y(),
+                           w_total,
+                           h_max));
 
-                // qdbg() << ind() << " * HL Finished for " << info();
+                //qdbg() << ind() << " * HL Finished for " << info();
             } // Horizontal layout
             break;
 
@@ -854,6 +885,7 @@ void Container::reposition()
 
         case List:
         case Vertical: {
+                // qdbg() << ind() << " # VL starting for " << info();
                 qreal h_total = 0;
                 qreal w_max = 0;
 
@@ -887,7 +919,7 @@ void Container::reposition()
                            break;
                         default:
                             qWarning() << "Container::reposition vertically - undefined alignment:" << horizontalAlignmentInt << " in " << info();
-                            if (containerType == BranchesContainer)
+                            if (containerTypeInt == BranchesContainer)
                                 qWarning() << "  orient=" << ((BranchContainer*)this)->getOrientation();
                    }
 
@@ -897,6 +929,8 @@ void Container::reposition()
                 // Set rect
                 setRect(-w_max / 2, -h_total / 2, w_max, h_total);
 
+                // qdbg() << ind() << " # VL finished for " << info();
+
             } // Vertical layout
             break;
         default:
index 552cf14dcebfc8d313dd7f8d457cb76ae4615423..30d8c0f0b6cdb0e3318d45a387cdd770f213e38b 100644 (file)
@@ -80,7 +80,7 @@ class Container : public QGraphicsRectItem {
     virtual void init();
 
     void setContainerType(const ContainerType &t);
-    ContainerType getContainerType();
+    ContainerType containerType();
 
     enum {Type = UserType + 1};
     int type() const override;
@@ -95,6 +95,8 @@ class Container : public QGraphicsRectItem {
     int containerDepth();
     QString ind();
 
+    void addDebugGraphics(const QColor &col);
+
     // Convenience coordinates
     QPointF pointByName(PointName pn);
     QPointF topLeft();
@@ -166,7 +168,7 @@ class Container : public QGraphicsRectItem {
     virtual void reposition();
 
   protected:
-    ContainerType containerType;
+    ContainerType containerTypeInt;
 
     bool overlay;
 
index 59eb2d580535ff16826f8db97764bc4285c11b4a..285478176bbbe4551f0ead0dd9bf9f5df4517395 100644 (file)
@@ -1,5 +1,6 @@
 #include "debuginfo.h"
 
+
 #include <QCoreApplication>
 #include <QDir>
 #include <QFont>
@@ -9,6 +10,8 @@
 #include <QStyleFactory>
 #include <QTranslator>
 
+#include "buildinfo.h"
+#include "git.h"
 #include "settings.h"
 
 extern bool usingDarkTheme;
@@ -41,11 +44,12 @@ extern QString zipToolPath;
 QString debugInfo()
 {
     QString s;
-    s =  QString("vym version: %1 - %2 - %3 %4\n")
+    s =  QString("vym version: %1 - %2 - \"%3\" Quality: %4\n")
             .arg(vymVersion)
             .arg(vymBuildDate)
-            .arg(vymCodeQuality)
-            .arg(vymCodeName);
+            .arg(vymCodeName)
+            .arg(vymCodeQuality);
+    s += QString("          git: \"%1\" branch - commit %2\n").arg(GIT_BRANCH, GIT_COMMIT_HASH);
     s += QString("     Platform: %1\n").arg(vymPlatform);
     s += QString("    tmpVymDir: %1\n").arg(tmpVymDir.path());
     s += QString("  zipToolPath: %1\n").arg(zipToolPath);
index 878e2d4eea4d0a8c54f59eb5b937b6ba4899bbd9..27dc9248ac8d0d1634aabc58e242be4fd0aa0537 100644 (file)
@@ -38,6 +38,7 @@ ExportBase::~ExportBase()
 
 void ExportBase::init()
 {
+    blockMapChangedDuringExport = false;
     indentPerDepth = "  ";
     exportName = "unnamed";
     lastCommand = "";
@@ -47,6 +48,11 @@ void ExportBase::init()
     dirPath = defaultDirPath;
 }
 
+void ExportBase::setBlockMapChangedDuringExport(bool b)
+{
+    blockMapChangedDuringExport = b;
+}
+
 void ExportBase::setupTmpDir()
 {
     bool ok;
@@ -110,6 +116,9 @@ bool ExportBase::execDialog()
                                      QFileDialog::DontConfirmOverwrite);
 
     if (!fn.isEmpty()) {
+
+// Macs check for replacing existing file in native dialog
+#ifndef Q_OS_MACOS
         if (QFile(fn).exists()) {
             WarningDialog dia;
             dia.showCancelButton(true);
@@ -125,6 +134,7 @@ bool ExportBase::execDialog()
                 return false;
             }
         }
+#endif
         dirPath = fn.left(fn.lastIndexOf("/"));
         filePath = fn;
         return true;
@@ -166,7 +176,7 @@ void ExportBase::completeExport(QStringList args)
     model->setExportLastDescription(exportName);
 
     // Trigger saving of export command if it has changed
-    if (model && (lastCommand != command))
+    if (model && !blockMapChangedDuringExport && (lastCommand != command))
         model->setChanged();
 
     switch (result) {
index e648c2bcfe0b0edb0595f1532d14c8c747e4fedd..4d816db51968acaf47dd823bc3004f60d2e3d280 100644 (file)
@@ -21,6 +21,7 @@ class ExportBase {
     ExportBase(VymModel *m);
     virtual ~ExportBase();
     virtual void init();
+    virtual void setBlockMapChangedDuringExport(bool b);
     virtual void setupTmpDir();
     virtual void setDirPath(const QString &);
     virtual QString getDirPath();
@@ -43,6 +44,7 @@ class ExportBase {
 
   protected:
     VymModel *model;
+    bool blockMapChangedDuringExport;   // block changing map in chained exports
     QString exportName;
     QString lastCommand;
     virtual QString getSectionString(TreeItem *);
index f2059dab35906e863e31ffcbcc8d2681f927a7a6..6f3e9c1de071152b519182fb252fa4ff9eae812f 100644 (file)
@@ -223,9 +223,10 @@ QString ExportHTML::getBranchText(BranchItem *current)
                 if (current->getNote().getFontHint() == "fixed")
                     n = "<pre>" + n + "</pre>";
             }
-            s += "\n<table class=\"vym-note\"><tr><td "
-                 "class=\"vym-note-flag\">\n<td>\n" +
-                 n + "\n</td></tr></table>\n";
+            s += "\n<button class=\"vym-note-button\">&#9654; Note</button>\n"
+                 "<div class=\"vym-note-collapsible\"><div class=\"vym-note\">\n" +
+                 n +
+                 "\n</div></div>\n";
         }
         return s;
     }
@@ -371,16 +372,26 @@ void ExportHTML::doExport(bool useDialog)
                 QObject::tr("Could not find stylesheet %1").arg(cssSrc));
             return;
         }
-        QFile src(cssSrc);
+        QString cssContent;
+        if (!loadStringFromDisk(cssSrc, cssContent)) {
+            QMessageBox::critical(
+                0, QObject::tr("Error", "ExportHTML"),
+                QObject::tr("Could not read \n%1", "ExportHTML")
+                    .arg(cssSrc));
+            return;
+        }
+
+        // Replace mapBackgroundColor placeholder with actual map background color
+        cssContent.replace("$MapBackgroundColor", model->backgroundColor().name());
+
         QFile dst(cssDst);
         if (dst.exists())
             dst.remove();
 
-        if (!src.copy(cssDst)) {
+        if (!saveStringToDisk(cssDst, cssContent)) {
             QMessageBox::critical(
                 0, QObject::tr("Error", "ExportHTML"),
-                QObject::tr("Could not copy\n%1 to\n%2", "ExportHTML")
-                    .arg(cssSrc)
+                QObject::tr("Could not write to \n%1", "ExportHTML")
                     .arg(cssDst));
             return;
         }
@@ -422,6 +433,11 @@ void ExportHTML::doExport(bool useDialog)
     // Include image
     // (be careful: this resets Export mode, so call before exporting branches)
     if (dia.includeMapImage) {
+        // Workaround to preserve mapChanged status,
+        // which otherwise might become true because of 
+        // implicit image export
+        setBlockMapChangedDuringExport(true);
+
         QString mapName = getMapName();
         ts << "<center><img src=\"" << mapName << ".png\"";
         ts << "alt=\""
@@ -430,6 +446,8 @@ void ExportHTML::doExport(bool useDialog)
         ts << " usemap='#imagemap'></center>\n";
         offset =
             model->exportImage(dirPath + "/" + mapName + ".png", false, "PNG");
+
+        setBlockMapChangedDuringExport(false);
     }
 
     // Include table of contents
@@ -458,14 +476,29 @@ void ExportHTML::doExport(bool useDialog)
     ts << "<hr/>\n";
     ts << "<table class=\"vym-footer\">   \n\
         <tr> \n\
-        <td class=\"vym-footerL\">" +
-              filePath + "</td> \n\
-            <td class=\"vym-footerC\">" +
-              toS(QDate::currentDate()) + "</td> \n\
-            <td class=\"vym-footerR\"> <a href='" +
-              vymHome + "'>vym " + vymVersion + "</a></td> \n\
+        <td class=\"vym-footerL\"></td> \n\
+            <td class=\"vym-footerC\">"
+              "<a href='" + vymHome + "'>vym " + vymVersion + "</a>  - " + toS(QDate::currentDate()) + "</td> \n\
+            <td class=\"vym-footerR\"></td> \n\
             </tr> \n \
             </table>\n";
+    ts << "<script>\n"
+          "(function() {\n"
+          "  var btns = document.querySelectorAll('.vym-note-button');\n"
+          "  for (var i = 0; i < btns.length; i++) {\n"
+          "    btns[i].addEventListener('click', function() {\n"
+          "      var content = this.nextElementSibling;\n"
+          "      if (content.style.maxHeight) {\n"
+          "        content.style.maxHeight = null;\n"
+          "        this.innerHTML = '&#9654; Note';\n"
+          "      } else {\n"
+          "        content.style.maxHeight = content.scrollHeight + 'px';\n"
+          "        this.innerHTML = '&#9660; Note';\n"
+          "      }\n"
+          "    });\n"
+          "  }\n"
+          "})();\n"
+          "</script>\n";
     ts << "</body></html>";
     file.close();
 
index 6d90cce0b6d5621e84781e64e3f9c7a064f1fbc0..21857409e49d84b21bfc75284f80aa7cb7dce3fc 100644 (file)
@@ -147,19 +147,27 @@ void ExportImpress::exportPresentation()
     // zip tmpdir to destination
     ZipAgent zipAgent(tmpDir, filePath);
     zipAgent.setBackgroundProcess(false);
-    zipAgent.startZip();
-    if(zipAgent.exitStatus() != QProcess::NormalExit ||
-            zipAgent.exitCode() > 0) {
+    if (!zipAgent.startZip()) {
         QMessageBox::critical(
             0, QObject::tr("Critical Export Error"),
-            QObject::tr("Could not compress file %1").arg(filePath));
+            QObject::tr("Could not start compressing file %1").arg(filePath));
+        result = ExportBase::Failed;
+        return;
+    } else {
+        if(zipAgent.exitStatus() != QProcess::NormalExit ||
+                zipAgent.exitCode() > 0) {
+            QMessageBox::critical(
+                0, QObject::tr("Critical Export Error"),
+                QObject::tr("Could not compress file %1").arg(filePath));
+            result = ExportBase::Failed;
+            return;
+        }
     }
 
+    result = ExportBase::Success;
 
     displayedDestination = filePath;
 
-    result = ExportBase::Success;
-
     QStringList args;
     args << filePath;
     args << configFile;
index c7b877062d8f0558c10cfe49e104fef061bf836b..54764c663b5534370a354f3fee96fefda6121224 100644 (file)
@@ -70,6 +70,8 @@ FindControlsWidget::FindControlsWidget(QWidget *)
 
 QString FindControlsWidget::getFindText() { return findcombo->currentText(); }
 
+bool FindControlsWidget::getSearchNotes() { return filterNotesButton->isChecked(); }
+
 void FindControlsWidget::nextPressed()
 {
     if (findcombo->count() < findcombo->maxCount())
index 9a500e76dbfee40189c173557a6e2b9dc8694d6d..f71d062a9e9577117602ff8a0228414e2693d468 100644 (file)
@@ -16,6 +16,7 @@ class FindControlsWidget : public QWidget {
 
     FindControlsWidget(QWidget *parent = nullptr);
     QString getFindText();
+    bool getSearchNotes();
 
   public slots:
     void nextPressed();
index 156ad79dffcef37ff0b227aac7fa903f27cb5075..a532d34acc745017236721ed1807a7a04c7b29a9 100644 (file)
@@ -111,6 +111,11 @@ void FindResultWidget::addItem(const QString &s)
 
 QString FindResultWidget::getFindText() { return findControlsWidget->getFindText(); }
 
+bool FindResultWidget::getSearchNotes()
+{
+    return findControlsWidget->getSearchNotes();
+}
+
 FindResultModel *FindResultWidget::getResultModel() { return resultsModel; }
 
 void FindResultWidget::popup()
index 682d0cb1b01c6d596c209841a5a4f2cfa98a518b..14697dc70c30cad422f4f6fdf2b39bfe65e08da3 100644 (file)
@@ -29,6 +29,7 @@ class FindResultWidget : public QWidget {
     void addItem(TreeItem *ti);
     void addItem(const QString &s);
     QString getFindText();
+    bool getSearchNotes();
 
   public slots:
     void popup();
index 28f30d14c4d2bcdc52adff9780e5c8f2fe28c739..fb4d97ce2946cd9e6b79684e6e0f2c330c1b94d7 100644 (file)
@@ -17,7 +17,7 @@ FlagContainer::~FlagContainer()
 void FlagContainer::init()
 {
     avis = true;
-    containerType = FlagCont;
+    setContainerType(FlagCont);
     //setPen(QPen(Qt::green));
 }
 
index 477548e652cddaf5b869a73e13a1efd84d583fd6..9cd24d113338aa14daa24896186dff4b653def5e 100644 (file)
@@ -12,7 +12,7 @@ FlagRowContainer::FlagRowContainer()
 {
     // qDebug() << "Const FlagRowContainer ()";
     // setPen(QPen(Qt::red));
-    containerType = FlagRowCont;
+    setContainerType(FlagRowCont);
     layoutInt = Horizontal;
     horizontalDirection = LeftToRight;
     horizontalAlignmentInt = HorAlignedCentered;
@@ -44,7 +44,7 @@ void FlagRowContainer::updateActiveFlagContainers(const QList<QUuid> activeFlagU
     }
 
     // Remove flags no longer active in TreeItem
-    foreach (QGraphicsItem *child, childItems()) {
+    foreach (QGraphicsItem *child, childContainers()) {
         FlagContainer* fc = (FlagContainer*) child;
         if (!activeFlagUids.contains(fc->getUuid())) {
             delete fc;
@@ -79,7 +79,7 @@ void FlagRowContainer::activateFlag(Flag *flag)
 
 FlagContainer *FlagRowContainer::findFlagContainerByUid(const QUuid &uid)
 {
-    foreach (QGraphicsItem *child, childItems()) {
+    foreach (QGraphicsItem *child, childContainers()) {
         FlagContainer* fc = (FlagContainer*) child;
         if (fc->getUuid() == uid)
             return fc;
@@ -92,7 +92,7 @@ QUuid FlagRowContainer::findFlagByPos(const QPointF &p)
     if (!boundingRect().contains(mapFromScene(p)))
         return QUuid();
 
-    foreach (QGraphicsItem *child, childItems()) {
+    foreach (QGraphicsItem *child, childContainers()) {
         FlagContainer* fc = (FlagContainer*) child;
         if (fc->boundingRect().contains(fc->mapFromScene(p)))
         return fc->getUuid();
index 69692b8b092fa56d08b40837b681c08b185fc10c..cba4c7d1a0891939ab36e718f36c6628312732db 100644 (file)
@@ -26,7 +26,7 @@ FrameContainer::~FrameContainer()
 
 void FrameContainer::init()
 {
-    containerType = Frame;
+    setContainerType(Frame);
     frameTypeInt = NoFrame;
     clear();
     framePen.setColor(Qt::black);
diff --git a/src/git.h b/src/git.h
new file mode 100644 (file)
index 0000000..b109406
--- /dev/null
+++ b/src/git.h
@@ -0,0 +1,2 @@
+#define GIT_BRANCH "develop"
+#define GIT_COMMIT_HASH "410a3541"
diff --git a/src/git.h.in b/src/git.h.in
new file mode 100644 (file)
index 0000000..4fceda2
--- /dev/null
@@ -0,0 +1,2 @@
+#define GIT_BRANCH "${GIT_BRANCH}"
+#define GIT_COMMIT_HASH "${GIT_COMMIT_HASH}"
index dabbd1a4f2809e902a55b6a561dbbab553829028..270c152bd7ec771816b67aacf50f05c772f2f6a7 100644 (file)
@@ -21,7 +21,7 @@ HeadingContainer::~HeadingContainer()
 
 void HeadingContainer::init()
 {
-    containerType = Container::Heading;
+    setContainerType(Container::Heading);
 
     headingInt.setText(" ");
     headingColorInt = QColor(Qt::black);
@@ -209,7 +209,7 @@ qreal HeadingContainer::getScrollOpacity() // FIXME-3 needed?
 
 void HeadingContainer::reposition()
 {
-    // qdbg() << ind() << "HC::reposition " + info();
+    // My rectangle is defined above in setText()
     return;
 }
 
index 2977a1701b75a64807d5f7dcd3b80a29432cf40c..a2e525d36ad809443abdcfadadca1eb8da366f40 100644 (file)
@@ -12,6 +12,8 @@ extern QString editorFocusOutStyle;
 
 HistoryWindow::HistoryWindow(QWidget *parent) : QDialog(parent)
 {
+    modelIdInt = 0;
+
     ui.setupUi(this);
     ui.historyTable->setRowCount(
         settings.value("/history/stepsTotal", 75).toInt());
@@ -123,8 +125,11 @@ void HistoryWindow::updateRow(int row, int step, SimpleSettings &set)
     ui.historyTable->setItem(row, 2, item);
 }
 
-void HistoryWindow::update(SimpleSettings &set)
+void HistoryWindow::update(uint model, SimpleSettings &set)
 {
+    // Remember model id
+    modelIdInt = model;
+
     int undosAvail = set.numValue("/history/undosAvail", 0);
     int redosAvail = set.numValue("/history/redosAvail", 0);
     int stepsTotal = set.numValue("/history/stepsTotal", 1000);
@@ -134,6 +139,12 @@ void HistoryWindow::update(SimpleSettings &set)
     int r = undosAvail - 1;
     QTableWidgetItem *item;
 
+    /*
+    qDebug() << "HistoryWindow::update: undosAvail=" << undosAvail
+             << "redosAvail=" << redosAvail << "stepsTotal=" << stepsTotal
+             << "curStep=" << curStep;
+    */
+
     // Update number of rows
     ui.historyTable->setRowCount(undosAvail + redosAvail + 1);
 
@@ -214,8 +225,12 @@ void HistoryWindow::undo() { mainWindow->editUndo(); }
 
 void HistoryWindow::redo() { mainWindow->editRedo(); }
 
-void HistoryWindow::select()
+void HistoryWindow::select()    // FIXME-2 Better save current vymModel in HistoryWIndow and undo/redo directly without MainWindow.
 {
-    mainWindow->gotoHistoryStep(
-        ui.historyTable->row(ui.historyTable->selectedItems().first()));
+    QList <QTableWidgetItem*> selis = ui.historyTable->selectedItems();
+    if (selis.size() < 1) {
+        qDebug() << "HistoryWindow::select() no selection";
+        return;
+    }
+    mainWindow->gotoHistoryStep(modelIdInt, ui.historyTable->row(selis.first()));
 }
index 0c6c2f94de304a412f06cc457d900c7ff1ccecc3..8f7fc9c32ec6301274e9cc8e9f9e08bdf60c3623 100644 (file)
@@ -14,7 +14,7 @@ class HistoryWindow : public QDialog {
     HistoryWindow(QWidget *parent = 0);
     ~HistoryWindow();
     void setFocus();
-    void update(SimpleSettings &);
+    void update(uint modelId, SimpleSettings &);
     void setStepsTotal(int);
 
   protected:
@@ -30,9 +30,11 @@ class HistoryWindow : public QDialog {
     void windowClosed();
 
   private:
+    Ui::HistoryWindow ui;
+
+    uint modelIdInt;
     void clearRow(int);
     void updateRow(int, int, SimpleSettings &);
-    Ui::HistoryWindow ui;
 };
 
 #endif
index 2b64410c9af0bfe48aafc31566fc659cdddcd912..a7794ce083d2b55fe7b04ddc06c351083f827ee8 100644 (file)
@@ -82,7 +82,7 @@ void ImageContainer::copy(ImageContainer *other)
 
 void ImageContainer::init()
 {
-    containerType = Image;
+    setContainerType(Image);
 
     originalFilenameInt = "";
 
@@ -274,8 +274,9 @@ void ImageContainer::linkTo(BranchContainer *pbc)
 void ImageContainer::updateUpLink()
 {
     /*
+    qDebug() << "IC::updateUpLink()  this=" << this << " ii=" <<  imageItem << "type=" << type();
     if (imageItem)
-        qDebug() << "IC::updateUpLink()  ii=" << imageItem->headingText()  << "  vis=" << isVisible() << " par_item=" << parentItem();
+        qDebug() << "IC::updateUpLink() ii=" << imageItem->headingText()  << "  vis=" << isVisible() << " par_item=" << parentItem();
     else
         qDebug() << "IC::updateUpLink() No ii.";
     */
@@ -317,12 +318,13 @@ void ImageContainer::updateUpLink()
 
     // Color of link (depends on current parent)
     BranchItem *pb = imageItem->parentBranch();
-    if (pb) {
-        if (upLink->linkColorHint() == LinkObj::HeadingColor)
+    if (imageItem && pb) {
+        if (pb->mapDesign()->linkColorHint() == LinkObj::HeadingColor)
             upLink->setLinkColor(pb->headingColor());
         else
             upLink->setLinkColor(pb->mapDesign()->defaultLinkColor());
-    }
+    } else
+       return;
 
     // Finally update geometry
     upLink->updateLinkGeometry();
index 973530e840fc28e66076d09035ba85ada89c9302..bdd4b9c98a5067db6cd8b09cbd05e82bf6a59dd7 100644 (file)
@@ -33,8 +33,9 @@ ImageItem::~ImageItem()
         imageContainer = nullptr;
 
         // Remove images container, if no longer required
-        if (parentBranch())
-            parentBranch()->getBranchContainer()->updateChildrenStructure();
+        BranchItem *pb = parentBranch();
+        if (pb && pb->getBranchContainer())
+            pb->getBranchContainer()->updateChildrenStructure();
     }
 
     if (!filePathInZipDir.isEmpty() && QFile(filePathInZipDir).exists()) {
index 109260ba81e42b79121c10c1108a7ce383c85ecb..eac5105abdcd96c1d83ea3b94ec32fda43aace47 100644 (file)
@@ -26,8 +26,13 @@ void ItemListWrapper::init()
 {
     QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
     itemList.clear();
-    currentIndex = -1;
     deepLevelsFirstInt = false;
+    reset();
+}
+
+void ItemListWrapper::reset()
+{
+    currentIndex = -1;
 }
 
 void ItemListWrapper::setModeBranches(bool deepLevelsFirst)
index b6a8dfa28233bba65780dc0a908fd16fa71013d8..da91f2ea2aee14730902976918fe0e136c1cf315 100644 (file)
@@ -18,6 +18,7 @@ public:
     void init();
 
 public slots:
+    void reset();
     Q_INVOKABLE void setModeBranches(bool deepLevelsFirst = false);
     Q_INVOKABLE void setModeSelectedBranches();
     Q_INVOKABLE void setModeSelectedSubtrees(bool deepLevelsFirst = false);
index 8a15cad6e7ecd020ad8d87737da48a409ad241f8..a090c12d163376983f0bcc72b0eb19d7854e878c 100644 (file)
@@ -23,7 +23,7 @@ LinkContainer::~LinkContainer()
 
 void LinkContainer::init()
 {
-    containerType = Link;
+    setContainerType(Link);
 }
 
 void LinkContainer::addLink(LinkObj *lo)
index ab12e5065049a0988b11a22a4bf92603b7bc1393..ed94904c49064341c6015bc37852a1d78582b548 100644 (file)
@@ -176,16 +176,6 @@ QString LinkObj::styleString(int style)
     }
 }
 
-void LinkObj::setLinkColorHint(ColorHint hint)
-{
-    colorHint = hint;
-}
-
-LinkObj::ColorHint LinkObj::linkColorHint()
-{
-    return colorHint;
-}
-
 LinkObj::ColorHint LinkObj::linkColorHint(const QString &s)
 {
     if (s == "HeadingColor")
index a2b502842d65dfc44d60502631461d5e00af7fc1..9e07a2523310ab80f80f5f5f51de1c3deccdaa09 100644 (file)
@@ -55,8 +55,6 @@ class LinkObj : public MapObj {
     static Style styleFromString(const QString &);
     static QString styleString(int);
 
-    void setLinkColorHint(ColorHint);
-    ColorHint linkColorHint();
     static ColorHint linkColorHint(const QString &);
     static QString linkColorHintName(ColorHint);
 
@@ -84,7 +82,7 @@ class LinkObj : public MapObj {
     int thickness_start; // for StylePoly*
     Style style;         // Current style
     QColor linkcolor;    // Link color
-    ColorHint colorHint;
+
     QPen pen;
     QGraphicsLineItem *l;               // line style
     QGraphicsPolygonItem *p;            // poly styles
index 732e6ec0412e9ef29640ce3cf1e25535d8828ae7..d042448bdcad5e8a5e9dd16a8eecb9087155cc65 100644 (file)
@@ -8,10 +8,12 @@
 #include <QStyleFactory>
 
 #include "branchpropeditor.h"
+#include "buildinfo.h"
 #include "command.h"
 #include "debuginfo.h"
 #include "findresultwidget.h"
 #include "flagrow-master.h"
+#include "git.h"
 #include "headingeditor.h"
 #include "macros.h"
 #include "mainwindow.h"
@@ -261,6 +263,7 @@ int main(int argc, char *argv[])
             s += QString(" - \"%1\"").arg(vymCodeName);
         s += "\n";
         s += "   Quality: " + vymCodeQuality + "\n";
+        s += QString("       git: branch \"%1\" - commit %2\n").arg(GIT_BRANCH, GIT_COMMIT_HASH);
         s += "Build date: " + vymBuildDate + "\n";
         std::cout << s.toStdString();
 
@@ -539,14 +542,21 @@ int main(int argc, char *argv[])
         warn.exec();
     } else {
         bool ok;
+        QString lname;
         if (!localeName.isEmpty())
             // Use localeName to load specific language
-            ok = vymTranslator.load(QString("vym_%1.qm").arg(localeName), vymTranslationsDir.path());
+            lname = QString("vym_%1.qm").arg(localeName);
         else {
-            ok = vymTranslator.load(QLocale(), "vym", ".", vymTranslationsDir.path(), ".qm");
-            if (!ok)
-                // No system locale found, go for English
-                ok = vymTranslator.load(QString("vym_en.qm"), vymTranslationsDir.path());
+            QString s = QLocale::system().name();
+            lname = s.left(s.indexOf("_"));
+        }
+
+        ok = vymTranslator.load(QString("vym_%1.qm").arg(lname), vymTranslationsDir.path());
+
+        if (!ok) {
+            // No system locale found, go for English
+            qDebug() << "Main: No system locale found, trying Enlish";
+            ok = vymTranslator.load(QString("vym_en.qm"), vymTranslationsDir.path());
         }
 
         if (!ok) {
@@ -721,7 +731,7 @@ int main(int argc, char *argv[])
     // For benchmarking or if test script is done
     // we may want to quit instead of entering event loop
     if (options.isActive("quit") || mainWindow->exitAfterScript())
-        mainWindow->fileExitVYM();
+        mainWindow->fileExitVym();
     else
         app.exec();
 
index 43535553e07ecc4ee95bb1c555b492ed50a2ba54..e5f3ddf986e30d0675d688a98f59ad07d5b6e9e9 100644 (file)
@@ -200,7 +200,7 @@ Main::Main(QWidget *parent) : QMainWindow(parent)
     // Allow closing of tabs (introduced in Qt 4.5)
     tabWidget->setTabsClosable(true);
     connect(tabWidget, SIGNAL(tabCloseRequested(int)), this,
-            SLOT(fileCloseMap(int)));
+            SLOT(fileCloseTab(int)));
 
     tabWidget->setMovable(true);
 
@@ -217,8 +217,6 @@ Main::Main(QWidget *parent) : QMainWindow(parent)
     viewMenu = menuBar()->addMenu(tr("&View"));
     toolbarsMenu =
         viewMenu->addMenu(tr("Toolbars", "Toolbars overview in view menu"));
-    toggleWindowsMenu =
-        viewMenu->addMenu(tr("Toggle window", "Toggle visibility of editor windows overview in view menu"));
     focusWindowsMenu =
         viewMenu->addMenu(tr("Focus window", "Toggle visibility of editor windows overview in view menu"));
 
@@ -369,8 +367,7 @@ Main::Main(QWidget *parent) : QMainWindow(parent)
     // Allows a (test-)script to make vym quit after script execution
     exitAfterScriptInt = false;
 
-    backgroundZipProcesses = 0;
-    closeAfterLastZipProcess = false;
+    exitAfterLastMapClosed = false;
 }
 
 Main::~Main()
@@ -526,11 +523,8 @@ void Main::satelliteVisibilityChanged()
 
 void Main::closeEvent(QCloseEvent *event)
 {
-    if (tabWidget->count() > 0 && fileExitVYM())
-        // Some problem when closing tabs
-        event->ignore();
-    else
-        event->accept();
+    fileExitVym();
+    event->ignore();
 }
 
 QPrinter *Main::setupPrinter()
@@ -554,8 +548,8 @@ void Main::setupAPI()
     c = new Command("clearConsole", Command::AnySel);
     vymCommands.append(c);
 
-    c = new Command("closeMapWithID", Command::AnySel);
-    c->addParameter(Command::IntPar, false, "ID of map (unsigned int)");
+    c = new Command("closeMapWithId", Command::AnySel);
+    c->addParameter(Command::IntPar, false, "Id of map (unsigned int)");
     vymCommands.append(c);
 
     c = new Command("currentColor", Command::AnySel);
@@ -733,6 +727,10 @@ void Main::setupAPI()
     c->setComment("Returns true, if map uses an image as background");
     modelCommands.append(c);
 
+    c = new Command("isBusy", Command::AnySel);
+    c->setComment("Returns true while map is saving or loading");
+    modelCommands.append(c);
+
     c = new Command("itemList", Command::AnySel, Command::BoolPar);
     c->addParameter(Command::BoolPar, true, "Flag to go deep levels first (currently unused)");
     c->setComment("Create new itemList to iterate over branches");
@@ -749,6 +747,11 @@ void Main::setupAPI()
     c->setComment("Replace branch with data from given path");
     modelCommands.append(c);
 
+    c = new Command("moveSelectionToTarget", Command::BranchSel, Command::BoolPar);
+    c->setComment("Move selected branches to target branch");
+    c->addParameter(Command::BranchPar, false, "Target branch");
+    modelCommands.append(c);
+
     c = new Command("moveSlideDown", Command::AnySel);
     modelCommands.append(c);
 
@@ -891,6 +894,11 @@ void Main::setupAPI()
     c->addParameter(Command::StringPar, false, "");
     modelCommands.append(c);
 
+    c = new Command("setSaveAsBackgroundProcess", Command::AnySel);
+    c->addParameter(Command::BoolPar, false, "Enable (default) or disable background saving");
+    c->setComment("Use background progress to save maps or selections");
+    modelCommands.append(c);
+
     c = new Command("setZoom", Command::AnySel);
     c->addParameter(Command::DoublePar, false, "Zoomfactor of map");
     modelCommands.append(c);
@@ -925,16 +933,16 @@ void Main::setupAPI()
     //
 
     c = new Command("addBranch", Command::BranchSel);
-    c->setComment("Add branch as child branch to current branch");
+    c->setComment("Add branch as child branch to current branch and return it");
     branchCommands.append(c);
 
     c = new Command("addBranchAt", Command::BranchSel);
-    c->setComment("Add branch at position to current branch");
+    c->setComment("Add branch at position to current branch and return it");
     c->addParameter(Command::IntPar, true, "Index of new branch");
     branchCommands.append(c);
 
     c = new Command("addBranchBefore", Command::BranchSel);
-    c->setComment("Add branch as parent before current branch");
+    c->setComment("Add branch as parent before current branch and return it");
     branchCommands.append(c);
 
     c = new Command("attributeAsInt", Command::BranchSel, Command::IntPar);
@@ -947,6 +955,11 @@ void Main::setupAPI()
     c->addParameter(Command::StringPar, false, "Key of string attribute");
     branchCommands.append(c);
 
+    c = new Command("branchAt", Command::BranchSel);
+    c->setComment("Return child branch at given index");
+    c->addParameter(Command::IntPar, false, "Index of child branch");
+    branchCommands.append(c);
+
     c = new Command("branchCount", Command::BranchSel, Command::IntPar);
     c->setComment("Return number of child branches");
     branchCommands.append(c);
@@ -1537,6 +1550,10 @@ void Main::setupAPI()
     c->setReturnType(Command::IntPar);
     itemListCommands.append(c);
 
+    c = new Command("reset");
+    c->setComment("Reset the current item position to the beginning of the list");
+    itemListCommands.append(c);
+
     c = new Command("setModeBranches");
     c->setComment("Set iteration mode to include all branches in map");
     c->addParameter(Command::BoolPar, true, "Deep levels first");
@@ -1641,51 +1658,14 @@ void Main::setupFileActions()
     fileMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(fileSaveAsDefault()));
 
-    fileMenu->addSeparator();
-
-    fileImportMenu = fileMenu->addMenu(tr("Import", "File menu"));
-
-    // Import at selection (adding to selection)
-    a = new QAction(tr("Add map (insert)", "Edit menu"), this);
-    connect(a, SIGNAL(triggered()), this, SLOT(editImportAdd()));
-    a->setEnabled(false);
-    actionListBranches.append(a);
-    actionImportAdd = a;
-    fileImportMenu->addAction(a);
-
-    // Import at selection (replacing selection)
-    a = new QAction(tr("Add map (replace)", "Edit menu"), this);
-    connect(a, SIGNAL(triggered()), this, SLOT(editImportReplace()));
+    a = new QAction(tr("Save selection", "Edit menu"), this);
+    connect(a, SIGNAL(triggered()), this, SLOT(editSaveSelection()));
     a->setEnabled(false);
+    fileMenu->addAction(a);
     actionListBranches.append(a);
-    actionImportReplace = a;
-    fileImportMenu->addAction(a);
-    fileImportMenu->addSeparator();
+    actionSaveSelection = a;
 
-    a = new QAction( tr("Firefox Bookmarks", "Import filters") +
-                        tr("(still experimental)"),
-                    this);
-    connect(a, SIGNAL(triggered()), this,
-            SLOT(fileImportFirefoxBookmarks()));
-    fileImportMenu->addAction(a);
-
-    a = new QAction("Freemind..." + tr("(still experimental)"), this);
-    connect(a, SIGNAL(triggered()), this, SLOT(fileImportFreemind()));
-    fileImportMenu->addAction(a);
-
-    a = new QAction("IThoughts..." + tr("(still experimental)"), this);
-    connect(a, SIGNAL(triggered()), this, SLOT(fileImportIThoughts()));
-    fileImportMenu->addAction(a);
-
-    a = new QAction("Mind Manager..." + tr("(still experimental)"), this);
-    connect(a, SIGNAL(triggered()), this, SLOT(fileImportMM()));
-    fileImportMenu->addAction(a);
-
-    a = new QAction(tr("Import Dir...", "Import Filters") + " " +
-                        tr("(still experimental)"),
-                    this);
-    connect(a, SIGNAL(triggered()), this, SLOT(fileImportDir()));
-    fileImportMenu->addAction(a);
+    fileMenu->addSeparator();
 
     fileExportMenu = fileMenu->addMenu(tr("Export", "File menu"));
 
@@ -1789,6 +1769,50 @@ void Main::setupFileActions()
     fileExportMenu->addAction(a);
     actionListFiles.append(a);
 
+    fileImportMenu = fileMenu->addMenu(tr("Import", "File menu"));
+
+    // Import at selection (adding to selection)
+    a = new QAction(tr("Add map (insert)", "Edit menu"), this);
+    connect(a, SIGNAL(triggered()), this, SLOT(editImportAdd()));
+    a->setEnabled(false);
+    actionListBranches.append(a);
+    actionImportAdd = a;
+    fileImportMenu->addAction(a);
+
+    // Import at selection (replacing selection)
+    a = new QAction(tr("Add map (replace)", "Edit menu"), this);
+    connect(a, SIGNAL(triggered()), this, SLOT(editImportReplace()));
+    a->setEnabled(false);
+    actionListBranches.append(a);
+    actionImportReplace = a;
+    fileImportMenu->addAction(a);
+    fileImportMenu->addSeparator();
+
+    a = new QAction( tr("Firefox Bookmarks", "Import filters") +
+                        tr("(still experimental)"),
+                    this);
+    connect(a, SIGNAL(triggered()), this,
+            SLOT(fileImportFirefoxBookmarks()));
+    fileImportMenu->addAction(a);
+
+    a = new QAction("Freemind..." + tr("(still experimental)"), this);
+    connect(a, SIGNAL(triggered()), this, SLOT(fileImportFreemind()));
+    fileImportMenu->addAction(a);
+
+    a = new QAction("IThoughts..." + tr("(still experimental)"), this);
+    connect(a, SIGNAL(triggered()), this, SLOT(fileImportIThoughts()));
+    fileImportMenu->addAction(a);
+
+    a = new QAction("Mind Manager..." + tr("(still experimental)"), this);
+    connect(a, SIGNAL(triggered()), this, SLOT(fileImportMM()));
+    fileImportMenu->addAction(a);
+
+    a = new QAction(tr("Import Dir...", "Import Filters") + " " +
+                        tr("(still experimental)"),
+                    this);
+    connect(a, SIGNAL(triggered()), this, SLOT(fileImportDir()));
+    fileImportMenu->addAction(a);
+
     fileMenu->addSeparator();
 
     a = new QAction(tr("Map properties"), this);
@@ -1811,14 +1835,14 @@ void Main::setupFileActions()
     a = new QAction(QPixmap(QString(":/document-close-%1.svg").arg(iconTheme)), tr("&Close Map", "File menu"),
                     this);
     switchboard.addAction(a, "fileMapClose", Qt::CTRL | Qt::Key_W, shortcutScope, tag);
-    connect(a, SIGNAL(triggered()), this, SLOT(fileCloseMap()));
+    connect(a, SIGNAL(triggered()), this, SLOT(fileCloseCurrentMap()));
     fileMenu->addAction(a);
     actionFileClose = a;
 
     tag = tr("Exit", "MainWindow shortcut groups");
     a = new QAction(QPixmap(QString(":/application-exit-%1.svg").arg(iconTheme)), tr("E&xit", "File menu"), this);
     switchboard.addAction(a, "fileExit", Qt::CTRL | Qt::Key_Q, shortcutScope, tag);
-    connect(a, SIGNAL(triggered()), this, SLOT(fileExitVYM()));
+    connect(a, SIGNAL(triggered()), this, SLOT(fileExitVym()));
     fileMenu->addAction(a);
     actionFileExitVym = a;
 
@@ -1853,8 +1877,9 @@ void Main::setupEditActions()
     a->setShortcutContext(Qt::WidgetShortcut);
     a->setEnabled(false);
     mapEditorActions.append(a);
+    vimActions.append(a);
     restrictedMapActions.append(a);
-    switchboard.addAction(a, "mapUndo", Qt::Key_U, shortcutScope, tag); // Vim Alternative
+    switchboard.addAction(a, "mapUndoVimAlt", Qt::Key_U, shortcutScope, tag); // Vim Alternative
     connect(a, SIGNAL(triggered()), this, SLOT(editUndo()));
     actionUndoVim = a;
 
@@ -1867,7 +1892,7 @@ void Main::setupEditActions()
     actionRedo = a;
 
     a = new QAction(tr("Repeat last action", "Edit menu") + " (experimental)", this);
-    switchboard.addAction(a, "repeatLastAction", Qt::Key_Period, shortcutScope, tag);
+    switchboard.addAction(a, "repeatLastActionVim", Qt::Key_Period, shortcutScope, tag);
     connect(a, SIGNAL(triggered()), this, SLOT(editRepeatLastAction()));
     //actionListBranches.append(a);
     actionRepeatCommand = a;
@@ -1888,7 +1913,8 @@ void Main::setupEditActions()
     a->setEnabled(false);
     unrestrictedMapActions.append(a);
     mapEditorActions.append(a);
-    switchboard.addAction(a, "mapCopyVim", Qt::Key_Y, shortcutScope, tag);
+    vimActions.append(a);
+    switchboard.addAction(a, "mapCopyVimAlt", Qt::Key_Y, shortcutScope, tag);
     connect(a, SIGNAL(triggered()), this, SLOT(editCopy()));
     actionCopyVim = a;
 
@@ -1905,8 +1931,9 @@ void Main::setupEditActions()
     actionCut = a;
 
     a = new QAction(QPixmap(QString(":/edit-cut-%1.svg").arg(iconTheme)), tr("Cu&t", "Edit menu"), this);
-    switchboard.addAction(a, "mapCutVim", Qt::Key_D, shortcutScope, tag);
+    switchboard.addAction(a, "mapCutVimAlt", Qt::Key_D, shortcutScope, tag);
     addAction(a);
+    vimActions.append(a);
     connect(a, SIGNAL(triggered()), this, SLOT(editDeleteSelection()));
     actionListItems.append(a);
     actionCutVim = a;
@@ -1928,7 +1955,8 @@ void Main::setupEditActions()
     a->setEnabled(false);
     restrictedMapActions.append(a);
     mapEditorActions.append(a);
-    switchboard.addAction(a, "mapPasteVim", Qt::Key_P, shortcutScope, tag);
+    vimActions.append(a);
+    switchboard.addAction(a, "mapPasteVimAlt", Qt::Key_P, shortcutScope, tag);
     actionPasteVim = a;
 
     // Shortcut to delete selection
@@ -2407,13 +2435,6 @@ void Main::setupEditActions()
     actionListBranches.append(a);
     actionTaskSleep28 = a;
 
-    // Save selection
-    a = new QAction(tr("Save selection", "Edit menu"), this);
-    connect(a, SIGNAL(triggered()), this, SLOT(editSaveBranch()));
-    a->setEnabled(false);
-    actionListBranches.append(a);
-    actionSaveBranch = a;
-
     tag = tr("Removing parts of a map", "Shortcuts");
 
     // Only remove branch, not its children
@@ -2518,7 +2539,8 @@ void Main::setupSelectActions()
 
     a = new QAction(QPixmap(QString(":/edit-find-%1.svg").arg(iconTheme)), tr("Find...", "Edit menu"), this);
     selectMenu->addAction(a);
-    switchboard.addAction(a, "mapFindAlt", Qt::Key_Slash, shortcutScope, tag); // Alternative: VIM Find
+    vimActions.append(a);
+    switchboard.addAction(a, "mapFindVimAlt", Qt::Key_Slash, shortcutScope, tag); // Alternative: VIM Find
     connect(a, SIGNAL(triggered()), this, SLOT(editOpenFindResultWidget()));
     actionListFiles.append(a);
     actionFindVim = a;
@@ -2541,8 +2563,9 @@ void Main::setupSelectActions()
 
     a = new QAction("Select first branch in siblings", this);
     a->setShortcutContext(Qt::WidgetWithChildrenShortcut);
+    vimActions.append(a);
     selectMenu->addAction(a);
-    switchboard.addAction(a, "Select first branch in siblings", Qt::Key_0, shortcutScope, tag);              // Alternative: VIM Select first
+    switchboard.addAction(a, "selectFirstSiblingVim", Qt::Key_0, shortcutScope, tag);              // Alternative: VIM Select first
     actionListBranches.append(a);
     addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(editSelectFirstSibling()));
@@ -2557,8 +2580,9 @@ void Main::setupSelectActions()
 
     a = new QAction("Select last branch in siblings", this);
     a->setShortcutContext(Qt::WidgetWithChildrenShortcut);
+    vimActions.append(a);
     selectMenu->addAction(a);
-    switchboard.addAction(a, "Select last branch in siblings", Qt::Key_Dollar, shortcutScope, tag);
+    switchboard.addAction(a, "selectLastSiblingVim", Qt::Key_Dollar, shortcutScope, tag);
     actionListBranches.append(a);
     addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(editSelectLastSibling()));
@@ -2865,7 +2889,6 @@ void Main::setupViewActions()
 
     a = new QAction(QPixmap(":/flag-note.svg"), n, this);
     a->setCheckable(true);
-    toggleWindowsMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(toggleNoteEditor()));
     actionViewToggleNoteEditor = a;
                                     //
@@ -2881,7 +2904,6 @@ void Main::setupViewActions()
     a = new QAction(QPixmap(":/headingeditor.png"), n, this);
     a->setCheckable(true);
     mapEditorActions.append(a);
-    toggleWindowsMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(toggleHeadingEditor()));
     actionViewToggleHeadingEditor = a;
 
@@ -2889,7 +2911,6 @@ void Main::setupViewActions()
     // Original icon is "category" from KDE
     a = new QAction(QPixmap(":/treeeditor.png"), n, this);
     a->setCheckable(true);
-    toggleWindowsMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(toggleTreeEditors()));
     actionViewToggleTreeEditors = a;
 
@@ -2912,14 +2933,12 @@ void Main::setupViewActions()
 
     a = new QAction(QPixmap(":/taskeditor.png"), n, this);
     a->setCheckable(true);
-    toggleWindowsMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(toggleTaskEditor()));
     actionViewToggleTaskEditor = a;
 
     n = tr("Slide editor", "View action");
     a = new QAction(QPixmap(":/slideeditor.png"), n, this);
     a->setCheckable(true);
-    toggleWindowsMenu->addAction(a);
     switchboard.addAction(a, "mapShowSlideEditor", shortcutScope, tag);
     connect(a, SIGNAL(triggered()), this, SLOT(toggleSlideEditors()));
     actionViewToggleSlideEditors = a;
@@ -2933,16 +2952,19 @@ void Main::setupViewActions()
 
     a = new QAction(QPixmap(":/scripteditor.png"), n, this);
     a->setCheckable(true);
-    toggleWindowsMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(toggleScriptEditor()));
     actionViewToggleScriptEditor = a;
 
+    a = new QAction(QPixmap(), tr("Script output", "View action"), this);
+    focusWindowsMenu->addAction(a);
+    switchboard.addAction(a, "mapFocusScriptOutput", Qt::CTRL | Qt::SHIFT | Qt::Key_S, shortcutScope, tag);
+    connect(a, SIGNAL(triggered()), this, SLOT(focusScriptOutput()));
+    actionViewFocusScriptOutput = a;
+
     a = new QAction(QPixmap(), tr("Script output", "View action"), this);
     a->setCheckable(true);
-    toggleWindowsMenu->addAction(a);
-    switchboard.addAction(a, "mapToggleScriptOutput", Qt::CTRL | Qt::SHIFT | Qt::Key_S, shortcutScope, tag);
     connect(a, SIGNAL(triggered()), this, SLOT(toggleScriptOutput()));
-    actionViewToggleScriptOutput = a; // FIXME-3 show
+    actionViewToggleScriptOutput = a;
 
     n = tr("History window", "View action");
     a = new QAction(QPixmap(":/history.png"), n, this);
@@ -2959,12 +2981,10 @@ void Main::setupViewActions()
 
     a = new QAction(QPixmap(":/history.png"), n, this);
     a->setCheckable(true);
-    toggleWindowsMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(toggleHistory()));
     actionViewToggleHistoryWindow = a;
 
     focusWindowsMenu->addAction(actionViewFocusPropertyEditor);
-    toggleWindowsMenu->addAction(actionViewTogglePropertyEditor);
 
     viewMenu->addSeparator();
 
@@ -3035,7 +3055,6 @@ void Main::setupConnectActions()
 
     a = new QAction( tr("Get Confluence user data", "Connect action"), this);
     connectMenu->addAction(a);
-    switchboard.addAction(a, "confluenceUser", Qt::SHIFT | Qt::Key_C, shortcutScope, tag);
     connect(a, SIGNAL(triggered()), this, SLOT(getConfluenceUser()));
     actionConnectGetConfluenceUser = a;
 
@@ -3137,6 +3156,7 @@ void Main::setupFlagActions()
     // Create System Flags
 
     // Tasks
+
     // Origin: ./share/icons/oxygen/48x48/status/task-reject.png
     flag = setupFlag(":/flag-task-new.svg", Flag::SystemFlag, "system-task-new",
                      tr("Note", "SystemFlag"));
@@ -3708,6 +3728,11 @@ void Main::setupHelpActions()
     helpMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(helpDebugInfo()));
 
+    helpMenu->addSeparator();
+    a = new QAction(tr("Help VYM development", "Help action"), this);
+    helpMenu->addAction(a);
+    connect(a, SIGNAL(triggered()), this, SLOT(helpVymDevelopment()));
+
     a = new QAction(tr("About QT", "Help action"), this);
     connect(a, SIGNAL(triggered()), this, SLOT(helpAboutQT()));
     helpMenu->addAction(a);
@@ -3731,6 +3756,7 @@ void Main::setupContextMenus()
     branchAddContextMenu->addAction(actionPaste);
     branchAddContextMenu->addAction(actionLoadImage);
     branchAddContextMenu->addAction(actionAddMapCenter);
+    branchAddContextMenu->addSeparator();
     branchAddContextMenu->addAction(actionAddBranch);
     branchAddContextMenu->addAction(actionAddBranchBefore);
     branchAddContextMenu->addAction(actionAddBranchAbove);
@@ -4216,7 +4242,7 @@ VymModel *Main::currentModel() const
         return nullptr;
 }
 
-VymModel *Main::getModel(uint id) // Used in BugAgent
+VymModel *Main::modelWithId(uint id) // Used in BugAgent
 {
     if (id <= 0)
         return nullptr;
@@ -4257,23 +4283,39 @@ bool Main::closeModelWithId(uint id)
     for (int i = 0; i < tabWidget->count(); i++) {
         vm = view(i)->getModel();
         if (vm && vm->modelId() == id) {
-            VymView *vv = view(i);
-            tabWidget->removeTab(i);
+            if (!vm->isBusy()) {
+                VymView *vv = view(i);
+                tabWidget->removeTab(i);
 
-            // Destroy stuff, order is important
-            branchPropertyEditor->setModel(nullptr);
-            delete (vm->getMapEditor());
-            delete (vv);
-            delete (vm);
+                // Destroy stuff, order is important
+                branchPropertyEditor->setModel(nullptr);
+                delete (vm->getMapEditor());
+                delete (vv);
+                delete (vm);
 
-            updateActions();
-            return true;
+                updateActions();
+                if (tabWidget->count() == 0 && exitAfterLastMapClosed)
+                    fileExitVym();
+
+                return true;    // Found Id, Closing scheduled successful (used in script)
+            }
         }
     }
 
     return false;
 }
 
+void Main::closeSavedModels()
+{
+    // Called from VymModel::zipFinished via QTimer::singleShot
+    // to avoid race conditions
+    for (int i = 0; i < tabWidget->count(); i++) {
+        VymModel *vm = view(i)->getModel();
+        if (vm && vm->readyToClose())
+            closeModelWithId(vm->modelId());
+    }
+}
+
 int Main::modelCount() { return tabWidget->count(); }
 
 void Main::updateTabName(VymModel *vm)
@@ -4304,8 +4346,20 @@ void Main::editorChanged()
         updateQueries(vm);
         taskEditor->setMapName(vm->getMapName());
         updateDockWidgetTitles(vm);
+
+        // Re-run search in the newly selected map, so the FindResultWidget
+        // reflects the current map instead of the previous one (issue #216)
+        if (findResultWidget->isVisible() &&
+            !findResultWidget->getFindText().isEmpty())
+            editFindNext(findResultWidget->getFindText(),
+                         findResultWidget->getSearchNotes());
     }
 
+    // Update BranchPropertyEditor to reflect the map of the current tab.
+    // Selection does not change when switching tabs, so changeSelection()
+    // is not triggered and the editor would still show the previous map.
+    branchPropertyEditor->setModel(vm);
+
     // Update actions to in menus and toolbars according to editor
     updateActions();
 }
@@ -4357,18 +4411,6 @@ void Main::fileNewCopy()
     }
 }
 
-void Main::backgroundZipStarted()
-{
-    backgroundZipProcesses++;
-}
-
-void Main::backgroundZipFinished()
-{
-    backgroundZipProcesses--;
-    if (closeAfterLastZipProcess)
-        fileExitVYM();
-}
-
 bool Main::fileLoad(QString fn, const File::LoadMode &lmode,
                                const File::FileType &ftype)
 {
@@ -4470,6 +4512,10 @@ bool Main::fileLoad(QString fn, const File::LoadMode &lmode,
                     vm = currentMapEditor()->getModel();
                     vm->setFilePath(fn);
                     updateTabName(vm);
+                    // Notify satellite editors about the new map, e.g. so the
+                    // TaskEditor's "current map only" filter uses the new map
+                    // name instead of the previous (default) one. (See #174)
+                    editorChanged();
                     statusBar()->showMessage("Created " + fn);
                     return true;
                 }
@@ -4478,7 +4524,7 @@ bool Main::fileLoad(QString fn, const File::LoadMode &lmode,
                 statusBar()->showMessage("Loading " + fn + " failed!");
                 int cur = tabWidget->currentIndex();
                 tabWidget->setCurrentIndex(tabWidget->count() - 1);
-                fileCloseMap();
+                fileCloseCurrentMap();
                 tabWidget->setCurrentIndex(cur);
                 return false;
             }
@@ -4513,7 +4559,7 @@ bool Main::fileLoad(QString fn, const File::LoadMode &lmode,
         // Finally check for errors and go home
         if (!noError) {
             if (lmode == File::NewMap)
-                fileCloseMap();
+                fileCloseCurrentMap();
             statusBar()->showMessage("Could not load " + fn);
         }
         else {
@@ -4531,7 +4577,12 @@ bool Main::fileLoad(QString fn, const File::LoadMode &lmode,
             }
 
             editorChanged();
-            vm->emitShowSelection(false, false);
+            if (vm->hasViewCenterTarget())
+                // Maps since version 2.9.606 save center of view
+                vm->getMapEditor()->setViewCenterTarget(vm->viewCenterTarget());
+            else
+                vm->emitShowSelection(false, false);
+
             statusBar()->showMessage(tr("Loaded %1").arg(fn));
         }
     }
@@ -4592,7 +4643,7 @@ void Main::fileSaveSession()
         flist.append(view(i)->getModel()->getFilePath());
 
     settings.setValue("/mainwindow/sessionFileList", flist);
-    //logInfo("Current session list: " + flist.join(","), __func__);
+    // qDebug() << __func__ << "Current session list: " + flist.join(",");
 
     // Also called by event loop regulary, but apparently not often enough
     settings.sync();
@@ -4679,7 +4730,7 @@ void Main::fileSave(VymModel *m, const File::SaveMode &savemode)
         // We have  no filepath yet,
         // call fileSaveAs() now, this will call fileSave()
         // again.  First switch to editor
-        fileSaveAs(savemode);
+        fileSaveAs();
         return; // avoid saving twice...
     }
 
@@ -4690,164 +4741,120 @@ void Main::fileSave() { fileSave(currentModel(), File::CompleteMap); }
 
 void Main::fileSave(VymModel *m) { fileSave(m, File::CompleteMap); }
 
-void Main::fileSaveAs(const File::SaveMode &savemode)
+bool Main::fileSaveAs(const File::SaveMode &saveMode, QString fileName)
 {
     VymModel *m = currentModel();
-    if (!m) return;
+    if (!m) return false;
 
-    QString filter;
-    if (savemode == File::CompleteMap)
-        filter = "VYM map (*.vym)";
-    else
-        filter = "VYM part of map (*vyp)";
-    filter += ";;All (* *.*)";
+    QString fileName_org = m->getFilePath(); // Restore fileName later
 
-    // Get destination path
-    QString fn = QFileDialog::getSaveFileName(
-        this,
-        tr("Save map as"),
-        lastMapDir.path() + "/" + tr("Untitled", "Default name in FileSaveAs dialog") + ".vym",
-        filter, nullptr, QFileDialog::DontConfirmOverwrite);
-    if (!fn.isEmpty()) {
-        // Check for existing file
-        if (QFile(fn).exists()) {
-            // Check if the existing file is writable
-            if (!QFileInfo(fn).isWritable()) {
-                QMessageBox::critical(0, tr("Critical Error"),
-                                      tr("Couldn't save %1,\nbecause file "
-                                         "exists and cannot be changed.")
-                                          .arg(fn));
-                return;
-            }
+    // Check for existing file
+    if (QFile(fileName).exists()) {
+        // Check if the existing file is writable
+        if (!QFileInfo(fileName).isWritable()) {
+            QMessageBox::critical(0, tr("Critical Error"),
+                                  tr("Couldn't save %1,\nbecause file "
+                                     "exists and cannot be changed.")
+                                      .arg(fileName));
+            return false;
+        }
 
-            QMessageBox mb(
-                QMessageBox::Warning,
-                vymName,
-                tr("The file %1\nexists already. Do you want to").arg(fn));
-            QPushButton *overwriteButton = mb.addButton(tr("Overwrite"), QMessageBox::AcceptRole);
-            mb.addButton(tr("Cancel"), QMessageBox::RejectRole);
-            mb.exec();
-            if (mb.clickedButton() != overwriteButton) return;
+// Macs check for replacing existing file in native dialog
+#ifndef Q_OS_MACOS
+        // Ask if existing file can be overwritten
+        QMessageBox mb(
+            QMessageBox::Warning,
+            vymName,
+            tr("The file %1\nexists already. Do you want to").arg(fileName));
+        QPushButton *overwriteButton = mb.addButton(tr("Overwrite"), QMessageBox::AcceptRole);
+        mb.addButton(tr("Cancel"), QMessageBox::RejectRole);
+        mb.exec();
+        if (mb.clickedButton() != overwriteButton) return false;
+#endif
+    }
+    else {
+        // New file, add extension to filename, if missing
+        // This is always .vym or .vyp, depending on saveMode
+        if (saveMode == File::CompleteMap) {
+            if (!fileName.contains(".vym") && !fileName.contains(".xml"))
+                fileName += ".vym";
         }
         else {
-            // New file, add extension to filename, if missing
-            // This is always .vym or .vyp, depending on savemode
-            if (savemode == File::CompleteMap) {
-                if (!fn.contains(".vym") && !fn.contains(".xml"))
-                    fn += ".vym";
-            }
-            else {
-                if (!fn.contains(".vyp") && !fn.contains(".xml"))
-                    fn += ".vyp";
-            }
+            if (!fileName.contains(".vyp") && !fileName.contains(".xml"))
+                fileName += ".vyp";
         }
+    }
 
-        // Save original filepath, might want to restore after saving
-        QString fn_org = m->getFilePath();
+    m->setFilePath(fileName);
 
-        // Check for existing lockfile
-        QFile lockFile(fn + ".lock");
-        if (lockFile.exists()) {
-            QMessageBox::critical(0, tr("Critical Error"),
-                                  tr("Couldn't save %1,\nbecause of "
-                                     "existing lockfile:\n\n%2")
-                                      .arg(fn, lockFile.fileName()));
-            return;
-        }
+    // Check for existing lockfile
+    QFile lockFile(fileName + ".lock");
+    if (lockFile.exists()) {
+        QMessageBox::critical(0, tr("Critical Error"),
+                              tr("Couldn't save %1,\nbecause of "
+                                 "existing lockfile:\n\n%2")
+                                  .arg(fileName, lockFile.fileName()));
+        m->setFilePath(fileName_org);
+        return false;
+    }
 
-        if (!m->renameMap(fn)) {
-            QMessageBox::critical(0, tr("Critical Error"),
-                                  tr("Saving the map failed:\nCouldn't rename map to %1").arg(fn));
-            return; // FIXME-3 Check: If saved part of map and this error occurs?
-        }
+    // Rename also current lockfile, if saving complete map
+    if (saveMode == File::CompleteMap && !m->changeLock(fileName)) {
+        QMessageBox::critical(0, tr("Critical Error"),
+                              tr("Saving the map failed:\nCouldn't rename map to %1").arg(fileName));
+        m->setFilePath(fileName_org);
+        return false; // FIXME-3 Check: If saved part of map and this error occurs?
+    }
 
-        fileSave(m, savemode);
+    fileSave(m, saveMode);
 
-        // Set name of tab
-        if (savemode == File::CompleteMap)
-        {
-            addRecentMap(m->getFileName());
-            updateTabName(m);
-        }
-        else { // Renaming map to original name, because we only saved the
-               // selected part of it
-            m->setFilePath(fn_org);
-            if (!m->renameMap(fn_org)) {
-                QMessageBox::critical(0, "Critical Error",
-                                      "Couldn't rename map back to " + fn_org);
-            }
-        }
-        lastMapDir.setPath(m->getFileDir());
-        return;
+    // Set name of tab
+    if (saveMode == File::CompleteMap)
+    {
+        addRecentMap(m->getFileName());
+        updateTabName(m);
+    } else if (saveMode == File::PartOfMap) {
+        m->setFilePath(fileName_org);
     }
-}
 
-void Main::fileSaveAs() { fileSaveAs(File::CompleteMap); }
+    lastMapDir.setPath(m->getFileDir());
+    return true;
+}
 
-void Main::fileSaveAsDefault()
+void Main::fileSaveAs()
 {
-    if (currentMapEditor()) {
-        QString fn = QFileDialog::getSaveFileName(
-            this, tr("Save map as new default map"), newMapPath(),
-            "VYM map (*.vym)", nullptr, QFileDialog::DontConfirmOverwrite);
-
-        if (!fn.isEmpty()) {
+    VymModel *m = currentModel();
+    if (!m) return;
 
-            // Check for existing file
-            if (QFile(fn).exists()) {
-                // Check if the existing file is writable
-                if (!QFileInfo(fn).isWritable()) {
-                    QMessageBox::critical(
-                        0, tr("Warning"),
-                        tr("You have no permissions to write to ") + fn);
-                    return;
-                }
+    QString filter = "VYM map (*.vym)";
+    filter += ";;All (* *.*)";
 
-                // Confirm overwrite of existing file
-                QMessageBox mb(
-                    QMessageBox::Warning,
-                    vymName,
-                    tr("The file %1\nexists already. Do you want to").arg(fn));
-                mb.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel);
-                mb.setDefaultButton(QMessageBox::Save);
-                switch (mb.exec()) {
-                    case QMessageBox::Save:
-                        // save
-                        break;
-                    case QMessageBox::Cancel:
-                        return;
-                }
-            }
+    // Get destination path
+    QString fileName = QFileDialog::getSaveFileName(
+        this,
+        tr("Save map as"),
+        lastMapDir.path() + "/" + tr("Untitled", "Default name in FileSaveAs dialog") + ".vym",
+        filter, nullptr, QFileDialog::DontConfirmOverwrite);
 
-            // Save now as new default
-            VymModel *m = currentModel();
-
-            // Check for existing lockfile
-            QFile lockFile(fn + ".lock");
-            if (lockFile.exists()) {
-                QMessageBox::critical(
-                    0, tr("Critical Error"),
-                    tr("Couldn't save %1,\nbecause of existing lockfile:\n\n%2")
-                        .arg(fn, lockFile.fileName()));
-                return;
-            }
+    fileSaveAs(File::CompleteMap, fileName);
+}
 
-            if (!m->renameMap(fn)) {
-                QMessageBox::critical(0, tr("Critical Error"),
-                                      tr("Couldn't save as default, failed to rename to\n%1").arg(fn));
-                return;
-            }
-            lastMapDir.setPath(m->getFileDir());
+void Main::fileSaveAsDefault()
+{
+    VymModel *m = currentModel();
+    if (!m) return;
 
-            fileSave(m, File::CompleteMap);
+    QString filter = "VYM map (*.vym)";
+    filter += ";;All (* *.*)";
 
-            // Set name of tab
-            updateTabName(m);
+    QString fileName = QFileDialog::getSaveFileName(
+        this, tr("Save map as new default map"), newMapPath(),
+        filter, nullptr, QFileDialog::DontConfirmOverwrite);
 
-            // Set new default path
-            settings.setValue("/system/defaultMap/auto", false);
-            settings.setValue("/system/defaultMap/path", fn);
-        }
+    if (fileSaveAs(File::CompleteMap, fileName)) {
+        // Set new default path
+        settings.setValue("/system/defaultMap/auto", false);    // Don't autoselect based on theme
+        settings.setValue("/system/defaultMap/path", fileName);
     }
 }
 
@@ -5113,56 +5120,62 @@ void Main::fileExportLast()
         m->exportLast();
 }
 
-bool Main::fileCloseMap(int i)
+void Main::fileCloseTab(int i)
 {
-    //qDebug() << __func__ << "i=" << i << " currentInd=" << tabWidget->currentIndex();
-    VymModel *m;
-    VymView *vv;
-    if (i < 0)
-        i = tabWidget->currentIndex();
+    if (i < tabWidget->count()) 
+    {
+        VymView *vv = view(i);
+        if (vv) {
+            VymModel *vm = vv->getModel();
+            if (vm) 
+                fileCloseMapWithId(vm->modelId());
+        }
+        fileSaveSession();
+    }
+}
 
-    vv = view(i);
-    m = vv->getModel();
+void Main::fileCloseCurrentMap()
+{
+    fileCloseMapWithId(currentMapId());
+}
 
-    if (m) {
-        if (m->hasChanged()) {
+void Main::fileCloseMapWithId(uint id)
+{
+    VymModel *vm = nullptr;
+    VymView *vv;
+    for (int i = 0; i < tabWidget->count(); i++) {
+        vm = view(i)->getModel();
+        if (vm && vm->modelId() == id)
+            break;
+    }
+
+    if (vm) {
+        if (vm->hasChanged()) {
             QMessageBox mb(
                 QMessageBox::Warning,
                 vymName,
                 tr("The map %1 has been modified but not saved yet. Do you "
-                   "want to").arg(m->getFileName()));
+                   "want to").arg(vm->getFileName()));
             mb.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
             mb.setDefaultButton(QMessageBox::Save);
             mb.setModal(true);
             switch (mb.exec()) {
                 case QMessageBox::Save:
                     // save and close
-                    fileSave(m, File::CompleteMap);
-                    break;
+                    vm->closeAfterSaving();
+                    fileSave(vm, File::CompleteMap);
+                    return;
                 case QMessageBox::Discard:
                     // close  without saving
                     break;
                 case QMessageBox::Cancel:
                     // do nothing
-                    return false;
+                    return;
             }
         }
 
-        logInfo(__func__ + QString(" before removing tab %1 - %2").arg(i).arg(m->mapTitle()));  // FIXME-2 debugging
-        tabWidget->removeTab(i);
-        logInfo(__func__ + QString(" after  removing tab %1 - %2").arg(i).arg(m->mapTitle()));  // FIXME-2 debugging
-
-        // Destroy stuff, order is important
-        noteEditor->clear();
-        branchPropertyEditor->setModel(nullptr);
-        delete (m->getMapEditor());
-        delete (vv);
-        delete (m);
-
-        updateActions();
-        return true;
+        closeModelWithId(id);
     }
-    return false; // Better don't exit vym if there is no currentModel()...
 }
 
 void Main::filePrint()
@@ -5186,27 +5199,30 @@ void Main::setExitAfterScript(bool b)
     exitAfterScriptInt = b;
 }
 
-bool Main::fileExitVYM()
+void Main::fileExitVym()
 {
-    closeAfterLastZipProcess = true;
+    if (tabWidget->count() == 0)
+        qApp->exit();
+
+    exitAfterLastMapClosed = true;
+
+    if (tabWidget->count() == 0)
+        qApp->exit(0);
 
     // Only save session if there still are tabs open
     if (tabWidget->count() > 0)
         fileSaveSession();
 
-    // Check if one or more editors have changed
-    while (tabWidget->count() > 0) {
-        tabWidget->setCurrentIndex(0);
-        if (!fileCloseMap())
-            return true;
-        // Update widgets to show progress
-        qApp->processEvents();
+    // Get list of open maps and trigger closing, save if necessary
+    QList <uint> modelIds;
+    for (int i = 0; i < tabWidget->count(); i++) {
+        VymModel *vm = view(i)->getModel();
+        if (vm)
+            modelIds << vm->modelId();
     }
-    if (backgroundZipProcesses > 0)
-        qDebug() << __func__ << " has still running bg zips...";
-    else
-        qApp->exit(0);
-    return false;
+
+    foreach (auto id, modelIds)
+        fileCloseMapWithId(id);
 }
 
 void Main::editUndo()
@@ -5223,9 +5239,9 @@ void Main::editRedo()
         m->redo();
 }
 
-void Main::gotoHistoryStep(int i)
+void Main::gotoHistoryStep(uint modelId, int i)
 {
-    VymModel *m = currentModel();
+    VymModel *m = modelWithId(modelId);
     if (m)
         m->gotoHistoryStep(i);
 }
@@ -5557,7 +5573,6 @@ void Main::editVymLink()
             fd.setAcceptMode(QFileDialog::AcceptOpen);
             if (!bi->vymLink().isEmpty())
                 fd.selectFile(bi->vymLink());
-            fd.show();
 
             if (fd.exec() == QDialog::Accepted &&
                 !fd.selectedFiles().isEmpty()) {
@@ -5938,7 +5953,19 @@ void Main::editImportAdd() { fileLoad(File::ImportAdd); }
 
 void Main::editImportReplace() { fileLoad(File::ImportReplace); }
 
-void Main::editSaveBranch() { fileSaveAs(File::PartOfMap); }
+void Main::editSaveSelection()
+{
+    VymModel *m = currentModel();
+    if (!m) return;
+
+    QString filter = "Part of VYM map (*.vyp)";
+
+    QString fileName = QFileDialog::getSaveFileName(
+        this, tr("Save part of map"), m->getFileDir() + "/" + m->getMapName() + ".vyp",
+        filter, nullptr, QFileDialog::DontConfirmOverwrite);
+
+    fileSaveAs(File::PartOfMap, fileName);
+}
 
 void Main::editDeleteKeepChildren()
 {
@@ -6144,41 +6171,9 @@ void Main::editMoveToTarget()
         QAction *a = targetsContextMenu->exec(QCursor::pos());
         if (a) {
             TreeItem *dsti = model->findID(a->data().toUInt());
-            /*
-            BranchItem *selbi = model->getSelectedBranch();
-            if (!selbi)
-                return;
-            */
-
-            QList<TreeItem *> itemList = model->getSelectedItems();
-            if (itemList.count() < 1) return;
-
-            if (dsti && dsti->hasTypeBranch() ) {
-                BranchItem *selbi;
-                BranchItem *pi;
-                foreach (TreeItem *ti, itemList) {
-                    if (ti->hasTypeBranch() )
-                    {
-                        selbi = (BranchItem*)ti;
-                        pi = selbi->parentBranch();
-                        
-                        // If branch below exists, select that one
-                        // Makes it easier to quickly resort using the MoveTo function
-                        BranchItem *below = pi->getBranchNum(selbi->num() + 1);
-                        if (below)
-                            model->select(below);
-                        else {
-                            BranchItem *above = pi->getBranchNum(selbi->num() - 1);
-                            if (above)
-                                model->select(above);
-                            else if (pi)
-                                model->select(pi);
-                        }
 
-                        model->relinkBranch(selbi, (BranchItem *)dsti, -1);
-                    }
-                }
-            }
+            if (dsti && dsti->hasTypeBranch())
+                model->moveSelectionToTarget((BranchItem *)dsti);
         }
     }
 }
@@ -6440,7 +6435,7 @@ void Main::viewZoomReset()
 {
     MapEditor *me = currentMapEditor();
     if (me)
-        me->setViewCenterTarget();
+        me->setViewCenterSelection();
 }
 
 void Main::viewZoomIn()
@@ -6520,7 +6515,7 @@ void Main::downloadFinished() // only used for drop events in mapeditor and
     */
 
     QString script = agent->getFinishedScript();
-    VymModel *model = getModel(agent->getFinishedScriptModelID());
+    VymModel *model = modelWithId(agent->getFinishedScriptModelID());
     if (!script.isEmpty() && model) {
         script.replace("$TMPFILE", agent->getDestination());
         runScript(script);
@@ -6718,7 +6713,7 @@ void Main::settingsToggleAnimation()
                       actionSettingsUseAnimation->isChecked());
 }
 
-void Main::settingsToggleDownloads() { downloadsEnabled(true); }
+void Main::settingsToggleDownloads() { vymDownloadsEnabled(true); }
 
 bool Main::settingsConfluence()
 {
@@ -6810,12 +6805,7 @@ void Main::setTreeEditorsVisibility(bool b)
     // Close *all* TreeEditors in each VymView and update vym settings
     settings.setValue("/mainwindow/view/showTreeEditors", b);
     for (int i = 0; i < tabWidget->count(); i++) {
-        logInfo(__func__ + QString(" Setting vis in vymview  %1 to %2").arg(i, b));  // FIXME-2 debugging
-        if (!((VymView*)tabWidget->widget(i))) {
-            logInfo("Main::setTreeEditorsVisibility: Fatal. widget i is nullptr");  // FIXME-2 debugging
-            QMessageBox::warning(0, "Warning", "Would have crashed now in setTEVis, please notify development team!");
-        }
-        else
+        if (((VymView*)tabWidget->widget(i)))
             ((VymView*)tabWidget->widget(i))->setTreeEditorVisibility(b);
     }
     updateActions();
@@ -6878,8 +6868,6 @@ void Main::focusScriptOutput()
 {
     scriptOutput->parentWidget()->show();
     actionViewToggleScriptOutput->setChecked(true);
-    // Currently ScriptEditor gets focus, when output is toggled
-    // scriptOutput->setFocus();
     focusScriptEditor();
 }
 void Main::toggleScriptOutput()
@@ -6967,9 +6955,12 @@ void Main::toggleSmoothPixmap()
 
 void Main::clearScriptOutput() { scriptOutput->clear(); }
 
-void Main::updateHistory(SimpleSettings &undoSet)
+void Main::updateHistory(VymModel *model, SimpleSettings &undoSet)
 {
-    historyWindow->update(undoSet);
+    if (model) {
+        // qDebug() << __func__ << " model=" << model << model->getFileName();
+        historyWindow->update(model->modelId(), undoSet);
+    }
 }
 
 void Main::updateHeading(const VymText &vt)
@@ -7664,7 +7655,7 @@ QVariant Main::runScript(const QString &script)
     scriptEngine = nullptr;
 
     if (exitAfterScriptInt)
-        fileExitVYM();
+        fileExitVym();
 
     return scriptResult;
 }
@@ -7959,6 +7950,41 @@ void Main::helpDebugInfo()
     dia.exec();
 }
 
+void Main::helpVymDevelopment()
+{
+    DownloadAgent *agent =
+        new DownloadAgent(QUrl("https://www.insilmaril.de/vym/helpVymDevelopment.html"));
+    connect(agent, SIGNAL(downloadFinished()), this,
+            SLOT(helpVymDevelopmentFinished()));
+    QTimer::singleShot(0, agent, SLOT(execute()));
+}
+
+void Main::helpVymDevelopmentFinished()
+{
+    DownloadAgent *agent = static_cast<DownloadAgent *>(sender());
+
+    if (agent->isSuccess()) {
+        QString page;
+        if (loadStringFromDisk(agent->getDestination(), page)) {
+            ShowTextDialog dia(this);
+            dia.setText(page);
+            dia.setMinimumWidth(900);
+            dia.setMinimumHeight(600);
+            dia.exec();
+        }
+    }
+    else {
+        statusMessage("Downloading VYM development page failed.");
+       logInfo("Failed to download page: " + agent->getResultMessage(), __func__);
+        if (debug) {
+            qDebug() << "Main::helpVymDevelopmentFinished ";
+            qDebug() << "  result: failed";
+            qDebug() << "     msg: " << agent->getResultMessage();
+        }
+    }
+    agent->deleteLater();
+}
+
 void Main::helpAbout()
 {
     AboutDialog ad;
@@ -8011,6 +8037,7 @@ void Main::downloadReleaseNotesFinished()
         QString page;
         if (agent->isSuccess()) {
             if (loadStringFromDisk(agent->getDestination(), page)) {
+                page.replace("<!-- VYMVERSION -->", " (" + vymVersion + ")");
                 ShowTextDialog dia(this);
                 dia.setText(page);
                 dia.exec();
@@ -8070,7 +8097,7 @@ void Main::checkReleaseNotes ()
     else
         userTriggered = false;
 
-    if (downloadsEnabled()) {
+    if (vymDownloadsEnabled()) {
         if (userTriggered ||
             versionLowerThanVym(
                 settings.value("/downloads/releaseNotes/shownVersion", "0.0.1")
@@ -8088,26 +8115,23 @@ void Main::checkReleaseNotes ()
             QMessageBox::warning(
                 0, tr("Warning"),
                 tr("Please allow vym to download release notes!"));
-            if (downloadsEnabled(userTriggered))
+            if (vymDownloadsEnabled(userTriggered))
                 checkUpdates();
         }
     }
 }
 
-bool Main::downloadsEnabled(bool userTriggered)
+bool Main::vymDownloadsEnabled(bool userTriggered)
 {
     bool result;
-    if (!userTriggered &&
-        settings.value("/downloads/enabled", false).toBool()) {
+    if (!userTriggered && settings.value("/downloads/enabled", false).toBool()) {
+        // Download triggered by timer (updates) AND previously allowed
         result = true;
     }
     else {
-        QDate lastAsked =
-            settings.value("/downloads/permissionLastAsked", QDate(1970, 1, 1))
-                .toDate();
+        // Download triggered by user, or first run without permission asked before
         if (userTriggered ||
-            !settings.contains("/downloads/permissionLastAsked") ||
-            lastAsked.daysTo(QDate::currentDate()) > 7) {
+            !settings.contains("/downloads/permissionLastAsked") ) {
             QString infotext;
             infotext =
                 tr("<html>"
@@ -8183,6 +8207,7 @@ void Main::downloadUpdatesFinished(bool userTriggered)
         dia.setWindowTitle(vymName + " - " + tr("Update information"));
         QString page;
         if (loadStringFromDisk(agent->getDestination(), page)) {
+            page.replace("<!-- VYMVERSION -->", " (" + vymVersion + ")");
             if (page.contains("vymisuptodate")) {
                 statusMessage(tr("vym is up to date.", "MainWindow"));
                 if (userTriggered) {
@@ -8244,7 +8269,7 @@ void Main::checkUpdates()
     else
         userTriggered = false;
 
-    if (downloadsEnabled()) {
+    if (vymDownloadsEnabled()) {
         // Too much time passed since last update check?
         QDate lastChecked =
             settings.value("/downloads/updates/lastChecked", QDate(1970, 1, 1))
@@ -8263,7 +8288,7 @@ void Main::checkUpdates()
             // Notification: vym could not check for updates
             QMessageBox::warning(0, tr("Warning"),
                                  tr("Please allow vym to check for updates!"));
-            if (downloadsEnabled(userTriggered))
+            if (vymDownloadsEnabled(userTriggered))
                 checkUpdates();
         }
     }
index c7e61c90c971563c5ae854b2062d138fe1b50726..dd269e437c7b3ebb38955410605713f700b52ffa 100644 (file)
@@ -110,10 +110,15 @@ class Main : public QMainWindow {
     VymModel *currentModel() const;
     uint currentMapId() const;
     int currentMapIndex() const;
-    VymModel *getModel(uint);
+    VymModel *modelWithId(uint);
     bool gotoModel(VymModel *m);
     bool gotoModelWithId(uint id);
+
+  public slots:
     bool closeModelWithId(uint id);
+    void closeSavedModels();
+
+  public:
     int modelCount();
     void updateTabName(VymModel *vm);
 
@@ -121,12 +126,9 @@ class Main : public QMainWindow {
     void editorChanged();
 
   private:
-    int backgroundZipProcesses;
-    bool closeAfterLastZipProcess;
+    bool exitAfterLastMapClosed;
 
   public slots:
-    void backgroundZipStarted();
-    void backgroundZipFinished();
     bool fileLoad(QString, const File::LoadMode &, const File::FileType &ftype);
     void fileLoad(const File::LoadMode &);
   private slots:
@@ -143,8 +145,8 @@ class Main : public QMainWindow {
   public slots:
     void fileSave(VymModel *); // autosave from MapEditor
   private slots:
+    bool fileSaveAs(const File::SaveMode &, QString fileName);
     void fileSaveAs();
-    void fileSaveAs(const File::SaveMode &);
     void fileSaveAsDefault();
     void fileImportFirefoxBookmarks();
     void fileImportFreemind();
@@ -168,7 +170,9 @@ class Main : public QMainWindow {
     void fileExportTaskJuggler();
     void fileExportXML();
     void fileExportLast();
-    bool fileCloseMap(int i = -1); // Optionally pass number of tab
+    void fileCloseTab(int i);           // Index of tab
+    void fileCloseCurrentMap();         // Calls fileCloseModelWithId(-1);
+    void fileCloseMapWithId(uint i);    // id = -1 uses current model
     void filePrint();
 
   public:
@@ -183,10 +187,10 @@ class Main : public QMainWindow {
     void setRepeatAction(const QString &script);
 
   public slots:
-    bool fileExitVYM();
+    void fileExitVym();
     void editUndo();
     void editRedo();
-    void gotoHistoryStep(int);
+    void gotoHistoryStep(uint modelId, int step);
 
   private slots:
     void editCopy();
@@ -254,7 +258,7 @@ class Main : public QMainWindow {
     void editAddBranchBelow();
     void editImportAdd();
     void editImportReplace();
-    void editSaveBranch();
+    void editSaveSelection();
     void editDeleteKeepChildren();
     void editDeleteChildren();
     void editDeleteSelection();
@@ -367,7 +371,7 @@ class Main : public QMainWindow {
     void toggleProperty();
     void focusHeadingEditor();
     void toggleHeadingEditor();
-    void updateHistory(SimpleSettings &);
+    void updateHistory(VymModel*, SimpleSettings &);
     void toggleAntiAlias();
     bool isAliased();
     bool hasSmoothPixmapTransform();
@@ -427,6 +431,8 @@ class Main : public QMainWindow {
     void helpDebugInfo();
     void helpAbout();
     void helpAboutQT();
+    void helpVymDevelopment();
+    void helpVymDevelopmentFinished();
     void callMacro();
     void downloadReleaseNotesFinished();
 
@@ -439,7 +445,7 @@ class Main : public QMainWindow {
 
   public slots:
     void checkReleaseNotes();
-    bool downloadsEnabled(bool userTriggered = false);
+    bool vymDownloadsEnabled(bool userTriggered = false);
     void downloadUpdatesFinished(bool userTriggered = false);
     void downloadUpdatesFinishedInt();
     void downloadUpdates(bool userTriggered);
@@ -465,9 +471,11 @@ class Main : public QMainWindow {
 
   public:
     QList<QAction *>
-        mapEditorActions; //! allows mapEditor to clone actions and shortcuts
+        mapEditorActions;   //! allows mapEditor to clone actions and shortcuts
+    QList<QAction *>
+        taskEditorActions;  //! allows taskEditor to clone actions and shortcuts
     QList<QAction *>
-        taskEditorActions; //! allows taskEditor to clone actions and shortcuts
+        vimActions;         //! Actions with vim inspired shortcuts
   private:
     QList<QAction *>
         restrictedMapActions; //! Actions reqire map and write access
@@ -493,7 +501,6 @@ class Main : public QMainWindow {
     QList <QColor> quickColors;
 
     QMenu *toolbarsMenu;
-    QMenu *toggleWindowsMenu;
     QMenu *focusWindowsMenu;
 
     QMenu *branchAddContextMenu;
@@ -617,7 +624,7 @@ class Main : public QMainWindow {
     QAction *actionDeleteChildren;
     QAction *actionImportAdd;
     QAction *actionImportReplace;
-    QAction *actionSaveBranch;
+    QAction *actionSaveSelection;
     QAction *actionLoadImage;
 
     QAction *actionGrowSelectionSize;
index 7d4dd39f6f7da95fbecc144533b1476f715f1bd1..394e894fe912026960f7481cc63c94c8327ef5f0 100644 (file)
@@ -213,9 +213,6 @@ MapEditor::MapEditor(VymModel *vm)
     winter = nullptr;
 
     // animations
-    animationUse = settings.value("/animation/use", true) .toBool();
-    animationTicks = settings.value("/animation/snapback/ticks", 50).toInt();
-    animationInterval = settings.value("/animation/snapback/interval", 15).toInt();
     animatedContainers.clear();
     animationTimer = new QTimer(this);
     connect(animationTimer, SIGNAL(timeout()), this, SLOT(animate()));
@@ -279,7 +276,7 @@ void MapEditor::ensureAreaVisibleAnimated(
         bool rotated,
         qreal new_rotation)
 {
-    qDebug() << __func__ << "scaled=" << scaled << "rotated=" <<rotated << "new_rot=" << new_rotation;
+    // qDebug() << __func__ << "scaled=" << scaled << "rotated=" <<rotated << "new_rot=" << new_rotation << " area=" << toS(area);
 
     // Changes viewCenter to make sure that 
     // r is  within the margins of the viewport
@@ -321,7 +318,6 @@ void MapEditor::ensureAreaVisibleAnimated(
     int animDuration = 2000;
     QEasingCurve easingCurve = QEasingCurve::OutQuint;
     
-    qDebug() << __func__ << " zoomOutReq: " << zoomOutRequired << " zoomFactor=" << zoomFactorInt << " zf=" << zf << " zft=" << zoomFactorTargetInt;
     //qDebug() << "z_xy=" << toS(QPointF(z_x, z_y));
     if (zoomOutRequired || scaled) {
         setViewCenterTarget(
@@ -370,7 +366,7 @@ void MapEditor::ensureSelectionVisibleAnimated(bool scaled, bool rotated)
     // Similar to QGraphicsItem::ensureVisible, but with animation and (if necessary)
     // zooming
 
-    qDebug() << __func__ << "scaled=" << scaled << "rotated=" <<rotated;
+    // qDebug() << __func__ << "scaled=" << scaled << "rotated=" <<rotated;
 
     QList <TreeItem*> selis = model->getSelectedItems();
 
@@ -509,7 +505,7 @@ void MapEditor::animate()
     foreach (Container *c, animatedContainers) {
         c->animate();
 
-        if (c->getContainerType() == Container::Branch)
+        if (c->containerType() == Container::Branch)
             ((BranchContainer*)c)->updateUpLink();
 
         if (!c->isAnimated())
@@ -517,7 +513,7 @@ void MapEditor::animate()
     }
 
     if (!animatedContainers.isEmpty())
-        animationTimer->start(animationInterval);
+        animationTimer->start(settings.value("/animation/snapback/interval", 15).toInt());
 
     model->repositionXLinks();
 }
@@ -539,7 +535,7 @@ void MapEditor::startAnimation(Container *c, const QPointF &start,
         AnimPoint ap;
         ap.setStart(start);
         ap.setDest(dest);
-        ap.setTicks(animationTicks);
+        ap.setTicks(settings.value("/animation/snapback/ticks", 50).toInt());
         ap.setAnimated(true);
         c->setAnimation(ap);
         if (!animatedContainers.contains(c))
@@ -612,7 +608,6 @@ void MapEditor::setZoomFactorTarget(const qreal &zft)
         zoomAnimation.setStartValue(zoomFactorInt);
         zoomAnimation.setEndValue(zft);
         zoomAnimation.start();
-        qDebug() << __func__ << zft;
     }
     else
         setZoomFactor(zft);
@@ -674,7 +669,7 @@ void MapEditor::setViewCenterTarget(const QPointF &p, const qreal &zft,
 
     viewCenter = mapToScene(viewport()->geometry()).boundingRect().center();
 
-    //qDebug() << __func__ << "zft=" << zft << "rot=" << at;
+    // qDebug() << __func__ << " p=" << toS(p) << " zft=" << zft << "rot=" << at;
 
     stopViewAnimations();
 
@@ -712,7 +707,7 @@ void MapEditor::setViewCenterTarget(const QPointF &p, const qreal &zft,
     }
 }
 
-void MapEditor::setViewCenterTarget()
+void MapEditor::setViewCenterSelection()
 {
     // qDebug() << __func__;
     QList <TreeItem*> seltis = model->getSelectedItems();
@@ -734,7 +729,10 @@ void MapEditor::setViewCenterTarget()
         setViewCenterTarget( p / n, 1, 0);
 }
 
-QPointF MapEditor::getViewCenterTarget() { return viewCenterTarget; }
+void MapEditor::setViewCenterTarget(QPointF p)
+{
+    setViewCenterTarget(p, zoomFactorTargetInt, rotationTargetInt);
+}
 
 void MapEditor::setViewCenter(const QPointF &vc) {
     // For wheel events // useTransFormationOrigin == true
@@ -1026,31 +1024,22 @@ TreeItem *MapEditor::findMapItem(
         const QList <TreeItem*> &excludedItems,
         bool findNearCenter)
 {
-    // Search XLinks
-    XLink *xlink;
-    for (int i = 0; i < model->xlinkCount(); i++) {
-        xlink = model->getXLinkNum(i);
-        if (xlink) {
-            XLinkObj *xlo = xlink->getXLinkObj();
-            if (xlo) {
-                XLinkObj::SelectionType xlinkSelection = xlo->couldSelect(p);
-                if (xlinkSelection == XLinkObj::Path) {
-                    // Found path of XLink, now return the nearest XLinkItem of p
-                    qreal d0 = Geometry::distance(p, xlo->getBeginPos());
-                    qreal d1 = Geometry::distance(p, xlo->getEndPos());
-                    if (d0 < d1)
-                        return xlink->beginXLinkItem();
-                    else
-                        return xlink->endXLinkItem();
-                }
-                if (xlinkSelection == XLinkObj::C0)
-                    return xlink->beginXLinkItem();
-                if (xlinkSelection == XLinkObj::C1)
-                    return xlink->endXLinkItem();
-            }
+    // If already a xlink is selected, try to find control points first
+    TreeItem *seli = model->getSelectedItem();
+    if (seli && seli->hasTypeXLink()) {
+        XLinkItem* xli = (XLinkItem*)seli;
+        XLinkObj* xlo = xli->getXLinkObj();
+        XLink* xl = xli->getXLink();
+        if (xlo && xl) {
+            XLinkObj::SelectionType xlinkSelection = xlo->couldSelect(p);
+            if (xlinkSelection == XLinkObj::C0)
+                return xl->beginXLinkItem();
+            if (xlinkSelection == XLinkObj::C1)
+                return xl->endXLinkItem();
         }
     }
 
+
     // Search branches (and their childs, e.g. images
     // Start with mapcenter, no images allowed at rootItem
     BranchItem *nearestFloatingCenter = nullptr;
@@ -1087,6 +1076,31 @@ TreeItem *MapEditor::findMapItem(
     if (nearestFloatingCenter && d < 80 && !excludedItems.contains(nearestFloatingCenter))
         return nearestFloatingCenter;
 
+    // Search XLinks
+    XLink *xlink;
+    for (int i = 0; i < model->xlinkCount(); i++) {
+        xlink = model->getXLinkNum(i);
+        if (xlink) {
+            XLinkObj *xlo = xlink->getXLinkObj();
+            if (xlo) {
+                XLinkObj::SelectionType xlinkSelection = xlo->couldSelect(p);
+                if (xlinkSelection == XLinkObj::Path) {
+                    // Found path of XLink, now return the nearest XLinkItem of p
+                    qreal d0 = Geometry::distance(p, xlo->getBeginPos());
+                    qreal d1 = Geometry::distance(p, xlo->getEndPos());
+                    if (d0 < d1)
+                        return xlink->beginXLinkItem();
+                    else
+                        return xlink->endXLinkItem();
+                }
+                if (xlinkSelection == XLinkObj::C0)
+                    return xlink->beginXLinkItem();
+                if (xlinkSelection == XLinkObj::C1)
+                    return xlink->endXLinkItem();
+            }
+        }
+    }
+
     return nullptr;
 }
 
@@ -2083,7 +2097,12 @@ void MapEditor::moveObject(QMouseEvent *e, const QPointF &p_event)
     // Add selected branches and images temporary to tmpParentContainer,
     // if they are not there yet:
     BranchContainer *bc_first = nullptr;
-    BranchContainer *bc_prev  = nullptr;
+    bool branchesAttached = false;  // True if branches were just added to tmpParentContainer
+    // Branches to animate into their position in tmpParentContainer. This
+    // excludes the first branch (bc_first): tmpParentContainer is positioned so
+    // that bc_first follows the cursor, so bc_first is already in its correct
+    // position and must not be animated (otherwise it would drift away).
+    QList <BranchContainer*> animateAttached;
     if (movingItems.count() > 0 && (tmpParentContainer->childrenCount() == 0)) {
         BranchContainer *bc;
         foreach (TreeItem *ti, movingItems)
@@ -2118,25 +2137,22 @@ void MapEditor::moveObject(QMouseEvent *e, const QPointF &p_event)
                     bc->setOriginalPos();
                     bc->setOriginalOrientation();   // Also sets originalParentBranchContainer
                     tmpParentContainer->addToBranchesContainer(bc);
+                    branchesAttached = true;
 
+                    // Animate all attached branches into their stacked position,
+                    // except the first one, which tmpParentContainer is
+                    // positioned by and is already in its correct place.
+                    if (bc != bc_first)
+                        animateAttached << bc;
                 }
 
-                if (bc_first && bc_first != bc) {
-                    QPointF p;
-                    // Animate other items to position horizontally centered below first one
-                    if (bc_first->getOriginalOrientation() == BranchContainer::RightOfParent) {
-                        p = tmpParentContainer->mapFromItem(bc,
-                                bc->alignTo(Container::TopLeft, bc_prev, Container::BottomLeft));
-                    } else if (bc_first->getOriginalOrientation() == BranchContainer::LeftOfParent)
-                        p = tmpParentContainer->mapFromItem(bc,
-                                bc->alignTo(Container::TopRight, bc_prev, Container::BottomRight));
-                    else
-                        p = tmpParentContainer->mapFromItem(bc,
-                                bc->alignTo(Container::TopCenter, bc_prev, Container::BottomCenter));
-
-                    startAnimation ( bc, bc->pos(), p);
-                }
-                bc_prev = bc;
+                // Stacking the branches vertically and aligning them left/right
+                // according to orientation is done by tmpParentContainer->reposition()
+                // below (FloatingReservedSpace layout). Animating them into position
+                // must happen *after* reposition() has calculated the final positions:
+                // an active animation makes Container::setPos() ignore the coordinates
+                // calculated during reposition, so animating with positions guessed
+                // here would leave the moved branches at wrong x/y positions.
             } else if (ti->hasTypeImage()) {
                 ImageContainer *ic = ((ImageItem*)ti)->getImageContainer();
                 if (ic->parentItem() != tmpParentContainer->getImagesContainer()) {
@@ -2157,6 +2173,31 @@ void MapEditor::moveObject(QMouseEvent *e, const QPointF &p_event)
         }
     } // add to tmpParentContainer
 
+    // If branches have just been attached, remember their current (scattered)
+    // positions, so they can be animated into the stacked positions calculated
+    // by reposition() below - but only if animations are enabled globally.
+    // The first branch (bc_first) is excluded: tmpParentContainer follows the
+    // cursor via bc_first, so it is already in its correct position.
+    QList <BranchContainer*> animationContainers;
+    QList <QPointF> animationStartPositions;
+    if (branchesAttached && settings.value("/animation/use", true).toBool()) {
+        foreach (BranchContainer *bc, animateAttached) {
+            animationContainers << bc;
+            animationStartPositions << bc->pos();
+        }
+    }
+
+    tmpParentContainer->reposition(); // Reposition children of tmpParentContainer, if necessary
+
+    // Now that final positions are known, animate the branches into place
+    if (!animationContainers.isEmpty()) {
+        int i = 0;
+        foreach (BranchContainer *bc, animationContainers) {
+            startAnimation(bc, animationStartPositions.at(i), bc->pos());
+            i++;
+        }
+    }
+
     if (tmpParentContainer->childBranches().count() > 0)
         // If ME::moveObject is called AFTER tPC has been filled previously, 
         // bc_first still might be unset here
@@ -2469,6 +2510,7 @@ void MapEditor::mouseReleaseEvent(QMouseEvent *e)
 
             // Loop over images // FIXME-3 refactor in VM similar to relinkBranches
             foreach(ImageContainer *ic, tmpParentContainer->childImages()) {
+                ic->setMovingState(SelectableContainer::NotMoving);
                 ImageItem *ii = ic->getImageItem();
                 model->relinkImage(ii, destinationBranch);
             }
@@ -2515,6 +2557,23 @@ void MapEditor::mouseReleaseEvent(QMouseEvent *e)
                         if (bi->depth() == 0)
                             // MapCenter
                             bc->setPos(bc->getHeadingContainer()->mapToScene(QPointF(0, 0)));
+                        else {
+                            // Re-anchor floating branch to the position it has on
+                            // release. While moving, the branch was laid out under
+                            // the (non-floating) tmpParentContainer, so its heading
+                            // is not centered on the container origin. The final
+                            // model->reposition() below will re-center the heading
+                            // on the origin (the real parent is floating), which
+                            // would shift the branch away from where it was dropped.
+                            // Lay out the internals here the same way, then move the
+                            // container so the heading stays where it was released.
+                            QPointF headingScenePos =
+                                bc->getHeadingContainer()->mapToScene(QPointF(0, 0));
+                            bc->reposition();
+                            QPointF headingScenePosNew =
+                                bc->getHeadingContainer()->mapToScene(QPointF(0, 0));
+                            bc->setPos(bc->pos() + headingScenePos - headingScenePosNew);
+                        }
                         // Save position change
                         QString uc, rc;
                         uc = QString("setPos%1;").arg(toS(bc->getOriginalPos(), 5));
@@ -2531,7 +2590,7 @@ void MapEditor::mouseReleaseEvent(QMouseEvent *e)
                 model->saveStateEndScript();
             }   // Empty tmpParenContainer
 
-            if (animationUse && animationContainers.count() > 0) {
+            if (settings.value("/animation/use", true) .toBool() && animationContainers.count() > 0) {
                 int i = 0;
                 foreach(BranchContainer *bc, animationContainers) {
                     startAnimation(bc, animationCurrentPositions.at(i), bc->getOriginalPos());
@@ -2546,6 +2605,7 @@ void MapEditor::mouseReleaseEvent(QMouseEvent *e)
         }
 
         foreach(ImageContainer *ic, tmpParentContainer->childImages()) {
+            ic->setMovingState(SelectableContainer::NotMoving);
             ImageItem *ii = ic->getImageItem();
             BranchItem *pi = ii->parentBranch();
 
index a94f78636854367c1d9302efda11e9bd9302169f..197b9baaab682daf4668fb04746ce7336ac4af18 100644 (file)
@@ -128,9 +128,8 @@ class MapEditor : public QGraphicsView {
         const QPointF &p, const qreal &zft, const qreal &at,
         const int duration = 2000,
         const QEasingCurve &easingCurve = QEasingCurve::OutQuint);
-    void
-    setViewCenterTarget(); //! Convenience function, center on selected item
-    QPointF getViewCenterTarget();
+    void setViewCenterSelection();          //! Convenience function, center on selected item
+    void setViewCenterTarget(QPointF p);    //! Centers on target with previously set rotation/zoom targets
     void setViewCenter(const QPointF &p);
     QPointF getViewCenter();
     QPropertyAnimation viewCenterAnimation;
index cc229adad4c816be3917f14039d47bfd76a135fb..4d2266b70873d9fcf4a751135f7e5494a0ff4e67 100644 (file)
@@ -233,11 +233,6 @@ void centerDialog(QDialog *dia)
               0.5 * QPoint(dia->rect().width(), dia->rect().height()));
 }
 
-// #include "version.h"
-
-// #include <QDebug>
-// #include <QRegularExpression>
-
 bool versionLowerThanVym(const QString &v)
 {
     // returns true, if Version v <  VYM_VERSION
index 4f6f66fb159ef2255f1f5133e03ad9b8a21616f1..5bbd2b1ec9b765550a9fa44fb2e38a76a86d0fb0 100644 (file)
@@ -102,7 +102,7 @@ ScriptEditor::ScriptEditor(QWidget *parent) : QWidget(parent)
     slideEditor->setStyleSheet("QPlainTextEdit {" + editorFocusInStyle + "}");
     macroEditor->setStyleSheet("QPlainTextEdit {" + editorFocusInStyle + "}");
 
-    QString shortcutScope = parentWidget()->windowTitle();
+    QString shortcutScope = tr("Script editor", "Shortcut scope");
     switchboard.addScope("MainWindow", shortcutScope);
 
     QAction *a = new QAction("Close window", this);
@@ -137,7 +137,7 @@ QString ScriptEditor::getScriptFile() { return codeEditor->toPlainText(); }
 
 void ScriptEditor::saveSlide()
 {
-    VymModel *vm = mainWindow->getModel(vymModelID);
+    VymModel *vm = mainWindow->modelWithId(vymModelID);
     if (!vm) {
         QMessageBox::warning(
             0, tr("Warning"),
index 2ac5a559f5f4c56647f6fac602d5dc3b29087b6c..0dc1c7b0c03afac1fd7f24e62d80b0c0c34c1a6d 100644 (file)
@@ -1,11 +1,19 @@
 #include "scriptoutput.h"
 
+#include <QAction>
+
 ScriptOutput::ScriptOutput(QWidget *parent) : QWidget(parent)
 {
     editor = new QTextEdit(this);   // FIXME-4 use QTextBrowser and add button to clear browser
     layout = new QVBoxLayout;
     layout->addWidget(editor);
     setLayout(layout);
+
+    QAction *a = new QAction(this);
+    a->setShortcutContext(Qt::WidgetWithChildrenShortcut);
+    a->setShortcut(Qt::CTRL | Qt::Key_D);
+    addAction(a);
+    connect(a, SIGNAL(triggered()), this, SLOT(closeWindow()));
 }
 
 ScriptOutput::~ScriptOutput()
@@ -14,6 +22,8 @@ ScriptOutput::~ScriptOutput()
     delete editor;
 }
 
+void ScriptOutput::closeWindow() { parentWidget()->hide(); }
+
 void ScriptOutput::setFocus() { //FIXME-5 missing implementation
     // qDebug() << "SO::setFOcus";
     // Currently ScriptEditor gets focus, when output is toggled
index 000f5e3843756975cc333048dbc43da9e8f21302..226e0e8847d8e2fe854dad31a66955e3a536a2c4 100644 (file)
@@ -15,6 +15,9 @@ class ScriptOutput : public QWidget {
     QString text();
     void append(const QString &text);
 
+  public slots:
+    void closeWindow();
+
   private:
     QTextEdit *editor;
     QVBoxLayout *layout;
index 9795560438958a8faabeb1cf59873c4a56d1cde6..7bd4cd3881bb4e7b16bb9a3547a8a95cfb9b0c13 100644 (file)
@@ -26,6 +26,23 @@ KeySwitch::KeySwitch(const QString &identifier,
 /////////////////////////////////////////////////////////////////
 Switchboard::Switchboard() {}
 
+QList <KeySwitch> Switchboard::valuesReversed(const QString &scope)
+{
+    QList<KeySwitch> list;
+    if (!scope.isEmpty())
+        list = switchesMap.values(scope);
+    else
+        list = switchesMap.values();
+    QList<KeySwitch> rlist;
+
+    QListIterator<KeySwitch> it(list);
+    it.toBack();
+    while (it.hasPrevious()) {
+        rlist << it.previous();
+    }
+    return rlist;
+}
+
 void Switchboard::addScope(QString scopeIdentifier, QString scopeName)
 {
     if (!scopesMap.contains(scopeIdentifier))
@@ -80,10 +97,13 @@ QString Switchboard::getASCII()
 
         foreach (auto tag, tagsInScope) {
             s += underline(tag, "-");
-            foreach (auto ksw, switchesMap.values(scope)) {
+            foreach (auto ksw, valuesReversed(scope)) {
                 if (ksw.tagInt == tag) {
                     QString desc = ksw.actionInt->text();
                     QString sc = ksw.actionInt->shortcut().toString();
+                    QString alt;
+                    if (ksw.identifierInt.contains("VimAlt"))
+                        alt = QObject::tr("(Vim alternative shortcut)","Shortcut help dialog");
                     if (!sc.isEmpty()) {
 #if defined(Q_OS_MACOS)
                         sc.replace("Ctrl","Cmd");
@@ -91,16 +111,28 @@ QString Switchboard::getASCII()
                     
                         desc = desc.remove('&');
                         desc = desc.remove("...");
-                        s += QString(" %1: %2\n").arg(sc, 12).arg(desc);
+                        s += QString(" %1: %2 %3\n").arg(sc, 12).arg(desc).arg(alt);
                     }
                 }
             }
             if (tag != tagsInScope.last())
                 s += "\n";
         }
-        if (scope != switchesMap.uniqueKeys().last())
-            s += "\n";
+        s += "\n";
     }
+
+    // Finally list vim inspired shortcuts
+    s += underline("VIM-like shortcuts", "=");
+    foreach (auto ksw, valuesReversed()) {
+        QString sc = ksw.actionInt->shortcut().toString();
+        if (!sc.isEmpty() && ksw.identifierInt.contains("Vim")) {
+            QString desc = ksw.actionInt->text();
+            desc = desc.remove('&');
+            desc = desc.remove("...");
+            s += QString(" %1: %2\n").arg(sc, 12).arg(desc);
+        }
+    }
+
     return s;
 }
 
index c10b2acf8316e28b34c6ff5efae6c412f2d020a7..1c1e06af67692a5ed465cb1001d07ddb705ae173 100644 (file)
@@ -23,6 +23,7 @@ class KeySwitch {
 class Switchboard {
   public:
     Switchboard();
+    QList <KeySwitch> valuesReversed(const QString &scope = "");
     void addScope(QString gIdentifier, QString gName);
     void addAction(QAction *a, const QString &identifier, const QString &scope, const QString &tag);
     void addAction(QAction *a, const QString &identifier, QKeySequence, const QString &scope, const QString &tag);
index f2c360524b72b4c1d22e2c7a20f0dbca2b791d50..65702c6f001f2be35cdbaf40967a48d13d4ce4f1 100644 (file)
@@ -120,7 +120,7 @@ TaskEditor::TaskEditor(QWidget *)
 
     a = new QAction("Close window", this);
     a->setShortcutContext(Qt::WidgetWithChildrenShortcut);
-    switchboard.addAction(a, "taskEditorCloseWindow", Qt::CTRL | Qt::Key_D, shortcutScope, "");
+    switchboard.addAction(a, "taskEditorCloseWindow", Qt::CTRL | Qt::Key_D, shortcutScope, "Misc");
     connect(a, SIGNAL(triggered()), this, SLOT(closeWindow()));
     view->addAction(a);
 
index 65e8bb17f5c6668a1ad125f4e449797a908749ce..38e4407f78abd6637c81e480cfb87125bc05e8b1 100644 (file)
@@ -14,6 +14,7 @@
 #include <QPrinter>
 #include <QStatusBar>
 #include <QToolBar>
+#include <QToolButton>
 
 #include "file.h"
 #include "mainwindow.h"
@@ -108,14 +109,25 @@ TextEditor::~TextEditor()
 void TextEditor::init()
 {
     QString n = QString("/satellite/%1/").arg(editorId);
+
+    // Toolbars
+    setupFileActions();
+    setupEditActions();
+    setupFormatActions();
+    setupSettingsActions();
+
+    restoreState(settings.value(n + "state", 0).toByteArray());
+
     colorRichTextEditorBackground = QColor::fromString(
         settings.value(n + "colors/richTextEditorBackground", vymBaseColor.name()).toString());
 
     colorRichTextForeground = QColor::fromString(
         settings.value(n + "colors/richTextForeground", vymForegroundColor.name()).toString());
+    colorFGChanged(colorRichTextForeground);
 
     colorRichTextBackground = QColor::fromString(
         settings.value(n + "colors/richTextBackground", vymBaseColor.name()).toString());
+    colorBGChanged(colorRichTextBackground);
 
     /*
     qDebug() << "TE::init" << scope;
@@ -124,14 +136,6 @@ void TextEditor::init()
     qDebug() << "  RTBG=" << colorRichTextBackground.name();
     */
 
-    // Toolbars
-    setupFileActions();
-    setupEditActions();
-    setupFormatActions();
-    setupSettingsActions();
-
-    restoreState(settings.value(n + "state", 0).toByteArray());
-
     fileNameInt = "";
     fixedFontInt = fixedFont;
     varFontInt = varFont;
@@ -507,24 +511,47 @@ void TextEditor::setupFormatActions()
     formatToolBar->setStyleSheet(toolBarStyle);
     formatToolBar->setObjectName("noteEditorFormatToolBar");
 
-    //QPixmap pix(16, 16);
-    //pix.fill(editor->textColor());
-    //a = new QAction(pix, tr("&Text Color..."), this);
-    a = new QAction(tr("&Text Color..."), this);
+    a = new QAction(tr("&Color text using foreground color"), this);
+    switchboard.addAction(a, "Color text with foreground color", Qt::CTRL | Qt::Key_T, shortcutScope, tag);
     formatMenu->addAction(a);
     formatToolBar->addAction(a);
+    connect(a, SIGNAL(triggered()), this, SLOT(useTextFGColor()));
+    filledEditorRichTextActions << a;
+    actionUseTextFGColor = a;
+
+    a = new QAction(tr("&Select text foreground color..."), this);
+    formatMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(selectTextFGColor()));
     filledEditorRichTextActions << a;
-    actionTextFGColor = a;
+    actionSelectTextFGColor = a;
 
-    //pix.fill(editor->textBackgroundColor());
-    //a = new QAction(pix, tr("&Text background color..."), this);
-    a = new QAction(tr("&Text background color..."), this);
+    QToolButton *tb = new QToolButton;
+    tb->setArrowType(Qt::DownArrow);
+    tb->setDefaultAction(actionSelectTextFGColor);
+    formatToolBar->addWidget(tb);
+    tb->setFixedSize(22,44);
+
+    a = new QAction(tr("&Mark text using background color..."), this);
+    switchboard.addAction(a, "Mark text using background color", Qt::CTRL | Qt::Key_M, shortcutScope, tag);
     formatMenu->addAction(a);
     formatToolBar->addAction(a);
+    connect(a, SIGNAL(triggered()), this, SLOT(useTextBGColor()));
+    filledEditorRichTextActions << a;
+    actionUseTextBGColor = a;
+
+    a = new QAction(tr("&Select text background color..."), this);
+    formatMenu->addAction(a);
     connect(a, SIGNAL(triggered()), this, SLOT(selectTextBGColor()));
     filledEditorRichTextActions << a;
-    actionTextBGColor = a;
+    actionSelectTextBGColor = a;
+
+    tb = new QToolButton;
+    tb->setArrowType(Qt::DownArrow);
+    tb->setDefaultAction(actionSelectTextBGColor);
+    formatToolBar->addWidget(tb);
+    tb->setFixedSize(22,44);
+
+    formatMenu->addSeparator();
 
     a = new QAction(QPixmap(QString(":/format-text-bold-%1.svg").arg(iconTheme)), tr("&Bold"), this);
 //    a->setShortcutContext(Qt::WidgetWithChildrenShortcut);
@@ -838,12 +865,16 @@ void TextEditor::deleteAll()
     editor->clear();
 }
 
-void TextEditor::textExportAs()
+void TextEditor::textExportAs() // FIXME-2 Heading colors missing, BG color span missing
 {
     QString text, postfix;
     if (actionFormatRichText->isChecked()) {
         text = editor->toHtml();
         postfix = ".html";
+        QString fgcol = colorRichTextForeground.name();
+        QString bgcol = colorRichTextEditorBackground.name();
+        text.replace("white-space: pre-wrap;", "white-space: pre-wrap; color:" + fgcol + ";");
+        text.replace("<body style=\"","<body style=\"background-color:" + bgcol + "; ");
     } else {
         text = editor->toPlainText();
         postfix = ".txt";
@@ -862,6 +893,9 @@ void TextEditor::textExportAs()
         0, QFileDialog::DontConfirmOverwrite);
 
     if (!fn.isEmpty()) {
+
+// Macs check for replacing existing file in native dialog
+#ifndef Q_OS_MACOS
         QFile file(fn);
         if (file.exists()) {
             QMessageBox mb(
@@ -874,6 +908,7 @@ void TextEditor::textExportAs()
             mb.exec();
             if (mb.clickedButton() != overwriteButton) return;
         }
+#endif
 
         fileNameInt = fn;
 
@@ -994,6 +1029,11 @@ void TextEditor::textFamily(const QString &f) { editor->setFontFamily(f); }
 
 void TextEditor::textSize(const QString &p) { editor->setFontPointSize(p.toInt()); }
 
+void TextEditor::useTextFGColor()
+{
+    editor->setTextColor( colorRichTextForeground);
+}
+
 void TextEditor::selectTextFGColor()
 {
     QColor col = QColorDialog::getColor(
@@ -1004,6 +1044,13 @@ void TextEditor::selectTextFGColor()
     if (!col.isValid())
         return;
     editor->setTextColor(col);
+    colorFGChanged(col);
+    colorRichTextForeground = col;
+}
+
+void TextEditor::useTextBGColor()
+{
+    editor->setTextBackgroundColor(colorRichTextBackground);
 }
 
 void TextEditor::selectTextBGColor()
@@ -1015,6 +1062,9 @@ void TextEditor::selectTextBGColor()
             QColorDialog::ShowAlphaChannel);
     if (!col.isValid())
         return;
+
+    colorRichTextBackground = col;
+    colorBGChanged(col);
     editor->setTextBackgroundColor(col);
 }
 
@@ -1063,7 +1113,7 @@ void TextEditor::fontChanged(const QFont &f)
     actionTextUnderline->setChecked(f.underline());
 }
 
-void TextEditor::colorFGChanged(const QColor &c)
+void TextEditor::colorFGChanged(const QColor &c)    // FIXME-0 see also setRichTextForegroundColor
 {
     QImage image(":color-text.svg");
     QPainter painter;
@@ -1072,7 +1122,7 @@ void TextEditor::colorFGChanged(const QColor &c)
     painter.drawRect(0,110,128,128);
     painter.end();
 
-    actionTextFGColor->setIcon(QPixmap::fromImage(image));
+    actionUseTextFGColor->setIcon(QPixmap::fromImage(image));
 }
 
 void TextEditor::colorBGChanged(const QColor &c)
@@ -1084,7 +1134,7 @@ void TextEditor::colorBGChanged(const QColor &c)
     painter.drawRect(0,110,128,128);
     painter.end();
 
-    actionTextBGColor->setIcon(QPixmap::fromImage(image));
+    actionUseTextBGColor->setIcon(QPixmap::fromImage(image));
 }
 
 void TextEditor::formatChanged(const QTextCharFormat &f)
@@ -1093,8 +1143,8 @@ void TextEditor::formatChanged(const QTextCharFormat &f)
     if (!actionFormatRichText->isChecked())
         return;
     fontChanged(f.font());
-    colorFGChanged(f.foreground().color());
-    colorBGChanged(f.background().color());
+    // colorFGChanged(f.foreground().color()); // FIXME-0
+    // colorBGChanged(f.background().color()); // FIXME-0
     alignmentChanged(editor->alignment());
     verticalAlignmentChanged(f.verticalAlignment());
 }
@@ -1175,7 +1225,7 @@ void TextEditor::updateActions()
 
 void TextEditor::setState(EditorState s)
 {
-    // qDebug() << "TE::setState" << s << editorName;
+    // qDebug() << "TE::setState" << s;
     QPalette p = qApp->palette();
     QColor baseColor;
     state = s;
@@ -1202,7 +1252,10 @@ void TextEditor::setState(EditorState s)
             baseColor = Qt::black;
             editor->setReadOnly(true);
     }
+
+    // Just setting base color sometimes seems not enough...
     p.setColor(QPalette::Base, baseColor);
+    p.setColor(QPalette::Window, baseColor);
     editor->setPalette(p);
 
     updateActions();
@@ -1230,6 +1283,9 @@ void TextEditor::selectRichTextEditorBackgroundColor()
     QPixmap pix(16, 16);
     pix.fill(colorRichTextEditorBackground);
     actionActiveEditorBGColor->setIcon(pix);
+
+    // Update color
+    setState(state);
 }
 
 void TextEditor::selectRichTextForegroundColor()
@@ -1291,7 +1347,11 @@ void TextEditor::insertOrEditUrl(QTextCursor cursor)
             if (cursor.charFormat().isAnchor())
                 anchorEnd = pos;
         }
+#if defined(QT_VERSION) && QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
         text = plainText.slice(anchorStart - 1, anchorEnd - anchorStart + 1);
+#else
+        text = plainText.sliced(anchorStart - 1, anchorEnd - anchorStart + 1);
+#endif
     }
 
     UrlDialog dia (this);
index 75d235196285c590e328c805dd191e0a9d62a0cf..633d0cbdb0b04fcb4fca713effce88b63c3475bb 100644 (file)
@@ -79,7 +79,9 @@ class TextEditor : public QMainWindow {
     void textItalic();
     void textFamily(const QString &f);
     void textSize(const QString &p);
+    void useTextFGColor();
     void selectTextFGColor();
+    void useTextBGColor();
     void selectTextBGColor();
     void textAlign(QAction *);
     void textVAlign();
@@ -157,8 +159,10 @@ class TextEditor : public QMainWindow {
        *actionRichTextBGColor;
 
     QAction
-        *actionTextFGColor,
-        *actionTextBGColor,
+        *actionUseTextFGColor,
+        *actionSelectTextFGColor,
+        *actionUseTextBGColor,
+        *actionSelectTextBGColor,
        *actionTextBold, *actionTextUnderline, *actionTextItalic,
        *actionAlignSubScript, *actionAlignSuperScript,
         *actionAlignLeft, *actionAlignCenter, *actionAlignRight,
index 62476ce3e0700eba17fbf71f324ab9e7dc6a6dae..07b6965aeac8ecb72b110b0e3338522966a36e51 100644 (file)
@@ -24,12 +24,15 @@ void TmpParentContainer::init()
     // setPen(QPen(Qt::green)); // Uncomment for testing
 
     // TmpParentContainer defaults, should be overridden from MapDesign later
-    containerType = Container::TmpParent;
+    setContainerType(Container::TmpParent);
 
     setLayout(Container::FloatingReservedSpace);
 
     branchesContainer = new Container ();
     branchesContainer->setContainerType(Container::BranchesContainer);
+    // Stack moved branches vertically. The horizontal (left/right) alignment
+    // is set depending on orientation in TmpParentContainer::reposition().
+    branchesContainer->setLayout(Container::Vertical);
     branchesContainer->setParentItem(this); // Different for BranchItem!
 }
 
@@ -53,7 +56,6 @@ void TmpParentContainer::addToImagesContainer(Container *c)
 {
     if (!imagesContainer) {
         createImagesContainer();
-
         imagesContainer->setParentItem(this);   // Different for BranchItem!
     }
 
index c968567f0e45292a2b2b5c0f33e9560b483efa17..4ebc7978c239f5bdaf8bbd126a39cfcc8a845019 100644 (file)
@@ -107,7 +107,6 @@ void TreeEditor::contextMenuEvent(QContextMenuEvent *e) {
 
 void TreeEditor::closeWindow()
 {
-    qDebug() << __func__;
     // Close *all* TreeEditors in each VymView and update vym settings
     mainWindow->setTreeEditorsVisibility(false);
 }
index 98e19f25f19155fc4b681e37a5f05b56755e84c9..ec2c70d16a5afd95f90b46c8fee6436448b0772f 100644 (file)
@@ -1,17 +1,15 @@
 #ifndef VERSION_H
 #define VERSION_H
 
-#define __VYM_VERSION "2.9.604"
-#define __VYM_BUILD_DATE "2027-01-20"
+#define __VYM_VERSION "3.0.1"
 
-
-#define __VYM_NAME "VYMng"     // FIXME "next generation" in in window title
+#define __VYM_NAME "VYM"
 #define __VYM_HOME "http://www.insilmaril.de/vym"
-//
-//#define __VYM_CODE_QUALITY "Production"
+
+#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_CODENAME "Debug version of upcoming 3.0.0"
+//#define __VYM_CODE_QUALITY "*Beta*"
+
+#define __VYM_CODENAME "Save the climate day"
 
 #endif
index ce99df6a06017f8dd65aa059d563b932fa0adf6d..d728c9ee6be49280c07f9c03aba44ad29adfbc53 100644 (file)
@@ -30,13 +30,13 @@ VymWrapper::~VymWrapper()
 
 void VymWrapper::clearConsole() { mainWindow->clearScriptOutput(); }
 
-bool VymWrapper::closeMapWithID(uint n)
+bool VymWrapper::closeMapWithId(uint id)
 {
-    bool r = mainWindow->closeModelWithId(n);
+    bool r = mainWindow->closeModelWithId(id);
     if (!r) {
         mainWindow->abortScript(
                 QJSValue::ReferenceError, 
-                QString("Map '%1' not available.").arg(n));
+                QString("VmWrapper::closeMapWithId Map '%1' not available.").arg(id));
         return false;
     }
     // Remove progress counter while testing
@@ -64,13 +64,13 @@ QObject *VymWrapper::currentMap()
     return mw;
 }
 
-QObject *VymWrapper::mapWithId(uint n)
+QObject *VymWrapper::mapWithId(uint id)
 {
-    VymModel *m = mainWindow->getModel(n);
+    VymModel *m = mainWindow->modelWithId(id);
     if (!m) {
         mainWindow->abortScript(
                 QJSValue::ReferenceError,
-                QString("No model available with id=%1").arg(n));
+                QString("No model available with id=%1").arg(id));
     }
     return (QObject*)(m->getWrapper());
 }
@@ -148,7 +148,7 @@ void VymWrapper::gotoMap(uint n)
     if (!mainWindow->gotoModelWithId(n)) {
         mainWindow->abortScript(
                 QJSValue::ReferenceError, 
-                QString("Map '%1' not available.").arg(n));
+                QString("VymWrapper::gotoMap  Map '%1' not available.").arg(n));
         return;
     }
 }
@@ -227,7 +227,7 @@ void VymWrapper::selectQuickColor(int n)
     mainWindow->selectQuickColor(n);
 }
 
-uint VymWrapper::currentMapID()
+uint VymWrapper::currentMapId()
 {
     uint r = mainWindow->currentMapId();
     mainWindow->setScriptResult(r);
index 26fc176ea741ef098cb78930e050c14d575ca7b2..78308b86d573fa5dcbd7d572f85ae935f1463bce 100644 (file)
@@ -16,11 +16,11 @@ class VymWrapper : public QObject {
 
   public slots:
     void clearConsole();
-    bool closeMapWithID(uint n);
+    bool closeMapWithId(uint n);
     QString currentColor();
     Q_INVOKABLE QObject *currentMap();
     Q_INVOKABLE QObject *mapWithId(uint n);
-    uint currentMapID();
+    uint currentMapId();
     void editHeading();
     bool directoryIsEmpty(const QString &dirName);
     bool directoryExists(const QString &dirName);
index 1b8a4edec1b3db52bb7e5a80cb3fd86e6b126e51..8f967c22d539b6b09edfcd8ba33dfc74daa41224 100644 (file)
@@ -224,8 +224,8 @@ void VymModel::init()
     hideMode = TreeItem::HideNone;
 
     // Animation in MapEditor
-    zoomFactor = 1;
-    mapRotationInt = 0;
+    viewZoomFactorInt = 1;
+    viewRotationInt = 0;
     animDuration = 2000;
     animCurve = QEasingCurve::OutQuint;
 
@@ -277,6 +277,21 @@ void VymModel::updateActions()
     mainWindow->updateActions();
 }
 
+void  VymModel::closeAfterSaving() {
+    closeAfterSavingInt = true;
+}
+
+bool  VymModel::readyToClose() {
+    // Check for background processes before closing map in mainWindow
+    // (Currently only zipAgent for saving)
+    return zipAgent ? false : true;
+}
+
+void VymModel::setSaveAsBackgroundProcess(bool b)
+{
+    saveAsBackgroundProcessInt = b;
+}
+
 bool VymModel::setData(const QModelIndex &, const QVariant &value, int role)
 {
     if (role != Qt::EditRole)
@@ -329,10 +344,15 @@ QString VymModel::saveToDir(const QString &tmpdir, const QString &prefix,
 
         mapAttr += xml.attribute("branchCount", QString().number(branchCount()));
         if (mapEditor) {
-        mapAttr += xml.attribute("mapZoomFactor",
-                     QString().setNum(mapEditor->zoomFactorTarget()));
-        mapAttr += xml.attribute("mapRotation",
-                     QString().setNum(mapEditor->rotationTarget()));
+            mapAttr += xml.attribute("viewZoomFactor",
+                         QString().setNum(mapEditor->zoomFactorTarget()));
+            mapAttr += xml.attribute("viewRotation",
+                         QString().setNum(mapEditor->rotationTarget()));
+            QPointF viewport_center = mapEditor->mapToScene(mapEditor->viewport()->geometry().center());
+            mapAttr += xml.attribute("viewCenterX",
+                         QString().setNum(viewport_center.x()));
+            mapAttr += xml.attribute("viewCenterY",
+                         QString().setNum(viewport_center.y()));
         }
     }
     header += xml.beginElement("vymmap", mapAttr);
@@ -470,14 +490,12 @@ bool VymModel::loadMap(QString fname, const File::LoadMode &lmode,
                                   BranchItem *insertBranch,
                                   int insertPos)
 {
-    qDebug() << "a) Loading " << fname;
-
     bool noError = true;
 
-    // Get updated zoomFactor, before applying one read from file in the end
+    // Get updated viewZoomFactor, before applying one read from file in the end
     if (mapEditor) {
-        zoomFactor = mapEditor->zoomFactorTarget();
-        mapRotationInt = mapEditor->rotationTarget();
+        viewZoomFactorInt = mapEditor->zoomFactorTarget();
+        viewRotationInt = mapEditor->rotationTarget();
     }
 
     BaseReader *reader;
@@ -727,19 +745,15 @@ bool VymModel::loadMap(QString fname, const File::LoadMode &lmode,
     if (lmode != File::NewMap)
         emitUpdateQueries();
 
-    qDebug() << "b) Loaded " << fname;
     if (mapEditor) {
-        mapEditor->setZoomFactorTarget(zoomFactor);
-        mapEditor->setRotationTarget(mapRotationInt);
+        mapEditor->setZoomFactorTarget(viewZoomFactorInt);
+        mapEditor->setRotationTarget(viewRotationInt);
     }
-    qDebug() << "c) Loaded " << fname;
 
     qApp->processEvents(); // Update view (scene()->update() is not enough)
 
     isLoadingInt = false;
 
-    qDebug() << "d) Loaded " << fname;
-
     return noError;
 }
 
@@ -809,7 +823,7 @@ bool VymModel::saveMap(const File::SaveMode &savemode)
                 if (!f.rename(backupFileName)) {
                     QMessageBox::warning(
                         0, tr("Save Error"),
-                        tr("%1\ncould not be renamed before saving")
+                        tr("%1\ncould not be renamed as backup file before saving")
                             .arg(destPath));
                 }
             }
@@ -898,11 +912,18 @@ bool VymModel::saveMap(const File::SaveMode &savemode)
             QString log = QString("Starting zipAgent to compress \"%1\" in zipDirInt = %2")
                 .arg(mapFileName, zipDirInt.path());
             logInfo(log, __func__);
-            zipAgent->startZip();
-        } else
+            zipAgent->setBackgroundProcess(saveAsBackgroundProcessInt);
+            bool r = zipAgent->startZip();
+            logInfo("Started zip to save map " + destPath + " Result: " + toS(r), __func__);  // FIXME-3 debugging
+            if (!saveAsBackgroundProcessInt && !r) {
+                qDebug() << "ok3  Result: " << r;
+                logInfo("Problems starting zip as foreground process", __func__);
+            }
+        } else {
             mainWindow->statusMessage(tr("Saved %1").arg(saveFilePath));
+            logInfo("Finishing saving unzipped map " + destPath, __func__);  // FIXME-3 debugging
+        }
 
-        logInfo("Finishing saving map " + destPath, __func__);  // FIXME-3 debugging
         // Restore original filepath outside of tmp zip dir
         setFilePath(saveFilePath);
     }
@@ -944,6 +965,8 @@ void VymModel::zipFinished()
 
         zipAgent->deleteLater();
         zipAgent = nullptr;
+
+        // qDebug() << "VM::" << __func__ << path << name;
     } else
         logWarning("zipAgent == nullptr", __func__);
 
@@ -951,10 +974,15 @@ void VymModel::zipFinished()
 
     mainWindow->statusMessage(tr("Saved %1").arg(filePath));
 
+    if (closeAfterSavingInt) {
+        // Schedule for removal of tab in MainWindow
+        QTimer::singleShot(100, mainWindow, SLOT(closeSavedModels()));
+        return;
+    }
+
     fileChangedTime = QFileInfo(destPath).lastModified();
 
     updateActions();
-
 }
 
 ImageItem* VymModel::loadImage(BranchItem *parentBranch, const QStringList &imagePaths)
@@ -1029,6 +1057,9 @@ void VymModel::saveImage(ImageItem *ii, QString fn)
 
         if (!fn.isEmpty()) {
             lastImageDir.setPath(fn.left(fn.lastIndexOf("/")));
+
+// Macs check for replacing existing file in native dialog
+#ifndef Q_OS_MACOS
             if (QFile(fn).exists()) {
                 QMessageBox mb(
                    QMessageBox::Warning,
@@ -1036,16 +1067,17 @@ void VymModel::saveImage(ImageItem *ii, QString fn)
                    tr("The file %1 exists already.\n"
                       "Do you want to overwrite it?")
                        .arg(fn));
-                mb.addButton(
+                QPushButton *overwriteButton = mb.addButton(
                     tr("Overwrite"),
                     QMessageBox::AcceptRole);
                 mb.addButton(
                     tr("Cancel"),
                     QMessageBox::RejectRole);
                 mb.exec();
-                if (mb.result() != QMessageBox::AcceptRole)
+                if (mb.clickedButton() != overwriteButton)
                     return;
             }
+#endif
             if (!ii->saveImage(fn))
                 QMessageBox::critical(0, tr("Critical Error"),
                                       tr("Couldn't save %1").arg(fn));
@@ -1193,15 +1225,32 @@ bool VymModel::addMapReplace(QString fpath, BranchItem *bi)
         return false;
     }
 
+    BranchItem *pbi = selbi->parentBranch();
+
     QString bv = setBranchVar(selbi);
-    QString pbv = setBranchVar(selbi->parentBranch(), "pb");
-    QString uc = pbv + QString("map.loadBranchReplace(\"UNDO_PATH\", pb);");
     QString rc = bv + QString("map.loadBranchReplace(\"REDO_PATH\", b);");
-    QString comment = QString("Replace \"%1\" with \"%2\"").arg(selbi->headingText(), fpath);
 
+    QString comment = QString("Replace \"%1\" with \"%2\"").arg(selbi->headingText(), fpath);
     logAction(rc, comment, __func__);
 
-    saveState(uc, rc, comment, selbi->parentBranch(), selbi);
+    if (pbi == rootItem) {
+        // About to replace a MapCenter, save complete map instead of "parent" branch
+        //
+        // FIXME-4: addMapReplace() The path to the map is saved in history,
+        // the file might no longer be available when redo is performed
+        QString uc = QString("map.replaceTree(\"UNDO_PATH\");");
+        QString bv = setBranchVar(selbi);
+        QString rc = bv + QString("map.loadBranchReplace(\"%1\", b);").arg(fpath);
+        saveState(uc, rc, comment, rootItem, selbi);
+    } else {
+        // Replace selected branch
+        QString pbv = setBranchVar(pbi, "pb");
+        QString uc = pbv + QString("map.loadBranchReplace(\"UNDO_PATH\", pb);");
+        QString bv = setBranchVar(selbi);
+        QString rc = bv + QString("map.loadBranchReplace(\"REDO_PATH\", b);");
+        saveState(uc, rc, comment, pbi, selbi);
+    }
+
 
     if (loadMap(fpath, File::ImportReplace, File::VymMap, 0x0000, selbi))
         return true;
@@ -1210,6 +1259,30 @@ bool VymModel::addMapReplace(QString fpath, BranchItem *bi)
     return false;
 }
 
+bool VymModel::replaceTree(QString fpath)
+{
+    /*
+    // Only saveState if a branch is inserted
+    // Other data like XLink is only used for undo/redo operations and currently
+    // does not need a saveState
+    QString bv = setBranchVar(selbi);
+    QString uc = bv + QString("map.loadBranchReplace(\"UNDO_PATH\", b);");
+    QString rc = bv + QString("b.loadBranchInsert(\"%1\", %2);").arg(fpath).arg(insertPos);
+    QString comment = QString("Add map %1 to \"%2\"").arg(fpath, selbi->headingText());
+
+    logAction(rc, comment, __func__);
+
+    saveState(uc, rc, comment, selbi);
+    */
+
+    clear();
+    if (loadMap(fpath, File::ImportAdd))
+        return true;
+    else {
+        logWarning("Failed: Replacing tree with " + fpath, __func__);
+        return false;
+    }
+}
 bool VymModel::removeVymLock()
 {
     if (vymLock.removeLockForced()) {
@@ -1295,12 +1368,13 @@ bool VymModel::tryVymLock()
     return true;
 }
 
-bool VymModel::renameMap(const QString &newPath)
-// map is renamed before fileSaveAs() or from VymModelWrapper::saveSelection()
-// Usually renamed back to original name again. Purpose here is to adapt the lockfile 
-// new name of map.
-// Internally the paths in ImageItems pointing to zipDirInt do not need to be adapted.
+bool VymModel::changeLock(const QString &newPath)
 {
+    // New lock is required in fileSaveAs(CompleteMap)
+
+    if (zipAgent)
+        qWarning() << __func__ << " has still running zipAgent";
+
     QString oldPath = filePath;
     if (vymLock.getState() == VymLock::LockedByMyself || vymLock.getState() == VymLock::Undefined) {
         // vymModel owns the lockfile, try to create new lock
@@ -1316,12 +1390,12 @@ bool VymModel::renameMap(const QString &newPath)
         if (!vymLock.releaseLock())
             logWarning(QString("Failed to release lock for %1").arg(oldPath), __func__);
         vymLock = newLock;
-        setFilePath(newPath);
+
         if (readonly)
             setReadOnly(false);
         return true;
     }
-    logWarning("Failed to rename map.", __func__);
+    logWarning("Failed to change lock file.", __func__);
     return false;
 }
 
@@ -1527,7 +1601,7 @@ void VymModel::redo()
     undoSet.setValue("/history/curStep", QString::number(curStep));
     undoSet.writeSettings(histPath);
 
-    mainWindow->updateHistory(undoSet);
+    mainWindow->updateHistory(this, undoSet);
 
     updateActions();
 
@@ -1657,7 +1731,7 @@ void VymModel::undo()
     undoSet.setValue("/history/curStep", QString::number(curStep));
     undoSet.writeSettings(histPath);
 
-    mainWindow->updateHistory(undoSet);
+    mainWindow->updateHistory(this, undoSet);
 
     updateActions();
 }
@@ -1711,7 +1785,7 @@ void VymModel::resetHistory()
 
     stepsTotal = settings.value("/history/stepsTotal", 100).toInt();
     undoSet.setValue("/history/stepsTotal", QString::number(stepsTotal));
-    mainWindow->updateHistory(undoSet);
+    mainWindow->updateHistory(this, undoSet);
 }
 
 QString VymModel::setAttributeVar(AttributeItem* ai, QString varName)
@@ -1778,14 +1852,17 @@ QString VymModel::saveState(
         return QString();
 
     /*
+    */
     if (debug) {
         qDebug() << "VM::saveState() for map " << mapName;
         qDebug() << "  comment: " << comment;
         qDebug() << "  Script:   " << buildingUndoScript;
         qDebug() << "  undoCom: " << undoCommand;
         qDebug() << "  redoCom: " << redoCommand;
+        qDebug() << " undoItem: " << saveUndoItem;
+        qDebug() << " redoItem: " << saveRedoItem;
+        qDebug() << " rootItem: " << rootItem;
     }
-    */
 
     if (buildingUndoScript)
         logInfo("// Building script: " + redoCommand + " " +  comment, __func__);    // FIXME-3 Use logDebug instead? Remove logging completely from saveState?
@@ -1807,8 +1884,14 @@ QString VymModel::saveState(
     // FIXME-5 saveState: userFlags are not written, but still in memory. Could
     //         lead to problem, if one day removed from userFlags toolbar AND memory
     if (saveUndoItem) {
+        bool completeTree = false;
+        if (saveUndoItem == rootItem) {
+            completeTree = true;
+            saveUndoItem = nullptr;
+        }
+
         QString dataXML = saveToDir(historyPath, mapName + "-", FlagRowMaster::NoFlags, QPointF(),
-                            false, false, false, saveUndoItem);
+                            false, false, completeTree, saveUndoItem);
 
         QString xmlUndoPath = historyPath + "/undo.xml";
         undoCommand.replace("UNDO_PATH", xmlUndoPath);
@@ -1887,7 +1970,7 @@ QString VymModel::saveState(
     }
     */
 
-    mainWindow->updateHistory(undoSet);
+    mainWindow->updateHistory(this, undoSet);
 
     setChanged();
 
@@ -1912,7 +1995,7 @@ QString VymModel::saveStateBranch(
 void VymModel::saveStateBeginScript(const QString &comment)
 {
     if (buildingUndoScript)
-        logWarning("Nested saveState scripts found", __func__);  // FIXME-3 e.g. for setFrameAutoDesign...
+        logWarning(QString("Nested saveState scripts found \"%1\"").arg(comment), __func__);  // FIXME-3 e.g. for setFrameAutoDesign...
     else {
         logDebug("Starting to build saveStateScript: '" + comment + "'", __func__);
 
@@ -2664,10 +2747,9 @@ void VymModel::setFrameAutoDesign(const bool &useInnerFrame, const bool &newAuto
 {
     QList<BranchItem *> selbis = getSelectedBranches(bi);
 
-
     foreach (BranchItem *selbi, selbis) {
         BranchContainer *bc = selbi->getBranchContainer();
-        if (bc->frameAutoDesign(useInnerFrame) != newAutoDesign) {
+        if (bc->frameAutoDesign(useInnerFrame) != newAutoDesign || newAutoDesign == true) {
             QString uif = toS(useInnerFrame);
             QString b_undo = toS(!newAutoDesign);
             QString b_redo = toS(newAutoDesign);
@@ -2680,13 +2762,13 @@ void VymModel::setFrameAutoDesign(const bool &useInnerFrame, const bool &newAuto
 
             saveStateBeginScript(comment);  // setFrameAD, calls setFrame* functions
 
-            bc->setFrameAutoDesign(useInnerFrame, newAutoDesign);
             if (newAutoDesign) {
                 setFrameType(useInnerFrame, mapDesignInt->frameType(useInnerFrame, selbi->depth()), selbi);
                 setFramePenColor(useInnerFrame, mapDesignInt->framePenColor(useInnerFrame, selbi->depth()), selbi);
                 setFramePenWidth(useInnerFrame, mapDesignInt->framePenWidth(useInnerFrame, selbi->depth()), selbi);
                 setFrameBrushColor(useInnerFrame, mapDesignInt->frameBrushColor(useInnerFrame, selbi->depth()), selbi);
             }
+            bc->setFrameAutoDesign(useInnerFrame, newAutoDesign);
 
             emitDataChanged(selbi);
             branchPropertyEditor->updateControls();
@@ -2705,7 +2787,6 @@ void VymModel::setFrameType(const bool &useInnerFrame, const FrameContainer::Fra
         if (bc->frameType(useInnerFrame) == t)
             continue;
 
-        setFrameAutoDesign(useInnerFrame, false, selbi);
 
         QString uif = toS(useInnerFrame);
 
@@ -2779,8 +2860,6 @@ void VymModel::setFramePenColor(const bool &useInnerFrame, const QColor &col, Br
     foreach (BranchItem *selbi, selbis) {
         BranchContainer *bc = selbi->getBranchContainer();
         if (bc->frameType(useInnerFrame) != FrameContainer::NoFrame)  {
-            setFrameAutoDesign(useInnerFrame, false, selbi);
-
             QString uif = toS(useInnerFrame);
             QString colorNameOld = bc->framePenColor(useInnerFrame).name();
             QString uc = QString("setFramePenColor (%1, \"%2\");").arg(uif, colorNameOld);
@@ -2807,7 +2886,6 @@ void VymModel::setFrameBrushColor(
     foreach (BranchItem *selbi, selbis) {
         BranchContainer *bc = selbi->getBranchContainer();
         if (bc->frameType(useInnerFrame) != FrameContainer::NoFrame)  {
-            setFrameAutoDesign(useInnerFrame, false, selbi);
 
             QString uif = toS(useInnerFrame);
             QString colorNameOld = bc->framePenColor(useInnerFrame).name();
@@ -2834,8 +2912,6 @@ void VymModel::setFramePadding(
     foreach (BranchItem *selbi, selbis) {
         BranchContainer *bc = selbi->getBranchContainer();
         if (i != bc->framePadding(useInnerFrame)) {
-            setFrameAutoDesign(useInnerFrame, false, selbi);
-
             QString uif = toS(useInnerFrame);
             QString uc = QString("setFramePadding (%1, \"%2\");").arg(uif).arg(bc->framePadding(useInnerFrame));
             QString rc = QString("setFramePadding (%1, \"%2\");").arg(uif).arg(i);
@@ -2861,8 +2937,6 @@ void VymModel::setFramePenWidth(
     foreach (BranchItem *selbi, selbis) {
         BranchContainer *bc = selbi->getBranchContainer();
         if (i != bc->framePenWidth(useInnerFrame)) {
-            setFrameAutoDesign(useInnerFrame, false, selbi);
-
             QString uif = toS(useInnerFrame);
             QString uc = QString("setFramePenWidth (%1, \"%2\");").arg(uif).arg(bc->framePenWidth(useInnerFrame));
             QString rc = QString("setFramePenWidth (%1, \"%2\");").arg(uif).arg(i);
@@ -4671,6 +4745,9 @@ bool VymModel::relinkBranches(QList <BranchItem*> branches, BranchItem *dst, int
         endMoveRows();
         emit layoutChanged();
 
+        // Insert further branches after this one to keep their original order
+        num_dst = bi->num() + 1;
+
         // Update upLink of BranchContainer to *parent* BC of destination
         bc->linkTo(dstBC);
 
@@ -4733,6 +4810,48 @@ bool VymModel::relinkBranches(QList <BranchItem*> branches, BranchItem *dst, int
     return true;
 }
 
+bool VymModel::moveSelectionToTarget(BranchItem *dst)
+{
+    if (!dst)
+        return false;
+
+    QList <BranchItem*> branches = getSelectedBranches();
+    if (branches.isEmpty())
+        return false;
+
+    // Find branch, which will be selected after moving. Makes it easier
+    // to quickly resort using the MoveTo function.
+    // Look for nearest sibling of first selection, which is not moved itself
+    BranchItem *nextSelection = nullptr;
+    BranchItem *pi = branches.first()->parentBranch();
+    if (pi && pi != rootItem) {
+        int n = branches.first()->num();
+        for (int i = n + 1; i < pi->branchCount() && !nextSelection; i++)
+            if (!branches.contains(pi->getBranchNum(i)))
+                nextSelection = pi->getBranchNum(i);
+
+        for (int i = n - 1; i >= 0 && !nextSelection; i--)
+            if (!branches.contains(pi->getBranchNum(i)))
+                nextSelection = pi->getBranchNum(i);
+
+        if (!nextSelection)
+            nextSelection = pi;
+    }
+
+    if (!relinkBranches(branches, dst, -1))
+        return false;
+
+    if (nextSelection)
+        select(nextSelection);
+
+    QString repeatAction = QString("m = vym.currentMap();");
+    repeatAction += QString(" dst = m.findBranchById(\"%1\");").arg(dst->getUuid().toString());
+    repeatAction += " m.moveSelectionToTarget(dst);";
+    mainWindow->setRepeatAction(repeatAction);
+
+    return true;
+}
+
 bool VymModel::relinkImage(ImageItem* image, TreeItem *dst_ti, int num_new) {
     if (!image)
         return false;
@@ -5180,6 +5299,10 @@ bool VymModel::scrollBranch(BranchItem *bi)
             logAction(r, c, __func__);
             saveState(u, r, c);
             emitDataChanged(bi);
+
+            if (mapEditor)
+                mapEditor->stopContainerAnimations();
+
             reposition();
             return true;
         }
@@ -5201,6 +5324,9 @@ bool VymModel::unscrollBranch(BranchItem *bi)
             saveState(u, r, c);
             emitDataChanged(bi);
 
+            if (mapEditor)
+                mapEditor->stopContainerAnimations();
+
             reposition();
             return true;
         }
@@ -5243,6 +5369,10 @@ void VymModel::unscrollSubtree(BranchItem *bi)
         }
     }
     updateActions();
+
+    if (mapEditor)
+        mapEditor->stopContainerAnimations();
+
     reposition();
 }
 
@@ -6446,7 +6576,7 @@ bool VymModel::exportLastAvailable(QString &description, QString &command,
     if (match.hasMatch()) {
         command = QString("vym.currentMap().exportMap([%1]);").arg(match.captured(1));
         settings.setLocalValue(filePath, "/export/last/command", command);
-        qDebug() << "Rewriting last export command to version " << vymVersion << " format: " << command;
+        //qDebug() << "Rewriting last export command to version " << vymVersion << " format: " << command;
     }
 
     description = settings.localValue(filePath, "/export/last/description", "")
@@ -6557,18 +6687,18 @@ void VymModel::exportMarkdown(const QString &fname, bool askName)
 
 void VymModel::registerMapEditor(QWidget *e) { mapEditor = (MapEditor *)e; }
 
-void VymModel::setMapZoomFactor(const double &d)
+void VymModel::setViewZoomFactor(const double &d)
 {
     if (!mapEditor) {
         qWarning() << __func__ << "mapEditor == nullptr";
         return;
     }
 
-    zoomFactor = d;
+    viewZoomFactorInt = d;
     mapEditor->setZoomFactorTarget(d);
 }
 
-void VymModel::setMapRotation(const double &a)
+void VymModel::setViewRotation(const double &a)
 {
     if (!mapEditor) {
         qWarning() << __func__ << "mapEditor == nullptr";
@@ -6578,15 +6708,15 @@ void VymModel::setMapRotation(const double &a)
     if (a < 1)
         // Round to zero, otherwise selectionMode in MapEditor might be 
         // "Geometric" when it should be "Classic"
-        mapRotationInt = 0;
+        viewRotationInt = 0;
     else
-        mapRotationInt = a;
-    mapEditor->setRotationTarget(mapRotationInt);
+        viewRotationInt = a;
+    mapEditor->setRotationTarget(viewRotationInt);
 }
 
-void VymModel::setMapAnimDuration(const int &d) { animDuration = d; }
+void VymModel::setViewAnimDuration(const int &d) { animDuration = d; }
 
-void VymModel::setMapAnimCurve(const QEasingCurve &c) { animCurve = c; }
+void VymModel::setViewAnimCurve(const QEasingCurve &c) { animCurve = c; }
 
 bool VymModel::centerOnID(const QString &id)
 {
@@ -6605,9 +6735,9 @@ bool VymModel::centerOnID(const QString &id)
             c = ((MapItem*)ti)->getContainer();
             p_center = c->mapToScene(c->rect().center());
         }
-        if (zoomFactor > 0 ) {
-            mapEditor->setViewCenterTarget(p_center, zoomFactor,
-                                           mapRotationInt, animDuration,
+        if (viewZoomFactorInt > 0 ) {
+            mapEditor->setViewCenterTarget(p_center, viewZoomFactorInt,
+                                           viewRotationInt, animDuration,
                                            animCurve);
             return true;
         }
@@ -6615,6 +6745,22 @@ bool VymModel::centerOnID(const QString &id)
     return false;
 }
 
+void VymModel::setViewCenterTarget(const QPointF &p)
+{
+    viewCenterTargetInt = p;
+    hasViewCenterTargetInt = true;
+}
+
+QPointF VymModel::viewCenterTarget()
+{
+    return viewCenterTargetInt;
+}
+
+bool VymModel::hasViewCenterTarget()
+{
+    return hasViewCenterTargetInt;
+}
+
 void VymModel::setContextPos(QPointF p)
 {
     contextPos = p;
@@ -6629,11 +6775,11 @@ void VymModel::unsetContextPos()
 
 void VymModel::reposition(bool force)
 {
+    //qDebug() << "VM::reposition start force=" << force << "  repositionBlocked=" << repositionBlocked;
+
     if (!force && repositionBlocked)
         return;
 
-    //qDebug() << "VM::reposition start force=" << force;
-
     // Reposition containers
     BranchItem *bi;
     for (int i = 0; i < rootItem->branchCount(); i++) {
@@ -6890,24 +7036,6 @@ void VymModel::setLinkColorHint(const LinkObj::ColorHint &newHint)
     logAction(rc, com, __func__);
     saveState(uc, rc, com);
     
-    BranchItem *cur = nullptr;
-    BranchItem *prev = nullptr;
-    nextBranch(cur, prev);
-    while (cur) {
-        BranchContainer *bc = cur->getBranchContainer();
-        LinkObj *upLink = bc->getLink();
-        if (upLink)
-            upLink->setLinkColorHint(newHint);
-
-        // FIXME-4 setLinkColorHint: images currently use branch link color
-        for (int i = 0; i < cur->imageCount(); ++i) {
-            upLink = cur->getImageNum(i)->getImageContainer()->getLink();
-            if (upLink)
-                upLink->setLinkColorHint(newHint);
-        }
-        nextBranch(cur, prev);
-    }
-
     applyDesignRecursively(MapDesign::LinkStyleChanged, rootItem);
     reposition();
 }
@@ -7270,6 +7398,7 @@ void VymModel::setSelectionPenColor(QColor col)
     selPen.setColor(col);
     mapDesignInt->setSelectionPen(selPen);
     vymView->updateColors();
+    updateSelection(selModel->selection(), QItemSelection());
 }
 
 QColor VymModel::getSelectionPenColor() {
@@ -7289,6 +7418,7 @@ void VymModel::setSelectionPenWidth(qreal w)
     selPen.setWidth(w);
     mapDesignInt->setSelectionPen(selPen);
     vymView->updateColors();
+    updateSelection(selModel->selection(), QItemSelection());
 }
 
 qreal VymModel::getSelectionPenWidth() {
@@ -7310,6 +7440,7 @@ void VymModel::setSelectionBrushColor(QColor col)
     selBrush.setColor(col);
     mapDesignInt->setSelectionBrush(selBrush);
     vymView->updateColors();
+    updateSelection(selModel->selection(), QItemSelection());
 }
 
 QColor VymModel::getSelectionBrushColor() {
@@ -7649,7 +7780,6 @@ void VymModel::appendSelectionToHistory() // FIXME-3 history unable to cope with
 
 void VymModel::emitShowSelection(bool scaled, bool rotated)
 {
-    //qDebug() << "VM::" <<  __func__ << "scaled=" << scaled << "rotated=" << rotated;
     if (!repositionBlocked)
         emit showSelection(scaled, rotated);
 }
index bad7d1ac8600d5b7737af3611423781c39f1d3bf..9bfdffc6205274998d4de3507c26a49d0e1db938 100644 (file)
@@ -88,8 +88,17 @@ class VymModel : public TreeModel {
     ////////////////////////////////////////////
     // Load/save
     ////////////////////////////////////////////
+  public:
+    void closeAfterSaving();
+    bool readyToClose();
+    void setSaveAsBackgroundProcess(bool);
+
+  private:
+    bool closeAfterSavingInt = false;
+
   private:
     bool zipped;       // should map be zipped
+    bool saveAsBackgroundProcessInt = true;
     static int mapNum; // unique number for model used in save/undo
     File::FileType fileType; // type of file, e.g. vym, freemind...
     QString fileName;  // short name of file (for tab)
@@ -201,13 +210,14 @@ class VymModel : public TreeModel {
     void importDir();
     bool addMapInsert(QString filepath, int pos = -1, BranchItem *bi = nullptr);
     bool addMapReplace(QString filepath, BranchItem *bi = nullptr);
+    bool replaceTree(QString filepath);
 
   private:
     bool removeVymLock();
 
   public:
     bool tryVymLock();
-    bool renameMap(const QString &newPath); //! Rename map and change lockfile
+    bool changeLock(const QString &newPath); //! Change lockfile to new path
     void setReadOnly(bool b);
     bool isReadOnly();
 
@@ -530,6 +540,15 @@ class VymModel : public TreeModel {
 
     bool relinkTo(const QString &dest, int num);
 
+    /*! \brief Move selected branches to target dst
+
+        Relinks all selected branches to dst and afterwards selects a
+        branch near the original position, which makes it easier to
+        quickly resort several branches. The action can be repeated
+        with the "."-key.
+    */
+    bool moveSelectionToTarget(BranchItem *dst);
+
   public:
     void deleteSelection(ulong selID = 0); //!< Delete selection
     void deleteKeepChildren(BranchItem *bi = nullptr); //!< remove branch, but keep children
@@ -687,15 +706,21 @@ class VymModel : public TreeModel {
   public:
     void registerMapEditor(QWidget *);
 
-    void setMapZoomFactor(const double &);
-    void setMapRotation(const double &);
-    void setMapAnimDuration(const int &d);
-    void setMapAnimCurve(const QEasingCurve &c);
+    void setViewZoomFactor(const double &);
+    void setViewRotation(const double &);
+    void setViewAnimDuration(const int &d);
+    void setViewAnimCurve(const QEasingCurve &c);
     bool centerOnID(const QString &id);
+    void setViewCenterTarget(const QPointF &p); // Save view center during load
+    QPointF viewCenterTarget();
+    bool hasViewCenterTarget();
 
   private:
-    double zoomFactor;
-    double mapRotationInt;
+    double viewZoomFactorInt;
+    double viewRotationInt;
+    QPointF viewCenterTargetInt;
+    bool hasViewCenterTargetInt = false;
+
     int animDuration;
     QEasingCurve animCurve;
 
@@ -928,6 +953,7 @@ class VymModel : public TreeModel {
     SlideModel *slideModel;
     bool blockSlideSelection;
 
+  public:
     ////////////////////////////////////////////
     // Logfile related
     ////////////////////////////////////////////
index 4b53c01a1158da7cedc321cea39ac8d1b04898c1..9bc2218bfe1fbce6caaf5221d2a32807c015938a 100644 (file)
@@ -362,6 +362,13 @@ bool VymModelWrapper::hasBackgroundImage()
     return r;
 }
 
+bool VymModelWrapper::isBusy()
+{
+    bool r = modelInt->isBusy();
+    mainWindow->setScriptResult(r);
+    return r;
+}
+
 bool VymModelWrapper::loadBackgroundImage(const QString &imagePath)
 {
     bool r =modelInt->loadBackgroundImage(imagePath);
@@ -398,6 +405,17 @@ ItemListWrapper* VymModelWrapper::itemList()
     return new ItemListWrapper(modelInt);
 }
 
+bool VymModelWrapper::moveSelectionToTarget(BranchWrapper *dst)
+{
+    if (!dst) {
+        mainWindow->abortScript(
+                QJSValue::GenericError,
+                "VymModelWrapper::moveSelectionToTarget(dst) dst is invalid");
+        return false;
+    }
+    return modelInt->moveSelectionToTarget(dst->branchItem());
+}
+
 void VymModelWrapper::moveSlideDown(int n)
 {
     if (!modelInt->moveSlideDown(n))
@@ -481,26 +499,24 @@ void VymModelWrapper::removeXLink(XLinkWrapper *xlw)
     modelInt->deleteXLink(xlw->xlink());
 }
 
-bool VymModelWrapper::saveSelection(const QString &filename)
+bool VymModelWrapper::replaceTree(QString fileName)
 {
-    QString filename_org = modelInt->getFilePath(); // Restore filename later
-    if (!modelInt->renameMap(filename)) {
-        QString s = tr("Saving the selection in map failed:\nCouldn't rename map to %1").arg(filename);
-        QMessageBox::critical(0,
-            tr("Critical Error"), s);
-        mainWindow->abortScript(QJSValue::GenericError, s);
-        return false;
-    }
+    if (QDir::isRelativePath(fileName))
+        fileName = QDir::currentPath() + "/" + fileName;
+
+    bool r = modelInt->replaceTree(fileName);
+    mainWindow->setScriptResult(r);
+    return r;
+}
+
+bool VymModelWrapper::saveSelection(const QString &fileName)
+{
+    QString fileName_org = modelInt->getFilePath(); // Restore fileName later
+    modelInt->setFilePath(fileName);
 
     bool r = modelInt->saveMap(File::PartOfMap);
 
-    if (!modelInt->renameMap(filename_org)) {
-        QString s = tr("Saving the selection in map failed:\nCouldn't rename map to %1").arg(filename);
-        QMessageBox::critical(0,
-            tr("Critical Error"), s);
-        mainWindow->abortScript(QJSValue::GenericError, s);
-        return false;
-    }
+    modelInt->setFilePath(fileName_org);
 
     return r;
 }
@@ -603,13 +619,13 @@ void VymModelWrapper::setAnimCurve(int n)
     else {
         QEasingCurve c;
         c.setType((QEasingCurve::Type)n);
-        modelInt->setMapAnimCurve(c);
+        modelInt->setViewAnimCurve(c);
     }
 }
 
 void VymModelWrapper::setAnimDuration(int n)
 {
-    modelInt->setMapAnimDuration(n);
+    modelInt->setViewAnimDuration(n);
 }
 
 void VymModelWrapper::setAuthor(const QString &s) { modelInt->setMapAuthor(s); }
@@ -659,11 +675,15 @@ void VymModelWrapper::setLinkStyle(const QString &style, int depth)
                 QString("Could not set linkstyle to %1 with d=%2").arg(style, depth));
 }
 
-void VymModelWrapper::setRotationView(float a) { modelInt->setMapRotation(a); }
+void VymModelWrapper::setRotationView(float a) { modelInt->setViewRotation(a); }
 
 void VymModelWrapper::setTitle(const QString &s) { modelInt->setMapTitle(s); }
 
-void VymModelWrapper::setZoom(float z) { modelInt->setMapZoomFactor(z); }
+void VymModelWrapper::setSaveAsBackgroundProcess(bool b){
+    modelInt->setSaveAsBackgroundProcess(b);
+}
+
+void VymModelWrapper::setZoom(float z) { modelInt->setViewZoomFactor(z); }
 
 void VymModelWrapper::setSelectionBrushColor(const QString &color)
 {
index 137a2e04eccaf475430be857b6422537883e29eb..49de599443dac631ded8bb7835296ac77fbde34e 100644 (file)
@@ -47,9 +47,11 @@ class VymModelWrapper : public QObject {
     QString getSelectionString();
     double getZoom();
     bool hasBackgroundImage();
+    bool isBusy();
     bool loadBackgroundImage(const QString &imagePath);
     bool loadBranchReplace(QString filename, BranchWrapper *bw);
     bool loadDataInsert(QString filename, int pos = -1, BranchWrapper *bw = nullptr);
+    bool moveSelectionToTarget(BranchWrapper *dst);
     void moveSlideDown(int n);
     void moveSlideDown();
     void moveSlideUp(int n);
@@ -64,6 +66,7 @@ class VymModelWrapper : public QObject {
     void removeKeepChildren(BranchWrapper *bw);
     void removeSlide(int n);
     void removeXLink(XLinkWrapper *xlw);
+    bool replaceTree(QString filename);
     bool saveSelection(const QString &filename);
     bool select(const QString &s);
     Q_INVOKABLE AttributeWrapper* selectedAttribute();
@@ -82,11 +85,12 @@ class VymModelWrapper : public QObject {
     void setLinkStyle(const QString &style, int depth = -1);
     void setLinkColorHint(const QString &hint);
     void setRotationView(float a);
-    void setTitle(const QString &s);
-    void setZoom(float z);
     void setSelectionBrushColor(const QString &color);
     void setSelectionPenColor(const QString &color);
     void setSelectionPenWidth(const qreal &);
+    void setSaveAsBackgroundProcess(bool);
+    void setTitle(const QString &s);
+    void setZoom(float z);
     void sleep(int n);
     int slideCount();
     void undo();
index b9490c1a18540810e2d392c3ed305f3044829d2a..65daf1806f41219d45be878426261dd5983cd21c 100644 (file)
@@ -172,7 +172,7 @@ void VymReader::readMapDesignElement()
     QString k = xml.attributes().value("key").toString();
     QString v = xml.attributes().value("val").toString();
     QString d = xml.attributes().value("d").toString();
-    if (!v.isEmpty()) {
+    if (!v.isEmpty() && (loadMode != File::ImportAdd && loadMode != File::ImportReplace)) {
         if (!model->mapDesign()->setElement(k, v, d)) {
             xml.raiseError(QString("MapDesign: Failed to set key %1 to %2").arg(k, v));
             return;
@@ -185,6 +185,9 @@ void VymReader::readMapDesignElement()
 
 void VymReader::readMapDesignCompatibleAttributes()
 {
+    if (loadMode == File::ImportAdd || loadMode == File::ImportReplace)
+        return;
+
     // Reads attributes which before 2.9.13 used to be
     // in <vymmap> and now are in <mapdesign>
 
@@ -423,13 +426,6 @@ void VymReader::readBranchOrMapCenter(File::LoadMode loadModeBranch, int insertP
             xml.name() == QLatin1String("note"))
             readHeadingOrVymNote();
         else if (xml.name() == QLatin1String("branch")) {
-            if (lastBranch && lastBranch->depth() < 3 && false) {   // FIXME-2 Updates during load disabled for now. Too many selectionCHanges
-                // Some graphical repainting during loading of map
-                lastBranch->updateVisuals();
-                model->select(lastBranch);
-                model->reposition(true);
-            }
-
             // Going deeper we regard incoming data as "new", no inserts/replacements
             readBranchOrMapCenter(File::NewMap, -1);
 
@@ -600,6 +596,14 @@ void VymReader::readHeadingOrVymNote()
         }
 
         lastMI->setHeading(vymtext);
+
+        if (lastBranch && (lastBranch->depth() < 3 || branchesCounter % 100 == 0)) {     // Update and process events once in a while
+            // Some graphical repainting during loading of map
+            lastBranch->updateVisuals();
+            //model->select(lastBranch);
+            model->reposition(true);
+        }
+
     } else {
         if (lastMI->hasTypeBranch()) {
             if (textType == "vymnote" || textType == "note" || textType == "htmlnote")
@@ -762,72 +766,77 @@ void VymReader::readImage()
     Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("floatimage"));
 
     lastImage = model->createImage(lastBranch);
-    lastMI = lastImage;
 
+    QString orgName = attributeToString("originalName");
     QString s;
 
     s = attributeToString("href");
     if (!s.isEmpty()) {
         // Load Image
         if (!lastImage->load(parseHREF(s))) {
-            QMessageBox::warning(0, "Warning: ",
-                                 "Couldn't load image\n" +
-                                     parseHREF(s));
+            QString err = "Couldn't load image \"" + parseHREF(s) + "\" " +
+                          "originalName=\"" + orgName + "\" " +
+                          "to branch \"" + lastBranch->headingText() + "\"";
+            QMessageBox::critical(0, "Critical: ", err);
+            model->logInfo(err, "VymReader::readImage()");
             lastImage = nullptr;
-            return;
         }
     }
 
-    // Scale image
-    // scaleX and scaleY are no longer used since 2.7.509 and replaced by
-    // scaleFactor
-    float x = 1;
-    float y = 1;
-    bool okx, oky;
-    s = attributeToString("scaleX");
-    if (!s.isEmpty()) {
-        x = s.toFloat(&okx);
-        if (!okx) {
-            xml.raiseError("Couldn't read scaleX of image");
-            return;
+    if (lastImage) {
+        lastMI = lastImage;
+
+        if (!orgName.isEmpty())
+            lastImage->setOriginalFilename(orgName);
+
+        // Scale image
+        // scaleX and scaleY are no longer used since 2.7.509 and replaced by
+        // scaleFactor
+        float x = 1;
+        float y = 1;
+        bool okx, oky;
+        s = attributeToString("scaleX");
+        if (!s.isEmpty()) {
+            x = s.toFloat(&okx);
+            if (!okx) {
+                xml.raiseError("Couldn't read scaleX of image");
+                return;
+            }
         }
-    }
 
-    s = attributeToString("scaleY");
-    if (!s.isEmpty()) {
-        y = s.toFloat(&oky);
-        if (!oky) {
-            xml.raiseError("Couldn't read scaleY of image");
-            return;
+        s = attributeToString("scaleY");
+        if (!s.isEmpty()) {
+            y = s.toFloat(&oky);
+            if (!oky) {
+                xml.raiseError("Couldn't read scaleY of image");
+                return;
+            }
         }
-    }
 
-    s = attributeToString("scale");
-    if (!s.isEmpty()) {
-        x = s.toFloat(&okx);
-        if (!okx) {
-            xml.raiseError("Couldn't read scale of image");
-            return;
+        s = attributeToString("scale");
+        if (!s.isEmpty()) {
+            x = s.toFloat(&okx);
+            if (!okx) {
+                xml.raiseError("Couldn't read scale of image");
+                return;
+            }
         }
-    }
 
-    s = attributeToString("scaleFactor"); // Legacy: Used in version < 2.9.518
-    if (!s.isEmpty()) {
-        x = s.toFloat(&okx);
-        if (!okx) {
-            xml.raiseError("Couldn't read scaleFactor of image");
-            return;
+        s = attributeToString("scaleFactor"); // Legacy: Used in version < 2.9.518
+        if (!s.isEmpty()) {
+            x = s.toFloat(&okx);
+            if (!okx) {
+                xml.raiseError("Couldn't read scaleFactor of image");
+                return;
+            }
         }
-    }
 
-    if (x != 1)
-        lastImage->setScale(x);
+        if (x != 1)
+            lastImage->setScale(x);
 
-    readOrnamentsAttr();
+        readOrnamentsAttr();
 
-    s = attributeToString("originalName");
-    if (!s.isEmpty())
-        lastImage->setOriginalFilename(s);
+    }   // lastImage != nullptr
 
     while (xml.readNextStartElement()) {
         if (xml.name() == QLatin1String("heading"))
@@ -1069,7 +1078,7 @@ void VymReader::readVymMapAttr()
     }
 
     qreal r;
-    a = "mapZoomFactor";
+    a = "viewZoomFactor";
     s = xml.attributes().value(a).toString();
     if (!s.isEmpty()) {
         r = s.toDouble(&ok);
@@ -1077,10 +1086,10 @@ void VymReader::readVymMapAttr()
             xml.raiseError("Could not parse attribute" + a);
             return;
         }
-        model->setMapZoomFactor(r);
+        model->setViewZoomFactor(r);
     }
 
-    a = "mapRotation";
+    a = "viewRotation";
     s = xml.attributes().value(a).toString();
     if (!s.isEmpty()) {
         r = s.toDouble(&ok);
@@ -1088,7 +1097,27 @@ void VymReader::readVymMapAttr()
             xml.raiseError("Could not parse attribute " + a);
             return;
         }
-        model->setMapRotation(r);
+        model->setViewRotation(r);
+    }
+
+    a = "viewCenterX";
+    s = xml.attributes().value(a).toString();
+    if (!s.isEmpty()) {
+        qreal x = s.toDouble(&ok);
+        if (!ok) {
+            xml.raiseError("Could not parse attribute " + a);
+            return;
+        }
+        a = "viewCenterY";
+        s = xml.attributes().value(a).toString();
+        if (!s.isEmpty()) {
+            qreal y = s.toDouble(&ok);
+            if (!ok) {
+                xml.raiseError("Could not parse attribute " + a);
+                return;
+            }
+            model->setViewCenterTarget(QPointF(x,y));
+        }
     }
 
     readMapDesignCompatibleAttributes();
@@ -1343,6 +1372,8 @@ void VymReader::readFrameAttr()
             // Set all frame parameters via model
             model->setFrameAutoDesign(useInnerFrame, true, lastBranch);
         else {
+            bc->setFrameAutoDesign(useInnerFrame, false);
+
             a = "frameType";
             s = attributeToString(a);
             if (s.isEmpty())
@@ -1352,8 +1383,6 @@ void VymReader::readFrameAttr()
             // assuming that there is no "NoFrame" frame in the xml
             bc->setFrameType(useInnerFrame, s);
 
-            bc->setFrameAutoDesign(useInnerFrame, false);
-
             a = "penColor";
             s = attributeToString(a);
             if (!s.isEmpty())
index f7ad8bd5f5e15e09cb7fbc4da6809a06d03082d1..e1d184a6810c28b6e52634ed369c23ba0f185b5c 100644 (file)
@@ -53,8 +53,9 @@ void ZipAgent::setBackgroundProcess(bool b)
     isBackgroundProcessInt = b;
 }
 
-void ZipAgent::startZip()
+bool ZipAgent::startZip()
 {
+    // Returns true on success
     connect(this, SIGNAL(finished(int, QProcess::ExitStatus)),
             this, SLOT(zipProcessFinished(int, QProcess::ExitStatus)));
 
@@ -86,6 +87,7 @@ void ZipAgent::startZip()
                             "The map could not be saved, please check if "
                             "backup file is available or export as XML file!\n\n")
                         + zipToolPath + args.join(" "));
+            return false;
         }
         else {
             // zip could be started
@@ -93,26 +95,23 @@ void ZipAgent::startZip()
             if (exitStatus() != QProcess::NormalExit) {
                 QMessageBox::critical(0, QObject::tr("Critical Error"),
                                       QObject::tr("zip didn't exit normally"));
+                return false;
             }
             else {
                 if (exitCode() > 0) {
                     QMessageBox::critical(
                         0, QObject::tr("Critical Error"),
                         QString("zip exit code:  %1").arg(exitCode()));
+                    return false;
                 }
             }
         }
-    } else {
-        connect (this, SIGNAL(backgroundZipStarted()), mainWindow, SLOT(backgroundZipStarted()));
-        connect (this, SIGNAL(backgroundZipFinished()), mainWindow, SLOT(backgroundZipFinished()));
-        emit backgroundZipStarted();
-    }    
-
+    }
+    return true;    // Success
 }
 
 void ZipAgent::zipProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
 {
-    //qDebug() << __func__ << "starting.";
     mainWindow->logInfo(QString("ZA::zipProcessFinished  exitCode=%1 exitStatus=%2").arg(exitCode).arg(exitStatus), __func__);
 
 #if defined(Q_OS_WINDOWS)
index 312af1a3feb3ce7713fc67429b0f30393c53aa18..c48422b2ff140e3ae434a6e9ca4a8ee6349b1e13 100644 (file)
@@ -19,7 +19,7 @@ class ZipAgent : public QProcess {
     static bool checkUnzipTool();
 
     void setBackgroundProcess(bool);
-    void startZip();
+    bool startZip();
     void startUnzip();
     QDir zipDir();
     QString zipName();
diff --git a/styles/vym-dark.css b/styles/vym-dark.css
deleted file mode 100644 (file)
index 51471ce..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-html { 
-    font-family:arial,sans-serif; 
-}
-
-body { 
-    margin:0; 
-    padding:10px; 
-    font-family:arial,
-    sans-serif; 
-    align:center;  
-    background-color:#1B1E20; 
-}
-
-a, a:visited, a:link, a:active { 
-    color:#666666; 
-    text-decoration:none; 
-}
-
-a:hover { 
-    text-decoration:underline; 
-}
-
-/* VYM specific elements*/
-
-.vym-header{ 
-    width:96%; 
-    padding:2%; 
-    margin-bottom:10px; 
-    border:solid 1px black; 
-    background-color:#f0f0f0; 
-    text-align:center; 
-    vertical-align:center;
-    font-size: 2em;
-}
-.vym-toc{
-    background-color: #F9F9F9;
-    border: 1px solid #AAAAAA;
-    font-size: 95%;
-    padding: 5px
-}
-.vym-toc-title{
-    background-color: #F9F9F9;
-    font-size: 100%;
-}
-.vym-toc-branch-0{ text-indent: 0em; }
-.vym-toc-branch-1{ text-indent: 1em; }
-.vym-toc-branch-2{ text-indent: 2em; }
-.vym-toc-branch-3{ text-indent: 3em; }
-.vym-toc-branch-4{ text-indent: 4em; }
-.vym-toc-branch-5{ text-indent: 5em; }
-.vym-toc-branch-6{ text-indent: 6em; }
-.vym-toc-branch-7{ text-indent: 7em; }
-.vym-toc-branch-8{ text-indent: 8em; }
-.vym-toc-branch-9{ text-indent: 9em; }
-.vym-toc-number{ }
-.vym-toc-text{ }
-.vym-imagemap{
-    width:96%; 
-    padding:2%; 
-    margin-bottom:10px; 
-    border: 0px; 
-    text-align:center; 
-    vertical-align:center;
-}
-.imagemap{
-    border: 0px; 
-}
-.vym-BoxBottom { 
-    padding:10px; 
-    font-size:0.7em; 
-    border:solid 1px black; 
-    margin:0; 
-    background-color:#f0f0f0; 
-}
-.vym-BoxBottomR                
-{ 
-    padding-top:1em; 
-    color:#676767; 
-    text-align:right; 
-}
-.vym-footer { 
-    width:100%; 
-    border:1;
-}
-.vym-footerL { font-size:0.7em; color:#676767; text-align:left; width:33%}
-.vym-footerC { font-size:0.7em; color:#676767; text-align:center; width:33%}
-.vym-footerR { font-size:0.7em; color:#676767; text-align:right; width:33%}
-
-.vym-url {} 
-
-.vym-branch-0 { 
-}
-.vym-branch-1{
-}
-.vym-branch-2{
-    font-size: small;
-    font-weight: normal;
-}
-.vym-branch-3{
-    font-size: small;
-    font-weight: normal;
-}
-.vym-branch-4{
-    font-size: small;
-    font-weight: normal;
-}
-.vym-branch-5{
-    font-size: small;
-    font-weight: normal;
-}
-.vym-branch-6{
-    font-size: small;
-    font-weight: normal;
-}
-.vym-branch-7{
-    font-size: small;
-    font-weight: normal;
-}
-
-.vym-branch-8{
-    font-size: small;
-    font-weight: normal;
-}
-.vym-branch-9{
-    font-size: small;
-    font-weight: normal;
-}
-.vym-note { 
-    width:80%; 
-    border: solid 1px black; 
-    border-radius: 0.6em 0.6em 0.6em 0.6em;
-    border-color: #000000;
-    background-color: #eeeeee; 
-    font-size: small;
-    font-weight: normal;
-    overflow: auto;
-    padding: 0em 1em;
-}
-
-.vym-note-flag {
-    vertical-align:top;
-    width:30px;
-    height:30px;
-    background-image: url("flags/flag-note.png");
-    background-repeat: no-repeat;
-    background-position: left top;
-}
-
-.vym-note-paragraph { 
-    margin-top: 0px;
-    margin-bottom: 1em;
-}
-
-.vym-fixed-note-paragraph { 
-    margin: 0;
-}
-.standardflag { 
-    margin-left: 5px; 
-}
-
-.vym-list-ul-0 {
-    list-style-type: none;
-    list-style-position: inside;
-}
-
-.vym-list-ul-1 {
-    list-style-type: none;
-    list-style-position: outside;
-}
-
index f5d73ec4c79bd447598f54aa8e7b1753ca793f09..ba6cea05990f2d0aadc86981c924b60ecec92d30 100644 (file)
@@ -8,7 +8,7 @@ body {
     font-family:arial,
     sans-serif; 
     align:center;  
-    background-color:#ffffff; 
+    background-color:$MapBackgroundColor;
 }
 
 a, a:visited, a:link, a:active { 
@@ -125,28 +125,44 @@ a:hover {
     font-size: small;
     font-weight: normal;
 }
-.vym-note { 
-    width:80%; 
-    border: solid 1px black; 
-    border-radius: 0.6em 0.6em 0.6em 0.6em;
+.vym-note {
+    width: 100%;
+    border: solid 1px black;
+    border-radius: 0.6em;
     border-color: #000000;
-    background-color: #eeeeee; 
+    background-color: #eeeeee;
     font-size: small;
     font-weight: normal;
-    overflow: auto;
     padding: 0em 1em;
 }
 
-.vym-note-flag {
-    vertical-align:top;
-    width:30px;
-    height:30px;
-    background-image: url("flags/flag-note.png");
-    background-repeat: no-repeat;
-    background-position: left top;
+.vym-note-button {
+    background-color: #8888cc;
+    color: #ffffff;
+    cursor: pointer;
+    padding: 0.3em 0.8em;
+    width: 80%;
+    border: none;
+    border-radius: 0.4em;
+    text-align: left;
+    font-size: small;
+    font-weight: bold;
+    margin-top: 0.4em;
+    display: block;
+}
+
+.vym-note-button:hover {
+    background-color: #6666aa;
+}
+
+.vym-note-collapsible {
+    width: 80%;
+    max-height: 0;
+    overflow: hidden;
+    transition: max-height 0.3s ease-out;
 }
 
-.vym-note-paragraph { 
+.vym-note-paragraph {
     margin-top: 0px;
     margin-bottom: 1em;
 }
index b65dcab982fcb3cbdd5d13f3bf36432e9ab0bc37..037b6b56ac4d6308d252d18757c88c798d055dae 100644 (file)
@@ -36,7 +36,7 @@ not_yet_ported_tests = [
 ];
 
 tests = all_tests;
-// tests = ["modify_branches"];
+//tests = ["saving"];
 
 
 var verbosity = 0;
@@ -154,7 +154,7 @@ function initMap(mapPath)  // FIXME not fully ported yet: files parameter missin
   */
 
   if (vym.loadMap(currentMapPath)) {
-    let id = vym.currentMapID();
+    let id = vym.currentMapId();
     if (verbosity > 0)
       vym.print("# Loaded " + currentMapPath + " (id: " + id + "  original: " + mapPath + ")");
     
@@ -171,13 +171,13 @@ function initMap(mapPath)  // FIXME not fully ported yet: files parameter missin
 
 function closeCurrentMap()
 {
-  id = vym.currentMapID();
+  id = vym.currentMapId();
   name = vym.currentMap().getFileName();
-  if(vym.closeMapWithID(id)) {
+  if(vym.closeMapWithId(id)) {
     if (verbosity > 0)
       vym.print("# Closed map \"" + name + "\" (id: #{id})");
   } else {
-    vym.print("# Failed to close map with id = #{id}. CurrentMapID = #{id}");
+    vym.print("# Failed to close map with id = #{id}. currentMapId = #{id}");
   }
 }
 
@@ -1466,6 +1466,7 @@ function test_saving()
 
   mapName = "test-saveSelection.vyp";
   fn = testDir + "/" + mapName;
+  map.setSaveAsBackgroundProcess(false);
   ok = map.saveSelection(fn);
   expect("Saved selection successfully to '" + fn + "'", ok, true);
 
index 17dfd8b3b0e80964c43cfd08012e5c29c1211326..fa53758402cdc14531c12b019cfa2030bef00a3e 100644 (file)
@@ -101,7 +101,7 @@ def init_map( mapPath, files = [])
   end
 
   if @vym.loadMap (@currentMapPath)
-    id = @vym.currentMapID
+    id = @vym.currentMapId
     puts "# Loaded #{mapPath} -> #{@currentMapPath} (id: #{id})".light_black
     return @vym.map (id)
   end
@@ -111,12 +111,12 @@ def init_map( mapPath, files = [])
 end
 
 def close_current_map
-  id = @vym.currentMapID
-  r = @vym.closeMapWithID(id)
+  id = @vym.currentMapId
+  r = @vym.closeMapWithId(id)
   if r
     puts "# Closed map (id: #{id})".light_black
   else
-    puts "# Failed to close map with id = #{id}. CurrentMapID = #{id}".red
+    puts "# Failed to close map with id = #{id}. currentMapId = #{id}".red
   end
 end
 
index ddf387dae2e2dbd6c8b48b872eace82b4a8511e2..f10d9d557db22b6ac646db133269a4a88158b665 100755 (executable)
@@ -101,7 +101,7 @@ def init_map( mapPath, files = [])
   end
 
   if @vym.loadMap (@currentMapPath)
-    id = @vym.currentMapID
+    id = @vym.currentMapId
     puts "# Loaded #{mapPath} -> #{@currentMapPath} (id: #{id})".blue
     return @vym.map (id)
   end
@@ -111,12 +111,12 @@ def init_map( mapPath, files = [])
 end
 
 def close_current_map
-  id = @vym.currentMapID
-  r = @vym.closeMapWithID(id)
+  id = @vym.currentMapId
+  r = @vym.closeMapWithId(id)
   if r
     puts "# Closed map (id: #{id})".blue
   else
-    puts "# Failed to close map with id = #{id}. CurrentMapID = #{id}".red
+    puts "# Failed to close map with id = #{id}. currentMapId = #{id}".red
   end
 end
 
diff --git a/tex/icons/camera-photo.pdf b/tex/icons/camera-photo.pdf
new file mode 100644 (file)
index 0000000..31d0472
Binary files /dev/null and b/tex/icons/camera-photo.pdf differ
diff --git a/tex/icons/converted-icons.txt b/tex/icons/converted-icons.txt
new file mode 100644 (file)
index 0000000..bdb7136
--- /dev/null
@@ -0,0 +1 @@
+icons/classic/edit-delete.svg   icons/edit-delete.pdf
diff --git a/tex/icons/edit-delete.pdf b/tex/icons/edit-delete.pdf
new file mode 100644 (file)
index 0000000..4199a64
Binary files /dev/null and b/tex/icons/edit-delete.pdf differ
diff --git a/tex/icons/edit-find.pdf b/tex/icons/edit-find.pdf
new file mode 100644 (file)
index 0000000..fec5735
Binary files /dev/null and b/tex/icons/edit-find.pdf differ
diff --git a/tex/icons/edit-find.svg b/tex/icons/edit-find.svg
new file mode 100644 (file)
index 0000000..c46b0c7
--- /dev/null
@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
+  <defs id="defs3051">
+    <style type="text/css" id="current-color-scheme">
+      .ColorScheme-Text {
+        color:#232629;
+      }
+      </style>
+  </defs>
+ <path 
+    style="fill:currentColor;fill-opacity:1;stroke:none" 
+    d="M 9 3 C 5.6759952 3 3 5.6759952 3 9 C 3 12.324005 5.6759952 15 9 15 C 10.481205 15 11.830584 14.465318 12.875 13.582031 L 18.292969 19 L 19 18.292969 L 13.582031 12.875 C 14.465318 11.830584 15 10.481205 15 9 C 15 5.6759952 12.324005 3 9 3 z M 9 4 C 11.770005 4 14 6.2299952 14 9 C 14 11.770005 11.770005 14 9 14 C 6.2299952 14 4 11.770005 4 9 C 4 6.2299952 6.2299952 4 9 4 z "
+    class="ColorScheme-Text"
+    />  
+</svg>
diff --git a/tex/icons/formatrichtext.pdf b/tex/icons/formatrichtext.pdf
new file mode 100644 (file)
index 0000000..a7c8816
Binary files /dev/null and b/tex/icons/formatrichtext.pdf differ
index 2e64f811cd16184d5262eaf589f93db185097ed2..ab950309a429ed1d2c9ed55b61472aea91f1eeba 100644 (file)
@@ -82,7 +82,7 @@
 \title{
     \includegraphics[width=8cm]{images/vym-logo-new.png} \\ 
     VYM  -- View Your Mind \\ 
-    {\small Version 2.9.0} \\ 
+    {\small Version 2.9.512} \\ 
     { Usermanual }
 \author{\textcopyright Uwe Drechsel  }
 }
@@ -167,9 +167,9 @@ stimulates new associations.
 
 
 \subsubsection*{Your Brain}
-In 1960 Prof. {\sc Roger Sperry} discovered that both hemispheres
-of the human brain undertake different tasks (of course both of them
-basically {\em can} do the same): 
+For many years it was believed that the left and the right side of the
+brain undertake different tasks like the left side is responsible for
+logical thinking and the right side for creativity:
 \begin{center}
 \begin{tabular}{|p{5.5cm}|p{5.5cm}|} \hline
     Left side & Right side \\ \hline
@@ -194,12 +194,16 @@ basically {\em can} do the same):
     \end{itemize}     \\ \hline
 \end{tabular}   
 \end{center}
-In our science oriented western society we have learned to mainly rely
-on our left side of the brain, the "rational" one. In other cultures,
-such as the native americans and other "old" cultures, the right side is
-much more important. {\em Map} are just one way to stimulate the other
-side and make use of additional resources we all have.
+More recent research has shown that the two sides of the brain are much
+more connected and neurologists are more sceptical about the idea of a
+strict division of tasks between the two sides. The two sides of the
+brain are much more interdependent and work together much more closely
+than previously thought.
 
+Anyway in our western culture we have learned to mainly rely on the
+rational part of our brain. Laying out our thoughts in a {\em map} can
+help to stimulate the other part and make use of additional resources we
+all have.
 
 \subsection{Where could I use a {\em map}?}
 Here are some examples, how you can use those {\em maps}
@@ -290,7 +294,7 @@ Here is a list of the available satellite windows, the {\em dockable}
 feature is explained in next section \ref{dockable}:
 \begin{itemize}
     \item Branch Property Window (see section \ref{propwindow})
-    \item \includegraphics[width=0.5cm]{../icons/find.png}
+    \item \includegraphics[width=0.5cm]{icons/edit-find.pdf}
         Find window to search for text (dockable)
     \item \includegraphics[width=0.5cm]{../icons/headingeditor.png}
         Heading editor (dockable, features are the same as in the
@@ -306,6 +310,9 @@ feature is explained in next section \ref{dockable}:
     \item \includegraphics[width=0.5cm]{../icons/taskeditor.png}
         Taskeditor (dockable, see section \ref {taskeditor})
 \end{itemize}
+Btw. all satellite windows can be opened by using the menu "View \ra Show \ra
+{\em name of the window}" and with keyboard shortcuts, e.g. \key{CTRL+F}
+for the Find window. Each satellite can be closed again by \key{CTRL+D}.
 
 \subsection{Dockable windows} \label{dockable}
 Beginning with \vym 1.13.0 some of the windows may be docked and become
@@ -447,7 +454,7 @@ zoom.
 
 \subsubsection*{Find Function} \label{findwindow}
 Choose Edit \ra Find or just press \key{CTRL+F} to open
-the Findwidget. The image below shows the findwidget above the
+the Findi Window. The image below shows the Find Window above the
 noteeditor and the mapeditor:
 \begin{center}
     \maximage{images/find-window.png}
@@ -842,7 +849,7 @@ Notes and also the headings of branches can either use a default font or
 all text attributes availabe in RichText, like bold, italic, colors,
 etc. To enable the latter, click the RichText button:
 \begin{center}
-    \includegraphics[width=0.5cm]{../icons/formatrichtext.png}
+    \includegraphics[width=0.5cm]{icons/formatrichtext.pdf}
 \end{center}
 
 \subsection{Fonts and how to switch them quickly}
@@ -1028,7 +1035,7 @@ menu. The (currently) available action are:
     Select next slide
 
     \item
-    \includegraphics[width=0.5cm]{../icons/slide-camera.png}
+    \includegraphics[width=0.5cm]{../icons/classic/camera-photo.png}
     Create a new slide by snapshotting the current selection. The exact
     set of actions performed when selecting the new snapshot defined in
     a script called {\tt slideeditor-snapshot.vys}. The script is one of
@@ -1040,7 +1047,7 @@ menu. The (currently) available action are:
     (More on scripting in appendix \ref{scripts}).
     
     \item
-    \includegraphics[width=0.5cm]{../icons/edittrash.png}
+    \includegraphics[width=0.5cm]{icons/edit-delete.pdf}
     Delete the current slide
     
     \item
@@ -1646,19 +1653,18 @@ several maps at once.
 
 \section{Scripts} \label{scripts}   
 \subsection{Overview}
-Beginning with version 2.7.0 \vym is fully scriptable, though the
-scripting support is still considered a {\em technical preview}. Some
-parts still might change and improve in later versions.
+\vym is fully scriptable. Beginning with version 3.0.0 the scripting
+engine is based on QJSEngine, which is a JavaScript engine.
 Scripts are internally used for
 \begin{itemize}
     \item Undo and Redo
     \item Macros on function keys
     \item Slideshow
 \end{itemize}
-In addition to the internal scriptengine, which is using QScript, 
-you can also  use external ruby scripts, which communicate with \vym via
-DBUS. Please note that the latter is currently only possible on Linux.
-See also the examples in \ref{examplescripts}.
+Older versions of \vym in addition to QJSEngine used the Ruby scripting
+engine. This is still available in \vym, the commands are on Linux
+accessible via DBUS. The Ruby engine is not available on Windows and
+MacOS.
 
 The scripts within \vym are edited using the {\em script editor}:
 \begin{center} \label{scripteditor}
@@ -1674,18 +1680,32 @@ installation directory and the subfolder {\tt demos/scripts/} and the
 macros in the macro tab of the script editor.
 \subsubsection{Macro to create a rounded rectangle frame}
 \begin{code}
-// Macro Shift + F1: Frame background light red
-function macro_shift_f1()
+//! Helper function to toggle frame background color of a whole subtree
+
+function toggle_frame_subtree(color, msg)
 {
     map = vym.currentMap();
-    status = "Background off";
-    if (map.getFrameType() == "NoFrame") {
-        status = "Background light red";
+    branches = map.selectedBranches();
+    for (b of branches) {
+        // Make sure changes are saved
+        b.setFrameAutoDesign(false, false);
+        if (b.getFrameType(false) == "NoFrame" ) {
+            b.setFrameType (false, "RoundedRectangle");
+            b.setFrameBrushColor(false, color);
+            vym.statusMessage(msg);
+        } else {
+            b.setFrameType (false, "NoFrame");
+            vym.statusMessage("No frame for subtree");
+        }
     }
-    toggle_frame ( map );
-    map.setFrameBrushColor("#ffb3b4");
-    statusMessage(status);
 }
+
+//! Macro Ctrl+Shift+F1: Toggle subtree frame background light red
+function macro_ctrl_shift_f1()
+{
+    toggle_frame_subtree ( "#ffb3b4", "Subtree frame background light red" );
+}
+
 \end{code}
 
 \subsubsection{Batch script to export all maps as images}
@@ -1696,7 +1716,7 @@ with
 \$ vym --quit --run export-image.vys *.vym
 \end{code}
 
-\subsubsection{Full scripting using ruby and DBUS} \label{dbus}
+\subsubsection{Full scripting using ruby and DBUS (deprecated)} \label{dbus}
 Nearly every action in \vym can be controlled via DBUS (on Linux
 machines). You can have several \vym instances running at the same time,
 e.g. for production and development. Before controlling one, you need to