Added Support for ignored files
Better handling when refreshing workspaces with lots of files FossilOrigin-Name: f038928c484d177fbe86bee4cd689d8a7d1e3eeb
This commit is contained in:
parent
ee6a90530e
commit
3387439c2c
129
MainWindow.cpp
129
MainWindow.cpp
@ -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,9 +534,16 @@ void MainWindow::scanWorkspace()
|
||||
|
||||
}
|
||||
|
||||
// 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))
|
||||
{
|
||||
// Apply settings
|
||||
for(size_t m=0; m<COUNTOF(maps); ++m)
|
||||
{
|
||||
if(maps[m].value->isEmpty())
|
||||
runFossil(QStringList() << "unset" << maps[m].command << "-global");
|
||||
else
|
||||
runFossil(QStringList() << "settings" << maps[m].command << *maps[m].value << "-global");
|
||||
}
|
||||
}
|
||||
if(!SettingsDialog::run(this, settings))
|
||||
return;
|
||||
|
||||
// Apply settings
|
||||
for(Settings::mappings_t::iterator it=settings.Mappings.begin(); it!=settings.Mappings.end(); ++it)
|
||||
{
|
||||
const QString &name = it.key();
|
||||
QString *value = it.value();
|
||||
Q_ASSERT(value);
|
||||
|
||||
if(value->isEmpty())
|
||||
runFossil(QStringList() << "unset" << name << "-global");
|
||||
else
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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()
|
||||
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -9,8 +9,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>520</width>
|
||||
<height>150</height>
|
||||
<width>544</width>
|
||||
<height>160</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@ -20,9 +20,6 @@
|
||||
<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">
|
||||
@ -57,6 +54,26 @@
|
||||
</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">
|
||||
@ -84,7 +101,17 @@
|
||||
</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>
|
||||
@ -94,31 +121,13 @@
|
||||
</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>
|
||||
<zorder>label_4</zorder>
|
||||
<zorder>lineIgnore</zorder>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
|
4
main.cpp
4
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
|
||||
|
24
manifest
24
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
|
||||
|
@ -1 +1 @@
|
||||
165842900a857fa07fa58f43f309b79065ecc42c
|
||||
f038928c484d177fbe86bee4cd689d8a7d1e3eeb
|
Loading…
x
Reference in New Issue
Block a user