From 54ca948fae58c086271cdfb11ac0777599b41dae Mon Sep 17 00:00:00 2001 From: kostas Date: Thu, 4 Aug 2011 15:52:07 +0000 Subject: [PATCH] Implemented CommitAction, DeleteAction, RevertAction, NewRepository, OpenRepository New Action: Open containing folder New filetypes ADDED, DELETED We now detect invalid or outdated repositories FossilOrigin-Name: 2ac3cf9717f3529f809ffde1e802295988dfda05 --- MainWindow.cpp | 389 +++++++++++++++++++++++++++++++++++++--------- MainWindow.h | 41 +++-- MainWindow.ui | 42 ++++- RepoDialog.cpp | 14 ++ RepoDialog.h | 22 +++ RepoDialog.ui | 91 +++++++++++ manifest | 23 +-- manifest.uuid | 2 +- qtfossil.pro | 12 +- qtfossil.pro.user | 2 +- 10 files changed, 532 insertions(+), 106 deletions(-) create mode 100644 RepoDialog.cpp create mode 100644 RepoDialog.h create mode 100644 RepoDialog.ui diff --git a/MainWindow.cpp b/MainWindow.cpp index 5bf2ce3..502d71a 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -6,9 +6,20 @@ #include #include #include +#include +#include +#include +#include #include "CommitDialog.h" #include "FileActionDialog.h" +#define SILENT_STATUS true +#define COUNTOF(array) (sizeof(array)/sizeof(array[0])) + +#define DEV_SETTINGS + + + enum { COLUMN_STATUS, @@ -18,6 +29,20 @@ enum COLUMN_MODIFIED }; +static QString QuotePath(const QString &path) +{ + return path; +} + +static QStringList QuotePaths(const QStringList &paths) +{ + QStringList res; + for(int i=0; isetupUi(this); ui->tableView->setModel(&itemModel); + itemModel.setHorizontalHeaderLabels(QStringList() << tr("S") << tr("Path") << tr("File") << tr("Ext") << tr("Modified") ); + ui->tableView->addAction(ui->actionDiff); ui->tableView->addAction(ui->actionHistory); ui->tableView->addAction(ui->actionOpenFile); + ui->tableView->addAction(ui->actionOpenContaining); ui->tableView->addAction(ui->actionAdd); ui->tableView->addAction(ui->actionDelete); ui->tableView->addAction(ui->actionRename); + statusLabel = new QLabel(); + statusLabel->setMinimumSize( statusLabel->sizeHint() ); + ui->statusBar->addWidget( statusLabel, 1 ); + settingsFile = QDir::homePath() + QDir::separator() + ".fuelrc"; currentWorkspace = 0; - loadSettings(); +#ifdef DEV_SETTINGS if(workspaces.empty()) - workspaces.append("/home/kostas/tmp/cheesy-fos"); + workspaces.append("/home/kostas/tmp/testfossil"); + + fossilPath = "fossil"; +#else + loadSettings(); +#endif refresh(); } @@ -46,7 +83,9 @@ MainWindow::MainWindow(QWidget *parent) : MainWindow::~MainWindow() { stopUI(); +#ifndef DEV_SETTINGS saveSettings(); +#endif delete ui; } @@ -59,11 +98,12 @@ void MainWindow::on_actionRefresh_triggered() //------------------------------------------------------------------------------ void MainWindow::on_actionOpen_triggered() { - QString path = QFileDialog::getExistingDirectory (this, tr("Fossil Checkout")); + QString path = QFileDialog::getExistingDirectory(this, tr("Fossil Checkout")); if(!path.isNull()) { workspaces.append(path); currentWorkspace = workspaces.size()-1; + on_actionClearLog_triggered(); refresh(); } } @@ -94,12 +134,58 @@ static void RecurseDirectory(QFileInfoList &entries, const QString& dirPath, con } } +//------------------------------------------------------------------------------ +void MainWindow::enableActions(bool on) +{ + ui->actionCommit->setEnabled(on); + ui->actionDiff->setEnabled(on); + ui->actionAdd->setEnabled(on); + ui->actionDelete->setEnabled(on); + ui->actionPush->setEnabled(on); + ui->actionPull->setEnabled(on); + ui->actionRename->setEnabled(on); + ui->actionHistory->setEnabled(on); + ui->actionFossilUI->setEnabled(on); + ui->actionRevert->setEnabled(on); + ui->actionTimeline->setEnabled(on); + ui->actionOpenFile->setEnabled(on); + ui->actionOpenContaining->setEnabled(on); +} //------------------------------------------------------------------------------ void MainWindow::refresh() { // Load repository info - updateStatus(); + RepoStatus st = getRepoStatus(); + if(st==REPO_NOT_FOUND) + { + setStatus(tr("No checkout detected.")); + enableActions(false); + itemModel.removeRows(0, itemModel.rowCount()); + return; + } + else if(st==REPO_OLD_SCHEMA) + { + setStatus(tr("Old fossil schema detected. Consider running rebuild.")); + enableActions(false); + itemModel.removeRows(0, itemModel.rowCount()); + return; + } + + scanWorkspace(); + setStatus(""); + enableActions(true); + + QString title = "Fuel"; + if(!projectName.isEmpty()) + title += " - "+projectName; + + setWindowTitle(title); +} + +//------------------------------------------------------------------------------ +void MainWindow::scanWorkspace() +{ // Scan all workspace files QFileInfoList all_files; QString wkdir = getCurrentWorkspace(); @@ -109,7 +195,6 @@ void MainWindow::refresh() for(QFileInfoList::iterator it=all_files.begin(); it!=all_files.end(); ++it) { QString filename = it->fileName(); - QString qqq = it->absoluteFilePath(); // Skip fossil files if(filename == "_FOSSIL_" || (!repositoryFile.isEmpty() && it->absoluteFilePath()==repositoryFile)) @@ -122,7 +207,7 @@ void MainWindow::refresh() // Retrieve the status of files tracked by fossil QStringList res; - if(!runFossil(res, QStringList() << "ls" << "-l")) + if(!runFossil(res, QStringList() << "ls" << "-l", SILENT_STATUS)) return; for(QStringList::iterator it=res.begin(); it!=res.end(); ++it) @@ -136,6 +221,10 @@ void MainWindow::refresh() if(status_text=="EDITED") type = FileEntry::TYPE_EDITTED; + if(status_text=="ADDED") + type = FileEntry::TYPE_ADDED; + if(status_text=="DELETED") + type = FileEntry::TYPE_DELETED; else if(status_text=="UNCHANGED") type = FileEntry::TYPE_UNCHANGED; @@ -148,35 +237,39 @@ void MainWindow::refresh() } // Update the model - itemModel.clear(); - itemModel.setHorizontalHeaderLabels(QStringList() << "S" << "Path" << "File" << "Ext" << "Modified" ); + // Clear all rows (except header) + itemModel.removeRows(0, itemModel.rowCount()); + + struct { FileEntry::EntryType type; const char *tag; const char *icon; } + stats[]= + { + { FileEntry::TYPE_EDITTED, "E", ":icons/icons/Button Blank Yellow-01.png" }, + { FileEntry::TYPE_UNCHANGED, "U", ":icons/icons/Button Blank Green-01.png" }, + { FileEntry::TYPE_ADDED, "A", ":icons/icons/Button Add-01.png" }, + { FileEntry::TYPE_DELETED, "D", ":icons/icons/Button Close-01.png" }, + }; size_t i=0; for(filemap_t::iterator it = workspaceFiles.begin(); it!=workspaceFiles.end(); ++it, ++i) { const FileEntry &e = it.value(); - switch(e.getType()) - { - case FileEntry::TYPE_EDITTED: - { - QIcon modicon(":icons/icons/Button Blank Yellow-01.png"); - itemModel.setItem(i, COLUMN_STATUS, new QStandardItem(modicon, "E")); - break; - } - case FileEntry::TYPE_UNCHANGED: - { - QIcon modicon(":icons/icons/Button Blank Green-01.png"); - itemModel.setItem(i, COLUMN_STATUS, new QStandardItem(modicon, "U")); - break; - } - default: - { - QIcon modicon(":icons/icons/Button Blank Gray-01.png"); - itemModel.setItem(i, COLUMN_STATUS, new QStandardItem(modicon, "?")); - } + // Status Column + const char *tag = "?"; // Default Tag + const char *icon = ":icons/icons/Button Blank Gray-01.png"; // Default icon + + for(size_t t=0; ttableView->resizeColumnsToContents(); ui->tableView->resizeRowsToContents(); +} +//------------------------------------------------------------------------------ +MainWindow::RepoStatus MainWindow::getRepoStatus() +{ + QStringList res; + int exit_code = EXIT_FAILURE; - QString title = "Fuel"; - if(!projectName.isEmpty()) - title += " - "+projectName; + // We need to differentiate the reason why fossil has failed + // so we delay processing of the exit_code + if(!runFossil(res, QStringList() << "info", exit_code, SILENT_STATUS)) + return REPO_NOT_FOUND; - setWindowTitle(title); + bool run_ok = exit_code == EXIT_SUCCESS; + + for(QStringList::iterator it=res.begin(); it!=res.end(); ++it) + { + QStringList tokens = it->split(":"); + if(tokens.length()!=2) + continue; + QString key = tokens[0].trimmed(); + QString value = tokens[1].trimmed(); + + if(key=="fossil") + { + if(value=="incorrect repository schema version") + return REPO_OLD_SCHEMA; + else if(value=="not within an open checkout") + return REPO_NOT_FOUND; + } + + if(run_ok) + { + if(key=="project-name") + projectName = value; + else if(key=="repository") + repositoryFile = value; + } + } + + return run_ok ? REPO_OK : REPO_NOT_FOUND; +} +//------------------------------------------------------------------------------ +void MainWindow::log(const QString &text) +{ + ui->textBrowser->insertPlainText(text); + QTextCursor c = ui->textBrowser->textCursor(); + c.movePosition(QTextCursor::End); + ui->textBrowser->setTextCursor(c); } //------------------------------------------------------------------------------ -void MainWindow::Log(const QString &text) +void MainWindow::setStatus(const QString &text) { - ui->textBrowser->append(text); + Q_ASSERT(statusLabel); + statusLabel->setText(text); } + //------------------------------------------------------------------------------ void MainWindow::on_actionClearLog_triggered() { @@ -210,22 +347,32 @@ void MainWindow::on_actionClearLog_triggered() } //------------------------------------------------------------------------------ -bool MainWindow::runFossil(QStringList &result, const QStringList &args) +bool MainWindow::runFossil(QStringList &result, const QStringList &args, bool silent) { - QProcess process; + int exit_code = EXIT_FAILURE; + if(!runFossil(result, args, exit_code, silent)) + return false; + + return exit_code == EXIT_SUCCESS; +} +//------------------------------------------------------------------------------ +// Run fossil. Returns true if execution was succesfull regardless if fossil +// issued an error +bool MainWindow::runFossil(QStringList &result, const QStringList &args, int &exitCode, bool silent) +{ + QProcess process(this); process.setProcessChannelMode(QProcess::MergedChannels); - process.setWorkingDirectory(getCurrentWorkspace()); + QString wkdir = getCurrentWorkspace(); + process.setWorkingDirectory(wkdir); - QStringList rargs; - rargs << args; + if(!silent) + log("> fossil "+args.join(" ")+"\n"); - Log("> fossil "+rargs.join(" ")); - - process.start(fossilPath, rargs); + process.start(fossilPath, args); if(!process.waitForStarted()) { - Log(fossilPath + " does not exist\n"); + log("Could not start fossil executable '"+fossilPath + "''\n"); return false; } @@ -238,15 +385,25 @@ bool MainWindow::runFossil(QStringList &result, const QStringList &args) { QString line = it->trimmed(); result.append(line); - Log(line); + if(!silent) + log(line+"\n"); } - if(process.exitStatus()!=QProcess::NormalExit) + QProcess::ExitStatus es = process.exitStatus(); + + if(es!=QProcess::NormalExit) return false; - return process.exitCode() == EXIT_SUCCESS; + exitCode = process.exitCode(); + return true; } +//------------------------------------------------------------------------------ +void MainWindow::addWorkspace(const QString &dir) +{ + workspaces.append(dir); + currentWorkspace = workspaces.size()-1; +} //------------------------------------------------------------------------------ void MainWindow::loadSettings() { @@ -314,9 +471,16 @@ void MainWindow::saveSettings() } //------------------------------------------------------------------------------ -void MainWindow::getSelectionFilenames(QStringList &filenames, int includeMask) +void MainWindow::getSelectionFilenames(QStringList &filenames, int includeMask, bool allIfEmpty) { QModelIndexList selection = ui->tableView->selectionModel()->selectedIndexes(); + if(selection.empty() && allIfEmpty) + { + ui->tableView->selectAll(); + selection = ui->tableView->selectionModel()->selectedIndexes(); + ui->tableView->clearSelection(); + } + for(QModelIndexList::iterator mi_it = selection.begin(); mi_it!=selection.end(); ++mi_it) { const QModelIndex &mi = *mi_it; @@ -348,7 +512,7 @@ void MainWindow::on_actionDiff_triggered() for(QStringList::iterator it = selection.begin(); it!=selection.end(); ++it) { QStringList res; - if(!runFossil(res, QStringList() << "gdiff" << *it)) + if(!runFossil(res, QStringList() << "gdiff" << QuotePath(*it))) return; } } @@ -362,12 +526,12 @@ bool MainWindow::startUI() fossilUI.setProcessChannelMode(QProcess::MergedChannels); fossilUI.setWorkingDirectory(getCurrentWorkspace()); - Log("> fossil ui"); + log("> fossil ui\n"); fossilUI.start(fossilPath, QStringList() << "ui"); if(!fossilUI.waitForStarted()) { - Log(fossilPath + " does not exist\n"); + log(fossilPath + tr(" does not exist") +"\n"); return false; } @@ -457,32 +621,12 @@ void MainWindow::on_actionPull_triggered() runFossil(res, QStringList() << "pull"); } -//------------------------------------------------------------------------------ -void MainWindow::updateStatus() -{ - QStringList res; - if(!runFossil(res, QStringList() << "info")) - return; - - for(QStringList::iterator it=res.begin(); it!=res.end(); ++it) - { - QStringList tokens = it->split(":"); - if(tokens.length()!=2) - continue; - QString key = tokens[0].trimmed(); - QString value = tokens[1].trimmed(); - if(key=="project-name") - projectName = value; - else if(key=="repository") - repositoryFile = value; - } -} //------------------------------------------------------------------------------ void MainWindow::on_actionCommit_triggered() { QStringList modified_files; - getSelectionFilenames(modified_files, FileEntry::TYPE_EDITTED); + getSelectionFilenames(modified_files, FileEntry::TYPE_REPO_MODIFIED, true); if(modified_files.empty()) return; @@ -493,6 +637,18 @@ void MainWindow::on_actionCommit_triggered() // Do commit commitMessages.push_front(msg); + + { + QTemporaryFile comment_file; + comment_file.open(); + comment_file.write(msg.toUtf8()); + comment_file.close(); + + QStringList res; + runFossil(res, QStringList() << "commit" << "--message-file" << QuotePath(comment_file.fileName()) << QuotePaths(modified_files) ); + } + + refresh(); } //------------------------------------------------------------------------------ @@ -505,17 +661,21 @@ void MainWindow::on_actionAdd_triggered() if(selection.empty()) return; - if(!FileActionDialog::run("Add files", "The following files will be added. Are you sure?", selection, this)) + if(!FileActionDialog::run(tr("Add files"), tr("The following files will be added. Are you sure?"), selection, this)) return; // Do Add + QStringList res; + runFossil(res, QStringList() << "add" << QuotePaths(selection) ); + + refresh(); } //------------------------------------------------------------------------------ void MainWindow::on_actionDelete_triggered() { QStringList repo_files; - getSelectionFilenames(repo_files, FileEntry::TYPE_EDITTED|FileEntry::TYPE_UNCHANGED); + getSelectionFilenames(repo_files, FileEntry::TYPE_REPO); QStringList unknown_files; getSelectionFilenames(unknown_files, FileEntry::TYPE_UNKNOWN); @@ -523,24 +683,103 @@ void MainWindow::on_actionDelete_triggered() if(repo_files.empty() && unknown_files.empty()) return; - if(!FileActionDialog::run("Delete files", "The following files will be deleted. Are you sure?", repo_files+unknown_files, this)) + if(!FileActionDialog::run(tr("Delete files"), tr("The following files will be deleted. Are you sure?"), repo_files+unknown_files, this)) return; // Do Delete + QStringList res; + runFossil(res, QStringList() << "delete" << QuotePaths(repo_files) ); + refresh(); } //------------------------------------------------------------------------------ void MainWindow::on_actionRevert_triggered() { QStringList modified_files; - getSelectionFilenames(modified_files, FileEntry::TYPE_EDITTED); + getSelectionFilenames(modified_files, FileEntry::TYPE_ADDED|FileEntry::TYPE_EDITTED); if(modified_files.empty()) return; - if(!FileActionDialog::run("Revert files", "The following files will be reverted. Are you sure?", modified_files, this)) + if(!FileActionDialog::run(tr("Revert files"), tr("The following files will be reverted. Are you sure?"), modified_files, this)) return; // Do Revert + QStringList res; + runFossil(res, QStringList() << "revert" << QuotePaths(modified_files) ); + + refresh(); +} + +//------------------------------------------------------------------------------ +void MainWindow::on_actionNew_triggered() +{ + QString filter(tr("Fossil Repositories (*.fossil)")); + + QString path = QFileDialog::getSaveFileName( + this, + tr("New Fossil Repository"), + QString(), + filter, + &filter); + + if(path.isEmpty()) + return; + + if(QFile::exists(path)) + { + QMessageBox::critical(this, tr("Error"), tr("A repository file already exists.\nRepository creation aborted."), QMessageBox::Ok ); + return; + } + + QFileInfo path_info(path); + Q_ASSERT(path_info.dir().exists()); + QString wkdir = path_info.absoluteDir().absolutePath(); + addWorkspace(wkdir); + repositoryFile = path_info.absoluteFilePath(); + + // Create repo + QStringList res; + if(!runFossil(res, QStringList() << "new" << QuotePath(repositoryFile), false)) + { + QMessageBox::critical(this, tr("Error"), tr("Repository creation failed."), QMessageBox::Ok ); + return; + } + + // Open repo + if(!runFossil(res, QStringList() << "open" << QuotePath(repositoryFile), false)) + { + QMessageBox::critical(this, tr("Error"), tr("Repository checkout failed."), QMessageBox::Ok ); + return; + } + + refresh(); +} + +//------------------------------------------------------------------------------ +void MainWindow::on_actionClone_triggered() +{ + +} + + +//------------------------------------------------------------------------------ +void MainWindow::on_actionOpenContaining_triggered() +{ + QStringList selection; + getSelectionFilenames(selection); + + QString target; + + if(selection.empty()) + target = QDir::toNativeSeparators(getCurrentWorkspace()); + else + { + QFileInfo file_info(selection[0]); + target = QDir::toNativeSeparators(file_info.absoluteDir().absolutePath()); + } + + QUrl url = QUrl::fromLocalFile(target); + QDesktopServices::openUrl(url); } diff --git a/MainWindow.h b/MainWindow.h index 2c082c0..2307ee7 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -19,10 +19,14 @@ struct FileEntry { enum EntryType { - TYPE_UNKNOWN = 1<<0, - TYPE_UNCHANGED = 1<<1, - TYPE_EDITTED = 1<<2, - TYPE_ALL = TYPE_UNKNOWN|TYPE_UNCHANGED|TYPE_EDITTED + TYPE_UNKNOWN = 1<<0, + TYPE_UNCHANGED = 1<<1, + TYPE_EDITTED = 1<<2, + TYPE_ADDED = 1<<3, + TYPE_DELETED = 1<<4, + TYPE_REPO_MODIFIED = TYPE_EDITTED|TYPE_ADDED|TYPE_DELETED, + TYPE_REPO = TYPE_UNCHANGED|TYPE_REPO_MODIFIED, + TYPE_ALL = TYPE_UNKNOWN|TYPE_REPO }; void set(QFileInfo &info, EntryType type, const QString &repoPath) @@ -81,6 +85,7 @@ private: }; + class MainWindow : public QMainWindow { Q_OBJECT @@ -91,16 +96,29 @@ public: private: void refresh(); - bool runFossil(QStringList &result, const QStringList &args); + void scanWorkspace(); + bool runFossil(QStringList &result, const QStringList &args, bool silent=false); + bool runFossil(QStringList &result, const QStringList &args, int &exitCode, bool silent=false); void loadSettings(); void saveSettings(); const QString &getCurrentWorkspace() { Q_ASSERT(currentWorkspace + + + @@ -115,10 +118,10 @@ false - - + + @@ -130,11 +133,11 @@ - - - + + + @@ -149,7 +152,7 @@ - :/icons/icons/Button Add-01.png:/icons/icons/Button Add-01.png + :/icons/icons/Save-01.png:/icons/icons/Save-01.png Commit @@ -304,6 +307,33 @@ Open file + + + + :/icons/icons/Book-01.png:/icons/icons/Book-01.png + + + New Repository... + + + + + + :/icons/icons/Address Book-01.png:/icons/icons/Address Book-01.png + + + Clone Repository... + + + + + + :/icons/icons/My Documents-01.png:/icons/icons/My Documents-01.png + + + Open Containing Folder + + diff --git a/RepoDialog.cpp b/RepoDialog.cpp new file mode 100644 index 0000000..b5959da --- /dev/null +++ b/RepoDialog.cpp @@ -0,0 +1,14 @@ +#include "RepoDialog.h" +#include "ui_RepoDialog.h" + +RepoDialog::RepoDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::RepoDialog) +{ + ui->setupUi(this); +} + +RepoDialog::~RepoDialog() +{ + delete ui; +} diff --git a/RepoDialog.h b/RepoDialog.h new file mode 100644 index 0000000..163027c --- /dev/null +++ b/RepoDialog.h @@ -0,0 +1,22 @@ +#ifndef REPODIALOG_H +#define REPODIALOG_H + +#include + +namespace Ui { + class RepoDialog; +} + +class RepoDialog : public QDialog +{ + Q_OBJECT + +public: + explicit RepoDialog(QWidget *parent = 0); + ~RepoDialog(); + +private: + Ui::RepoDialog *ui; +}; + +#endif // REPODIALOG_H diff --git a/RepoDialog.ui b/RepoDialog.ui new file mode 100644 index 0000000..57413cb --- /dev/null +++ b/RepoDialog.ui @@ -0,0 +1,91 @@ + + + RepoDialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 150 + 60 + 241 + 25 + + + + + + + 30 + 70 + 181 + 17 + + + + Repository Name + + + + + + + buttonBox + accepted() + RepoDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + RepoDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/manifest b/manifest index e760dec..799cd73 100644 --- a/manifest +++ b/manifest @@ -1,14 +1,17 @@ -C Added\sCommit\sand\sFileAction\sdialogs\nSkeleton\scode\sfor\sCommit,\sAdd,\sDelete,\sRevert\sactions -D 2011-08-03T15:30:09.277 +C Implemented\sCommitAction,\sDeleteAction,\sRevertAction,\sNewRepository,\sOpenRepository\nNew\sAction:\sOpen\scontaining\sfolder\nNew\sfiletypes\sADDED,\sDELETED\nWe\snow\sdetect\sinvalid\sor\soutdated\srepositories\n +D 2011-08-04T15:52:07.126 F CommitDialog.cpp f4065a49dfaa6904ffb1ad4ebe5efd01506cf550 F CommitDialog.h c18c73998f8a925723ec1407ce75dc17a27a5ff7 F CommitDialog.ui 482961858d1e7c31745966c347b21b6318e2e7b5 F FileActionDialog.cpp 02dc244b0bcaad2021327186d5870bc408210a41 F FileActionDialog.h 6082f84f6b5d48be6104034d6dc896a9d343b613 F FileActionDialog.ui 2d7a0fa47f9555f4a4a7485feacd5bce504415a0 -F MainWindow.cpp b2fb908aefa74484a4b7f751f8ad9570b79454bb -F MainWindow.h a3fda2c06f47a831e799a441f183810e6585b9bb -F MainWindow.ui 71a58630d7a3b6af128d427a9390eadfc4fc83e3 +F MainWindow.cpp f8433657efea2e502d790b6d094891aaee1134c5 +F MainWindow.h f193166dbdafd922ba6513f16a6d12bda09a8ffc +F MainWindow.ui 6f445eb6b5d58e54050d255420b6eac005a81eeb +F RepoDialog.cpp 8f20e1511526973555c774350ec413dcecf51c9e +F RepoDialog.h a958c5f98f1e6882bf41dbdd2e4df3cb89700802 +F RepoDialog.ui 8fe9b7f7528332ca9a45e919cf116aaf144a3286 F icons/Address\sBook-01.png ef2cec80ea5a559b72e8be4a344a1869fe69cbd8 F icons/Adobe\sIllustrator\sCS3\sDocument-01.png 2e44e933d58eefee7ccfa1650fed4ceadcf3c2be F icons/Adobe\sPDF\sDocument-01.png 8a0bc3ba633d08debde748d64b5a9675e30447a3 @@ -162,10 +165,10 @@ F icons/Zoom\sIn-01.png bdd24558fd23a1003f1a569f092f22022736f236 F icons/Zoom\sOut-01.png 8eda092100d9e00c9097f43a80d1e26695947448 F icons/Zoom-01.png 67ca532922e9166325c5c75fce1ca3fbb0d2b6a6 F main.cpp f53e9e1e34f65565f06b2d37d7be5c38e2113a03 -F qtfossil.pro 728f1eec3adbcfc0e030cad1ea0867f765d9f179 -F qtfossil.pro.user 3aa11e8cc637ac9de0e6396307370f20bee7f62f +F qtfossil.pro 047d5e691c772ef110e4eaef75ddba39a0142544 +F qtfossil.pro.user 46795d72c37bdb7016c9673180cecb5264713f50 F resources.qrc e98383ed205f4e37100c60057e0129c3b86dea53 -P aea0b01c82bcd9caa71a5049c60e07ad6b3aed41 -R c84ec25e7c6ecb8c98cb5544d5a2d147 +P 9e35495cc3f4e18f458cf02f83d1d8075c0a85b9 +R 59296ed5593ab777a8dc300eeb4e43dc U kostas -Z c73d16be1ed5c7fe4f1970c96b7dab6a +Z 301a78f530bab5b00a799f65640fa487 diff --git a/manifest.uuid b/manifest.uuid index 9f43ba2..dccae18 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e35495cc3f4e18f458cf02f83d1d8075c0a85b9 \ No newline at end of file +2ac3cf9717f3529f809ffde1e802295988dfda05 \ No newline at end of file diff --git a/qtfossil.pro b/qtfossil.pro index f91daa8..9dafc84 100644 --- a/qtfossil.pro +++ b/qtfossil.pro @@ -13,15 +13,18 @@ TEMPLATE = app SOURCES += main.cpp\ MainWindow.cpp \ CommitDialog.cpp \ - FileActionDialog.cpp + FileActionDialog.cpp \ + RepoDialog.cpp HEADERS += MainWindow.h \ CommitDialog.h \ - FileActionDialog.h + FileActionDialog.h \ + RepoDialog.h FORMS += MainWindow.ui \ CommitDialog.ui \ - FileActionDialog.ui + FileActionDialog.ui \ + RepoDialog.ui RESOURCES += \ resources.qrc @@ -32,3 +35,6 @@ RESOURCES += \ + + + diff --git a/qtfossil.pro.user b/qtfossil.pro.user index eca131d..c2fc651 100644 --- a/qtfossil.pro.user +++ b/qtfossil.pro.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget