From: Pierre Dumuid <pmdumuid@gmail.com>
To: paulus@ozlabs.org, git@vger.kernel.org
Cc: Pierre Dumuid <pmdumuid@gmail.com>
Subject: [PATCH 3/6] Add a tree view to the local branches, remote branches and tags, where / is treated as a directory seperator.
Date: Thu, 15 Dec 2016 21:58:44 +1030 [thread overview]
Message-ID: <20161215112847.14719-3-pmdumuid@gmail.com> (raw)
In-Reply-To: <20161215112847.14719-1-pmdumuid@gmail.com>
Signed-off-by: Pierre Dumuid <pmdumuid@gmail.com>
---
gitk | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 117 insertions(+)
diff --git a/gitk b/gitk
index 36cba49..a894f1d 100755
--- a/gitk
+++ b/gitk
@@ -2089,6 +2089,10 @@ proc makewindow {} {
{mc "Reread re&ferences" command rereadrefs}
{mc "&List references" command showrefs -accelerator F2}
{xx "" separator}
+ {mc "List Local Branches" command {show_tree_of_references_dialog "localBranches"} -accelerator F6}
+ {mc "List Remote Branches" command {show_tree_of_references_dialog "remoteBranches"} -accelerator F7}
+ {mc "List Tags" command {show_tree_of_references_dialog "tags"} -accelerator F8}
+ {xx "" separator}
{mc "Start git &gui" command {exec git gui &}}
{xx "" separator}
{mc "&Quit" command doquit -accelerator Meta1-Q}
@@ -2601,6 +2605,9 @@ proc makewindow {} {
bind . <F5> updatecommits
bindmodfunctionkey Shift 5 reloadcommits
bind . <F2> showrefs
+ bind . <F6> {show_tree_of_references_dialog "localBranches"}
+ bind . <F7> {show_tree_of_references_dialog "remoteBranches"}
+ bind . <F8> {show_tree_of_references_dialog "tags"}
bindmodfunctionkey Shift 4 {newview 0}
bind . <F4> edit_or_newview
bind . <$M1B-q> doquit
@@ -10146,6 +10153,116 @@ proc rmbranch {} {
run refill_reflist
}
+# Display a tree view of local branches, remote branches, and tags according to view_type.
+#
+# @param string view_type
+# Must be one of "localBranches", "remoteBranches", or "tags".
+#
+proc show_tree_of_references_dialog {view_type} {
+ global NS
+ global treefilelist
+ global headids tagids
+
+ switch -- $view_type {
+ "localBranches" {
+ set dialogName "Local Branches"
+ set top .show_tree_of_local_branches
+ set listOfReferences [lsort [array names headids -regexp {^(?!remotes/)} ]]
+ set truncateFrom 0
+ }
+ "remoteBranches" {
+ set dialogName "Remote Branches"
+ set top .show_tree_of_remote_branches
+ set listOfReferences [lsort [array names headids -regexp {^remotes/} ]]
+ set truncateFrom 8
+ }
+ "tags" {
+ set dialogName "Tags"
+ set top .show_tree_of_tags
+ set listOfReferences [lsort [array names tagids]]
+ set truncateFrom 0
+ }
+ }
+
+ if {[winfo exists $top]} {
+ raise $top
+ return
+ }
+
+ ttk_toplevel $top
+ wm title $top [mc "$dialogName: %s" [file tail [pwd]]]
+ wm geometry $top "600x900"
+
+ make_transient $top .
+
+ ## See http://www.tkdocs.com/tutorial/tree.html
+ ttk::treeview $top.referenceList -xscrollcommand "$top.horizontalScrollBar set" -yscrollcommand "$top.verticalScrollBar set"
+
+ # Populate the dialog
+ foreach reference $listOfReferences {
+ # The display name omits some leading characters (such as "remotes/")
+ set referenceDisplayName [string range $reference $truncateFrom end]
+
+ # Split the branch/tag by slashes, and incrementally ensure that each leaf in the treeview exists..
+ # otherwise add it.
+ set treeLeaves [split $referenceDisplayName "/"]
+ for {set i 0} {$i < [llength $treeLeaves]} {} {
+ set leafReferenceId [join [lrange $treeLeaves 0 $i] "/"]
+ if {![$top.referenceList exists $leafReferenceId]} {
+ if {$i > 0} {
+ set parentLeafId [join [lrange $treeLeaves 0 $i-1] "/"]
+ } else {
+ set parentLeafId {}
+ }
+ $top.referenceList insert $parentLeafId end -id $leafReferenceId -text [lindex $treeLeaves $i]
+ }
+ incr i
+ }
+ }
+
+ ${NS}::scrollbar $top.verticalScrollBar -command "$top.referenceList yview" -orient vertical
+ ${NS}::scrollbar $top.horizontalScrollBar -command "$top.referenceList xview" -orient horizontal
+
+ grid $top.referenceList $top.verticalScrollBar -sticky nsew
+ grid $top.horizontalScrollBar x -sticky ew
+
+ bind $top <Key-Escape> [list destroy $top]
+
+ bind $top.referenceList <<TreeviewSelect>> {callback_tree_of_references_item_selected %W; break}
+
+ grid columnconfigure $top 0 -weight 1
+ grid rowconfigure $top 0 -weight 1
+}
+
+# Call back for selecting a branch / tag in the tree of references
+#
+# @param w
+#
+proc callback_tree_of_references_item_selected {w} {
+ global headids tagids
+
+ set itemId [$w focus]
+ switch -- $w {
+ ".show_tree_of_local_branches.referenceList" {
+ if {[info exists headids($itemId)]} {
+ selbyid $headids($itemId)
+ }
+ }
+ ".show_tree_of_remote_branches.referenceList" {
+ set itemId "remotes/$itemId"
+ if {[info exists headids($itemId)]} {
+ selbyid $headids($itemId)
+ }
+ }
+ ".show_tree_of_tags.referenceList" {
+ if {[info exists tagids($itemId)]} {
+ selbyid $tagids($itemId)
+ }
+ }
+ }
+}
+
+
# Display a list of tags and heads
proc showrefs {} {
global showrefstop bgcolor fgcolor selectbgcolor NS
--
2.10.2
next prev parent reply other threads:[~2016-12-15 11:29 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-15 11:28 [PATCH 1/6] Enable ability to visualise the results of git cherry C1 C2 Pierre Dumuid
2016-12-15 11:28 ` [PATCH 2/6] Add ability to follow a remote branch with a dialog Pierre Dumuid
2016-12-31 8:53 ` Paul Mackerras
2016-12-15 11:28 ` Pierre Dumuid [this message]
2016-12-31 9:08 ` [PATCH 3/6] Add a tree view to the local branches, remote branches and tags, where / is treated as a directory seperator Paul Mackerras
2016-12-15 11:28 ` [PATCH 4/6] Add DirDiffTool as additional option Pierre Dumuid
2016-12-15 11:28 ` [PATCH 5/6] gitk: Add a "Save file as" menu item Pierre Dumuid
2016-12-15 11:28 ` [PATCH 6/6] Rename 'remotes/' to 'r../' in heads Pierre Dumuid
2016-12-31 8:30 ` [PATCH 1/6] Enable ability to visualise the results of git cherry C1 C2 Paul Mackerras
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161215112847.14719-3-pmdumuid@gmail.com \
--to=pmdumuid@gmail.com \
--cc=git@vger.kernel.org \
--cc=paulus@ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).