Merge branch 'bw/commit-scrollbuffer'
authorPratyush Yadav <me@yadavpratyush.com>
Fri, 13 Sep 2019 20:49:38 +0000 (02:19 +0530)
committerPratyush Yadav <me@yadavpratyush.com>
Fri, 13 Sep 2019 20:49:38 +0000 (02:19 +0530)
Add a scrollbar at the bottom of the commit message buffer.

* bw/commit-scrollbuffer:
  git-gui: add horizontal scrollbar to commit buffer

1  2 
git-gui.sh

diff --combined git-gui.sh
@@@ -1341,7 -1341,6 +1341,7 @@@ set HEAD {
  set PARENT {}
  set MERGE_HEAD [list]
  set commit_type {}
 +set commit_type_is_amend 0
  set empty_tree {}
  set current_branch {}
  set is_detached 0
@@@ -1349,9 -1348,8 +1349,9 @@@ set current_diff_path {
  set is_3way_diff 0
  set is_submodule_diff 0
  set is_conflict_diff 0
 -set selected_commit_type new
  set diff_empty_count 0
 +set last_revert {}
 +set last_revert_enc {}
  
  set nullid "0000000000000000000000000000000000000000"
  set nullid2 "0000000000000000000000000000000000000001"
@@@ -1437,7 -1435,7 +1437,7 @@@ proc PARENT {} 
  }
  
  proc force_amend {} {
 -      global selected_commit_type
 +      global commit_type_is_amend
        global HEAD PARENT MERGE_HEAD commit_type
  
        repository_state newType newHEAD newMERGE_HEAD
        set MERGE_HEAD $newMERGE_HEAD
        set commit_type $newType
  
 -      set selected_commit_type amend
 +      set commit_type_is_amend 1
        do_select_commit_type
  }
  
@@@ -2497,7 -2495,7 +2497,7 @@@ proc force_first_diff {after} 
  
  proc toggle_or_diff {mode w args} {
        global file_states file_lists current_diff_path ui_index ui_workdir
 -      global last_clicked selected_paths
 +      global last_clicked selected_paths file_lists_last_clicked
  
        if {$mode eq "click"} {
                foreach {x y} $args break
        $ui_index tag remove in_sel 0.0 end
        $ui_workdir tag remove in_sel 0.0 end
  
 +      set file_lists_last_clicked($w) $path
 +
        # Determine the state of the file
        if {[info exists file_states($path)]} {
                set state [lindex $file_states($path) 0]
@@@ -2644,26 -2640,6 +2644,26 @@@ proc show_less_context {} 
        }
  }
  
 +proc focus_widget {widget} {
 +      global file_lists last_clicked selected_paths
 +      global file_lists_last_clicked
 +
 +      if {[llength $file_lists($widget)] > 0} {
 +              set path $file_lists_last_clicked($widget)
 +              set index [lsearch -sorted -exact $file_lists($widget) $path]
 +              if {$index < 0} {
 +                      set index 0
 +                      set path [lindex $file_lists($widget) $index]
 +              }
 +
 +              focus $widget
 +              set last_clicked [list $widget [expr $index + 1]]
 +              array unset selected_paths
 +              set selected_paths($path) 1
 +              show_diff $path $widget
 +      }
 +}
 +
  ######################################################################
  ##
  ## ui construction
@@@ -2852,10 -2828,19 +2852,10 @@@ if {[is_enabled multicommit] || [is_ena
        menu .mbar.commit
  
        if {![is_enabled nocommit]} {
 -              .mbar.commit add radiobutton \
 -                      -label [mc "New Commit"] \
 -                      -command do_select_commit_type \
 -                      -variable selected_commit_type \
 -                      -value new
 -              lappend disable_on_lock \
 -                      [list .mbar.commit entryconf [.mbar.commit index last] -state]
 -
 -              .mbar.commit add radiobutton \
 +              .mbar.commit add checkbutton \
                        -label [mc "Amend Last Commit"] \
 -                      -command do_select_commit_type \
 -                      -variable selected_commit_type \
 -                      -value amend
 +                      -variable commit_type_is_amend \
 +                      -command do_select_commit_type
                lappend disable_on_lock \
                        [list .mbar.commit entryconf [.mbar.commit index last] -state]
  
@@@ -3328,10 -3313,18 +3328,10 @@@ set ui_comm .vpane.lower.commarea.buffe
  set ui_coml .vpane.lower.commarea.buffer.header.l
  
  if {![is_enabled nocommit]} {
 -      ${NS}::radiobutton .vpane.lower.commarea.buffer.header.new \
 -              -text [mc "New Commit"] \
 -              -command do_select_commit_type \
 -              -variable selected_commit_type \
 -              -value new
 -      lappend disable_on_lock \
 -              [list .vpane.lower.commarea.buffer.header.new conf -state]
 -      ${NS}::radiobutton .vpane.lower.commarea.buffer.header.amend \
 +      ${NS}::checkbutton .vpane.lower.commarea.buffer.header.amend \
                -text [mc "Amend Last Commit"] \
 -              -command do_select_commit_type \
 -              -variable selected_commit_type \
 -              -value amend
 +              -variable commit_type_is_amend \
 +              -command do_select_commit_type
        lappend disable_on_lock \
                [list .vpane.lower.commarea.buffer.header.amend conf -state]
  }
@@@ -3356,6 -3349,7 +3356,6 @@@ pack $ui_coml -side left -fill 
  
  if {![is_enabled nocommit]} {
        pack .vpane.lower.commarea.buffer.header.amend -side right
 -      pack .vpane.lower.commarea.buffer.header.new -side right
  }
  
  textframe .vpane.lower.commarea.buffer.frame
@@@ -3369,10 -3363,16 +3369,16 @@@ ttext $ui_comm -background white -foreg
        -relief sunken \
        -width $repo_config(gui.commitmsgwidth) -height 9 -wrap none \
        -font font_diff \
+       -xscrollcommand {.vpane.lower.commarea.buffer.frame.sbx set} \
        -yscrollcommand {.vpane.lower.commarea.buffer.frame.sby set}
+ ${NS}::scrollbar .vpane.lower.commarea.buffer.frame.sbx \
+       -orient horizontal \
+       -command [list $ui_comm xview]
  ${NS}::scrollbar .vpane.lower.commarea.buffer.frame.sby \
+       -orient vertical \
        -command [list $ui_comm yview]
  
+ pack .vpane.lower.commarea.buffer.frame.sbx -side bottom -fill x
  pack .vpane.lower.commarea.buffer.frame.sby -side right -fill y
  pack $ui_comm -side left -fill y
  pack .vpane.lower.commarea.buffer.header -side top -fill x
@@@ -3588,31 -3588,15 +3594,31 @@@ set ctxm .vpane.lower.diff.body.ctx
  menu $ctxm -tearoff 0
  $ctxm add command \
        -label [mc "Apply/Reverse Hunk"] \
 -      -command {apply_hunk $cursorX $cursorY}
 +      -command {apply_or_revert_hunk $cursorX $cursorY 0}
  set ui_diff_applyhunk [$ctxm index last]
  lappend diff_actions [list $ctxm entryconf $ui_diff_applyhunk -state]
  $ctxm add command \
        -label [mc "Apply/Reverse Line"] \
 -      -command {apply_range_or_line $cursorX $cursorY; do_rescan}
 +      -command {apply_or_revert_range_or_line $cursorX $cursorY 0; do_rescan}
  set ui_diff_applyline [$ctxm index last]
  lappend diff_actions [list $ctxm entryconf $ui_diff_applyline -state]
  $ctxm add separator
 +$ctxm add command \
 +      -label [mc "Revert Hunk"] \
 +      -command {apply_or_revert_hunk $cursorX $cursorY 1}
 +set ui_diff_reverthunk [$ctxm index last]
 +lappend diff_actions [list $ctxm entryconf $ui_diff_reverthunk -state]
 +$ctxm add command \
 +      -label [mc "Revert Line"] \
 +      -command {apply_or_revert_range_or_line $cursorX $cursorY 1; do_rescan}
 +set ui_diff_revertline [$ctxm index last]
 +lappend diff_actions [list $ctxm entryconf $ui_diff_revertline -state]
 +$ctxm add command \
 +      -label [mc "Undo Last Revert"] \
 +      -command {undo_last_revert; do_rescan}
 +set ui_diff_undorevert [$ctxm index last]
 +lappend diff_actions [list $ctxm entryconf $ui_diff_undorevert -state]
 +$ctxm add separator
  $ctxm add command \
        -label [mc "Show Less Context"] \
        -command show_less_context
@@@ -3691,7 -3675,7 +3697,7 @@@ proc has_textconv {path} 
  }
  
  proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
 -      global current_diff_path file_states
 +      global current_diff_path file_states last_revert
        set ::cursorX $x
        set ::cursorY $y
        if {[info exists file_states($current_diff_path)]} {
                tk_popup $ctxmsm $X $Y
        } else {
                set has_range [expr {[$::ui_diff tag nextrange sel 0.0] != {}}]
 +              set u [mc "Undo Last Revert"]
                if {$::ui_index eq $::current_diff_side} {
                        set l [mc "Unstage Hunk From Commit"]
 +                      set h [mc "Revert Hunk"]
 +
                        if {$has_range} {
                                set t [mc "Unstage Lines From Commit"]
 +                              set r [mc "Revert Lines"]
                        } else {
                                set t [mc "Unstage Line From Commit"]
 +                              set r [mc "Revert Line"]
                        }
                } else {
                        set l [mc "Stage Hunk For Commit"]
 +                      set h [mc "Revert Hunk"]
 +
                        if {$has_range} {
                                set t [mc "Stage Lines For Commit"]
 +                              set r [mc "Revert Lines"]
                        } else {
                                set t [mc "Stage Line For Commit"]
 +                              set r [mc "Revert Line"]
                        }
                }
                if {$::is_3way_diff
                        || [string match {T?} $state]
                        || [has_textconv $current_diff_path]} {
                        set s disabled
 +                      set revert_state disabled
                } else {
                        set s normal
 +
 +                      # Only allow reverting changes in the working tree. If
 +                      # the user wants to revert changes in the index, they
 +                      # need to unstage those first.
 +                      if {$::ui_workdir eq $::current_diff_side} {
 +                              set revert_state normal
 +                      } else {
 +                              set revert_state disabled
 +                      }
                }
 +
 +              if {$last_revert eq {}} {
 +                      set undo_state disabled
 +              } else {
 +                      set undo_state normal
 +              }
 +
                $ctxm entryconf $::ui_diff_applyhunk -state $s -label $l
                $ctxm entryconf $::ui_diff_applyline -state $s -label $t
 +              $ctxm entryconf $::ui_diff_revertline -state $revert_state \
 +                      -label $r
 +              $ctxm entryconf $::ui_diff_reverthunk -state $revert_state \
 +                      -label $h
 +              $ctxm entryconf $::ui_diff_undorevert -state $undo_state \
 +                      -label $u
 +
                tk_popup $ctxm $X $Y
        }
  }
@@@ -3907,14 -3858,6 +3913,14 @@@ foreach i [list $ui_index $ui_workdir] 
  }
  unset i
  
 +bind .   <Alt-Key-1> {focus_widget $::ui_workdir}
 +bind .   <Alt-Key-2> {focus_widget $::ui_index}
 +bind .   <Alt-Key-3> {focus $::ui_diff}
 +bind .   <Alt-Key-4> {focus $::ui_comm}
 +
 +set file_lists_last_clicked($ui_index) {}
 +set file_lists_last_clicked($ui_workdir) {}
 +
  set file_lists($ui_index) [list]
  set file_lists($ui_workdir) [list]