diff --git a/MainWindow.cpp b/MainWindow.cpp new file mode 100644 index 0000000..06e8dbb --- /dev/null +++ b/MainWindow.cpp @@ -0,0 +1,257 @@ +#include "MainWindow.h" +#include "ui_MainWindow.h" +#include +#include +#include +#include + + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + ui->tableView->setModel(&itemModel); + ui->tableView->addAction(ui->actionAdd); + ui->tableView->addAction(ui->actionDelete); + ui->tableView->addAction(ui->actionRename); + ui->tableView->addAction(ui->actionHistory); + ui->tableView->addAction(ui->actionDiff); + + settingsFile = QApplication::applicationDirPath().left(1) + ":/qfossil.ini"; + currentWorkspace = 0; + loadSettings(); + + if(workspaces.empty()) + workspaces.append("/home/kostas/tmp/cheesy-fos"); + + if(fossilPath.isEmpty()) + fossilPath = "fossil"; + +// fossilPath = "/home/kostas/local/bin/fossil"; +// repoPath = ; + refresh(); +} + +MainWindow::~MainWindow() +{ + saveSettings(); + delete ui; +} + +void MainWindow::on_actionRefresh_triggered() +{ + refresh(); +} + +void MainWindow::on_actionOpen_triggered() +{ + QString path = QFileDialog::getExistingDirectory (this, tr("Fossil Checkout")); + if(!path.isNull()) + { + workspaces.append(path); + currentWorkspace = workspaces.size()-1; + refresh(); + } + +} + +void RecurseDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir) +{ + QDir dir(dirPath); + + QFileInfoList list = dir.entryInfoList(QDir::AllEntries); + for (int i=0; ifileName()== "_FOSSIL_") + continue; + + FileEntry e; + e.status = FileEntry::STATUS_UNKNOWN; + e.fileinfo = *it; + e.filename = e.getRelativeFilename(wkdir); + workspaceFiles.insert(e.filename, e); + } + + for(QStringList::iterator it=res.begin(); it!=res.end(); ++it) + { + QString line = (*it).trimmed(); + if(line.length()==0) + continue; + + QString status_text = line.left(10).trimmed(); + FileEntry::Status status = FileEntry::STATUS_UNKNOWN; + + if(status_text=="EDITED") + status = FileEntry::STATUS_EDITTED; + else if(status_text=="UNCHANGED") + status = FileEntry::STATUS_UNCHAGED; + + QString fname = line.right(line.length() - 10).trimmed(); + + filemap_t::iterator it = workspaceFiles.find(fname); + Q_ASSERT(it!=workspaceFiles.end()); + + it.value().status = status; + } + + itemModel.clear(); + itemModel.setHorizontalHeaderLabels(QStringList() << "Status" << "File" << "Ext" ); + + size_t i=0; + for(filemap_t::iterator it = workspaceFiles.begin(); it!=workspaceFiles.end(); ++it, ++i) + { + const FileEntry &e = it.value(); + switch(e.status) + { + case FileEntry::STATUS_EDITTED: + { + QIcon modicon(":icons/icons/Button-Blank-Yellow-icon.png"); + itemModel.setItem(i, 0, new QStandardItem(modicon, "Edited")); + break; + } + case FileEntry::STATUS_UNCHAGED: + { + QIcon modicon(":icons/icons/Button-Blank-Green-icon.png"); + itemModel.setItem(i, 0, new QStandardItem(modicon, "Unchanged")); + break; + } + default: + { + QIcon modicon(":icons/icons/Button-Blank-Gray-icon.png"); + itemModel.setItem(i, 0, new QStandardItem(modicon, "Unknown")); + } + + } + + itemModel.setItem(i, 1, new QStandardItem(e.filename)); + itemModel.setItem(i, 2, new QStandardItem( e.fileinfo.completeSuffix())); + + } + ui->tableView->resizeColumnsToContents(); + ui->tableView->resizeRowsToContents(); +} + +bool MainWindow::runFossil(QStringList &result, const QStringList &args) +{ + QProcess process; + + process.setProcessChannelMode(QProcess::MergedChannels); + process.setWorkingDirectory(getCurrentWorkspace()); + + QStringList rargs; + rargs << args; + + ui->textBrowser->append("fossil "+rargs.join(" ")); + + process.start(fossilPath, rargs); + if(!process.waitForStarted()) + { + ui->textBrowser->append(fossilPath + " does not exist\n"); + return false; + } + + process.waitForFinished(); + + QString output = process.readAllStandardOutput(); + + QStringList lines = output.split('\n'); + + for(QStringList::iterator it=lines.begin(); it!=lines.end(); ++it) + { + QString &line = *it; + result.append(line.trimmed()); + ui->textBrowser->append( line.trimmed()); + } + + return true; +} + +void MainWindow::on_tableView_customContextMenuRequested(const QPoint &pos) +{ + QModelIndex idx = ui->tableView->indexAt(pos); + if(!idx.isValid()) + return; + + QMenu *menu = new QMenu; + menu->addAction("Diff"); + menu->addSeparator(); + menu->addAction("Add"); + menu->addAction("Delete"); + menu->addSeparator(); + menu->addAction("Commit"); + menu->exec(pos); + + // QMen +} + +void MainWindow::loadSettings() +{ + QSettings settings(settingsFile, QSettings::NativeFormat); + + bool ok=false; + + fossilPath = settings.value("FossilPath").toString(); + if(fossilPath.isEmpty()) + fossilPath = "fossil"; + + int num_repos = settings.value("NumWorkspaces").toInt(&ok); + if(!ok) + num_repos=0; + + for(int i=0; i +#include +#include +#include +#include +#include +namespace Ui { + class MainWindow; +} + +class QStringList; + +struct FileEntry +{ + enum Status + { + STATUS_UNKNOWN, + STATUS_UNCHAGED, + STATUS_EDITTED + }; + + QFileInfo fileinfo; + Status status; + QString filename; + + QString getRelativeFilename(const QString &path) + { + QString abs_base_dir = QDir(path).absolutePath(); + + QString relative = fileinfo.absoluteFilePath(); + int index = relative.indexOf(abs_base_dir); + if(index<0) + return QString(""); + + return relative.right(relative.length() - abs_base_dir.length()-1); + } +}; + + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + +private: + void refresh(); + bool runFossil(QStringList &result, const QStringList &args); + void loadSettings(); + void saveSettings(); + const QString &getCurrentWorkspace() { Q_ASSERT(currentWorkspace filemap_t; + filemap_t workspaceFiles; + int currentWorkspace; +}; + +#endif // MAINWINDOW_H diff --git a/MainWindow.ui b/MainWindow.ui new file mode 100644 index 0000000..3646c00 --- /dev/null +++ b/MainWindow.ui @@ -0,0 +1,271 @@ + + + MainWindow + + + + 0 + 0 + 865 + 640 + + + + QFossil + + + + + 4 + + + + + Qt::Vertical + + + + + 0 + 80 + + + + Qt::ActionsContextMenu + + + QFrame::StyledPanel + + + QFrame::Sunken + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::SelectRows + + + false + + + true + + + true + + + false + + + 30 + + + + + + 0 + 20 + + + + + + + + + + + 0 + 0 + 865 + 27 + + + + + File + + + + + + + + + + + + 32 + 32 + + + + Qt::ToolButtonFollowStyle + + + false + + + TopToolBarArea + + + false + + + + + + + + + + + + + + + + + + + + + + + :/icons/icons/Button-Refresh-icon.png:/icons/icons/Button-Refresh-icon.png + + + Refresh + + + + + + :/icons/icons/Button-Add-icon.png:/icons/icons/Button-Add-icon.png + + + Commit + + + + + + :/icons/icons/Document-Copy-icon.png:/icons/icons/Document-Copy-icon.png + + + Diff + + + + + + :/icons/icons/File-New-icon.png:/icons/icons/File-New-icon.png + + + Add + + + + + + :/icons/icons/File-Delete-icon.png:/icons/icons/File-Delete-icon.png + + + Delete + + + + + Open workspace... + + + + + + :/icons/icons/Button-Upload-icon.png:/icons/icons/Button-Upload-icon.png + + + Push + + + + + + :/icons/icons/Button-Download-icon.png:/icons/icons/Button-Download-icon.png + + + Pull + + + + + + :/icons/icons/File-Open-icon.png:/icons/icons/File-Open-icon.png + + + Rename + + + Rename + + + + + Quit + + + + + + :/icons/icons/File-History-icon.png:/icons/icons/File-History-icon.png + + + history + + + + + + :/icons/icons/Network-PC-icon.png:/icons/icons/Network-PC-icon.png + + + FossilUI + + + + + + :/icons/icons/Document-Revert-icon.png:/icons/icons/Document-Revert-icon.png + + + revert + + + + + + + + + + tableView + customContextMenuRequested(QPoint) + MainWindow + deleteLater() + + + 432 + 278 + + + 432 + 319 + + + + + diff --git a/icons/Button-Add-icon.png b/icons/Button-Add-icon.png new file mode 100644 index 0000000..a23ab1c Binary files /dev/null and b/icons/Button-Add-icon.png differ diff --git a/icons/Button-Blank-Blue-icon.png b/icons/Button-Blank-Blue-icon.png new file mode 100644 index 0000000..2cee4e2 Binary files /dev/null and b/icons/Button-Blank-Blue-icon.png differ diff --git a/icons/Button-Blank-Gray-icon.png b/icons/Button-Blank-Gray-icon.png new file mode 100644 index 0000000..400e6e0 Binary files /dev/null and b/icons/Button-Blank-Gray-icon.png differ diff --git a/icons/Button-Blank-Green-icon.png b/icons/Button-Blank-Green-icon.png new file mode 100644 index 0000000..d0539fc Binary files /dev/null and b/icons/Button-Blank-Green-icon.png differ diff --git a/icons/Button-Blank-Red-icon.png b/icons/Button-Blank-Red-icon.png new file mode 100644 index 0000000..f29b747 Binary files /dev/null and b/icons/Button-Blank-Red-icon.png differ diff --git a/icons/Button-Blank-Yellow-icon.png b/icons/Button-Blank-Yellow-icon.png new file mode 100644 index 0000000..2a9173c Binary files /dev/null and b/icons/Button-Blank-Yellow-icon.png differ diff --git a/icons/Button-Close-icon.png b/icons/Button-Close-icon.png new file mode 100644 index 0000000..87d9a1f Binary files /dev/null and b/icons/Button-Close-icon.png differ diff --git a/icons/Button-Download-icon.png b/icons/Button-Download-icon.png new file mode 100644 index 0000000..d8c4223 Binary files /dev/null and b/icons/Button-Download-icon.png differ diff --git a/icons/Button-Refresh-icon.png b/icons/Button-Refresh-icon.png new file mode 100644 index 0000000..6d3f066 Binary files /dev/null and b/icons/Button-Refresh-icon.png differ diff --git a/icons/Button-Rewind-icon.png b/icons/Button-Rewind-icon.png new file mode 100644 index 0000000..2a8cefc Binary files /dev/null and b/icons/Button-Rewind-icon.png differ diff --git a/icons/Button-Upload-icon.png b/icons/Button-Upload-icon.png new file mode 100644 index 0000000..7de7a12 Binary files /dev/null and b/icons/Button-Upload-icon.png differ diff --git a/icons/Button-Warning-icon.png b/icons/Button-Warning-icon.png new file mode 100644 index 0000000..db9fa3e Binary files /dev/null and b/icons/Button-Warning-icon.png differ diff --git a/icons/Clock-icon.png b/icons/Clock-icon.png new file mode 100644 index 0000000..f752502 Binary files /dev/null and b/icons/Clock-icon.png differ diff --git a/icons/Document-Copy-icon.png b/icons/Document-Copy-icon.png new file mode 100644 index 0000000..6c31a31 Binary files /dev/null and b/icons/Document-Copy-icon.png differ diff --git a/icons/Document-Organization-Chart-icon.png b/icons/Document-Organization-Chart-icon.png new file mode 100644 index 0000000..dd9771e Binary files /dev/null and b/icons/Document-Organization-Chart-icon.png differ diff --git a/icons/Document-Revert-icon.png b/icons/Document-Revert-icon.png new file mode 100644 index 0000000..ec3b199 Binary files /dev/null and b/icons/Document-Revert-icon.png differ diff --git a/icons/Document-icon.png b/icons/Document-icon.png new file mode 100644 index 0000000..dd8ab6e Binary files /dev/null and b/icons/Document-icon.png differ diff --git a/icons/File-Delete-icon.png b/icons/File-Delete-icon.png new file mode 100644 index 0000000..0b8c861 Binary files /dev/null and b/icons/File-Delete-icon.png differ diff --git a/icons/File-History-icon.png b/icons/File-History-icon.png new file mode 100644 index 0000000..147fd58 Binary files /dev/null and b/icons/File-History-icon.png differ diff --git a/icons/File-New-icon.png b/icons/File-New-icon.png new file mode 100644 index 0000000..16c02cc Binary files /dev/null and b/icons/File-New-icon.png differ diff --git a/icons/File-Open-icon.png b/icons/File-Open-icon.png new file mode 100644 index 0000000..beeea2b Binary files /dev/null and b/icons/File-Open-icon.png differ diff --git a/icons/IconCredits.txt b/icons/IconCredits.txt new file mode 100644 index 0000000..00179c2 --- /dev/null +++ b/icons/IconCredits.txt @@ -0,0 +1 @@ +http://www.iconarchive.com/show/soft-scraps-icons-by-deleket.3.html diff --git a/icons/Network-PC-icon.png b/icons/Network-PC-icon.png new file mode 100644 index 0000000..4a85b01 Binary files /dev/null and b/icons/Network-PC-icon.png differ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..c052757 --- /dev/null +++ b/main.cpp @@ -0,0 +1,11 @@ +#include +#include "MainWindow.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +} diff --git a/manifest b/manifest index 01e2526..b903129 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,36 @@ -C initial\sempty\scheck-in -D 2011-08-01T16:00:48.779 -P -R d41d8cd98f00b204e9800998ecf8427e -T *branch * trunk -T *sym-trunk * +C Initial\scommit +D 2011-08-01T16:01:50.497 +F MainWindow.cpp c5fbd8ca52dc16d0f67e70e4ac45aafc22f4bd42 +F MainWindow.h cfcac26df614d2f3bdf001470b16374523ef0b37 +F MainWindow.ui f615eeae75553401f720d77507c1be2764d42784 +F icons/Button-Add-icon.png dadf3bf18c07c65d4a4655a4adaa45680c0abfde +F icons/Button-Blank-Blue-icon.png 3cb7dc5cb20b56a3793a649e9b1ad6feb90bbaf0 +F icons/Button-Blank-Gray-icon.png d1a6873369614ce73c87045acb379d4f4bad12f8 +F icons/Button-Blank-Green-icon.png a62f00dfce56eeb0eb6a6b8503fc3b7575d16900 +F icons/Button-Blank-Red-icon.png 16b59b7307507c76bc733be78c0314e7c6368983 +F icons/Button-Blank-Yellow-icon.png a088169552b7745eb7976226d4915aad70397f48 +F icons/Button-Close-icon.png 9fe1296b4c4c98a9f01e5acd61f18a0fbf0bb220 +F icons/Button-Download-icon.png 17c93659be8967ba8ded57f709a67bbd80c1ec65 +F icons/Button-Refresh-icon.png ce8b163c2f49e53854fe4b88d22a1b5d81fe6bc2 +F icons/Button-Rewind-icon.png d6cb4e298ad2fc7b39cdcdedd235f2445555fc81 +F icons/Button-Upload-icon.png b2731cecf1f32d181fd584aab78747449674dcc3 +F icons/Button-Warning-icon.png f2b2e4d22744fc54f1bd998776970e5c80c2e756 +F icons/Clock-icon.png 91164eb2a1dce6693e6b968e9973b6a42286c94f +F icons/Document-Copy-icon.png 0d9803252ecd372ea2910f594e829676fd499a83 +F icons/Document-Organization-Chart-icon.png 40198a69779894c74b4548dd4af6a8febab6c3fc +F icons/Document-Revert-icon.png c696a41d43d08c99a726cb8af97601b825a9fb34 +F icons/Document-icon.png 38ac596e8781f790d3cd597267ed9a609d1dda5f +F icons/File-Delete-icon.png 9bdb9ab015a688c82b14d8f0fd6dec06d8a7d5fd +F icons/File-History-icon.png d9c61fef53a3e6cb92dad05d72aa6fcf8818ce16 +F icons/File-New-icon.png 7dc6354d5df96febfc410d83339a51585283457d +F icons/File-Open-icon.png b756b910579f17a1721c280c328477af2107d73d +F icons/IconCredits.txt cee343f48fa15458897693df78193c0f7c63a519 +F icons/Network-PC-icon.png 5a452cf64e495361bf569c007856a953de871082 +F main.cpp f53e9e1e34f65565f06b2d37d7be5c38e2113a03 +F qtfossil.pro 80268b3b1ec8f73cbc24896a0f2ae3fbcca286cb +F qtfossil.pro.user 29e3db9439958ad5a7cf2e7ca667d4e79c94f449 +F resources.qrc e8da172649b8eb351ac12085a66bec1863e5aac9 +P 228a59141104e75511ee4232585543c5182c7e89 +R 89ef91ffc77f859f59780af3211b709b U kostas -Z c1ebb12543578e73f2aeef1560b152d9 +Z c53b4596afb07569b4bad845dab76ffc diff --git a/manifest.uuid b/manifest.uuid index 658543a..4e10965 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -228a59141104e75511ee4232585543c5182c7e89 \ No newline at end of file +ef1ad7e20ba3aa605446197cecbba38c8b0e60da \ No newline at end of file diff --git a/qtfossil.pro b/qtfossil.pro new file mode 100644 index 0000000..b26b745 --- /dev/null +++ b/qtfossil.pro @@ -0,0 +1,22 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2011-08-01T00:17:18 +# +#------------------------------------------------- + +QT += core gui webkit + +TARGET = qtfossil +TEMPLATE = app + + +SOURCES += main.cpp\ + MainWindow.cpp + +HEADERS += MainWindow.h + +FORMS += MainWindow.ui + +RESOURCES += \ + resources.qrc + diff --git a/qtfossil.pro.user b/qtfossil.pro.user new file mode 100644 index 0000000..79dd759 --- /dev/null +++ b/qtfossil.pro.user @@ -0,0 +1,398 @@ + + + + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + + Cpp + + false + CppGlobal + true + false + true + false + false + false + true + true + false + true + false + false + false + true + false + + + 1 + UTF-8 + Global + 4 + true + 1 + true + false + true + + Cpp + + true + false + CppGlobal + 4 + 1 + false + true + 0 + 8 + + + + QmlJS + + true + false + QmlJSGlobal + 4 + 1 + false + true + 0 + 8 + + + 2 + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + Qt4ProjectManager.Target.DesktopTarget + 1 + 0 + 0 + + ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-64bit./usr/bin/gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Qt in PATH Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + /home/kostas/tmp/qtfossil-build-desktop-Qt_in_PATH_Release + 2 + true + + + ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-64bit./usr/bin/gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Qt in PATH Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + /home/kostas/tmp/qtfossil-build-desktop-Qt_in_PATH_Debug + 2 + true + + + ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-64bit./usr/bin/gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + 4.7.0 Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + /home/kostas/tmp/qtfossil-build-desktop-4_7_0_Release + 4 + true + + + ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-linux-generic-elf-64bit./usr/bin/gdb + + + qmake + + QtProjectManager.QMakeBuildStep + false + true + + false + + + Make + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + Make + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + 4.7.0 Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + /home/kostas/tmp/qtfossil-build-desktop-4_7_0_Debug + 4 + true + + 4 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + No deployment + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + + false + false + false + false + false + false + false + false + true + true + 0.01 + 0.01 + 10 + 10 + true + true + 25 + 25 + + + true + true + valgrind + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + qtfossil + + Qt4ProjectManager.Qt4RunConfiguration + 2 + + qtfossil.pro + false + false + + + 3768 + true + false + false + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.EnvironmentId + {bda40a79-bf37-4550-a115-261dea66cdf3} + + + ProjectExplorer.Project.Updater.FileVersion + 10 + + diff --git a/resources.qrc b/resources.qrc new file mode 100644 index 0000000..8836bf6 --- /dev/null +++ b/resources.qrc @@ -0,0 +1,26 @@ + + + icons/Button-Add-icon.png + icons/Button-Download-icon.png + icons/Button-Refresh-icon.png + icons/Button-Upload-icon.png + icons/Clock-icon.png + icons/Document-Copy-icon.png + icons/File-Delete-icon.png + icons/File-New-icon.png + icons/File-Open-icon.png + icons/File-History-icon.png + icons/Network-PC-icon.png + icons/Button-Blank-Green-icon.png + icons/Button-Blank-Red-icon.png + icons/Button-Blank-Yellow-icon.png + icons/Button-Close-icon.png + icons/Button-Warning-icon.png + icons/Document-Organization-Chart-icon.png + icons/Button-Blank-Blue-icon.png + icons/Button-Blank-Gray-icon.png + icons/Button-Rewind-icon.png + icons/Document-icon.png + icons/Document-Revert-icon.png + +