diff --git a/manifest b/manifest index 1ff9601..00cf2e5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merged\srefactor\nAdded\smissing\sstatus\sUPDATED_BY_MERGE\s\nFixed\sparsing\sof\sfile\sstatus -D 2015-04-30T17:43:40.786 +C Initial\swork\son\snew\sworkspace\sview\n +D 2015-05-01T19:04:02.737 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -200,13 +200,13 @@ F src/Fossil.cpp b54d136f05764535636da04bcc5f60b2eb97e5b6 F src/Fossil.h e46ec6cdb5c23a34176050fbd90e561ac87c07f9 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp b8d87316df5ca82d6ac9bb0960304ab39489a91f -F src/MainWindow.h d8d376f2efbf47c7a0241bb574994dbcf92300fb +F src/MainWindow.cpp 7f3b06953194c1aa46511b49906edab8c194930d +F src/MainWindow.h 5e0b71e6b795c32ae4207ffb44aa056b52674a10 F src/SettingsDialog.cpp a46cff5e5dd425e3dbdd15632abfd5829f5562b4 F src/SettingsDialog.h 4e2790f581e991c744ae9f86580f1972b8c7ff43 F src/Utils.cpp f78728e0817b1db23007ba0d2c5c26980ee7ebca F src/Utils.h 8ad68bd227bd999eb6ea92a70bb4be2d6788d912 -F src/Workspace.cpp 199ec5f5aee9e8d9997617aa879cb9a14dafcb1b +F src/Workspace.cpp 114daa2d44228ac253056fdf74a45e977d181475 F src/Workspace.h 9f1d34320abb378ae5a6e3360f8c8a5949029b88 F src/main.cpp 2ac8badc2a63fa123ceae53382ce24cfe1b5a54b F tools/git-push.sh 62cc58434cae5b7bcd6bd9d4cce8b08739f31cd7 x @@ -215,9 +215,9 @@ F ui/BrowserWidget.ui 5ad98b13773afadb20a1a2c22148aaebe5dbd95d F ui/CloneDialog.ui 4886e7d4f258ea8b852b5eefc860396e35145712 F ui/CommitDialog.ui 6200f6cabdcf40a20812e811be28e0793f82516f F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d -F ui/MainWindow.ui c02f609b7f3a33c9be5f420591466ae5e398a988 +F ui/MainWindow.ui ef46a06e46eb465703a8b7353b079c2e538104d7 F ui/SettingsDialog.ui 2b7c2870e0054b0f4106f495d85d02c0b814df8b -P e54f1cacad13f429891d89053a208cd340386a3b 54059126aee6bb232373c1f134cc07ea0a6f4cca -R c8caf9794c01c2e9f28e7aab2d817e71 +P f82fab41453e6ccf28c60e89ce567635ffab25a3 +R eb515f213709887707816d20f04a41de U kostas -Z 2db0b96e08403561e015298ad9ef24fd +Z 79fc4cbaace7ceb95ba923e30451b76b diff --git a/manifest.uuid b/manifest.uuid index 7d1d459..a9ba285 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f82fab41453e6ccf28c60e89ce567635ffab25a3 \ No newline at end of file +64386745ebf2d2fa921a51383bd76241947b879c \ No newline at end of file diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 8e705b6..c62ea12 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -38,6 +38,50 @@ enum REPODIRMODEL_ROLE_PATH = Qt::UserRole+1 }; +struct TreeViewItem +{ + enum + { + TYPE_UNKNOWN, + TYPE_WORKSPACE, + TYPE_FOLDER, + TYPE_STASHES, + TYPE_STASH, + TYPE_BRANCHES, + TYPE_BRANCH, + TYPE_TAGS, + TYPE_TAG, + TYPE_REMOTES, + TYPE_SETTINGS + }; + + TreeViewItem() + : Type(TYPE_UNKNOWN) + { + } + + TreeViewItem(int type, const QString &value) + : Type(type), Value(value) + { + } + + TreeViewItem(const TreeViewItem &other) + { + Type = other.Type; + Value = other.Value; + } + + int Type; + QString Value; + + operator QVariant() const + { + return QVariant::fromValue(*this); + } +}; +Q_DECLARE_METATYPE(TreeViewItem) + + //----------------------------------------------------------------------------- typedef QMap QStringMap; static QStringMap MakeKeyValues(QStringList lines) @@ -114,14 +158,16 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP SLOT( onWorkspaceTreeViewSelectionChanged(const QItemSelection &, const QItemSelection &) ), Qt::DirectConnection ); - ui->workspaceTreeView->addAction(ui->actionCommit); - ui->workspaceTreeView->addAction(ui->actionOpenFolder); - ui->workspaceTreeView->addAction(ui->actionAdd); - ui->workspaceTreeView->addAction(ui->actionRevert); - ui->workspaceTreeView->addAction(ui->actionDelete); - ui->workspaceTreeView->addAction(separator); - ui->workspaceTreeView->addAction(ui->actionRenameFolder); - ui->workspaceTreeView->addAction(ui->actionOpenFolder); + // Workspace Menus + menuWorkspace = new QMenu(this); + menuWorkspace->addAction(ui->actionCommit); + menuWorkspace->addAction(ui->actionOpenFolder); + menuWorkspace->addAction(ui->actionAdd); + menuWorkspace->addAction(ui->actionRevert); + menuWorkspace->addAction(ui->actionDelete); + menuWorkspace->addAction(separator); + menuWorkspace->addAction(ui->actionRenameFolder); + menuWorkspace->addAction(ui->actionOpenFolder); // StashView ui->stashTableView->setModel(&getWorkspace().getStashModel()); @@ -130,6 +176,12 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP ui->stashTableView->addAction(ui->actionDeleteStash); ui->stashTableView->horizontalHeader()->setSortIndicatorShown(false); + // StashMenu + menuStashes = new QMenu(this); + menuStashes->addAction(ui->actionApplyStash); + menuStashes->addAction(ui->actionDiffStash); + menuStashes->addAction(ui->actionDeleteStash); + // Recent Workspaces // Locate a sequence of two separator actions in file menu QList file_actions = ui->menuFile->actions(); @@ -590,7 +642,7 @@ static void addPathToTree(QStandardItem &root, const QString &path) if(!found) // Generate it { QStandardItem *child = new QStandardItem(QIcon(":icons/icons/Folder-01.png"), dir); - child->setData(fullpath); // keep the full path to simplify selection + child->setData(TreeViewItem(TreeViewItem::TYPE_FOLDER, fullpath), REPODIRMODEL_ROLE_PATH); parent->appendRow(child); parent = child; } @@ -605,24 +657,61 @@ void MainWindow::updateDirView() getWorkspace().getDirModel().clear(); QStringList header; - header << tr("Folders"); + header << fossil().getProjectName(); getWorkspace().getDirModel().setHorizontalHeaderLabels(header); - QStandardItem *root = new QStandardItem(QIcon(":icons/icons/My Documents-01.png"), fossil().getProjectName()); - root->setData(""); // Empty Path - root->setEditable(false); + QStandardItem *workspace = new QStandardItem(QIcon(":icons/icons/Folder-01.png"), "Workspace"); + workspace->setData(TreeViewItem(TreeViewItem::TYPE_WORKSPACE, ""), REPODIRMODEL_ROLE_PATH); + workspace->setEditable(false); - getWorkspace().getDirModel().appendRow(root); - for(stringset_t::iterator it = getWorkspace().getPaths().begin(); it!=getWorkspace().getPaths().end(); ++it) + getWorkspace().getDirModel().appendRow(workspace); + if(viewMode == VIEWMODE_TREE) { - const QString &dir = *it; - if(dir.isEmpty()) - continue; + for(stringset_t::iterator it = getWorkspace().getPaths().begin(); it!=getWorkspace().getPaths().end(); ++it) + { + const QString &dir = *it; + if(dir.isEmpty()) + continue; - addPathToTree(*root, dir); + addPathToTree(*workspace, dir); + } } + + QStandardItem *branches = new QStandardItem(QIcon(":icons/icons/Document Organization Chart-01.png"), "Branches"); + branches->setData(TreeViewItem(TreeViewItem::TYPE_BRANCHES, ""), REPODIRMODEL_ROLE_PATH); + branches->setEditable(false); + getWorkspace().getDirModel().appendRow(branches); + + QStandardItem *stashes = new QStandardItem(QIcon(":icons/icons/My Documents-01.png"), "Stashes"); + stashes->setData(TreeViewItem(TreeViewItem::TYPE_STASHES, ""), REPODIRMODEL_ROLE_PATH); + stashes->setEditable(false); + getWorkspace().getDirModel().appendRow(stashes); + for(stashmap_t::const_iterator it= getWorkspace().getStashes().begin(); it!=getWorkspace().getStashes().end(); ++it) + { + QStandardItem *stash = new QStandardItem(QIcon(":icons/icons/Folder-01.png"), it.key()); + stash->setData(TreeViewItem(TreeViewItem::TYPE_STASH, it.value()), REPODIRMODEL_ROLE_PATH); + stashes->appendRow(stash); + } + + + QStandardItem *tags = new QStandardItem(QIcon(":icons/icons/Book-01.png"), "Tags"); + tags->setData(TreeViewItem(TreeViewItem::TYPE_TAGS, ""), REPODIRMODEL_ROLE_PATH); + tags->setEditable(false); + getWorkspace().getDirModel().appendRow(tags); + + QStandardItem *remotes = new QStandardItem(QIcon(":icons/icons/Network PC-01.png"), "Remotes"); + remotes->setData(TreeViewItem(TreeViewItem::TYPE_REMOTES, ""), REPODIRMODEL_ROLE_PATH); + remotes->setEditable(false); + getWorkspace().getDirModel().appendRow(remotes); + + QStandardItem *settings = new QStandardItem(QIcon(":icons/icons/Gear-01.png"), "Settings"); + settings->setData(TreeViewItem(TreeViewItem::TYPE_SETTINGS, ""), REPODIRMODEL_ROLE_PATH); + settings->setEditable(false); + getWorkspace().getDirModel().appendRow(settings); + + ui->workspaceTreeView->expandToDepth(0); - ui->workspaceTreeView->sortByColumn(0, Qt::AscendingOrder); + //ui->workspaceTreeView->sortByColumn(0, Qt::AscendingOrder); } //------------------------------------------------------------------------------ @@ -817,7 +906,7 @@ void MainWindow::applySettings() ui->actionViewAsList->setChecked(store->value("ViewAsList").toBool()); viewMode = store->value("ViewAsList").toBool()? VIEWMODE_LIST : VIEWMODE_TREE; } - ui->workspaceTreeView->setVisible(viewMode == VIEWMODE_TREE); + //ui->workspaceTreeView->setVisible(viewMode == VIEWMODE_TREE); if(store->contains("ViewStash")) ui->actionViewStash->setChecked(store->value("ViewStash").toBool()); @@ -867,6 +956,7 @@ void MainWindow::updateSettings() //------------------------------------------------------------------------------ void MainWindow::selectRootDir() { + // FIXME: KKK if(viewMode==VIEWMODE_TREE) { QModelIndex root_index = ui->workspaceTreeView->model()->index(0, 0); @@ -906,11 +996,15 @@ void MainWindow::getSelectionPaths(stringset_t &paths) { // Determine the directories selected QModelIndexList selection = ui->workspaceTreeView->selectionModel()->selectedIndexes(); - for(QModelIndexList::iterator mi_it = selection.begin(); mi_it!=selection.end(); ++mi_it) + foreach(const QModelIndex &mi, selection) { - const QModelIndex &mi = *mi_it; - QVariant data = getWorkspace().getDirModel().data(mi, REPODIRMODEL_ROLE_PATH); - paths.insert(data.toString()); + QVariant data = Workspace().getDirModel().data(mi, REPODIRMODEL_ROLE_PATH); + Q_ASSERT(data.isValid()); + TreeViewItem tv = data.value(); + if(tv.Type != TreeViewItem::TYPE_FOLDER) + continue; + + paths.insert(tv.Value); } } //------------------------------------------------------------------------------ @@ -1503,7 +1597,10 @@ void MainWindow::on_actionViewIgnored_triggered() void MainWindow::on_actionViewAsList_triggered() { viewMode = ui->actionViewAsList->isChecked() ? VIEWMODE_LIST : VIEWMODE_TREE; +#if 0 ui->workspaceTreeView->setVisible(viewMode == VIEWMODE_TREE); +#endif + updateDirView(); updateFileView(); } @@ -1517,23 +1614,34 @@ QString MainWindow::getFossilHttpAddress() //------------------------------------------------------------------------------ void MainWindow::onWorkspaceTreeViewSelectionChanged(const QItemSelection &/*selected*/, const QItemSelection &/*deselected*/) { - QModelIndexList selection = ui->workspaceTreeView->selectionModel()->selectedIndexes(); - int num_selected = selection.count(); + QModelIndexList indices = ui->workspaceTreeView->selectionModel()->selectedIndexes(); // Do not modify the selection if nothing is selected - if(num_selected==0) + if(indices.empty()) return; - selectedDirs.clear(); + stringset_t new_dirs; - for(int i=0; iworkspaceTreeView->model()==&getWorkspace().getDirModel()); + //QVariant data = getWorkspace().getDirModel().data(id, REPODIRMODEL_ROLE_PATH); + QVariant data = id.model()->data(id, REPODIRMODEL_ROLE_PATH); + Q_ASSERT(data.isValid()); + TreeViewItem tv = data.value(); + + if(tv.Type != TreeViewItem::TYPE_FOLDER && tv.Type != TreeViewItem::TYPE_WORKSPACE) + continue; + + new_dirs.insert(tv.Value); } - updateFileView(); + // Update the selection if we have any new folders + if(!new_dirs.empty() && viewMode == VIEWMODE_TREE) + { + selectedDirs = new_dirs; + updateFileView(); + } } //------------------------------------------------------------------------------ @@ -1551,7 +1659,11 @@ void MainWindow::on_actionOpenFolder_triggered() //------------------------------------------------------------------------------ void MainWindow::on_workspaceTreeView_doubleClicked(const QModelIndex &index) { - QString target = getWorkspace().getDirModel().data(index, REPODIRMODEL_ROLE_PATH).toString(); + QVariant data = index.model()->data(index, REPODIRMODEL_ROLE_PATH); + Q_ASSERT(data.isValid()); + TreeViewItem tv = data.value(); + QString target = tv.Value; + target = getCurrentWorkspace() + PATH_SEPARATOR + target; QUrl url = QUrl::fromLocalFile(target); @@ -1917,6 +2029,34 @@ void MainWindow::on_fileTableView_customContextMenuRequested(const QPoint &pos) } +//------------------------------------------------------------------------------ +void MainWindow::on_workspaceTreeView_customContextMenuRequested(const QPoint &) +{ + QModelIndexList indices = ui->workspaceTreeView->selectionModel()->selectedIndexes(); + + if(indices.empty()) + return; + + QMenu *menu = 0; + + // Get first selected item + const QModelIndex &mi = indices.first(); + QVariant data = getWorkspace().getDirModel().data(mi, REPODIRMODEL_ROLE_PATH); + Q_ASSERT(data.isValid()); + TreeViewItem tv = data.value(); + + if(tv.Type == TreeViewItem::TYPE_FOLDER || tv.Type == TreeViewItem::TYPE_WORKSPACE) + menu = menuWorkspace; + else if (tv.Type == TreeViewItem::TYPE_STASH || tv.Type == TreeViewItem::TYPE_STASHES) + menu = menuStashes; + + if(menu) + { + QPoint pos = QCursor::pos(); + menu->popup(pos); + } +} + //------------------------------------------------------------------------------ void MainWindow::dragEnterEvent(QDragEnterEvent *event) { diff --git a/src/MainWindow.h b/src/MainWindow.h index 41da3fe..83b62e2 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -112,6 +112,7 @@ private slots: void on_actionDiffStash_triggered(); void on_textBrowser_customContextMenuRequested(const QPoint &pos); void on_fileTableView_customContextMenuRequested(const QPoint &pos); + void on_workspaceTreeView_customContextMenuRequested(const QPoint &pos); private: class MainWinUICallback : public UICallback @@ -147,6 +148,9 @@ private: class QAction *recentWorkspaceActs[MAX_RECENT]; class QProgressBar *progressBar; class QShortcut *abortShortcut; + QMenu *menuWorkspace; + QMenu *menuStashes; + bool operationAborted; stringset_t selectedDirs; // The directory selected in the tree diff --git a/src/Workspace.cpp b/src/Workspace.cpp index 613958d..0f6b763 100644 --- a/src/Workspace.cpp +++ b/src/Workspace.cpp @@ -120,7 +120,6 @@ void Workspace::scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModifie if(space_index==-1) continue; - //QString status_text = line.left(10).trimmed(); QString status_text = line.left(space_index); QString fname = line.right(line.length() - space_index).trimmed(); WorkspaceFile::Type type = WorkspaceFile::TYPE_UNKNOWN; diff --git a/ui/MainWindow.ui b/ui/MainWindow.ui index 55a5389..a8ef19b 100644 --- a/ui/MainWindow.ui +++ b/ui/MainWindow.ui @@ -17,7 +17,7 @@ Fuel - + :/icons/icons/Battery-01.png:/icons/icons/Battery-01.png @@ -66,7 +66,7 @@ - Qt::ActionsContextMenu + Qt::CustomContextMenu QAbstractItemView::NoEditTriggers @@ -263,7 +263,7 @@ 0 0 865 - 22 + 23 @@ -356,7 +356,7 @@ - + :/icons/icons/Button Refresh-01.png:/icons/icons/Button Refresh-01.png @@ -374,7 +374,7 @@ - + :/icons/icons/Save-01.png:/icons/icons/Save-01.png @@ -392,7 +392,7 @@ - + :/icons/icons/Document Copy-01.png:/icons/icons/Document Copy-01.png @@ -410,7 +410,7 @@ - + :/icons/icons/File New-01.png:/icons/icons/File New-01.png @@ -428,7 +428,7 @@ - + :/icons/icons/File Delete-01.png:/icons/icons/File Delete-01.png @@ -446,7 +446,7 @@ - + :/icons/icons/Document Blank-01.png:/icons/icons/Document Blank-01.png @@ -464,7 +464,7 @@ - + :/icons/icons/My Documents-01.png:/icons/icons/My Documents-01.png @@ -496,11 +496,11 @@ - + :/icons/icons/My Websites-01.png:/icons/icons/My Websites-01.png - Clone... + C&lone... Clone a remote repository @@ -508,7 +508,7 @@ - + :/icons/icons/Button Upload-01.png:/icons/icons/Button Upload-01.png @@ -526,7 +526,7 @@ - + :/icons/icons/Button Download-01.png:/icons/icons/Button Download-01.png @@ -544,7 +544,7 @@ - + :/icons/icons/File Open-01.png:/icons/icons/File Open-01.png @@ -562,7 +562,7 @@ - + :/icons/icons/Button Turn Off-01.png:/icons/icons/Button Turn Off-01.png @@ -583,7 +583,7 @@ - + :/icons/icons/File History-01.png:/icons/icons/File History-01.png @@ -604,7 +604,7 @@ true - + :/icons/icons/Network MAC-01.png:/icons/icons/Network MAC-01.png @@ -619,7 +619,7 @@ - + :/icons/icons/Document-Revert-icon.png:/icons/icons/Document-Revert-icon.png @@ -634,7 +634,7 @@ - + :/icons/icons/Text Edit.png:/icons/icons/Text Edit.png @@ -649,7 +649,7 @@ - + :/icons/icons/Clock-01.png:/icons/icons/Clock-01.png @@ -664,7 +664,7 @@ - + :/icons/icons/Document-01.png:/icons/icons/Document-01.png @@ -682,7 +682,7 @@ - + :/icons/icons/Folder-01.png:/icons/icons/Folder-01.png @@ -700,7 +700,7 @@ - + :/icons/icons/Button Reload-01.png:/icons/icons/Button Reload-01.png @@ -718,7 +718,7 @@ - + :/icons/icons/Battery-01.png:/icons/icons/Battery-01.png @@ -733,7 +733,7 @@ - + :/icons/icons/Button Play-01.png:/icons/icons/Button Play-01.png @@ -751,7 +751,7 @@ - + :/icons/icons/Gear-01.png:/icons/icons/Gear-01.png @@ -839,7 +839,7 @@ - + :/icons/icons/Folder-01.png:/icons/icons/Folder-01.png @@ -854,7 +854,7 @@ - + :/icons/icons/Folder Open-01.png:/icons/icons/Folder Open-01.png @@ -869,7 +869,7 @@ - + :/icons/icons/Folder Add-01.png:/icons/icons/Folder Add-01.png @@ -881,7 +881,7 @@ - + :/icons/icons/Folder Open-01.png:/icons/icons/Folder Open-01.png @@ -913,7 +913,7 @@ - + :/icons/icons/Folder Delete-01.png:/icons/icons/Folder Delete-01.png @@ -922,7 +922,7 @@ - + :/icons/icons/Folder Explorer-01.png:/icons/icons/Folder Explorer-01.png @@ -944,6 +944,8 @@ 1 - + + +