From f3622f729ccbcdf56b7fd5204b00f34427987211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Wed, 19 Mar 2014 19:34:20 +0100 Subject: [PATCH] GUI: Added DATADIR setting. Related with #5513 --- gui/gui.pro | 3 --- gui/gui.qrc | 19 ------------------- gui/main.cpp | 23 +++++++++++++++-------- gui/mainwindow.cpp | 22 ++++++++++------------ gui/projectfiledialog.cpp | 11 ++++++++--- gui/translationhandler.cpp | 21 +++++++++++++++++---- 6 files changed, 50 insertions(+), 49 deletions(-) diff --git a/gui/gui.pro b/gui/gui.pro index 85e3ff06f..880b5c782 100644 --- a/gui/gui.pro +++ b/gui/gui.pro @@ -40,9 +40,6 @@ win32 { } } -# Generate the translations before we embed them -system("lrelease gui.pro") - RESOURCES = gui.qrc FORMS = about.ui \ application.ui \ diff --git a/gui/gui.qrc b/gui/gui.qrc index 35c3167d4..c6d12b84c 100644 --- a/gui/gui.qrc +++ b/gui/gui.qrc @@ -26,24 +26,5 @@ images/go-previous.png images/applications-development.png images/applications-system.png - - ../cfg/gtk.cfg - ../cfg/qt.cfg - ../cfg/posix.cfg - ../cfg/std.cfg - ../cfg/windows.cfg - - cppcheck_de.qm - cppcheck_es.qm - cppcheck_fi.qm - cppcheck_fr.qm - cppcheck_it.qm - cppcheck_ja.qm - cppcheck_ko.qm - cppcheck_nl.qm - cppcheck_ru.qm - cppcheck_sr.qm - cppcheck_sv.qm - cppcheck_zh_CN.qm diff --git a/gui/main.cpp b/gui/main.cpp index b34d46d98..7f5ce2219 100644 --- a/gui/main.cpp +++ b/gui/main.cpp @@ -37,7 +37,7 @@ void ShowUsage(); void ShowVersion(); -bool CheckArgs(const QStringList &args); +bool CheckArgs(const QStringList &args, QSettings * const settings); int main(int argc, char *argv[]) { @@ -58,7 +58,7 @@ int main(int argc, char *argv[]) QSettings* settings = new QSettings("Cppcheck", "Cppcheck-GUI", &app); th->SetLanguage(settings->value(SETTINGS_LANGUAGE, th->SuggestLanguage()).toString()); - if (!CheckArgs(app.arguments())) + if (!CheckArgs(app.arguments(), settings)) return 0; app.setWindowIcon(QIcon(":icon.png")); @@ -73,7 +73,7 @@ int main(int argc, char *argv[]) // Check only arguments needing action before GUI is shown. // Rest of the arguments are handled in MainWindow::HandleCLIParams() -bool CheckArgs(const QStringList &args) +bool CheckArgs(const QStringList &args, QSettings * const settings) { if (args.contains("-h") || args.contains("--help")) { ShowUsage(); @@ -83,6 +83,12 @@ bool CheckArgs(const QStringList &args) ShowVersion(); return false; } + foreach(const QString arg, args) { + if (arg.startsWith("--data-dir=")) { + settings->setValue("DATADIR", arg.mid(11)); + return false; + } + } return true; } @@ -93,11 +99,12 @@ void ShowUsage() "Syntax:\n" " cppcheck-gui [OPTIONS] [files or paths]\n\n" "Options:\n" - " -h, --help Print this help\n" - " -p Open given project file and start checking it\n" - " -l Open given results xml file\n" - " -d Specify the directory that was checked to generate the results xml specified with -l\n" - " -v, --version Show program version"); + " -h, --help Print this help\n" + " -p Open given project file and start checking it\n" + " -l Open given results xml file\n" + " -d Specify the directory that was checked to generate the results xml specified with -l\n" + " -v, --version Show program version\n" + " --data-dir= Specify directory where GUI datafiles are located (translations, cfg)"); #if defined(_WIN32) QMessageBox msgBox(QMessageBox::Information, MainWindow::tr("Cppcheck GUI - Command line parameters"), diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 6ba9c1397..482ef76ca 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -523,20 +523,18 @@ bool MainWindow::LoadLibrary(Library *library, QString filename) } // Try to load the library from the application folder.. - QString path = QFileInfo(QCoreApplication::applicationFilePath()).canonicalPath(); - if (library->load(NULL, (path+"/"+filename).toLatin1())) + const QString appPath = QFileInfo(QCoreApplication::applicationFilePath()).canonicalPath(); + if (library->load(NULL, (appPath+"/"+filename).toLatin1())) + return true; + if (library->load(NULL, (appPath+"/cfg/"+filename).toLatin1())) return true; // Try to load the library from the cfg subfolder.. - path = path + "/cfg"; - if (library->load(NULL, (path+"/"+filename).toLatin1())) - return true; - - // Try to load resource.. - QFile f(":/cfg/" + filename); - if (f.open(QIODevice::ReadOnly | QIODevice::Text)) { - QString data = f.readAll(); - if (library->loadxmldata(data.toLatin1(), data.length())) + const QString datadir = mSettings->value("DATADIR", QString()).toString(); + if (!datadir.isEmpty()) { + if (library->load(NULL, (datadir+"/"+filename).toLatin1())) + return true; + if (library->load(NULL, (datadir+"/cfg/"+filename).toLatin1())) return true; } @@ -613,7 +611,7 @@ Settings MainWindow::GetCppcheckSettings() posix = LoadLibrary(&result.library, "posix.cfg"); if (!std || !posix) - QMessageBox::warning(this, tr("Error"), tr("Failed to load %1. Your Cppcheck installation is broken.").arg(!std ? "std.cfg" : "posix.cfg")); + QMessageBox::warning(this, tr("Error"), tr("Failed to load %1. Your Cppcheck installation is broken. You can use --data-dir= at the command line to specify where this file is located.").arg(!std ? "std.cfg" : "posix.cfg")); if (result._jobs <= 1) { result._jobs = 1; diff --git a/gui/projectfiledialog.cpp b/gui/projectfiledialog.cpp index e8565faf8..24307be14 100644 --- a/gui/projectfiledialog.cpp +++ b/gui/projectfiledialog.cpp @@ -46,10 +46,15 @@ ProjectFileDialog::ProjectFileDialog(const QString &path, QWidget *parent) // Checkboxes for the libraries.. const QString applicationFilePath = QCoreApplication::applicationFilePath(); const QString appPath = QFileInfo(applicationFilePath).canonicalPath(); - const QString searchPaths[] = { ":/cfg", appPath, appPath + "/cfg", inf.canonicalPath() }; + QSettings settings; + const QString datadir = settings.value("DATADIR",QString()).toString(); + QStringList searchPaths; + searchPaths << appPath << appPath + "/cfg" << inf.canonicalPath(); + if (!datadir.isEmpty()) + searchPaths << datadir << datadir + "/cfg"; QStringList libs; - for (int i = 0; i < sizeof(searchPaths) / sizeof(searchPaths[0]); i++) { - QDir dir(searchPaths[i]); + foreach(const QString sp, searchPaths) { + QDir dir(sp); dir.setSorting(QDir::Name); dir.setNameFilters(QStringList("*.cfg")); dir.setFilter(QDir::Files | QDir::NoDotAndDotDot); diff --git a/gui/translationhandler.cpp b/gui/translationhandler.cpp index 86eb294eb..97ed15067 100644 --- a/gui/translationhandler.cpp +++ b/gui/translationhandler.cpp @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include "translationhandler.h" // Provide own translations for standard buttons. This (garbage) code is needed to enforce them to appear in .ts files even after "lupdate gui.pro" @@ -97,11 +99,22 @@ bool TranslationHandler::SetLanguage(const QString &code) mTranslator = new QTranslator(this); //Load the new language - QString translationFile = "lang/" + mTranslations[index].mFilename; + const QString appPath = QFileInfo(QCoreApplication::applicationFilePath()).canonicalPath(); - if (!QFile::exists(translationFile + ".qm")) { - translationFile = ":/" + mTranslations[index].mFilename; - } + QSettings settings; + QString datadir = settings.value("DATADIR").toString(); + if (datadir.isEmpty()) + datadir = appPath; + + QString translationFile; + if (QFile::exists(datadir + "/lang/" + mTranslations[index].mFilename + ".qm")) + translationFile = datadir + "/lang/" + mTranslations[index].mFilename + ".qm"; + + else if (QFile::exists(datadir + "/" + mTranslations[index].mFilename + ".qm")) + translationFile = datadir + "/" + mTranslations[index].mFilename + ".qm"; + + else + translationFile = appPath + "/" + mTranslations[index].mFilename + ".qm"; if (!mTranslator->load(translationFile) && !failure) { translationFile += ".qm";