Added support for portable mode [Thanks Chris]

Portable mode is enabled by passing the "--portable" command line option
More i8n cleanups



FossilOrigin-Name: 9cb380713c661f2ac8250800ef8e8b01fa9dafdc
This commit is contained in:
kostas 2012-04-22 13:48:41 +00:00
parent 0cb9a9c036
commit 480bc28712
5 changed files with 106 additions and 85 deletions

View File

@ -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), QMainWindow(parent),
ui(new Ui::MainWindow) ui(new Ui::MainWindow)
{ {
@ -173,6 +173,18 @@ MainWindow::MainWindow(QWidget *parent, QString *workspacePath) :
#endif #endif
viewMode = VIEWMODE_TREE; 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(); loadSettings();
// Apply any explicit workspace path if available // Apply any explicit workspace path if available
@ -193,6 +205,7 @@ MainWindow::~MainWindow()
{ {
stopUI(); stopUI();
saveSettings(); saveSettings();
delete qsettings;
// Dispose RepoFiles // Dispose RepoFiles
for(filemap_t::iterator it = workspaceFiles.begin(); it!=workspaceFiles.end(); ++it) for(filemap_t::iterator it = workspaceFiles.begin(); it!=workspaceFiles.end(); ++it)
@ -1222,24 +1235,20 @@ QString MainWindow::getFossilPath()
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void MainWindow::loadSettings() void MainWindow::loadSettings()
{ {
// Linux: ~/.config/organizationName/applicationName.conf if(qsettings->contains(FUEL_SETTING_FOSSIL_PATH))
// Windows: HKEY_CURRENT_USER\Software\organizationName\Fuel settings.Mappings[FUEL_SETTING_FOSSIL_PATH].Value = qsettings->value(FUEL_SETTING_FOSSIL_PATH);
QSettings qsettings(QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName());
if(qsettings.contains(FUEL_SETTING_FOSSIL_PATH)) if(qsettings->contains(FUEL_SETTING_COMMIT_MSG))
settings.Mappings[FUEL_SETTING_FOSSIL_PATH].Value = qsettings.value(FUEL_SETTING_FOSSIL_PATH); settings.Mappings[FUEL_SETTING_COMMIT_MSG].Value = qsettings->value(FUEL_SETTING_COMMIT_MSG);
if(qsettings.contains(FUEL_SETTING_COMMIT_MSG)) if(qsettings->contains(FUEL_SETTING_FILE_DBLCLICK))
settings.Mappings[FUEL_SETTING_COMMIT_MSG].Value = qsettings.value(FUEL_SETTING_COMMIT_MSG); settings.Mappings[FUEL_SETTING_FILE_DBLCLICK].Value = qsettings->value(FUEL_SETTING_FILE_DBLCLICK);
if(qsettings.contains(FUEL_SETTING_FILE_DBLCLICK)) int num_wks = qsettings->beginReadArray("Workspaces");
settings.Mappings[FUEL_SETTING_FILE_DBLCLICK].Value = qsettings.value(FUEL_SETTING_FILE_DBLCLICK);
int num_wks = qsettings.beginReadArray("Workspaces");
for(int i=0; i<num_wks; ++i) for(int i=0; i<num_wks; ++i)
{ {
qsettings.setArrayIndex(i); qsettings->setArrayIndex(i);
QString wk = qsettings.value("Path").toString(); QString wk = qsettings->value("Path").toString();
// Skip invalid workspaces // Skip invalid workspaces
if(wk.isEmpty() || !QDir(wk).exists()) if(wk.isEmpty() || !QDir(wk).exists())
@ -1247,81 +1256,79 @@ void MainWindow::loadSettings()
addWorkspace(wk); addWorkspace(wk);
if(qsettings.contains("Active") && qsettings.value("Active").toBool()) if(qsettings->contains("Active") && qsettings->value("Active").toBool())
setCurrentWorkspace(wk); setCurrentWorkspace(wk);
} }
qsettings.endArray(); qsettings->endArray();
if(qsettings.contains("WindowX") && qsettings.contains("WindowY")) if(qsettings->contains("WindowX") && qsettings->contains("WindowY"))
{ {
QPoint _pos; QPoint _pos;
_pos.setX(qsettings.value("WindowX").toInt()); _pos.setX(qsettings->value("WindowX").toInt());
_pos.setY(qsettings.value("WindowY").toInt()); _pos.setY(qsettings->value("WindowY").toInt());
move(_pos); move(_pos);
} }
if(qsettings.contains("WindowWidth") && qsettings.contains("WindowHeight")) if(qsettings->contains("WindowWidth") && qsettings->contains("WindowHeight"))
{ {
QSize _size; QSize _size;
_size.setWidth(qsettings.value("WindowWidth").toInt()); _size.setWidth(qsettings->value("WindowWidth").toInt());
_size.setHeight(qsettings.value("WindowHeight").toInt()); _size.setHeight(qsettings->value("WindowHeight").toInt());
resize(_size); resize(_size);
} }
if(qsettings.contains("ViewUnknown")) if(qsettings->contains("ViewUnknown"))
ui->actionViewUnknown->setChecked(qsettings.value("ViewUnknown").toBool()); ui->actionViewUnknown->setChecked(qsettings->value("ViewUnknown").toBool());
if(qsettings.contains("ViewModified")) if(qsettings->contains("ViewModified"))
ui->actionViewModified->setChecked(qsettings.value("ViewModified").toBool()); ui->actionViewModified->setChecked(qsettings->value("ViewModified").toBool());
if(qsettings.contains("ViewUnchanged")) if(qsettings->contains("ViewUnchanged"))
ui->actionViewUnchanged->setChecked(qsettings.value("ViewUnchanged").toBool()); ui->actionViewUnchanged->setChecked(qsettings->value("ViewUnchanged").toBool());
if(qsettings.contains("ViewIgnored")) if(qsettings->contains("ViewIgnored"))
ui->actionViewIgnored->setChecked(qsettings.value("ViewIgnored").toBool()); ui->actionViewIgnored->setChecked(qsettings->value("ViewIgnored").toBool());
if(qsettings.contains("ViewAsList")) if(qsettings->contains("ViewAsList"))
{ {
ui->actionViewAsList->setChecked(qsettings.value("ViewAsList").toBool()); ui->actionViewAsList->setChecked(qsettings->value("ViewAsList").toBool());
viewMode = qsettings.value("ViewAsList").toBool()? VIEWMODE_LIST : VIEWMODE_TREE; viewMode = qsettings->value("ViewAsList").toBool()? VIEWMODE_LIST : VIEWMODE_TREE;
} }
ui->treeView->setVisible(viewMode == VIEWMODE_TREE); ui->treeView->setVisible(viewMode == VIEWMODE_TREE);
if(qsettings.contains("ViewStash")) if(qsettings->contains("ViewStash"))
ui->actionViewStash->setChecked(qsettings.value("ViewStash").toBool()); ui->actionViewStash->setChecked(qsettings->value("ViewStash").toBool());
ui->tableViewStash->setVisible(ui->actionViewStash->isChecked()); ui->tableViewStash->setVisible(ui->actionViewStash->isChecked());
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void MainWindow::saveSettings() void MainWindow::saveSettings()
{ {
QSettings qsettings(QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName());
// If we have a customize fossil path, save it // If we have a customize fossil path, save it
QString fossil_path = settings.Mappings[FUEL_SETTING_FOSSIL_PATH].Value.toString(); QString fossil_path = settings.Mappings[FUEL_SETTING_FOSSIL_PATH].Value.toString();
qsettings.setValue(FUEL_SETTING_FOSSIL_PATH, fossil_path); 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_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_FILE_DBLCLICK, settings.Mappings[FUEL_SETTING_FILE_DBLCLICK].Value);
qsettings.beginWriteArray("Workspaces", workspaceHistory.size()); qsettings->beginWriteArray("Workspaces", workspaceHistory.size());
for(int i=0; i<workspaceHistory.size(); ++i) for(int i=0; i<workspaceHistory.size(); ++i)
{ {
qsettings.setArrayIndex(i); qsettings->setArrayIndex(i);
qsettings.setValue("Path", workspaceHistory[i]); qsettings->setValue("Path", workspaceHistory[i]);
if(getCurrentWorkspace() == workspaceHistory[i]) if(getCurrentWorkspace() == workspaceHistory[i])
qsettings.setValue("Active", true); qsettings->setValue("Active", true);
else else
qsettings.remove("Active"); qsettings->remove("Active");
} }
qsettings.endArray(); qsettings->endArray();
qsettings.setValue("WindowX", x()); qsettings->setValue("WindowX", x());
qsettings.setValue("WindowY", y()); qsettings->setValue("WindowY", y());
qsettings.setValue("WindowWidth", width()); qsettings->setValue("WindowWidth", width());
qsettings.setValue("WindowHeight", height()); qsettings->setValue("WindowHeight", height());
qsettings.setValue("ViewUnknown", ui->actionViewUnknown->isChecked()); qsettings->setValue("ViewUnknown", ui->actionViewUnknown->isChecked());
qsettings.setValue("ViewModified", ui->actionViewModified->isChecked()); qsettings->setValue("ViewModified", ui->actionViewModified->isChecked());
qsettings.setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked()); qsettings->setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked());
qsettings.setValue("ViewIgnored", ui->actionViewIgnored->isChecked()); qsettings->setValue("ViewIgnored", ui->actionViewIgnored->isChecked());
qsettings.setValue("ViewAsList", ui->actionViewAsList->isChecked()); qsettings->setValue("ViewAsList", ui->actionViewAsList->isChecked());
qsettings.setValue("ViewStash", ui->actionViewStash->isChecked()); qsettings->setValue("ViewStash", ui->actionViewStash->isChecked());
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -1479,7 +1486,7 @@ bool MainWindow::startUI()
{ {
if(uiRunning()) if(uiRunning())
{ {
log("Fossil UI is already running\n"); log(tr("Fossil UI is already running\n"));
return true; return true;
} }
@ -1488,13 +1495,13 @@ bool MainWindow::startUI()
fossilUI.setWorkingDirectory(getCurrentWorkspace()); fossilUI.setWorkingDirectory(getCurrentWorkspace());
log("<b>&gt; fossil ui</b><br>", true); log("<b>&gt; fossil ui</b><br>", true);
log("Starting Fossil UI. Please wait.\n"); log(tr("Starting Fossil UI. Please wait.\n"));
QString fossil = getFossilPath(); QString fossil = getFossilPath();
fossilUI.start(fossil, QStringList() << "ui"); fossilUI.start(fossil, QStringList() << "ui");
if(!fossilUI.waitForStarted() || fossilUI.state()!=QProcess::Running) 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); ui->actionFossilUI->setChecked(false);
return false; return false;
} }
@ -1620,7 +1627,6 @@ void MainWindow::on_actionPull_triggered()
runFossil(QStringList() << "pull"); runFossil(QStringList() << "pull");
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void MainWindow::on_actionCommit_triggered() void MainWindow::on_actionCommit_triggered()
{ {
@ -1800,8 +1806,6 @@ void MainWindow::on_actionRename_triggered()
refresh(); refresh();
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void MainWindow::on_actionOpenContaining_triggered() 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"; 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() + " " + QCoreApplication::applicationName() + " "+ QCoreApplication::applicationVersion() + " " +
tr("a GUI frontend to the Fossil SCM\n" tr("a GUI frontend to the Fossil SCM\n"
"by Kostas Karanikolas\n" "by Kostas Karanikolas\n"

View File

@ -116,7 +116,7 @@ class MainWindow : public QMainWindow
Q_OBJECT Q_OBJECT
public: public:
explicit MainWindow(QWidget *parent = 0, QString *workspacePath = 0); explicit MainWindow(QWidget *parent = 0, QString *workspacePath = 0, bool portableMode = false);
~MainWindow(); ~MainWindow();
bool diffFile(QString repoFile); bool diffFile(QString repoFile);
@ -252,6 +252,8 @@ private:
ViewMode viewMode; ViewMode viewMode;
stringset_t selectedDirs; // The directory selected in the tree stringset_t selectedDirs; // The directory selected in the tree
class QSettings *qsettings;
// Repo State // Repo State
typedef QList<RepoFile*> filelist_t; typedef QList<RepoFile*> filelist_t;
typedef QMap<QString, RepoFile*> filemap_t; typedef QMap<QString, RepoFile*> filemap_t;

View File

@ -3,24 +3,39 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication app(argc, argv);
a.setApplicationName("Fuel"); app.setApplicationName("Fuel");
a.setApplicationVersion("0.9.6"); app.setApplicationVersion("0.9.6");
a.setOrganizationDomain("fuel-scm.org"); app.setOrganizationDomain("fuel-scm.org");
a.setOrganizationName("Fuel-SCM"); app.setOrganizationName("Fuel-SCM");
// Native OSX applications don't use menu icons
#ifdef Q_WS_MACX #ifdef Q_WS_MACX
// Native OSX applications don't use menu icons
a.setAttribute(Qt::AA_DontShowIconsInMenus); a.setAttribute(Qt::AA_DontShowIconsInMenus);
#endif #endif
{ {
bool portable = false;
QString workspace; QString workspace;
if(a.arguments().length()>1)
workspace = a.arguments()[1]; Q_ASSERT(app.arguments().size()>0);
for(int i=1; i<app.arguments().size(); ++i)
{
QString arg = app.arguments()[i];
// Parse options
if(arg.indexOf("--")!=-1)
{
if(arg.indexOf("portable")!=-1)
portable = true;
continue;
}
else
workspace = arg;
}
MainWindow w(0, &workspace); MainWindow mainwin(0,
w.show(); workspace.isEmpty() ? 0 : &workspace,
return a.exec(); portable);
mainwin.show();
return app.exec();
} }
} }

View File

@ -1,5 +1,5 @@
C Fixed\scrash\son\sWindows\nMinor\scleanups\sfor\si8n\n C Added\ssupport\sfor\sportable\smode\s[Thanks\sChris]\nPortable\smode\sis\senabled\sby\spassing\sthe\s"--portable"\scommand\sline\soption\nMore\si8n\scleanups\n\n
D 2012-04-22T12:54:59.393 D 2012-04-22T13:48:41.757
F CommitDialog.cpp a46020a9361151d8d286a2670257d01d8967bf69 F CommitDialog.cpp a46020a9361151d8d286a2670257d01d8967bf69
F CommitDialog.h f1ee8db92103164e7db55a8407ccdcff24571b72 F CommitDialog.h f1ee8db92103164e7db55a8407ccdcff24571b72
F CommitDialog.ui 813d7cba316e226de1a22b7e480bb969fbe9b0c4 F CommitDialog.ui 813d7cba316e226de1a22b7e480bb969fbe9b0c4
@ -8,8 +8,8 @@ F FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce
F FileActionDialog.ui c63644428579741aeb5fa052e237ba799ced9ad7 F FileActionDialog.ui c63644428579741aeb5fa052e237ba799ced9ad7
F FileTableView.cpp 5ddf8c391c9a3ac449ec61fb1db837b577afeec2 F FileTableView.cpp 5ddf8c391c9a3ac449ec61fb1db837b577afeec2
F FileTableView.h 03e56d87c2d46411b9762b87f4d301619aaf18df F FileTableView.h 03e56d87c2d46411b9762b87f4d301619aaf18df
F MainWindow.cpp 44316f743a465506a2aad86dc52c3f7875927e7a F MainWindow.cpp 1ae55ca0a760c44ee33a73f35cb10e95a5c92172
F MainWindow.h 1f6d8db9cf25a89fbbb1e0b33cc63a0e43cfe7ff F MainWindow.h 3360113c938bee4b181f1bdc4953a09e60a0e1ed
F MainWindow.ui 6c12a0b141b86c6994d5835618acba19a9ff1976 F MainWindow.ui 6c12a0b141b86c6994d5835618acba19a9ff1976
F SettingsDialog.cpp e1fad18cc020d08b82c6d35dc94f6624deec9a3b F SettingsDialog.cpp e1fad18cc020d08b82c6d35dc94f6624deec9a3b
F SettingsDialog.h f5da6cab4ccc82e2eb78ec835fb849c4c104d6cc F SettingsDialog.h f5da6cab4ccc82e2eb78ec835fb849c4c104d6cc
@ -174,9 +174,9 @@ F icons/fuel.icns 81e535004b62db801a02f3e15d0a33afc9d4070b
F icons/fuel.ico eb529ab3332a17b9302ef3e851db5b9ebce2a038 F icons/fuel.ico eb529ab3332a17b9302ef3e851db5b9ebce2a038
F installer/fuel.iss 13b6a938bcdf273cbd3649d2549887baa1577214 F installer/fuel.iss 13b6a938bcdf273cbd3649d2549887baa1577214
F installer/license.txt 4cc77b90af91e615a64ae04893fdffa7939db84c F installer/license.txt 4cc77b90af91e615a64ae04893fdffa7939db84c
F main.cpp 69c1f9e873c016ef466d20298a67c3bc4c2b2f3a F main.cpp 3741082d40973584d7c9ecddb58721000d6a7f8e
F resources.qrc e98383ed205f4e37100c60057e0129c3b86dea53 F resources.qrc e98383ed205f4e37100c60057e0129c3b86dea53
P b8a055ccf8ebc9e80120ea76ec6db5c95706a10c P 2efeff4cc821f149dbfb010c2de6d2e36945efa4
R 1c96f8a9e18378890cda05cc358b8d05 R 587b49ca5c6114db2276f46c88d8e4a5
U kostas U kostas
Z ee05f83c5f2294a8a6db0a8f4727be4b Z 807e808714a0c7db7d78ffaf0e1621b4

View File

@ -1 +1 @@
2efeff4cc821f149dbfb010c2de6d2e36945efa4 9cb380713c661f2ac8250800ef8e8b01fa9dafdc