git-gui / lib / option.tclon commit Merge branch 'maint' (e3c58f8)
   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                {i-0..99 gui.diffcontext {mc "Number of Diff Context Lines"}}
 127                {t gui.newbranchtemplate {mc "New Branch Name Template"}}
 128                } {
 129                set type [lindex $option 0]
 130                set name [lindex $option 1]
 131                set text [eval [lindex $option 2]]
 132                incr optid
 133                foreach f {repo global} {
 134                        switch -glob -- $type {
 135                        b {
 136                                checkbutton $w.$f.$optid -text $text \
 137                                        -variable ${f}_config_new($name) \
 138                                        -onvalue true \
 139                                        -offvalue false
 140                                pack $w.$f.$optid -side top -anchor w
 141                        }
 142                        i-* {
 143                                regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max
 144                                frame $w.$f.$optid
 145                                label $w.$f.$optid.l -text "$text:"
 146                                pack $w.$f.$optid.l -side left -anchor w -fill x
 147                                spinbox $w.$f.$optid.v \
 148                                        -textvariable ${f}_config_new($name) \
 149                                        -from $min \
 150                                        -to $max \
 151                                        -increment 1 \
 152                                        -width [expr {1 + [string length $max]}]
 153                                bind $w.$f.$optid.v <FocusIn> {%W selection range 0 end}
 154                                pack $w.$f.$optid.v -side right -anchor e -padx 5
 155                                pack $w.$f.$optid -side top -anchor w -fill x
 156                        }
 157                        t {
 158                                frame $w.$f.$optid
 159                                label $w.$f.$optid.l -text "$text:"
 160                                entry $w.$f.$optid.v \
 161                                        -borderwidth 1 \
 162                                        -relief sunken \
 163                                        -width 20 \
 164                                        -textvariable ${f}_config_new($name)
 165                                pack $w.$f.$optid.l -side left -anchor w
 166                                pack $w.$f.$optid.v -side left -anchor w \
 167                                        -fill x -expand 1 \
 168                                        -padx 5
 169                                pack $w.$f.$optid -side top -anchor w -fill x
 170                        }
 171                        }
 172                }
 173        }
 174
 175        set all_dicts [linsert \
 176                [spellcheck::available_langs] \
 177                0 \
 178                none]
 179        incr optid
 180        foreach f {repo global} {
 181                if {![info exists ${f}_config_new(gui.spellingdictionary)]} {
 182                        if {[info exists ui_comm_spell]} {
 183                                set value [$ui_comm_spell lang]
 184                        } else {
 185                                set value none
 186                        }
 187                        set ${f}_config_new(gui.spellingdictionary) $value
 188                }
 189
 190                frame $w.$f.$optid
 191                label $w.$f.$optid.l -text [mc "Spelling Dictionary:"]
 192                eval tk_optionMenu $w.$f.$optid.v \
 193                        ${f}_config_new(gui.spellingdictionary) \
 194                        $all_dicts
 195                pack $w.$f.$optid.l -side left -anchor w -fill x
 196                pack $w.$f.$optid.v -side right -anchor e -padx 5
 197                pack $w.$f.$optid -side top -anchor w -fill x
 198        }
 199        unset all_dicts
 200
 201        set all_fonts [lsort [font families]]
 202        foreach option $font_descs {
 203                set name [lindex $option 0]
 204                set font [lindex $option 1]
 205                set text [eval [lindex $option 2]]
 206
 207                set global_config_new(gui.$font^^family) \
 208                        [font configure $font -family]
 209                set global_config_new(gui.$font^^size) \
 210                        [font configure $font -size]
 211
 212                frame $w.global.$name
 213                label $w.global.$name.l -text "$text:"
 214                button $w.global.$name.b \
 215                        -text [mc "Change Font"] \
 216                        -command [list \
 217                                choose_font::pick \
 218                                $w \
 219                                [mc "Choose %s" $text] \
 220                                global_config_new(gui.$font^^family) \
 221                                global_config_new(gui.$font^^size) \
 222                                ]
 223                label $w.global.$name.f -textvariable global_config_new(gui.$font^^family)
 224                label $w.global.$name.s -textvariable global_config_new(gui.$font^^size)
 225                label $w.global.$name.pt -text [mc "pt."]
 226                pack $w.global.$name.l -side left -anchor w
 227                pack $w.global.$name.b -side right -anchor e
 228                pack $w.global.$name.pt -side right -anchor w
 229                pack $w.global.$name.s -side right -anchor w
 230                pack $w.global.$name.f -side right -anchor w
 231                pack $w.global.$name -side top -anchor w -fill x
 232        }
 233
 234        bind $w <Visibility> "grab $w; focus $w.buttons.save"
 235        bind $w <Key-Escape> "destroy $w"
 236        bind $w <Key-Return> [list do_save_config $w]
 237
 238        if {[is_MacOSX]} {
 239                set t [mc "Preferences"]
 240        } else {
 241                set t [mc "Options"]
 242        }
 243        wm title $w "[appname] ([reponame]): $t"
 244        tkwait window $w
 245}
 246
 247proc do_restore_defaults {} {
 248        global font_descs default_config repo_config
 249        global repo_config_new global_config_new
 250
 251        foreach name [array names default_config] {
 252                set repo_config_new($name) $default_config($name)
 253                set global_config_new($name) $default_config($name)
 254        }
 255
 256        foreach option $font_descs {
 257                set name [lindex $option 0]
 258                set repo_config(gui.$name) $default_config(gui.$name)
 259        }
 260        apply_config
 261
 262        foreach option $font_descs {
 263                set name [lindex $option 0]
 264                set font [lindex $option 1]
 265                set global_config_new(gui.$font^^family) \
 266                        [font configure $font -family]
 267                set global_config_new(gui.$font^^size) \
 268                        [font configure $font -size]
 269        }
 270}
 271
 272proc do_save_config {w} {
 273        if {[catch {save_config} err]} {
 274                error_popup [strcat [mc "Failed to completely save options:"] "\n\n$err"]
 275        }
 276        reshow_diff
 277        destroy $w
 278}