Merge pull request #559 from ispyisail/fix/554-resolve-data-paths-from-binary

Fix language (and data paths) when opening a .qet by double-click on Windows
This commit is contained in:
Laurent Trinques
2026-07-26 15:00:55 +02:00
committed by GitHub
3 changed files with 56 additions and 5 deletions
+46 -3
View File
@@ -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