From 480bc287120f04923a01b0b0992165d9c3f32785 Mon Sep 17 00:00:00 2001 From: kostas Date: Sun, 22 Apr 2012 13:48:41 +0000 Subject: [PATCH] Added support for portable mode [Thanks Chris] Portable mode is enabled by passing the "--portable" command line option More i8n cleanups FossilOrigin-Name: 9cb380713c661f2ac8250800ef8e8b01fa9dafdc --- MainWindow.cpp | 130 +++++++++++++++++++++++++------------------------ MainWindow.h | 4 +- main.cpp | 39 ++++++++++----- manifest | 16 +++--- manifest.uuid | 2 +- 5 files changed, 106 insertions(+), 85 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index bbdf78b..c58f0ef 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -89,7 +89,7 @@ static QStringMap MakeKeyValues(QStringList lines) /////////////////////////////////////////////////////////////////////////////// -MainWindow::MainWindow(QWidget *parent, QString *workspacePath) : +MainWindow::MainWindow(QWidget *parent, QString *workspacePath, bool portableMode) : QMainWindow(parent), ui(new Ui::MainWindow) { @@ -173,6 +173,18 @@ MainWindow::MainWindow(QWidget *parent, QString *workspacePath) : #endif viewMode = VIEWMODE_TREE; + + // Go into portable mode when explicitly requested or if a config file exists next to the executable + QString ini_path = QDir::toNativeSeparators(QCoreApplication::applicationDirPath() + QDir::separator() + QCoreApplication::applicationName() + ".ini"); + if(portableMode || QFile::exists(ini_path)) + qsettings = new QSettings(ini_path, QSettings::IniFormat); + else + { + // Linux: ~/.config/organizationName/applicationName.conf + // Windows: HKEY_CURRENT_USER\Software\organizationName\Fuel + qsettings = new QSettings(QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()); + } + loadSettings(); // Apply any explicit workspace path if available @@ -193,6 +205,7 @@ MainWindow::~MainWindow() { stopUI(); saveSettings(); + delete qsettings; // Dispose RepoFiles for(filemap_t::iterator it = workspaceFiles.begin(); it!=workspaceFiles.end(); ++it) @@ -1222,24 +1235,20 @@ QString MainWindow::getFossilPath() //------------------------------------------------------------------------------ void MainWindow::loadSettings() { - // Linux: ~/.config/organizationName/applicationName.conf - // Windows: HKEY_CURRENT_USER\Software\organizationName\Fuel - QSettings qsettings(QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()); + if(qsettings->contains(FUEL_SETTING_FOSSIL_PATH)) + settings.Mappings[FUEL_SETTING_FOSSIL_PATH].Value = qsettings->value(FUEL_SETTING_FOSSIL_PATH); - if(qsettings.contains(FUEL_SETTING_FOSSIL_PATH)) - settings.Mappings[FUEL_SETTING_FOSSIL_PATH].Value = qsettings.value(FUEL_SETTING_FOSSIL_PATH); + if(qsettings->contains(FUEL_SETTING_COMMIT_MSG)) + settings.Mappings[FUEL_SETTING_COMMIT_MSG].Value = qsettings->value(FUEL_SETTING_COMMIT_MSG); - if(qsettings.contains(FUEL_SETTING_COMMIT_MSG)) - settings.Mappings[FUEL_SETTING_COMMIT_MSG].Value = qsettings.value(FUEL_SETTING_COMMIT_MSG); + if(qsettings->contains(FUEL_SETTING_FILE_DBLCLICK)) + settings.Mappings[FUEL_SETTING_FILE_DBLCLICK].Value = qsettings->value(FUEL_SETTING_FILE_DBLCLICK); - if(qsettings.contains(FUEL_SETTING_FILE_DBLCLICK)) - settings.Mappings[FUEL_SETTING_FILE_DBLCLICK].Value = qsettings.value(FUEL_SETTING_FILE_DBLCLICK); - - int num_wks = qsettings.beginReadArray("Workspaces"); + int num_wks = qsettings->beginReadArray("Workspaces"); for(int i=0; isetArrayIndex(i); + QString wk = qsettings->value("Path").toString(); // Skip invalid workspaces if(wk.isEmpty() || !QDir(wk).exists()) @@ -1247,81 +1256,79 @@ void MainWindow::loadSettings() addWorkspace(wk); - if(qsettings.contains("Active") && qsettings.value("Active").toBool()) + if(qsettings->contains("Active") && qsettings->value("Active").toBool()) setCurrentWorkspace(wk); } - qsettings.endArray(); + qsettings->endArray(); - if(qsettings.contains("WindowX") && qsettings.contains("WindowY")) + if(qsettings->contains("WindowX") && qsettings->contains("WindowY")) { QPoint _pos; - _pos.setX(qsettings.value("WindowX").toInt()); - _pos.setY(qsettings.value("WindowY").toInt()); + _pos.setX(qsettings->value("WindowX").toInt()); + _pos.setY(qsettings->value("WindowY").toInt()); move(_pos); } - if(qsettings.contains("WindowWidth") && qsettings.contains("WindowHeight")) + if(qsettings->contains("WindowWidth") && qsettings->contains("WindowHeight")) { QSize _size; - _size.setWidth(qsettings.value("WindowWidth").toInt()); - _size.setHeight(qsettings.value("WindowHeight").toInt()); + _size.setWidth(qsettings->value("WindowWidth").toInt()); + _size.setHeight(qsettings->value("WindowHeight").toInt()); resize(_size); } - if(qsettings.contains("ViewUnknown")) - ui->actionViewUnknown->setChecked(qsettings.value("ViewUnknown").toBool()); - if(qsettings.contains("ViewModified")) - ui->actionViewModified->setChecked(qsettings.value("ViewModified").toBool()); - if(qsettings.contains("ViewUnchanged")) - ui->actionViewUnchanged->setChecked(qsettings.value("ViewUnchanged").toBool()); - if(qsettings.contains("ViewIgnored")) - ui->actionViewIgnored->setChecked(qsettings.value("ViewIgnored").toBool()); - if(qsettings.contains("ViewAsList")) + if(qsettings->contains("ViewUnknown")) + ui->actionViewUnknown->setChecked(qsettings->value("ViewUnknown").toBool()); + if(qsettings->contains("ViewModified")) + ui->actionViewModified->setChecked(qsettings->value("ViewModified").toBool()); + if(qsettings->contains("ViewUnchanged")) + ui->actionViewUnchanged->setChecked(qsettings->value("ViewUnchanged").toBool()); + if(qsettings->contains("ViewIgnored")) + ui->actionViewIgnored->setChecked(qsettings->value("ViewIgnored").toBool()); + if(qsettings->contains("ViewAsList")) { - ui->actionViewAsList->setChecked(qsettings.value("ViewAsList").toBool()); - viewMode = qsettings.value("ViewAsList").toBool()? VIEWMODE_LIST : VIEWMODE_TREE; + ui->actionViewAsList->setChecked(qsettings->value("ViewAsList").toBool()); + viewMode = qsettings->value("ViewAsList").toBool()? VIEWMODE_LIST : VIEWMODE_TREE; } ui->treeView->setVisible(viewMode == VIEWMODE_TREE); - if(qsettings.contains("ViewStash")) - ui->actionViewStash->setChecked(qsettings.value("ViewStash").toBool()); + if(qsettings->contains("ViewStash")) + ui->actionViewStash->setChecked(qsettings->value("ViewStash").toBool()); ui->tableViewStash->setVisible(ui->actionViewStash->isChecked()); } //------------------------------------------------------------------------------ void MainWindow::saveSettings() { - QSettings qsettings(QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()); - // If we have a customize fossil path, save it QString fossil_path = settings.Mappings[FUEL_SETTING_FOSSIL_PATH].Value.toString(); - qsettings.setValue(FUEL_SETTING_FOSSIL_PATH, fossil_path); - qsettings.setValue(FUEL_SETTING_COMMIT_MSG, settings.Mappings[FUEL_SETTING_COMMIT_MSG].Value); - qsettings.setValue(FUEL_SETTING_FILE_DBLCLICK, settings.Mappings[FUEL_SETTING_FILE_DBLCLICK].Value); + qsettings->setValue(FUEL_SETTING_FOSSIL_PATH, fossil_path); + qsettings->setValue(FUEL_SETTING_COMMIT_MSG, settings.Mappings[FUEL_SETTING_COMMIT_MSG].Value); + qsettings->setValue(FUEL_SETTING_FILE_DBLCLICK, settings.Mappings[FUEL_SETTING_FILE_DBLCLICK].Value); - qsettings.beginWriteArray("Workspaces", workspaceHistory.size()); + qsettings->beginWriteArray("Workspaces", workspaceHistory.size()); for(int i=0; isetArrayIndex(i); + qsettings->setValue("Path", workspaceHistory[i]); if(getCurrentWorkspace() == workspaceHistory[i]) - qsettings.setValue("Active", true); + qsettings->setValue("Active", true); else - qsettings.remove("Active"); + qsettings->remove("Active"); } - qsettings.endArray(); + qsettings->endArray(); - qsettings.setValue("WindowX", x()); - qsettings.setValue("WindowY", y()); - qsettings.setValue("WindowWidth", width()); - qsettings.setValue("WindowHeight", height()); - qsettings.setValue("ViewUnknown", ui->actionViewUnknown->isChecked()); - qsettings.setValue("ViewModified", ui->actionViewModified->isChecked()); - qsettings.setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked()); - qsettings.setValue("ViewIgnored", ui->actionViewIgnored->isChecked()); - qsettings.setValue("ViewAsList", ui->actionViewAsList->isChecked()); - qsettings.setValue("ViewStash", ui->actionViewStash->isChecked()); + qsettings->setValue("WindowX", x()); + qsettings->setValue("WindowY", y()); + qsettings->setValue("WindowWidth", width()); + qsettings->setValue("WindowHeight", height()); + qsettings->setValue("ViewUnknown", ui->actionViewUnknown->isChecked()); + qsettings->setValue("ViewModified", ui->actionViewModified->isChecked()); + qsettings->setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked()); + qsettings->setValue("ViewIgnored", ui->actionViewIgnored->isChecked()); + qsettings->setValue("ViewAsList", ui->actionViewAsList->isChecked()); + qsettings->setValue("ViewStash", ui->actionViewStash->isChecked()); } //------------------------------------------------------------------------------ @@ -1479,7 +1486,7 @@ bool MainWindow::startUI() { if(uiRunning()) { - log("Fossil UI is already running\n"); + log(tr("Fossil UI is already running\n")); return true; } @@ -1488,13 +1495,13 @@ bool MainWindow::startUI() fossilUI.setWorkingDirectory(getCurrentWorkspace()); log("> fossil ui
", true); - log("Starting Fossil UI. Please wait.\n"); + log(tr("Starting Fossil UI. Please wait.\n")); QString fossil = getFossilPath(); fossilUI.start(fossil, QStringList() << "ui"); if(!fossilUI.waitForStarted() || fossilUI.state()!=QProcess::Running) { - log(fossil+ tr(" does not exist") +"\n"); + log(tr("%0 does not exist\n").arg(fossil)); ui->actionFossilUI->setChecked(false); return false; } @@ -1620,7 +1627,6 @@ void MainWindow::on_actionPull_triggered() runFossil(QStringList() << "pull"); } - //------------------------------------------------------------------------------ void MainWindow::on_actionCommit_triggered() { @@ -1800,8 +1806,6 @@ void MainWindow::on_actionRename_triggered() refresh(); } - - //------------------------------------------------------------------------------ void MainWindow::on_actionOpenContaining_triggered() { @@ -1856,7 +1860,7 @@ void MainWindow::on_actionAbout_triggered() fossil_ver = tr("Fossil version ")+res[0].mid(off) + "\n\n"; } - QMessageBox::about(this, "About Fuel...", + QMessageBox::about(this, tr("About Fuel..."), QCoreApplication::applicationName() + " "+ QCoreApplication::applicationVersion() + " " + tr("a GUI frontend to the Fossil SCM\n" "by Kostas Karanikolas\n" diff --git a/MainWindow.h b/MainWindow.h index ca327e6..7b3cacc 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -116,7 +116,7 @@ class MainWindow : public QMainWindow Q_OBJECT public: - explicit MainWindow(QWidget *parent = 0, QString *workspacePath = 0); + explicit MainWindow(QWidget *parent = 0, QString *workspacePath = 0, bool portableMode = false); ~MainWindow(); bool diffFile(QString repoFile); @@ -252,6 +252,8 @@ private: ViewMode viewMode; stringset_t selectedDirs; // The directory selected in the tree + class QSettings *qsettings; + // Repo State typedef QList filelist_t; typedef QMap filemap_t; diff --git a/main.cpp b/main.cpp index 169c39b..b287fbb 100644 --- a/main.cpp +++ b/main.cpp @@ -3,24 +3,39 @@ int main(int argc, char *argv[]) { - QApplication a(argc, argv); - a.setApplicationName("Fuel"); - a.setApplicationVersion("0.9.6"); - a.setOrganizationDomain("fuel-scm.org"); - a.setOrganizationName("Fuel-SCM"); + QApplication app(argc, argv); + app.setApplicationName("Fuel"); + app.setApplicationVersion("0.9.6"); + app.setOrganizationDomain("fuel-scm.org"); + app.setOrganizationName("Fuel-SCM"); - // Native OSX applications don't use menu icons #ifdef Q_WS_MACX + // Native OSX applications don't use menu icons a.setAttribute(Qt::AA_DontShowIconsInMenus); #endif - { + bool portable = false; QString workspace; - if(a.arguments().length()>1) - workspace = a.arguments()[1]; + + Q_ASSERT(app.arguments().size()>0); + for(int i=1; i