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
* 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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.