Added Support for ignored files

Better handling when refreshing workspaces with lots of files



FossilOrigin-Name: f038928c484d177fbe86bee4cd689d8a7d1e3eeb
This commit is contained in:
kostas 2011-10-06 13:02:09 +00:00
parent ee6a90530e
commit 3387439c2c
9 changed files with 300 additions and 213 deletions

View File

@ -13,6 +13,7 @@
#include <QInputDialog>
#include "CommitDialog.h"
#include "FileActionDialog.h"
#include <QDebug>
#define SILENT_STATUS true
#define COUNTOF(array) (sizeof(array)/sizeof(array[0]))
@ -50,7 +51,7 @@ static QStringList QuotePaths(const QStringList &paths)
//-----------------------------------------------------------------------------
typedef QMap<QString, QString> 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; i<list.count(); ++i)
{
QFileInfo info = list[i];
QString filename = info.fileName();
QString filepath = info.filePath();
QString rel_path = filepath;
rel_path.remove(baseDir+"/");
// Skip ignored files
if(!ignoreSpec.isEmpty() && QDir::match(ignoreSpec, rel_path))
continue;
if (info.isDir())
{
// recursive
if (info.fileName()!=".." && info.fileName()!=".")
{
RecurseDirectory(entries, filepath, baseDir);
}
if(!scanDirectory(entries, filepath, baseDir, ignoreSpec))
return false;
}
else
{
entries.push_back(info);
}
}
return true;
}
//------------------------------------------------------------------------------
@ -355,6 +362,7 @@ bool MainWindow::refresh()
return true;
}
loadFossilSettings();
scanWorkspace();
setStatus("");
enableActions(true);
@ -381,13 +389,24 @@ void MainWindow::scanWorkspace()
bool scan_files = ui->actionViewUnknown->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<COUNTOF(maps); ++m)
for(Settings::mappings_t::iterator it=settings.Mappings.begin(); it!=settings.Mappings.end(); ++it)
{
if(!kv.contains(maps[m].command))
const QString &name = it.key();
if(!kv.contains(name))
continue;
QString value = kv[maps[m].command];
if(value.indexOf("(global)") != -1)
QString value = kv[name];
if(value.indexOf("(global)") != -1 || value.indexOf("(local)") != -1)
{
int i = value.indexOf(" ");
Q_ASSERT(i!=-1);
*maps[m].value = value.mid(i).trimmed();
Q_ASSERT(it.value());
value = value.mid(i).trimmed();
// Remove quotes if any
if(value.length()>=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; m<COUNTOF(maps); ++m)
const QString &name = it.key();
QString *value = it.value();
Q_ASSERT(value);
if(value->isEmpty())
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;
}

View File

@ -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<QString, RepoFile> filemap_t;
filemap_t workspaceFiles;
};
#endif // MAINWINDOW_H

View File

@ -116,6 +116,7 @@
<addaction name="actionViewModified"/>
<addaction name="actionViewUnchanged"/>
<addaction name="actionViewUnknown"/>
<addaction name="actionViewIgnored"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuView"/>
@ -497,6 +498,14 @@
<string>Unknown</string>
</property>
</action>
<action name="actionViewIgnored">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Ignored</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>

View File

@ -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()

View File

@ -2,6 +2,7 @@
#define SETTINGSDIALOG_H
#include <QDialog>
#include <QMap>
namespace Ui {
class SettingsDialog;
@ -12,6 +13,17 @@ struct Settings
QString fossilPath;
QString gDiffCommand;
QString gMergeCommand;
QString ignoreGlob;
typedef QMap<QString, QString *> mappings_t;
mappings_t Mappings;
Settings()
{
Mappings.insert("gdiff-command", &gDiffCommand);
Mappings.insert("gmerge-command", &gMergeCommand);
Mappings.insert("ignore-glob", &ignoreGlob);
}
};

View File

@ -1,158 +1,167 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SettingsDialog</class>
<widget class="QDialog" name="SettingsDialog">
<property name="windowModality">
<enum>Qt::WindowModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>520</width>
<height>150</height>
</rect>
</property>
<property name="windowTitle">
<string>Settings</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Fossil Path</string>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="lineFossilPath"/>
</item>
<item>
<widget class="QPushButton" name="btnSelectFossil">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Graphical Diff </string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Graphical Merge</string>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLineEdit" name="lineGMergeCommand"/>
</item>
<item>
<widget class="QPushButton" name="btnSelectGMerge">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="lineGDiffCommand"/>
</item>
<item>
<widget class="QPushButton" name="btnSelectFossilGDiff">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
<zorder>buttonBox</zorder>
<zorder>label_2</zorder>
<zorder>label_3</zorder>
<zorder>label</zorder>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>SettingsDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>SettingsDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SettingsDialog</class>
<widget class="QDialog" name="SettingsDialog">
<property name="windowModality">
<enum>Qt::WindowModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>544</width>
<height>160</height>
</rect>
</property>
<property name="windowTitle">
<string>Settings</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Fossil Path</string>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="lineFossilPath"/>
</item>
<item>
<widget class="QPushButton" name="btnSelectFossil">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Graphical Diff </string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="lineGDiffCommand"/>
</item>
<item>
<widget class="QPushButton" name="btnSelectFossilGDiff">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Graphical Merge</string>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLineEdit" name="lineGMergeCommand"/>
</item>
<item>
<widget class="QPushButton" name="btnSelectGMerge">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Ignore List</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="lineIgnore"/>
</item>
<item row="4" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
<zorder>buttonBox</zorder>
<zorder>label_2</zorder>
<zorder>label_3</zorder>
<zorder>label</zorder>
<zorder>label_4</zorder>
<zorder>lineIgnore</zorder>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>SettingsDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>SettingsDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -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

View File

@ -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

View File

@ -1 +1 @@
165842900a857fa07fa58f43f309b79065ecc42c
f038928c484d177fbe86bee4cd689d8a7d1e3eeb