# Qt translation artifacts
translations/*.qm
+
+# Temporary files
+tmp/
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")
# 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)
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}")
endif()
if(APPLE)
- message(STATUS "vym: Detected APPLE")
+ message(STATUS "vym: Detected APPLE, preparing bundle:")
set(MACOSX_BUNDLE_EXECUTABLE_NAME ${PROJECT_NAME})
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 ---
# 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()
-VYM - View Your Mind (c) 2004-2025 by Uwe Drechsel
+VYM - View Your Mind (c) 2004-2026 by Uwe Drechsel
==================================================
About
--- /dev/null
+// 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();
+
<context>
<name>AboutDialog</name>
<message>
- <location filename="../src/aboutdialog.cpp" line="+141"/>
+ <location filename="../src/aboutdialog.cpp" line="141"/>
<source>Credits</source>
<comment>Help->About vym dialog</comment>
<translation>Mitwirkende</translation>
</message>
<message>
- <location line="+350"/>
+ <location filename="../src/aboutdialog.cpp" line="491"/>
<source>License</source>
<comment>Help->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-></source>
<translation>Bitte setzen sie einen Pfad in Einstellungen-></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'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
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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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 &Link Color</source>
<translation>&Farbe der Verbindungen</translation>
</message>
<translation type="vanished">&Hintergrundfarbe</translation>
</message>
<message>
- <location line="-2508"/>
+ <location filename="../src/mainwindow.cpp" line="217"/>
<source>&View</source>
<translation>&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>
<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>
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>
<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'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'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>&Print</source>
<translation>&Drucken</translation>
</message>
<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'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-></source>
<translation>Bitte setzen sie einen Pfad in Einstellungen-></translation>
</message>
<message>
- <location line="-2170"/>
+ <location filename="../src/mainwindow.cpp" line="5648"/>
<source>Couldn'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>
<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>
<translation type="vanished">&Map</translation>
</message>
<message>
- <location line="+1325"/>
+ <location filename="../src/mainwindow.cpp" line="1616"/>
<source>&Restore last session</source>
<comment>Edit menu</comment>
<translation>&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>
<translation type="vanished">Attribut hinzufügen</translation>
</message>
<message>
- <location line="+285"/>
+ <location filename="../src/mainwindow.cpp" line="2073"/>
<source>&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 &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>
<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>
<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&dit</source>
<comment>Edit menu</comment>
<translation>E&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>
<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>
<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>
<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>&Map</source>
<comment>Map menu</comment>
<translation>&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>&Open...</source>
<comment>File menu</comment>
<translation>&Ö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>&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>&Save...</source>
<comment>File menu</comment>
<translation>&Speichern...</translation>
</message>
<message>
- <location line="+8"/>
+ <location filename="../src/mainwindow.cpp" line="1640"/>
<source>Save &As...</source>
<comment>File menu</comment>
<translation>Speichern &unter...</translation>
</message>
<message>
- <location line="+11"/>
+ <location filename="../src/mainwindow.cpp" line="1658"/>
<source>Import</source>
<comment>File menu</comment>
<translation>Importieren</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>&Close Map</source>
<comment>File menu</comment>
<translation>Schlie&ßen</translation>
</message>
<message>
- <location line="+7"/>
+ <location filename="../src/mainwindow.cpp" line="1830"/>
<source>Exit</source>
<comment>MainWindow shortcut groups</comment>
<translation>B&eenden</translation>
</message>
<message>
- <location line="+1"/>
+ <location filename="../src/mainwindow.cpp" line="1831"/>
<source>E&xit</source>
<comment>File menu</comment>
<translation>B&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>&Undo</source>
<comment>Edit menu</comment>
<translation>&Rückgängig</translation>
</message>
<message>
- <location line="+9"/>
+ <location filename="../src/mainwindow.cpp" line="1874"/>
<source>&Redo</source>
<comment>Edit menu</comment>
<translation>Wieder&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>&Copy</source>
<comment>Edit menu</comment>
<translation>&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&t</source>
<comment>Edit menu</comment>
<translation>&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>&Paste</source>
<comment>Edit menu</comment>
<translation>Ein&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>
<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&ormat</source>
<comment>Format menu</comment>
<translation>F&ormat</translation>
</message>
<message>
- <location line="+2423"/>
+ <location filename="../src/mainwindow.cpp" line="2655"/>
<source>Pic&k color</source>
<comment>Edit menu</comment>
<translation>Farbe &übernehmen</translation>
</message>
<message>
- <location line="+9"/>
+ <location filename="../src/mainwindow.cpp" line="2664"/>
<source>Color &branch</source>
<comment>Edit menu</comment>
<translation>Zweig &färben</translation>
</message>
<message>
- <location line="+9"/>
+ <location filename="../src/mainwindow.cpp" line="2673"/>
<source>Color sub&tree</source>
<comment>Edit menu</comment>
<translation>&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>&Use color of heading for link</source>
<comment>Branch attribute</comment>
<translation>&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&O report)...</source>
<comment>Export format</comment>
<translation>Text (A&O Format)</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>
<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>
<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>
<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>
<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>
<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>&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>
<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'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>
<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't load default map:
%1
<translation>Konnte Standardmap nicht laden</translation>
</message>
<message>
- <location line="+395"/>
+ <location filename="../src/mainwindow.cpp" line="4727"/>
<source>Couldn'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't save %1,
because of existing lockfile:
</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>
<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 'h' 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>
<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>
%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>
<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 "Verbergen" Flag verwenden </translation>
</message>
<message>
- <location line="+76"/>
+ <location filename="../src/mainwindow.cpp" line="3686"/>
<source>&Help</source>
<comment>Help menubar entry</comment>
<translation>&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>&New map</source>
<comment>File menu</comment>
<translation>Neue map</translation>
</message>
<message>
- <location line="+9"/>
+ <location filename="../src/mainwindow.cpp" line="1601"/>
<source>&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>
<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>
<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 &Selection Color</source>
<translation>Farbe der Auswahlmarkierung</translation>
</message>
<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>
<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>
<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>
<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 &unter...</translation>
</message>
<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>
</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 "%1" 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>
<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'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>
<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'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'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><html><h3>Do you allow vym to check online for updates or release notes?</h3>If you allow, vym will <ul><li>check once for release notes</li><li>check regulary for updates and notify you in case you should update, e.g. if there are important bug fixes available</li><li>receive a cookie with a random ID and send some anonymous data, like:<ul><li>vym version</li><li>platform name and the ID (e.g. "Windows" or "Linux")</li><li>if you are using dark theme</li></ul>This data is sent to me, Uwe Drechsel.<p>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.</p> <p>No other data than above will be sent, especially no private data will be collected or sent.(Check the source code, if you don't believe.)</p></li></ul>If you do not allow, <ul><li>nothing will be downloaded and especially I will <b>not be motivated</b> to spend some more thousands of hours on developing a free software tool.</ul>Please allow vym to check for updates :-)</source>
<translation><html><h3>Erlauben Sie vym online nach Updates oder Release Anmerkungen zu suchen?</h3>Wenn Sie es erlauben, wird vym <ul><li>einmalig online nach Release Anmerkungen suchen</li><li>regelmäßig nach Updates suchen und Sie benachrichtigen, sollten Updates wie z.B. wichtige Fehlerbehebungen verfügbar sein</li><li>ein cookie erhalten mit eineer zufällig erzeugten ID und einige anonymisierte Daten senden, wie z.B.<ul><li>vym Version</li><li>Plattform Name und ID "Windows" oder "Linux")</li><li>Einstellungen wie z.B. Sprache und ob dunkles Design verwendet wird</li></ul>Diese Daten werden geschickt zum Author von vym: Uwe Drechsel.<p>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.</p> <p>Abgesehen von obigen Daten wird nichts weiteres gesendet, insbesondere keine privaten Daten. (Bitte bei Zweifel gerne die Quellen prüfen!)</p></li></ul>Falls Sie es nicht zulassen, wird<ul><li>nichts heruntergeladen und <b>besonders werde ich nicht motiviert</b> weiter tausende Stunden meiner Zeit in die Entwicklung einer freien Software zu stecken.</ul>Bitte erlauben Sie vym nach Updates zu sehen :-)</translation>
</message>
<message>
- <location line="+49"/>
+ <location filename="../src/mainwindow.cpp" line="8152"/>
<source>That'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>
<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>
<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>
<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>
%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't read settings from "%1"</source>
<translation>Konnte Einstellungen nicht lesen von %1</translation>
</message>
<message>
- <location line="+12"/>
+ <location filename="../src/export-impress.cpp" line="200"/>
<source>Check "%1" in
%2</source>
<translation>Bitte "%1" 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'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'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't find tar tool to unzip data. </source>
<translation>Konnte das tar Werkzeug zum Entpacken der Daten nicht finden.</translation>
</message>
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't start to compress data!
The map could not be saved, please check if backup file is available or export as XML file!
</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'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't start tool to decompress data!
</source>
<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'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'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>
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><h3>Map is newer than VYM</h3><p>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.</p></source>
<translation><h3>Map ist neuer als VYM</h3><p>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.</p></translation>
</message>
<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'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-></source>
<translation>Bitte setzen sie einen Pfad in Einstellungen-></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>
<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't open "%1"
.</source>
<translation>Konnte %1 nicht öffnen.
</translation>
</message>
<message>
- <location filename="../src/scripteditor.cpp" line="-64"/>
+ <location filename="../src/scripteditor.cpp" line="195"/>
<source>Couldn't write macros to "%1"
.</source>
<translation>Konnte Makros nicht speichern nach "%1"
</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't read script from "%1"
.</source>
<translation>Konnte script nicht lesen von "%1"
</translation>
</message>
<message>
- <location line="+16"/>
+ <location filename="../src/scripteditor.cpp" line="260"/>
<source>Couldn't write script to "%1"
.</source>
<translation>Konnte script nicht speichern in "%1"
</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>
</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>
<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'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'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>
<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>
<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>
<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>
<context>
<name>TextEditor</name>
<message>
- <location filename="../src/texteditor.cpp" line="+327"/>
+ <location filename="../src/texteditor.cpp" line="324"/>
<source>&Import...</source>
<translation>&Importiere</translation>
</message>
<message>
- <location line="+9"/>
+ <location filename="../src/texteditor.cpp" line="333"/>
<source>&Export...</source>
<translation>&Export</translation>
</message>
<message>
- <location line="+19"/>
+ <location filename="../src/texteditor.cpp" line="344"/>
<source>&Print...</source>
<translation>&Drucken</translation>
</message>
<message>
- <location line="+33"/>
+ <location filename="../src/texteditor.cpp" line="377"/>
<source>&Undo</source>
<translation>R&ückgängig</translation>
</message>
<message>
- <location line="+9"/>
+ <location filename="../src/texteditor.cpp" line="386"/>
<source>&Redo</source>
<translation>Wieder&herstellen</translation>
</message>
<message>
- <location line="+10"/>
+ <location filename="../src/texteditor.cpp" line="396"/>
<source>Select and copy &all</source>
<translation>&Alles auswählen und kopieren</translation>
</message>
<translation type="vanished">Ein&fügen</translation>
</message>
<message>
- <location line="-44"/>
+ <location filename="../src/texteditor.cpp" line="352"/>
<source>&Delete All</source>
<translation>Alles &löschen</translation>
</message>
<message>
- <location line="+262"/>
+ <location filename="../src/texteditor.cpp" line="514"/>
+ <source>&Color text using foreground color</source>
+ <translation>Text mit Vordergrundfarbe einfärben</translation>
+ </message>
+ <message>
+ <location filename="../src/texteditor.cpp" line="522"/>
+ <source>&Select text foreground color...</source>
+ <translation>Text Vordergrundfarbe auswählen</translation>
+ </message>
+ <message>
+ <location filename="../src/texteditor.cpp" line="534"/>
+ <source>&Mark text using background color...</source>
+ <translation>Text mit Hintergrundfarbe markieren</translation>
+ </message>
+ <message>
+ <location filename="../src/texteditor.cpp" line="542"/>
+ <source>&Select text background color...</source>
+ <translation>Text Hintergrundfarbe auswählen</translation>
+ </message>
+ <message>
+ <location filename="../src/texteditor.cpp" line="645"/>
<source>&Settings</source>
<translation>&Einstellungen</translation>
</message>
<message>
- <location line="+3"/>
+ <location filename="../src/texteditor.cpp" line="648"/>
<source>Set &fixed font</source>
<translation>Wähle Zeichensatz mit f&ixer Breite</translation>
</message>
<message>
- <location line="+5"/>
+ <location filename="../src/texteditor.cpp" line="653"/>
<source>Set &variable font</source>
<translation>Wähle Zeichensatz mit v&ariabler Breite</translation>
</message>
<message>
- <location line="+5"/>
+ <location filename="../src/texteditor.cpp" line="658"/>
<source>&fixed font is default</source>
<translation>Verwende fixen Zeichensatz p&er default</translation>
</message>
<translation type="vanished">Exportiere Notiz &als... (HTML)</translation>
</message>
<message>
- <location line="-292"/>
<source>Export &As...(ASCII)</source>
- <translation>Exportiere a&ls (ASCII)</translation>
+ <translation type="vanished">Exportiere a&ls (ASCII)</translation>
</message>
<message>
- <location line="+39"/>
+ <location filename="../src/texteditor.cpp" line="374"/>
<source>Edi&t</source>
<translation>Edi&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>
<translation type="vanished">&Farbe...</translation>
</message>
<message>
- <location line="+23"/>
+ <location filename="../src/texteditor.cpp" line="556"/>
<source>&Bold</source>
<translation>F&ett</translation>
</message>
<message>
- <location line="+10"/>
+ <location filename="../src/texteditor.cpp" line="566"/>
<source>&Italic</source>
<translation>K&ursiv</translation>
</message>
<message>
- <location line="+10"/>
+ <location filename="../src/texteditor.cpp" line="576"/>
<source>&Underline</source>
<translation>&Unterstrichen</translation>
</message>
<message>
- <location line="+37"/>
+ <location filename="../src/texteditor.cpp" line="613"/>
<source>&Left</source>
<translation>&Linksbündig</translation>
</message>
<message>
- <location line="+7"/>
+ <location filename="../src/texteditor.cpp" line="620"/>
<source>C&enter</source>
<translation>&Zentriert</translation>
</message>
<message>
- <location line="+7"/>
+ <location filename="../src/texteditor.cpp" line="627"/>
<source>&Right</source>
<translation>&Rechtsbündig</translation>
</message>
<message>
- <location line="+7"/>
+ <location filename="../src/texteditor.cpp" line="634"/>
<source>&Justify</source>
<translation>&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>&Font hint</source>
<translation>Zeichensatz &umschalten</translation>
</message>
<message>
- <location line="+107"/>
+ <location filename="../src/texteditor.cpp" line="590"/>
<source>Subs&cript</source>
<translation>&Tiefgestellt</translation>
</message>
<message>
- <location line="+9"/>
+ <location filename="../src/texteditor.cpp" line="599"/>
<source>Su&perscript</source>
<translation>&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&ormat</source>
<translation>F&ormat</translation>
</message>
<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>
<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>&Note</source>
<comment>Menubar</comment>
<translation>&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>&Copy</source>
<comment>Edit menu</comment>
<translation>&Kopieren</translation>
</message>
<message>
- <location line="+9"/>
+ <location filename="../src/texteditor.cpp" line="414"/>
<source>Cu&t</source>
<comment>Edit menu</comment>
<translation>&Ausschneiden</translation>
</message>
<message>
- <location line="+9"/>
+ <location filename="../src/texteditor.cpp" line="423"/>
<source>&Paste</source>
<comment>Edit menu</comment>
<translation>Ein&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>&Richtext</source>
<translation>&Richtext</translation>
</message>
<message>
- <location line="+45"/>
<source>&Text Color...</source>
- <translation>&Text Farbe</translation>
+ <translation type="vanished">&Text Farbe</translation>
</message>
<message>
- <location line="+9"/>
<source>&Text background color...</source>
- <translation>&Text Hintergrundfarbe</translation>
+ <translation type="vanished">&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>
Wollen Sie sie überschreiben?</translation>
</message>
<message>
- <location line="+19"/>
<source>Couldn't export note </source>
<comment>dialog 'save note as'</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>&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>&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>
<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>
<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'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'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'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
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'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'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'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>
<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>
<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'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 "%1" on "%2"
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'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
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 "Rückgängig"</translation>
</message>
<message>
- <location line="+961"/>
+ <location filename="../src/vymmodel.cpp" line="2640"/>
<source>Note</source>
<comment>FindAll in VymModel</comment>
<translation>Notiz</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'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>
<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>
<context>
<name>VymModelWrapper</name>
<message>
- <location filename="../src/vymmodelwrapper.cpp" line="+488"/>
- <location line="+10"/>
<source>Saving the selection in map failed:
Couldn'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'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>
<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>
<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>
<translation type="vanished">Dialog</translation>
</message>
<message>
- <location line="+35"/>
+ <location filename="../src/warningdialog.cpp" line="51"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
// 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);
}
}
+//! 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);
}
}
+//! 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()
{
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();
colorSubtreeWithQuickColor(2);
}
-
//! Macro F4: Color subtree purple
function macro_f4()
{
colorSubtreeWithQuickColor(4);
}
-//! Macro F6: Color subtree blue
+//! Macro F6: Color subtree cyan
function macro_f6()
{
colorSubtreeWithQuickColor(5);
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");
}
}
+// ─── 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
+}
--- /dev/null
+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
+
if (!branchesContainer)
return 0;
else
- return branchesContainer->childItems().count();
+ return branchesContainer->childContainers().count();
}
void BranchContainerBase::addToBranchesContainer(BranchContainer *bc) {}
if (!imagesContainer)
return 0;
else
- return imagesContainer->childItems().count();
+ return imagesContainer->childContainers().count();
}
void BranchContainerBase::createImagesContainer() {}
if (!branchesContainer) return list;
- foreach (QGraphicsItem *g_item, branchesContainer->childItems())
+ foreach (QGraphicsItem *g_item, branchesContainer->childContainers())
list << (BranchContainer*)g_item;
return list;
if (!imagesContainer) return list;
- foreach (QGraphicsItem *g_item, imagesContainer->childItems())
+ foreach (QGraphicsItem *g_item, imagesContainer->childContainers())
list << (ImageContainer*)g_item;
return list;
// BranchContainer defaults
// partially overwriting MinimalBranchContainer
// can be overwritten by MapDesign later
- containerType = Container::Branch;
+ setContainerType(Container::Branch);
setLayout(Container::Horizontal);
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;
// (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(
{
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
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;
void BranchContainer::updateChildrenStructure()
{
- logDebug("BC::updateChildrenStructure of " + info());
if (branchesContainerLayoutInt == List) {
if (!listContainer) {
// Create and setup a listContainer *below* the ornamentsContainer
// 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);
// 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();
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
}
else {
// No imagesAndBranchesContainer required
- //
- // TODO Remove imagesAndBranchesCont, relink imagesCont and
- // branchesCont
- if (imagesAndBranchesContainer) {
- updateImagesContainerParent();
- updateBranchesContainerParent();
- delete imagesAndBranchesContainer;
- imagesAndBranchesContainer = nullptr;
- }
+ if (imagesAndBranchesContainer)
+ deleteImagesAndBranchesContainer();
}
}
}
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();
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
void BranchContainer::updateImagesContainer()
{
- if (imagesContainer && imagesContainer->childItems().count() == 0) {
+ if (imagesContainer && imagesContainer->childContainers().count() == 0) {
delete imagesContainer;
imagesContainer = nullptr;
}
// The destructor of ImageItem calls
// updateChildrenStructure() in parentBranch()
imagesContainer = new Container();
- imagesContainer->containerType = ImagesContainer;
+ imagesContainer->setContainerType(ImagesContainer);
imagesContainer->setLayout(imagesContainerLayoutInt);
updateImagesContainerParent();
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();
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
}
// 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)
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);
// 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;
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
private:
void createOuterContainer(); //! Used if only images have FloatingBounded layout
void deleteOuterContainer();
+ void createImagesAndBranchesContainer();
+ void deleteImagesAndBranchesContainer();
void updateTransformations(); //! Update rotation and scaling
public:
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();
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);
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);
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();
--- /dev/null
+#define __VYM_BUILD_DATE "2026-07-21"
--- /dev/null
+#define __VYM_BUILD_DATE "${BUILD_DATE_IN}"
return;
}
if (jobStep == 3) {
- model = mainWindow->getModel(modelID);
+ model = mainWindow->modelWithId(modelID);
if (model) {
BranchItem *bi = (BranchItem *)(model->findID(branchID));
}
if (jobStep == 5) {
- model = mainWindow->getModel(modelID);
+ model = mainWindow->modelWithId(modelID);
if (model) {
BranchItem *bi = (BranchItem *)(model->findID(branchID));
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());
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());
void Container::copy(Container *other)
{
- containerType = other->containerType;
+ containerTypeInt = other->containerTypeInt;
originalPos = other->originalPos;
name = other->name;
void Container::init()
{
- containerType = UndefinedType;
+ containerTypeInt = UndefinedType;
layoutInt = Horizontal;
// subcontainers usually may influence position
show();
}
-Container::ContainerType Container::getContainerType()
+Container::ContainerType Container::containerType()
{
- return containerType;
+ return containerTypeInt;
}
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;
case Image:
t = "Image";
break;
+ case ImagesAndBranchesContainer:
+ t = "ImagesAndBranchesContainer";
+ break;
case ImagesContainer:
t = "ImagesContainer";
break;
t = "Undefined";
break;
default:
- t = "Unknown";
+ t = QString("Unknown (%1)").arg(containerTypeInt);
break;
}
return QString("[%1]").arg(t);
+ 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());
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) {
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;
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,
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();
}
// 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);
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:
}
setRect(r);
- //qdbg() << ind() << " + FloatingBounded r=" << toS(r) << " pos=" << pos() << getName();
}
break;
// 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();
}
// 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:
// 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
// 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
// - 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;
case List:
case Vertical: {
+ // qdbg() << ind() << " # VL starting for " << info();
qreal h_total = 0;
qreal w_max = 0;
break;
default:
qWarning() << "Container::reposition vertically - undefined alignment:" << horizontalAlignmentInt << " in " << info();
- if (containerType == BranchesContainer)
+ if (containerTypeInt == BranchesContainer)
qWarning() << " orient=" << ((BranchContainer*)this)->getOrientation();
}
// Set rect
setRect(-w_max / 2, -h_total / 2, w_max, h_total);
+ // qdbg() << ind() << " # VL finished for " << info();
+
} // Vertical layout
break;
default:
virtual void init();
void setContainerType(const ContainerType &t);
- ContainerType getContainerType();
+ ContainerType containerType();
enum {Type = UserType + 1};
int type() const override;
int containerDepth();
QString ind();
+ void addDebugGraphics(const QColor &col);
+
// Convenience coordinates
QPointF pointByName(PointName pn);
QPointF topLeft();
virtual void reposition();
protected:
- ContainerType containerType;
+ ContainerType containerTypeInt;
bool overlay;
#include "debuginfo.h"
+
#include <QCoreApplication>
#include <QDir>
#include <QFont>
#include <QStyleFactory>
#include <QTranslator>
+#include "buildinfo.h"
+#include "git.h"
#include "settings.h"
extern bool usingDarkTheme;
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);
void ExportBase::init()
{
+ blockMapChangedDuringExport = false;
indentPerDepth = " ";
exportName = "unnamed";
lastCommand = "";
dirPath = defaultDirPath;
}
+void ExportBase::setBlockMapChangedDuringExport(bool b)
+{
+ blockMapChangedDuringExport = b;
+}
+
void ExportBase::setupTmpDir()
{
bool ok;
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);
return false;
}
}
+#endif
dirPath = fn.left(fn.lastIndexOf("/"));
filePath = fn;
return true;
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) {
ExportBase(VymModel *m);
virtual ~ExportBase();
virtual void init();
+ virtual void setBlockMapChangedDuringExport(bool b);
virtual void setupTmpDir();
virtual void setDirPath(const QString &);
virtual QString getDirPath();
protected:
VymModel *model;
+ bool blockMapChangedDuringExport; // block changing map in chained exports
QString exportName;
QString lastCommand;
virtual QString getSectionString(TreeItem *);
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\">▶ Note</button>\n"
+ "<div class=\"vym-note-collapsible\"><div class=\"vym-note\">\n" +
+ n +
+ "\n</div></div>\n";
}
return s;
}
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;
}
// 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=\""
ts << " usemap='#imagemap'></center>\n";
offset =
model->exportImage(dirPath + "/" + mapName + ".png", false, "PNG");
+
+ setBlockMapChangedDuringExport(false);
}
// Include table of contents
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 = '▶ Note';\n"
+ " } else {\n"
+ " content.style.maxHeight = content.scrollHeight + 'px';\n"
+ " this.innerHTML = '▼ Note';\n"
+ " }\n"
+ " });\n"
+ " }\n"
+ "})();\n"
+ "</script>\n";
ts << "</body></html>";
file.close();
// 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;
QString FindControlsWidget::getFindText() { return findcombo->currentText(); }
+bool FindControlsWidget::getSearchNotes() { return filterNotesButton->isChecked(); }
+
void FindControlsWidget::nextPressed()
{
if (findcombo->count() < findcombo->maxCount())
FindControlsWidget(QWidget *parent = nullptr);
QString getFindText();
+ bool getSearchNotes();
public slots:
void nextPressed();
QString FindResultWidget::getFindText() { return findControlsWidget->getFindText(); }
+bool FindResultWidget::getSearchNotes()
+{
+ return findControlsWidget->getSearchNotes();
+}
+
FindResultModel *FindResultWidget::getResultModel() { return resultsModel; }
void FindResultWidget::popup()
void addItem(TreeItem *ti);
void addItem(const QString &s);
QString getFindText();
+ bool getSearchNotes();
public slots:
void popup();
void FlagContainer::init()
{
avis = true;
- containerType = FlagCont;
+ setContainerType(FlagCont);
//setPen(QPen(Qt::green));
}
{
// qDebug() << "Const FlagRowContainer ()";
// setPen(QPen(Qt::red));
- containerType = FlagRowCont;
+ setContainerType(FlagRowCont);
layoutInt = Horizontal;
horizontalDirection = LeftToRight;
horizontalAlignmentInt = HorAlignedCentered;
}
// 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;
FlagContainer *FlagRowContainer::findFlagContainerByUid(const QUuid &uid)
{
- foreach (QGraphicsItem *child, childItems()) {
+ foreach (QGraphicsItem *child, childContainers()) {
FlagContainer* fc = (FlagContainer*) child;
if (fc->getUuid() == uid)
return fc;
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();
void FrameContainer::init()
{
- containerType = Frame;
+ setContainerType(Frame);
frameTypeInt = NoFrame;
clear();
framePen.setColor(Qt::black);
--- /dev/null
+#define GIT_BRANCH "develop"
+#define GIT_COMMIT_HASH "410a3541"
--- /dev/null
+#define GIT_BRANCH "${GIT_BRANCH}"
+#define GIT_COMMIT_HASH "${GIT_COMMIT_HASH}"
void HeadingContainer::init()
{
- containerType = Container::Heading;
+ setContainerType(Container::Heading);
headingInt.setText(" ");
headingColorInt = QColor(Qt::black);
void HeadingContainer::reposition()
{
- // qdbg() << ind() << "HC::reposition " + info();
+ // My rectangle is defined above in setText()
return;
}
HistoryWindow::HistoryWindow(QWidget *parent) : QDialog(parent)
{
+ modelIdInt = 0;
+
ui.setupUi(this);
ui.historyTable->setRowCount(
settings.value("/history/stepsTotal", 75).toInt());
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);
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);
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()));
}
HistoryWindow(QWidget *parent = 0);
~HistoryWindow();
void setFocus();
- void update(SimpleSettings &);
+ void update(uint modelId, SimpleSettings &);
void setStepsTotal(int);
protected:
void windowClosed();
private:
+ Ui::HistoryWindow ui;
+
+ uint modelIdInt;
void clearRow(int);
void updateRow(int, int, SimpleSettings &);
- Ui::HistoryWindow ui;
};
#endif
void ImageContainer::init()
{
- containerType = Image;
+ setContainerType(Image);
originalFilenameInt = "";
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.";
*/
// 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();
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()) {
{
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
itemList.clear();
- currentIndex = -1;
deepLevelsFirstInt = false;
+ reset();
+}
+
+void ItemListWrapper::reset()
+{
+ currentIndex = -1;
}
void ItemListWrapper::setModeBranches(bool deepLevelsFirst)
void init();
public slots:
+ void reset();
Q_INVOKABLE void setModeBranches(bool deepLevelsFirst = false);
Q_INVOKABLE void setModeSelectedBranches();
Q_INVOKABLE void setModeSelectedSubtrees(bool deepLevelsFirst = false);
void LinkContainer::init()
{
- containerType = Link;
+ setContainerType(Link);
}
void LinkContainer::addLink(LinkObj *lo)
}
}
-void LinkObj::setLinkColorHint(ColorHint hint)
-{
- colorHint = hint;
-}
-
-LinkObj::ColorHint LinkObj::linkColorHint()
-{
- return colorHint;
-}
-
LinkObj::ColorHint LinkObj::linkColorHint(const QString &s)
{
if (s == "HeadingColor")
static Style styleFromString(const QString &);
static QString styleString(int);
- void setLinkColorHint(ColorHint);
- ColorHint linkColorHint();
static ColorHint linkColorHint(const QString &);
static QString linkColorHintName(ColorHint);
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
#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"
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();
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) {
// 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();
// 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);
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"));
// Allows a (test-)script to make vym quit after script execution
exitAfterScriptInt = false;
- backgroundZipProcesses = 0;
- closeAfterLastZipProcess = false;
+ exitAfterLastMapClosed = false;
}
Main::~Main()
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()
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);
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");
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);
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);
//
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);
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);
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");
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"));
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);
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;
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;
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;
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;
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;
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
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
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;
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()));
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()));
a = new QAction(QPixmap(":/flag-note.svg"), n, this);
a->setCheckable(true);
- toggleWindowsMenu->addAction(a);
connect(a, SIGNAL(triggered()), this, SLOT(toggleNoteEditor()));
actionViewToggleNoteEditor = a;
//
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;
// 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;
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;
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);
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();
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;
// 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"));
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);
branchAddContextMenu->addAction(actionPaste);
branchAddContextMenu->addAction(actionLoadImage);
branchAddContextMenu->addAction(actionAddMapCenter);
+ branchAddContextMenu->addSeparator();
branchAddContextMenu->addAction(actionAddBranch);
branchAddContextMenu->addAction(actionAddBranchBefore);
branchAddContextMenu->addAction(actionAddBranchAbove);
return nullptr;
}
-VymModel *Main::getModel(uint id) // Used in BugAgent
+VymModel *Main::modelWithId(uint id) // Used in BugAgent
{
if (id <= 0)
return nullptr;
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)
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();
}
}
}
-void Main::backgroundZipStarted()
-{
- backgroundZipProcesses++;
-}
-
-void Main::backgroundZipFinished()
-{
- backgroundZipProcesses--;
- if (closeAfterLastZipProcess)
- fileExitVYM();
-}
-
bool Main::fileLoad(QString fn, const File::LoadMode &lmode,
const File::FileType &ftype)
{
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;
}
statusBar()->showMessage("Loading " + fn + " failed!");
int cur = tabWidget->currentIndex();
tabWidget->setCurrentIndex(tabWidget->count() - 1);
- fileCloseMap();
+ fileCloseCurrentMap();
tabWidget->setCurrentIndex(cur);
return false;
}
// Finally check for errors and go home
if (!noError) {
if (lmode == File::NewMap)
- fileCloseMap();
+ fileCloseCurrentMap();
statusBar()->showMessage("Could not load " + fn);
}
else {
}
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));
}
}
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();
// We have no filepath yet,
// call fileSaveAs() now, this will call fileSave()
// again. First switch to editor
- fileSaveAs(savemode);
+ fileSaveAs();
return; // avoid saving twice...
}
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);
}
}
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()
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()
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);
}
fd.setAcceptMode(QFileDialog::AcceptOpen);
if (!bi->vymLink().isEmpty())
fd.selectFile(bi->vymLink());
- fd.show();
if (fd.exec() == QDialog::Accepted &&
!fd.selectedFiles().isEmpty()) {
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()
{
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);
}
}
}
{
MapEditor *me = currentMapEditor();
if (me)
- me->setViewCenterTarget();
+ me->setViewCenterSelection();
}
void Main::viewZoomIn()
*/
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);
actionSettingsUseAnimation->isChecked());
}
-void Main::settingsToggleDownloads() { downloadsEnabled(true); }
+void Main::settingsToggleDownloads() { vymDownloadsEnabled(true); }
bool Main::settingsConfluence()
{
// 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();
{
scriptOutput->parentWidget()->show();
actionViewToggleScriptOutput->setChecked(true);
- // Currently ScriptEditor gets focus, when output is toggled
- // scriptOutput->setFocus();
focusScriptEditor();
}
void Main::toggleScriptOutput()
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)
scriptEngine = nullptr;
if (exitAfterScriptInt)
- fileExitVYM();
+ fileExitVym();
return scriptResult;
}
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;
QString page;
if (agent->isSuccess()) {
if (loadStringFromDisk(agent->getDestination(), page)) {
+ page.replace("<!-- VYMVERSION -->", " (" + vymVersion + ")");
ShowTextDialog dia(this);
dia.setText(page);
dia.exec();
else
userTriggered = false;
- if (downloadsEnabled()) {
+ if (vymDownloadsEnabled()) {
if (userTriggered ||
versionLowerThanVym(
settings.value("/downloads/releaseNotes/shownVersion", "0.0.1")
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>"
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) {
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))
// 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();
}
}
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);
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:
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();
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:
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();
void editAddBranchBelow();
void editImportAdd();
void editImportReplace();
- void editSaveBranch();
+ void editSaveSelection();
void editDeleteKeepChildren();
void editDeleteChildren();
void editDeleteSelection();
void toggleProperty();
void focusHeadingEditor();
void toggleHeadingEditor();
- void updateHistory(SimpleSettings &);
+ void updateHistory(VymModel*, SimpleSettings &);
void toggleAntiAlias();
bool isAliased();
bool hasSmoothPixmapTransform();
void helpDebugInfo();
void helpAbout();
void helpAboutQT();
+ void helpVymDevelopment();
+ void helpVymDevelopmentFinished();
void callMacro();
void downloadReleaseNotesFinished();
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);
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
QList <QColor> quickColors;
QMenu *toolbarsMenu;
- QMenu *toggleWindowsMenu;
QMenu *focusWindowsMenu;
QMenu *branchAddContextMenu;
QAction *actionDeleteChildren;
QAction *actionImportAdd;
QAction *actionImportReplace;
- QAction *actionSaveBranch;
+ QAction *actionSaveSelection;
QAction *actionLoadImage;
QAction *actionGrowSelectionSize;
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()));
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
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(
// 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();
foreach (Container *c, animatedContainers) {
c->animate();
- if (c->getContainerType() == Container::Branch)
+ if (c->containerType() == Container::Branch)
((BranchContainer*)c)->updateUpLink();
if (!c->isAnimated())
}
if (!animatedContainers.isEmpty())
- animationTimer->start(animationInterval);
+ animationTimer->start(settings.value("/animation/snapback/interval", 15).toInt());
model->repositionXLinks();
}
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))
zoomAnimation.setStartValue(zoomFactorInt);
zoomAnimation.setEndValue(zft);
zoomAnimation.start();
- qDebug() << __func__ << zft;
}
else
setZoomFactor(zft);
viewCenter = mapToScene(viewport()->geometry()).boundingRect().center();
- //qDebug() << __func__ << "zft=" << zft << "rot=" << at;
+ // qDebug() << __func__ << " p=" << toS(p) << " zft=" << zft << "rot=" << at;
stopViewAnimations();
}
}
-void MapEditor::setViewCenterTarget()
+void MapEditor::setViewCenterSelection()
{
// qDebug() << __func__;
QList <TreeItem*> seltis = model->getSelectedItems();
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
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;
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;
}
// 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)
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()) {
}
} // 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
// 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);
}
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));
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());
}
foreach(ImageContainer *ic, tmpParentContainer->childImages()) {
+ ic->setMovingState(SelectableContainer::NotMoving);
ImageItem *ii = ic->getImageItem();
BranchItem *pi = ii->parentBranch();
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;
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
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);
void ScriptEditor::saveSlide()
{
- VymModel *vm = mainWindow->getModel(vymModelID);
+ VymModel *vm = mainWindow->modelWithId(vymModelID);
if (!vm) {
QMessageBox::warning(
0, tr("Warning"),
#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()
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
QString text();
void append(const QString &text);
+ public slots:
+ void closeWindow();
+
private:
QTextEdit *editor;
QVBoxLayout *layout;
/////////////////////////////////////////////////////////////////
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))
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");
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;
}
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);
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);
#include <QPrinter>
#include <QStatusBar>
#include <QToolBar>
+#include <QToolButton>
#include "file.h"
#include "mainwindow.h"
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;
qDebug() << " RTBG=" << colorRichTextBackground.name();
*/
- // Toolbars
- setupFileActions();
- setupEditActions();
- setupFormatActions();
- setupSettingsActions();
-
- restoreState(settings.value(n + "state", 0).toByteArray());
-
fileNameInt = "";
fixedFontInt = fixedFont;
varFontInt = varFont;
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);
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";
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(
mb.exec();
if (mb.clickedButton() != overwriteButton) return;
}
+#endif
fileNameInt = fn;
void TextEditor::textSize(const QString &p) { editor->setFontPointSize(p.toInt()); }
+void TextEditor::useTextFGColor()
+{
+ editor->setTextColor( colorRichTextForeground);
+}
+
void TextEditor::selectTextFGColor()
{
QColor col = QColorDialog::getColor(
if (!col.isValid())
return;
editor->setTextColor(col);
+ colorFGChanged(col);
+ colorRichTextForeground = col;
+}
+
+void TextEditor::useTextBGColor()
+{
+ editor->setTextBackgroundColor(colorRichTextBackground);
}
void TextEditor::selectTextBGColor()
QColorDialog::ShowAlphaChannel);
if (!col.isValid())
return;
+
+ colorRichTextBackground = col;
+ colorBGChanged(col);
editor->setTextBackgroundColor(col);
}
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;
painter.drawRect(0,110,128,128);
painter.end();
- actionTextFGColor->setIcon(QPixmap::fromImage(image));
+ actionUseTextFGColor->setIcon(QPixmap::fromImage(image));
}
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)
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());
}
void TextEditor::setState(EditorState s)
{
- // qDebug() << "TE::setState" << s << editorName;
+ // qDebug() << "TE::setState" << s;
QPalette p = qApp->palette();
QColor baseColor;
state = 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();
QPixmap pix(16, 16);
pix.fill(colorRichTextEditorBackground);
actionActiveEditorBGColor->setIcon(pix);
+
+ // Update color
+ setState(state);
}
void TextEditor::selectRichTextForegroundColor()
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);
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();
*actionRichTextBGColor;
QAction
- *actionTextFGColor,
- *actionTextBGColor,
+ *actionUseTextFGColor,
+ *actionSelectTextFGColor,
+ *actionUseTextBGColor,
+ *actionSelectTextBGColor,
*actionTextBold, *actionTextUnderline, *actionTextItalic,
*actionAlignSubScript, *actionAlignSuperScript,
*actionAlignLeft, *actionAlignCenter, *actionAlignRight,
// 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!
}
{
if (!imagesContainer) {
createImagesContainer();
-
imagesContainer->setParentItem(this); // Different for BranchItem!
}
void TreeEditor::closeWindow()
{
- qDebug() << __func__;
// Close *all* TreeEditors in each VymView and update vym settings
mainWindow->setTreeEditorsVisibility(false);
}
#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
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
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());
}
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;
}
}
mainWindow->selectQuickColor(n);
}
-uint VymWrapper::currentMapID()
+uint VymWrapper::currentMapId()
{
uint r = mainWindow->currentMapId();
mainWindow->setScriptResult(r);
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);
hideMode = TreeItem::HideNone;
// Animation in MapEditor
- zoomFactor = 1;
- mapRotationInt = 0;
+ viewZoomFactorInt = 1;
+ viewRotationInt = 0;
animDuration = 2000;
animCurve = QEasingCurve::OutQuint;
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)
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);
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;
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;
}
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));
}
}
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);
}
zipAgent->deleteLater();
zipAgent = nullptr;
+
+ // qDebug() << "VM::" << __func__ << path << name;
} else
logWarning("zipAgent == nullptr", __func__);
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)
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,
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));
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;
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()) {
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
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;
}
undoSet.setValue("/history/curStep", QString::number(curStep));
undoSet.writeSettings(histPath);
- mainWindow->updateHistory(undoSet);
+ mainWindow->updateHistory(this, undoSet);
updateActions();
undoSet.setValue("/history/curStep", QString::number(curStep));
undoSet.writeSettings(histPath);
- mainWindow->updateHistory(undoSet);
+ mainWindow->updateHistory(this, undoSet);
updateActions();
}
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)
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?
// 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);
}
*/
- mainWindow->updateHistory(undoSet);
+ mainWindow->updateHistory(this, undoSet);
setChanged();
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__);
{
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);
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();
if (bc->frameType(useInnerFrame) == t)
continue;
- setFrameAutoDesign(useInnerFrame, false, selbi);
QString uif = toS(useInnerFrame);
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);
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();
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);
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);
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);
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;
logAction(r, c, __func__);
saveState(u, r, c);
emitDataChanged(bi);
+
+ if (mapEditor)
+ mapEditor->stopContainerAnimations();
+
reposition();
return true;
}
saveState(u, r, c);
emitDataChanged(bi);
+ if (mapEditor)
+ mapEditor->stopContainerAnimations();
+
reposition();
return true;
}
}
}
updateActions();
+
+ if (mapEditor)
+ mapEditor->stopContainerAnimations();
+
reposition();
}
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", "")
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";
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)
{
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;
}
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;
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++) {
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();
}
selPen.setColor(col);
mapDesignInt->setSelectionPen(selPen);
vymView->updateColors();
+ updateSelection(selModel->selection(), QItemSelection());
}
QColor VymModel::getSelectionPenColor() {
selPen.setWidth(w);
mapDesignInt->setSelectionPen(selPen);
vymView->updateColors();
+ updateSelection(selModel->selection(), QItemSelection());
}
qreal VymModel::getSelectionPenWidth() {
selBrush.setColor(col);
mapDesignInt->setSelectionBrush(selBrush);
vymView->updateColors();
+ updateSelection(selModel->selection(), QItemSelection());
}
QColor VymModel::getSelectionBrushColor() {
void VymModel::emitShowSelection(bool scaled, bool rotated)
{
- //qDebug() << "VM::" << __func__ << "scaled=" << scaled << "rotated=" << rotated;
if (!repositionBlocked)
emit showSelection(scaled, rotated);
}
////////////////////////////////////////////
// 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)
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();
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
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;
SlideModel *slideModel;
bool blockSlideSelection;
+ public:
////////////////////////////////////////////
// Logfile related
////////////////////////////////////////////
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);
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))
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;
}
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); }
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)
{
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);
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();
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();
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;
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>
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);
}
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")
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"))
}
qreal r;
- a = "mapZoomFactor";
+ a = "viewZoomFactor";
s = xml.attributes().value(a).toString();
if (!s.isEmpty()) {
r = s.toDouble(&ok);
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);
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();
// Set all frame parameters via model
model->setFrameAutoDesign(useInnerFrame, true, lastBranch);
else {
+ bc->setFrameAutoDesign(useInnerFrame, false);
+
a = "frameType";
s = attributeToString(a);
if (s.isEmpty())
// 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())
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)));
"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
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)
static bool checkUnzipTool();
void setBackgroundProcess(bool);
- void startZip();
+ bool startZip();
void startUnzip();
QDir zipDir();
QString zipName();
+++ /dev/null
-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;
-}
-
font-family:arial,
sans-serif;
align:center;
- background-color:#ffffff;
+ background-color:$MapBackgroundColor;
}
a, a:visited, a:link, a:active {
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;
}
];
tests = all_tests;
-// tests = ["modify_branches"];
+//tests = ["saving"];
var verbosity = 0;
*/
if (vym.loadMap(currentMapPath)) {
- let id = vym.currentMapID();
+ let id = vym.currentMapId();
if (verbosity > 0)
vym.print("# Loaded " + currentMapPath + " (id: " + id + " original: " + mapPath + ")");
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}");
}
}
mapName = "test-saveSelection.vyp";
fn = testDir + "/" + mapName;
+ map.setSaveAsBackgroundProcess(false);
ok = map.saveSelection(fn);
expect("Saved selection successfully to '" + fn + "'", ok, true);
end
if @vym.loadMap (@currentMapPath)
- id = @vym.currentMapID
+ id = @vym.currentMapId
puts "# Loaded #{mapPath} -> #{@currentMapPath} (id: #{id})".light_black
return @vym.map (id)
end
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
end
if @vym.loadMap (@currentMapPath)
- id = @vym.currentMapID
+ id = @vym.currentMapId
puts "# Loaded #{mapPath} -> #{@currentMapPath} (id: #{id})".blue
return @vym.map (id)
end
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
--- /dev/null
+icons/classic/edit-delete.svg icons/edit-delete.pdf
--- /dev/null
+<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>
\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 }
}
\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
\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}
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
\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
\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}
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}
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
(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
\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}
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}
\$ 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