From 3387439c2c0256204218679022e88793b35b7e9c Mon Sep 17 00:00:00 2001 From: kostas Date: Thu, 6 Oct 2011 13:02:09 +0000 Subject: [PATCH] Added Support for ignored files Better handling when refreshing workspaces with lots of files FossilOrigin-Name: f038928c484d177fbe86bee4cd689d8a7d1e3eeb --- MainWindow.cpp | 127 ++++++++++++------ MainWindow.h | 5 + MainWindow.ui | 9 ++ SettingsDialog.cpp | 5 +- SettingsDialog.h | 12 ++ SettingsDialog.ui | 325 +++++++++++++++++++++++---------------------- main.cpp | 4 +- manifest | 24 ++-- manifest.uuid | 2 +- 9 files changed, 300 insertions(+), 213 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index e5027af..553a0b5 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -13,6 +13,7 @@ #include #include "CommitDialog.h" #include "FileActionDialog.h" +#include #define SILENT_STATUS true #define COUNTOF(array) (sizeof(array)/sizeof(array[0])) @@ -50,7 +51,7 @@ static QStringList QuotePaths(const QStringList &paths) //----------------------------------------------------------------------------- typedef QMap QStringMap; -static QStringMap MakeKeyValue(QStringList lines) +static QStringMap MakeKeyValues(QStringList lines) { QStringMap res; @@ -290,29 +291,35 @@ void MainWindow::onOpenRecent() } //------------------------------------------------------------------------------ -static void RecurseDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir) +bool MainWindow::scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec) { QDir dir(dirPath); - QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::Hidden); + setStatus(dirPath); + QCoreApplication::processEvents(); + + QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot); for (int i=0; iactionViewUnknown->isChecked(); + setStatus(tr("Scanning Workspace...")); + setEnabled(false); + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + workspaceFiles.clear(); if(scan_files) { - setStatus("Scanning Workspace..."); QCoreApplication::processEvents(); - RecurseDirectory(all_files, wkdir, wkdir); + QString ignore; + // If we should not be showing ignored files, fill in the ignored spec + if(!ui->actionViewIgnored->isChecked()) + { + // QDir expects multiple specs being separated by a semicolor + ignore = settings.ignoreGlob.replace(',',';'); + } + + scanDirectory(all_files, wkdir, wkdir, ignore); for(QFileInfoList::iterator it=all_files.begin(); it!=all_files.end(); ++it) { @@ -401,9 +420,9 @@ void MainWindow::scanWorkspace() e.set(*it, RepoFile::TYPE_UNKNOWN, wkdir); workspaceFiles.insert(e.getFilename(), e); } - setStatus(""); } - + setStatus(tr("Updating...")); + QCoreApplication::processEvents(); for(QStringList::iterator it=res.begin(); it!=res.end(); ++it) { @@ -476,6 +495,9 @@ void MainWindow::scanWorkspace() { RepoFile::TYPE_MISSING, "M", "Missing", ":icons/icons/Button Help-01.png" }, }; + size_t num_files = workspaceFiles.size(); + itemModel.insertRows(0, num_files); + size_t i=0; for(filemap_t::iterator it = workspaceFiles.begin(); it!=workspaceFiles.end(); ++it, ++i) { @@ -512,8 +534,15 @@ void MainWindow::scanWorkspace() } - ui->tableView->resizeColumnsToContents(); - ui->tableView->resizeRowsToContents(); + // Avoid expensive operations on really big datasets + if(num_files < 20000) + { + ui->tableView->resizeColumnsToContents(); + ui->tableView->resizeRowsToContents(); + } + setEnabled(true); + setStatus(""); + QApplication::restoreOverrideCursor(); } //------------------------------------------------------------------------------ MainWindow::RepoStatus MainWindow::getRepoStatus() @@ -821,6 +850,8 @@ void MainWindow::loadSettings() ui->actionViewModified->setChecked(qsettings.value("ViewModified").toBool()); if(qsettings.contains("ViewUnchanged")) ui->actionViewUnchanged->setChecked(qsettings.value("ViewUnchanged").toBool()); + if(qsettings.contains("ViewIgnored")) + ui->actionViewUnchanged->setChecked(qsettings.value("ViewIgnored").toBool()); } @@ -852,6 +883,7 @@ void MainWindow::saveSettings() qsettings.setValue("ViewUnknown", ui->actionViewUnknown->isChecked()); qsettings.setValue("ViewModified", ui->actionViewModified->isChecked()); qsettings.setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked()); + qsettings.setValue("ViewIgnored", ui->actionViewIgnored->isChecked()); } //------------------------------------------------------------------------------ @@ -1344,47 +1376,61 @@ void MainWindow::on_actionUpdate_triggered() } //------------------------------------------------------------------------------ -void MainWindow::on_actionSettings_triggered() +void MainWindow::loadFossilSettings() { // Also retrieve the fossil global settings QStringList out; if(!runFossil(QStringList() << "settings", &out, true)) return; - QStringMap kv = MakeKeyValue(out); - struct { const char *command; QString *value; } maps[] = - { - { "gdiff-command", &settings.gDiffCommand }, - { "gmerge-command", &settings.gMergeCommand } - }; + QStringMap kv = MakeKeyValues(out); - for(size_t m=0; m=2 && value.at(0)=='\"' && value.at(value.length()-1)=='\"') + value = value.mid(1, value.length()-2); + + *it.value() = value; } } +} + +//------------------------------------------------------------------------------ +void MainWindow::on_actionSettings_triggered() +{ + loadFossilSettings(); // Run the dialog - if(SettingsDialog::run(this, settings)) + if(!SettingsDialog::run(this, settings)) + return; + + // Apply settings + for(Settings::mappings_t::iterator it=settings.Mappings.begin(); it!=settings.Mappings.end(); ++it) { - // Apply settings - for(size_t m=0; misEmpty()) + runFossil(QStringList() << "unset" << name << "-global"); + else { - if(maps[m].value->isEmpty()) - runFossil(QStringList() << "unset" << maps[m].command << "-global"); - else - runFossil(QStringList() << "settings" << maps[m].command << *maps[m].value << "-global"); + runFossil(QStringList() << "settings" << name << "\"" + *value + "\"" <<"-global"); } } - } //------------------------------------------------------------------------------ @@ -1429,9 +1475,16 @@ void MainWindow::on_actionViewUnknown_triggered() refresh(); } +//------------------------------------------------------------------------------ +void MainWindow::on_actionViewIgnored_triggered() +{ + refresh(); +} + //------------------------------------------------------------------------------ QString MainWindow::getFossilHttpAddress() { return "http://127.0.0.1:"+fossilUIPort; } + diff --git a/MainWindow.h b/MainWindow.h index b1f264e..d6acd88 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -117,8 +117,10 @@ private: void addWorkspace(const QString &dir); void rebuildRecent(); bool openWorkspace(const QString &dir); + void loadFossilSettings(); QString getFossilPath(); QString getFossilHttpAddress(); + bool scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec); enum RepoStatus { @@ -163,6 +165,8 @@ private slots: void on_actionViewModified_triggered(); void on_actionViewUnknown_triggered(); + void on_actionViewIgnored_triggered(); + private: enum { @@ -187,6 +191,7 @@ private: // Repo State typedef QMap filemap_t; filemap_t workspaceFiles; + }; #endif // MAINWINDOW_H diff --git a/MainWindow.ui b/MainWindow.ui index 3d0dbf4..b9c89e7 100644 --- a/MainWindow.ui +++ b/MainWindow.ui @@ -116,6 +116,7 @@ + @@ -497,6 +498,14 @@ Unknown + + + true + + + Ignored + + diff --git a/SettingsDialog.cpp b/SettingsDialog.cpp index f214398..ffff8dd 100644 --- a/SettingsDialog.cpp +++ b/SettingsDialog.cpp @@ -19,9 +19,6 @@ static QString SelectExe(QWidget *parent, const QString &description) if(!QFile::exists(path)) return QString(); - // Quote path if it contains spaces - if(path.contains(' ')) - path = '"'+path + '"'; return path; } @@ -35,6 +32,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, Settings &_settings) : ui->lineFossilPath->setText(settings->fossilPath); ui->lineGDiffCommand->setText(settings->gDiffCommand); ui->lineGMergeCommand->setText(settings->gMergeCommand); + ui->lineIgnore->setText(settings->ignoreGlob); } //----------------------------------------------------------------------------- @@ -56,6 +54,7 @@ void SettingsDialog::on_buttonBox_accepted() settings->fossilPath = ui->lineFossilPath->text(); settings->gDiffCommand = ui->lineGDiffCommand->text(); settings->gMergeCommand = ui->lineGMergeCommand->text(); + settings->ignoreGlob = ui->lineIgnore->text(); } //----------------------------------------------------------------------------- void SettingsDialog::on_btnSelectFossil_clicked() diff --git a/SettingsDialog.h b/SettingsDialog.h index b017344..9731a07 100644 --- a/SettingsDialog.h +++ b/SettingsDialog.h @@ -2,6 +2,7 @@ #define SETTINGSDIALOG_H #include +#include namespace Ui { class SettingsDialog; @@ -12,6 +13,17 @@ struct Settings QString fossilPath; QString gDiffCommand; QString gMergeCommand; + QString ignoreGlob; + + typedef QMap mappings_t; + mappings_t Mappings; + + Settings() + { + Mappings.insert("gdiff-command", &gDiffCommand); + Mappings.insert("gmerge-command", &gMergeCommand); + Mappings.insert("ignore-glob", &ignoreGlob); + } }; diff --git a/SettingsDialog.ui b/SettingsDialog.ui index 970cec7..606e8d7 100644 --- a/SettingsDialog.ui +++ b/SettingsDialog.ui @@ -1,158 +1,167 @@ - - - SettingsDialog - - - Qt::WindowModal - - - - 0 - 0 - 520 - 150 - - - - Settings - - - true - - - - QFormLayout::AllNonFixedFieldsGrow - - - - - Fossil Path - - - - - - - - - - - - - 0 - 0 - - - - ... - - - - - - - - - Graphical Diff - - - - - - - Graphical Merge - - - - - - - - - - - - - 0 - 0 - - - - ... - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - - - - - 0 - 0 - - - - ... - - - - - - - buttonBox - label_2 - label_3 - label - - - - - buttonBox - accepted() - SettingsDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - SettingsDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - + + + SettingsDialog + + + Qt::WindowModal + + + + 0 + 0 + 544 + 160 + + + + Settings + + + true + + + + + + Fossil Path + + + + + + + + + + + + + 0 + 0 + + + + ... + + + + + + + + + Graphical Diff + + + + + + + + + + + + + 0 + 0 + + + + ... + + + + + + + + + Graphical Merge + + + + + + + + + + + + + 0 + 0 + + + + ... + + + + + + + + + Ignore List + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + buttonBox + label_2 + label_3 + label + label_4 + lineIgnore + + + + + buttonBox + accepted() + SettingsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + SettingsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/main.cpp b/main.cpp index 0ac2033..def8606 100644 --- a/main.cpp +++ b/main.cpp @@ -5,11 +5,11 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); a.setApplicationName("Fuel"); - a.setApplicationVersion("0.9.2"); + a.setApplicationVersion("0.9.4"); a.setOrganizationDomain("karanik.com"); a.setOrganizationName("Karanik"); - // Native applications on OSX don't use menu icons + // Native OSX applications don't use menu icons #ifdef Q_WS_MACX a.setAttribute(Qt::AA_DontShowIconsInMenus); #endif diff --git a/manifest b/manifest index ca103fd..6f52d13 100644 --- a/manifest +++ b/manifest @@ -1,20 +1,20 @@ -C Added\sstatus\smessage\swhen\sscanning\sfor\sworkspace\sfiles -D 2011-09-04T04:30:52.025 +C Added\sSupport\sfor\signored\sfiles\nBetter\shandling\swhen\srefreshing\sworkspaces\swith\slots\sof\sfiles\n\n +D 2011-10-06T13:02:09.111 F CommitDialog.cpp 8965e52d077c300cf1acb1b16fb2dcca5c7070f8 F CommitDialog.h a9596d99865cf312b419d01d51334ffc916f5508 F CommitDialog.ui 5067623f6af6f5a42c87df903278e383e945e154 F FileActionDialog.cpp fcaebf9986f789b3440d5390b3458ad5f86fe0c8 F FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce F FileActionDialog.ui c63644428579741aeb5fa052e237ba799ced9ad7 -F MainWindow.cpp e89d09b783fdd0dcb87703e6347cd2d6f2766f0b -F MainWindow.h cb4d2ab3c3fb3ecc26c5d162358316516090a89e -F MainWindow.ui fcce2709fd2dc332061ee72cbc5a5a17adfd0779 +F MainWindow.cpp d4bc0072c249f758aa39e9096207f904ba8dd44c +F MainWindow.h 55f90fe948661a6b7382470f3cdc80dc592e76c4 +F MainWindow.ui d22becfdb32d4b31ed9a6e6d68dd144870d9a957 F RepoDialog.cpp 8f20e1511526973555c774350ec413dcecf51c9e F RepoDialog.h a958c5f98f1e6882bf41dbdd2e4df3cb89700802 F RepoDialog.ui be7b18199c04a3003f3c7534a616cd7441b7bb0c -F SettingsDialog.cpp 638a513e765ef4268a514d679f78c8bd3f55862c -F SettingsDialog.h 9b02af204d7cf90c2fb92de50fb634fb36f179dc -F SettingsDialog.ui 9114ca5b9d8644cd0e910954c04f0425f89a960d +F SettingsDialog.cpp 4e8d12cd19c19590c68eaa3516441d21d08f0ee6 +F SettingsDialog.h c2a7828466a5459d8c08a759f0ddf3e368357e80 +F SettingsDialog.ui 292eea79612f0daa48b67436fcf812f48ff5af54 F fuel.pro 295944fd817518c7c2412c5e52ce5ecad11dd8f8 F fuel.rc 8e9ac966f283102c11a77cd7f936cdc09e09bd79 F icons/Address\sBook-01.png ef2cec80ea5a559b72e8be4a344a1869fe69cbd8 @@ -171,9 +171,9 @@ F icons/Zoom\sOut-01.png 8eda092100d9e00c9097f43a80d1e26695947448 F icons/Zoom-01.png 67ca532922e9166325c5c75fce1ca3fbb0d2b6a6 F icons/fuel.icns 81e535004b62db801a02f3e15d0a33afc9d4070b F icons/fuel.ico eb529ab3332a17b9302ef3e851db5b9ebce2a038 -F main.cpp 083845039c167badd57a4abf482dd3d5e77aab35 +F main.cpp f67a9b5c9ca0b634b19ef08e7136032372d37f93 F resources.qrc e98383ed205f4e37100c60057e0129c3b86dea53 -P 30fdcc0810046768f9635d4972026cadb1bb9dd3 -R b0543f1058270ddb516a4c0a9a543c63 +P 165842900a857fa07fa58f43f309b79065ecc42c +R a1ade7274295322c9cef6524f98c75a7 U kostas -Z 48e6b15a7648a3d3c0d67d63a64a810f +Z 0c76a29513c846b1a1375a9cab3853ad diff --git a/manifest.uuid b/manifest.uuid index 23f1f33..25656e3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -165842900a857fa07fa58f43f309b79065ecc42c \ No newline at end of file +f038928c484d177fbe86bee4cd689d8a7d1e3eeb \ No newline at end of file