35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
-
+
-
+
-
+
-
+
-
+
-
+
|
{
TAB_LOG,
TAB_BROWSER
};
enum
{
REPODIRMODEL_ROLE_PATH = Qt::UserRole+1
ROLE_WORKSPACE_ITEM = Qt::UserRole+1
};
struct TreeViewItem
struct WorkspaceItem
{
enum
{
TYPE_UNKNOWN,
TYPE_WORKSPACE,
TYPE_FOLDER,
TYPE_STASHES,
TYPE_STASH,
TYPE_BRANCHES,
TYPE_BRANCH,
TYPE_TAGS,
TYPE_TAG,
TYPE_REMOTES,
TYPE_SETTINGS
};
TreeViewItem()
WorkspaceItem()
: Type(TYPE_UNKNOWN)
{
}
TreeViewItem(int type, const QString &value)
WorkspaceItem(int type, const QString &value)
: Type(type), Value(value)
{
}
TreeViewItem(const TreeViewItem &other)
WorkspaceItem(const WorkspaceItem &other)
{
Type = other.Type;
Value = other.Value;
}
int Type;
QString Value;
operator QVariant() const
{
return QVariant::fromValue(*this);
}
};
Q_DECLARE_METATYPE(TreeViewItem)
Q_DECLARE_METATYPE(WorkspaceItem)
///////////////////////////////////////////////////////////////////////////////
MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspacePath) :
QMainWindow(parent),
ui(new Ui::MainWindow),
settings(_settings)
|
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
|
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
|
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
|
found = true;
}
}
if(!found) // Generate it
{
QStandardItem *child = new QStandardItem(QIcon(":icons/icons/Folder-01.png"), dir);
child->setData(TreeViewItem(TreeViewItem::TYPE_FOLDER, fullpath), REPODIRMODEL_ROLE_PATH);
child->setData(WorkspaceItem(WorkspaceItem::TYPE_FOLDER, fullpath), ROLE_WORKSPACE_ITEM);
parent->appendRow(child);
parent = child;
}
fullpath += '/';
}
}
//------------------------------------------------------------------------------
void MainWindow::updateWorkspaceView()
{
// Directory View
getWorkspace().getDirModel().clear();
QStringList header;
header << tr("Workspace");
getWorkspace().getDirModel().setHorizontalHeaderLabels(header);
QStandardItem *workspace = new QStandardItem(QIcon(":icons/icons/Folder-01.png"), tr("Files") );
workspace->setData(TreeViewItem(TreeViewItem::TYPE_WORKSPACE, ""), REPODIRMODEL_ROLE_PATH);
workspace->setData(WorkspaceItem(WorkspaceItem::TYPE_WORKSPACE, ""), ROLE_WORKSPACE_ITEM);
workspace->setEditable(false);
getWorkspace().getDirModel().appendRow(workspace);
if(viewMode == VIEWMODE_TREE)
{
for(stringset_t::iterator it = getWorkspace().getPaths().begin(); it!=getWorkspace().getPaths().end(); ++it)
{
const QString &dir = *it;
if(dir.isEmpty())
continue;
addPathToTree(*workspace, dir);
}
}
// Branches
QStandardItem *branches = new QStandardItem(QIcon(":icons/icons/Document Organization Chart-01.png"), "Branches");
branches->setData(TreeViewItem(TreeViewItem::TYPE_BRANCHES, ""), REPODIRMODEL_ROLE_PATH);
branches->setData(WorkspaceItem(WorkspaceItem::TYPE_BRANCHES, ""), ROLE_WORKSPACE_ITEM);
branches->setEditable(false);
getWorkspace().getDirModel().appendRow(branches);
foreach(const QString &branch_name, getWorkspace().getBranches())
{
QStandardItem *branch = new QStandardItem(QIcon(":icons/icons/Document Organization Chart-01.png"), branch_name);
branch->setData(TreeViewItem(TreeViewItem::TYPE_BRANCH, branch_name), REPODIRMODEL_ROLE_PATH);
branch->setData(WorkspaceItem(WorkspaceItem::TYPE_BRANCH, branch_name), ROLE_WORKSPACE_ITEM);
branches->appendRow(branch);
}
// Tags
QStandardItem *tags = new QStandardItem(QIcon(":icons/icons/Book-01.png"), "Tags");
tags->setData(TreeViewItem(TreeViewItem::TYPE_TAGS, ""), REPODIRMODEL_ROLE_PATH);
tags->setData(WorkspaceItem(WorkspaceItem::TYPE_TAGS, ""), ROLE_WORKSPACE_ITEM);
tags->setEditable(false);
getWorkspace().getDirModel().appendRow(tags);
for(QStringMap::const_iterator it=getWorkspace().getTags().begin(); it!=getWorkspace().getTags().end(); ++it)
{
const QString &tag_name = it.key();
QStandardItem *tag = new QStandardItem(QIcon(":icons/icons/Book-01.png"), tag_name);
tag->setData(TreeViewItem(TreeViewItem::TYPE_TAG, tag_name), REPODIRMODEL_ROLE_PATH);
tag->setData(WorkspaceItem(WorkspaceItem::TYPE_TAG, tag_name), ROLE_WORKSPACE_ITEM);
tags->appendRow(tag);
}
// Stashes
QStandardItem *stashes = new QStandardItem(QIcon(":icons/icons/My Documents-01.png"), "Stashes");
stashes->setData(TreeViewItem(TreeViewItem::TYPE_STASHES, ""), REPODIRMODEL_ROLE_PATH);
stashes->setData(WorkspaceItem(WorkspaceItem::TYPE_STASHES, ""), ROLE_WORKSPACE_ITEM);
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/My Documents-01.png"), it.key());
stash->setData(TreeViewItem(TreeViewItem::TYPE_STASH, it.value()), REPODIRMODEL_ROLE_PATH);
stash->setData(WorkspaceItem(WorkspaceItem::TYPE_STASH, it.value()), ROLE_WORKSPACE_ITEM);
stashes->appendRow(stash);
}
// Remotes
QStandardItem *remotes = new QStandardItem(QIcon(":icons/icons/Network PC-01.png"), "Remotes");
remotes->setData(TreeViewItem(TreeViewItem::TYPE_REMOTES, ""), REPODIRMODEL_ROLE_PATH);
remotes->setData(WorkspaceItem(WorkspaceItem::TYPE_REMOTES, ""), ROLE_WORKSPACE_ITEM);
remotes->setEditable(false);
getWorkspace().getDirModel().appendRow(remotes);
// Settings
QStandardItem *settings = new QStandardItem(QIcon(":icons/icons/Gear-01.png"), "Settings");
settings->setData(TreeViewItem(TreeViewItem::TYPE_SETTINGS, ""), REPODIRMODEL_ROLE_PATH);
settings->setData(WorkspaceItem(WorkspaceItem::TYPE_SETTINGS, ""), ROLE_WORKSPACE_ITEM);
settings->setEditable(false);
getWorkspace().getDirModel().appendRow(settings);
ui->workspaceTreeView->expandToDepth(0);
//ui->workspaceTreeView->sortByColumn(0, Qt::AscendingOrder);
}
|
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
|
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
|
-
+
-
+
-
+
|
//------------------------------------------------------------------------------
void MainWindow::getSelectionStashes(QStringList &stashNames)
{
QModelIndexList selection = ui->workspaceTreeView->selectionModel()->selectedIndexes();
foreach(const QModelIndex &mi, selection)
{
QVariant data = mi.model()->data(mi, REPODIRMODEL_ROLE_PATH);
QVariant data = mi.model()->data(mi, ROLE_WORKSPACE_ITEM);
Q_ASSERT(data.isValid());
TreeViewItem tv = data.value<TreeViewItem>();
WorkspaceItem tv = data.value<WorkspaceItem>();
if(tv.Type != TreeViewItem::TYPE_STASH)
if(tv.Type != WorkspaceItem::TYPE_STASH)
continue;
QString name = mi.model()->data(mi, Qt::DisplayRole).toString();
stashNames.append(name);
}
}
|
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
|
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
|
-
+
-
+
-
+
-
+
-
+
|
stringset_t new_dirs;
selectedTags.clear();
selectedBranches.clear();
foreach(const QModelIndex &id, indices)
{
QVariant data = id.model()->data(id, REPODIRMODEL_ROLE_PATH);
QVariant data = id.model()->data(id, ROLE_WORKSPACE_ITEM);
Q_ASSERT(data.isValid());
TreeViewItem tv = data.value<TreeViewItem>();
WorkspaceItem tv = data.value<WorkspaceItem>();
if(tv.Type == TreeViewItem::TYPE_FOLDER || tv.Type == TreeViewItem::TYPE_WORKSPACE)
if(tv.Type == WorkspaceItem::TYPE_FOLDER || tv.Type == WorkspaceItem::TYPE_WORKSPACE)
new_dirs.insert(tv.Value);
else if(tv.Type == TreeViewItem::TYPE_TAG)
else if(tv.Type == WorkspaceItem::TYPE_TAG)
selectedTags.append(tv.Value);
else if(tv.Type == TreeViewItem::TYPE_BRANCH)
else if(tv.Type == WorkspaceItem::TYPE_BRANCH)
selectedBranches.append(tv.Value);
}
// Update the selection if we have any new folders
if(!new_dirs.empty() && viewMode == VIEWMODE_TREE)
{
selectedDirs = new_dirs;
|
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
|
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
|
-
+
-
+
-
+
-
+
-
+
-
+
|
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);
QVariant data = getWorkspace().getDirModel().data(mi, ROLE_WORKSPACE_ITEM);
Q_ASSERT(data.isValid());
TreeViewItem tv = data.value<TreeViewItem>();
WorkspaceItem tv = data.value<WorkspaceItem>();
if(tv.Type == TreeViewItem::TYPE_FOLDER || tv.Type == TreeViewItem::TYPE_WORKSPACE)
if(tv.Type == WorkspaceItem::TYPE_FOLDER || tv.Type == WorkspaceItem::TYPE_WORKSPACE)
menu = menuWorkspace;
else if (tv.Type == TreeViewItem::TYPE_STASH || tv.Type == TreeViewItem::TYPE_STASHES)
else if (tv.Type == WorkspaceItem::TYPE_STASH || tv.Type == WorkspaceItem::TYPE_STASHES)
menu = menuStashes;
else if (tv.Type == TreeViewItem::TYPE_TAG || tv.Type == TreeViewItem::TYPE_TAGS)
else if (tv.Type == WorkspaceItem::TYPE_TAG || tv.Type == WorkspaceItem::TYPE_TAGS)
menu = menuTags;
else if (tv.Type == TreeViewItem::TYPE_BRANCH || tv.Type == TreeViewItem::TYPE_BRANCHES)
else if (tv.Type == WorkspaceItem::TYPE_BRANCH || tv.Type == WorkspaceItem::TYPE_BRANCHES)
menu = menuBranches;
if(menu)
{
QPoint pos = QCursor::pos() + QPoint(1, 1);
menu->popup(pos);
}
|