diff --git a/build-aux/windows/QElectroTech.wxs b/build-aux/windows/QElectroTech.wxs index 7b0d97a18..00614b98f 100644 --- a/build-aux/windows/QElectroTech.wxs +++ b/build-aux/windows/QElectroTech.wxs @@ -97,8 +97,13 @@ + + Value=""[INSTALLDIR]bin\qelectrotech.exe" --common-elements-dir="[INSTALLDIR]elements/" --common-tbt-dir="[INSTALLDIR]titleblocks/" --lang-dir="[INSTALLDIR]lang/" $(var.QtPlatformArgs) "%1"" /> diff --git a/cmake/paths_compilation_installation.cmake b/cmake/paths_compilation_installation.cmake index 33fbc29d5..f8cf763dd 100644 --- a/cmake/paths_compilation_installation.cmake +++ b/cmake/paths_compilation_installation.cmake @@ -58,7 +58,10 @@ if(WIN32) set(QET_BINARY_PATH "./") set(QET_COMMON_COLLECTION_PATH "elements/") set(QET_COMMON_TBT_PATH "titleblocks/") - set(QET_LANG_PATH "l10n/") + # "lang/" and not "l10n/": that is where every Windows packaging actually + # puts the .qm files (see build-aux/windows/QElectroTech.wxs and the + # windows-build workflow), and what the shortcuts pass as --lang-dir. + set(QET_LANG_PATH "lang/") set(QET_LICENSE_PATH "./") # Liste des ressources Windows #RC_FILE = qelectrotech.rc diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp index adac51c54..191e820fa 100644 --- a/sources/qetapp.cpp +++ b/sources/qetapp.cpp @@ -539,6 +539,48 @@ TitleBlockTemplatesCollection *QETApp::titleBlockTemplatesCollection( return(nullptr); } +/** + @brief resolveConfiguredDataPath + Resolve a data directory baked in at compile time. + + An absolute path is returned unchanged. A relative one used to be + interpreted against the process working directory, which is only correct + when QET is started from its own installation folder: opening a document + from a file manager sets the working directory to the document's folder, + so the data was not found there. Resolve it against the executable + instead, trying the folder next to the binary and then its parent -- some + packagings put the binary in a "bin" subfolder with the data beside it + (see issue #86). + + The working-directory interpretation is still attempted first, so any + setup that relied on it keeps working. + + \~French Resout un dossier de donnees fixe a la compilation. + @param configured : the compile-time path + @return an existing directory if one is found, @a configured otherwise +*/ +static QString resolveConfiguredDataPath(const QString &configured) +{ + if (configured.isEmpty() || QDir::isAbsolutePath(configured)) { + return(configured); + } + if (QDir(configured).exists()) { + return(configured); + } + + const QString bin_dir = QCoreApplication::applicationDirPath(); + const QStringList candidates = { + QDir::cleanPath(bin_dir + "/" + configured) + "/", + QDir::cleanPath(bin_dir + "/../" + configured) + "/" + }; + for (const QString &candidate : candidates) { + if (QDir(candidate).exists()) { + return(candidate); + } + } + return(configured); +} + /** @brief QETApp::commonElementsDir @return the dir path of the common elements collection. @@ -586,7 +628,8 @@ QString QETApp::commonElementsDir() /* the compilation option represents a classic absolute * or relative path */ - m_common_element_dir = QUOTE(QET_COMMON_COLLECTION_PATH); + m_common_element_dir = + resolveConfiguredDataPath(QUOTE(QET_COMMON_COLLECTION_PATH)); return m_common_element_dir; #else /* the compilation option represents a path @@ -754,7 +797,7 @@ QString QETApp::commonTitleBlockTemplatesDir() #ifndef QET_COMMON_COLLECTION_PATH_RELATIVE_TO_BINARY_PATH // the compile-time option represents a usual path // (be it absolute or relative) - return(QUOTE(QET_COMMON_TBT_PATH)); + return(resolveConfiguredDataPath(QUOTE(QET_COMMON_TBT_PATH))); #else /* the compile-time option represents a path relative * to the directory that contains the executable binary @@ -1261,7 +1304,7 @@ QString QETApp::languagesPath() * l'option de compilation represente * un chemin absolu ou relatif classique */ - return(QUOTE(QET_LANG_PATH)); + return(resolveConfiguredDataPath(QUOTE(QET_LANG_PATH))); #else /* the compilation option represents a path relative * to the folder containing the executable binary