git-gui / lib / option.tclon commit Merge branch 'maint' (fc721b6)
   1# git-gui options editor
   2# Copyright (C) 2006, 2007 Shawn Pearce
   3
   4proc save_config {} {
   5        global default_config font_descs
   6        global repo_config global_config
   7        global repo_config_new global_config_new
   8        global ui_comm_spell
   9
  10        foreach option $font_descs {
  11                set name [lindex $option 0]
  12                set font [lindex $option 1]
  13                font configure $font \
  14                        -family $global_config_new(gui.$font^^family) \
  15                        -size $global_config_new(gui.$font^^size)
  16                font configure ${font}bold \
  17                        -family $global_config_new(gui.$font^^family) \
  18                        -size $global_config_new(gui.$font^^size)
  19                font configure ${font}italic \
  20                        -family $global_config_new(gui.$font^^family) \
  21                        -size $global_config_new(gui.$font^^size)
  22                set global_config_new(gui.$name) [font configure $font]
  23                unset global_config_new(gui.$font^^family)
  24                unset global_config_new(gui.$font^^size)
  25        }
  26
  27        foreach name [array names default_config] {
  28                set value $global_config_new($name)
  29                if {$value ne $global_config($name)} {
  30                        if {$value eq $default_config($name)} {
  31                                catch {git config --global --unset $name}
  32                        } else {
  33                                regsub -all "\[{}\]" $value {"} value
  34                                git config --global $name $value
  35                        }
  36                        set global_config($name) $value
  37                        if {$value eq $repo_config($name)} {
  38                                catch {git config --unset $name}
  39                                set repo_config($name) $value
  40                        }
  41                }
  42        }
  43
  44        foreach name [array names default_config] {
  45                set value $repo_config_new($name)
  46                if {$value ne $repo_config($name)} {
  47                        if {$value eq $global_config($name)} {
  48                                catch {git config --unset $name}
  49                        } else {
  50                                regsub -all "\[{}\]" $value {"} value
  51                                git config $name $value
  52                        }
  53                        set repo_config($name) $value
  54                }
  55        }
  56
  57        if {[info exists repo_config(gui.spellingdictionary)]} {
  58                set value $repo_config(gui.spellingdictionary)
  59                if {$value eq {none}} {
  60                        if {[info exists ui_comm_spell]} {
  61                                $ui_comm_spell stop
  62                        }
  63                } elseif {[info exists ui_comm_spell]} {
  64                        $ui_comm_spell lang $value
  65                }
  66        }
  67}
  68
  69proc do_options {} {
  70        global repo_config global_config font_descs
  71        global repo_config_new global_config_new
  72        global ui_comm_spell
  73
  74        array unset repo_config_new
  75        array unset global_config_new
  76        foreach name [array names repo_config] {
  77                set repo_config_new($name) $repo_config($name)
  78        }
  79        load_config 1
  80        foreach name [array names repo_config] {
  81                switch -- $name {
  82                gui.diffcontext {continue}
  83                }
  84                set repo_config_new($name) $repo_config($name)
  85        }
  86        foreach name [array names global_config] {
  87                set global_config_new($name) $global_config($name)
  88        }
  89
  90        set w .options_editor
  91        toplevel $w
  92        wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
  93
  94        frame $w.buttons
  95        button $w.buttons.restore -text [mc "Restore Defaults"] \
  96                -default normal \
  97                -command do_restore_defaults
  98        pack $w.buttons.restore -side left
  99        button $w.buttons.save -text [mc Save] \
 100                -default active \
 101                -command [list do_save_config $w]
 102        pack $w.buttons.save -side right
 103        button $w.buttons.cancel -text [mc "Cancel"] \
 104                -default normal \
 105                -command [list destroy $w]
 106        pack $w.buttons.cancel -side right -padx 5
 107        pack $w.buttons -side bottom -fill x -pady 10 -padx 10
 108
 109        labelframe $w.repo -text [mc "%s Repository" [reponame]]
 110        labelframe $w.global -text [mc "Global (All Repositories)"]
 111        pack $w.repo -side left -fill both -expand 1 -pady 5 -padx 5
 112        pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5
 113
 114        set optid 0
 115        foreach option {
 116                {t user.name {mc "User Name"}}
 117                {t user.email {mc "Email Address"}}
 118
 119                {b merge.summary {mc "Summarize Merge Commits"}}
 120                {i-1..5 merge.verbosity {mc "Merge Verbosity"}}
 121                {b merge.diffstat {mc "Show Diffstat After Merge"}}
 122
 123                {b gui.trustmtime  {mc "Trust File Modification Timestamps"}}
 124                {b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}}
 125                {b gui.matchtrackingbranch {mc "Match Tracking Branches"}}
 126                {b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}}
 127                {i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}}
 128                {i-0..99 gui.diffcontext {mc "Number of Diff Context Lines"}}
 129                {i-0..99 gui.commitmsgwidth {mc "Commit Message Text Width"}}
 130                {t gui.newbranchtemplate {mc "New Branch Name Template"}}
 131                } {
 132                set type [lindex $option 0]
 133                set name [lindex $option 1]
 134                set text [eval [lindex $option 2]]
 135                incr optid
 136                foreach f {repo global} {
 137                        switch -glob -- $type {
 138                        b {
 139                                checkbutton $w.$f.$optid -text $text \
 140                                        -variable ${f}_config_new($name) \
 141                                        -onvalue true \
 142                                        -offvalue false
 143                                pack $w.$f.$optid -side top -anchor w
 144                        }
 145                        i-* {
 146                                regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max
 147                                frame $w.$f.$optid
 148                                label $w.$f.$optid.l -text "$text:"
 149                                pack $w.$f.$optid.l -side left -anchor w -fill x
 150                                spinbox $w.$f.$optid.v \
 151                                        -textvariable ${f}_config_new($name) \
 152                                        -from $min \
 153                                        -to $max \
 154                                        -increment 1 \
 155                                        -width [expr {1 + [string length $max]}]
 156                                bind $w.$f.$optid.v <FocusIn> {%W selection range 0 end}
 157                                pack $w.$f.$optid.v -side right -anchor e -padx 5
 158                                pack $w.$f.$optid -side top -anchor w -fill x
 159                        }
 160                        t {
 161                                frame $w.$f.$optid
 162                                label $w.$f.$optid.l -text "$text:"
 163                                entry $w.$f.$optid.v \
 164                                        -borderwidth 1 \
 165                                        -relief sunken \
 166                                        -width 20 \
 167                                        -textvariable ${f}_config_new($name)
 168                                pack $w.$f.$optid.l -side left -anchor w
 169                                pack $w.$f.$optid.v -side left -anchor w \
 170                                        -fill x -expand 1 \
 171                                        -padx 5
 172                                pack $w.$f.$optid -side top -anchor w -fill x
 173                        }
 174                        }
 175                }
 176        }
 177
 178        set all_dicts [linsert \
 179                [spellcheck::available_langs] \
 180                0 \
 181                none]
 182        incr optid
 183        foreach f {repo global} {
 184                if {![info exists ${f}_config_new(gui.spellingdictionary)]} {
 185                        if {[info exists ui_comm_spell]} {
 186                                set value [$ui_comm_spell lang]
 187                        } else {
 188                                set value none
 189                        }
 190                        set ${f}_config_new(gui.spellingdictionary) $value
 191                }
 192
 193                frame $w.$f.$optid
 194                label $w.$f.$optid.l -text [mc "Spelling Dictionary:"]
 195                eval tk_optionMenu $w.$f.$optid.v \
 196                        ${f}_config_new(gui.spellingdictionary) \
 197                        $all_dicts
 198                pack $w.$f.$optid.l -side left -anchor w -fill x
 199                pack $w.$f.$optid.v -side right -anchor e -padx 5
 200                pack $w.$f.$optid -side top -anchor w -fill x
 201        }
 202        unset all_dicts
 203
 204        set all_fonts [lsort [font families]]
 205        foreach option $font_descs {
 206                set name [lindex $option 0]
 207                set font [lindex $option 1]
 208                set text [eval [lindex $option 2]]
 209
 210                set global_config_new(gui.$font^^family) \
 211                        [font configure $font -family]
 212                set global_config_new(gui.$font^^size) \
 213                        [font configure $font -size]
 214
 215                frame $w.global.$name
 216                label $w.global.$name.l -text "$text:"
 217                button $w.global.$name.b \
 218                        -text [mc "Change Font"] \
 219                        -command [list \
 220                                choose_font::pick \
 221                                $w \
 222                                [mc "Choose %s" $text] \
 223                                global_config_new(gui.$font^^family) \
 224                                global_config_new(gui.$font^^size) \
 225                                ]
 226                label $w.global.$name.f -textvariable global_config_new(gui.$font^^family)
 227                label $w.global.$name.s -textvariable global_config_new(gui.$font^^size)
 228                label $w.global.$name.pt -text [mc "pt."]
 229                pack $w.global.$name.l -side left -anchor w
 230                pack $w.global.$name.b -side right -anchor e
 231                pack $w.global.$name.pt -side right -anchor w
 232                pack $w.global.$name.s -side right -anchor w
 233                pack $w.global.$name.f -side right -anchor w
 234                pack $w.global.$name -side top -anchor w -fill x
 235        }
 236
 237        bind $w <Visibility> "grab $w; focus $w.buttons.save"
 238        bind $w <Key-Escape> "destroy $w"
 239        bind $w <Key-Return> [list do_save_config $w]
 240
 241        if {[is_MacOSX]} {
 242                set t [mc "Preferences"]
 243        } else {
 244                set t [mc "Options"]
 245        }
 246        wm title $w "[appname] ([reponame]): $t"
 247        tkwait window $w
 248}
 249
 250proc do_restore_defaults {} {
 251        global font_descs default_config repo_config
 252        global repo_config_new global_config_new
 253
 254        foreach name [array names default_config] {
 255                set repo_config_new($name) $default_config($name)
 256                set global_config_new($name) $default_config($name)
 257        }
 258
 259        foreach option $font_descs {
 260                set name [lindex $option 0]
 261                set repo_config(gui.$name) $default_config(gui.$name)
 262        }
 263        apply_config
 264
 265        foreach option $font_descs {
 266                set name [lindex $option 0]
 267                set font [lindex $option 1]
 268                set global_config_new(gui.$font^^family) \
 269                        [font configure $font -family]
 270                set global_config_new(gui.$font^^size) \
 271                        [font configure $font -size]
 272        }
 273}
 274
 275proc do_save_config {w} {
 276        if {[catch {save_config} err]} {
 277                error_popup [strcat [mc "Failed to completely save options:"] "\n\n$err"]
 278        }
 279        reshow_diff
 280        destroy $w
 281}