]>
Commit | Line | Data |
---|---|---|
f522c9b5 SP |
1 | # git-gui options editor |
2 | # Copyright (C) 2006, 2007 Shawn Pearce | |
3 | ||
72e6b002 AG |
4 | proc config_check_encodings {} { |
5 | global repo_config_new global_config_new | |
6 | ||
7 | set enc $global_config_new(gui.encoding) | |
8 | if {$enc eq {}} { | |
9 | set global_config_new(gui.encoding) [encoding system] | |
10 | } elseif {[tcl_encoding $enc] eq {}} { | |
11 | error_popup [mc "Invalid global encoding '%s'" $enc] | |
12 | return 0 | |
13 | } | |
14 | ||
15 | set enc $repo_config_new(gui.encoding) | |
16 | if {$enc eq {}} { | |
17 | set repo_config_new(gui.encoding) [encoding system] | |
18 | } elseif {[tcl_encoding $enc] eq {}} { | |
19 | error_popup [mc "Invalid repo encoding '%s'" $enc] | |
20 | return 0 | |
21 | } | |
22 | ||
23 | return 1 | |
24 | } | |
25 | ||
f522c9b5 SP |
26 | proc save_config {} { |
27 | global default_config font_descs | |
153ad78b | 28 | global repo_config global_config system_config |
f522c9b5 | 29 | global repo_config_new global_config_new |
95b002ee | 30 | global ui_comm_spell |
f522c9b5 SP |
31 | |
32 | foreach option $font_descs { | |
33 | set name [lindex $option 0] | |
34 | set font [lindex $option 1] | |
35 | font configure $font \ | |
36 | -family $global_config_new(gui.$font^^family) \ | |
37 | -size $global_config_new(gui.$font^^size) | |
38 | font configure ${font}bold \ | |
39 | -family $global_config_new(gui.$font^^family) \ | |
40 | -size $global_config_new(gui.$font^^size) | |
debcd0fd SP |
41 | font configure ${font}italic \ |
42 | -family $global_config_new(gui.$font^^family) \ | |
43 | -size $global_config_new(gui.$font^^size) | |
f522c9b5 SP |
44 | set global_config_new(gui.$name) [font configure $font] |
45 | unset global_config_new(gui.$font^^family) | |
46 | unset global_config_new(gui.$font^^size) | |
47 | } | |
48 | ||
49 | foreach name [array names default_config] { | |
50 | set value $global_config_new($name) | |
51 | if {$value ne $global_config($name)} { | |
153ad78b | 52 | if {$value eq $system_config($name)} { |
f522c9b5 SP |
53 | catch {git config --global --unset $name} |
54 | } else { | |
55 | regsub -all "\[{}\]" $value {"} value | |
56 | git config --global $name $value | |
57 | } | |
58 | set global_config($name) $value | |
59 | if {$value eq $repo_config($name)} { | |
60 | catch {git config --unset $name} | |
61 | set repo_config($name) $value | |
62 | } | |
63 | } | |
64 | } | |
65 | ||
66 | foreach name [array names default_config] { | |
67 | set value $repo_config_new($name) | |
68 | if {$value ne $repo_config($name)} { | |
69 | if {$value eq $global_config($name)} { | |
70 | catch {git config --unset $name} | |
71 | } else { | |
72 | regsub -all "\[{}\]" $value {"} value | |
73 | git config $name $value | |
74 | } | |
75 | set repo_config($name) $value | |
76 | } | |
77 | } | |
95b002ee SP |
78 | |
79 | if {[info exists repo_config(gui.spellingdictionary)]} { | |
80 | set value $repo_config(gui.spellingdictionary) | |
81 | if {$value eq {none}} { | |
82 | if {[info exists ui_comm_spell]} { | |
83 | $ui_comm_spell stop | |
84 | } | |
85 | } elseif {[info exists ui_comm_spell]} { | |
86 | $ui_comm_spell lang $value | |
87 | } | |
88 | } | |
f522c9b5 SP |
89 | } |
90 | ||
f522c9b5 SP |
91 | proc do_options {} { |
92 | global repo_config global_config font_descs | |
93 | global repo_config_new global_config_new | |
c80d7be5 | 94 | global ui_comm_spell use_ttk NS |
f522c9b5 SP |
95 | |
96 | array unset repo_config_new | |
97 | array unset global_config_new | |
98 | foreach name [array names repo_config] { | |
99 | set repo_config_new($name) $repo_config($name) | |
100 | } | |
101 | load_config 1 | |
102 | foreach name [array names repo_config] { | |
103 | switch -- $name { | |
104 | gui.diffcontext {continue} | |
105 | } | |
106 | set repo_config_new($name) $repo_config($name) | |
107 | } | |
108 | foreach name [array names global_config] { | |
109 | set global_config_new($name) $global_config($name) | |
110 | } | |
111 | ||
112 | set w .options_editor | |
c80d7be5 PT |
113 | Dialog $w |
114 | wm withdraw $w | |
115 | wm transient $w [winfo parent $w] | |
f522c9b5 SP |
116 | wm geometry $w "+[winfo rootx .]+[winfo rooty .]" |
117 | ||
c80d7be5 PT |
118 | ${NS}::frame $w.buttons |
119 | ${NS}::button $w.buttons.restore -text [mc "Restore Defaults"] \ | |
f522c9b5 SP |
120 | -default normal \ |
121 | -command do_restore_defaults | |
122 | pack $w.buttons.restore -side left | |
c80d7be5 | 123 | ${NS}::button $w.buttons.save -text [mc Save] \ |
f522c9b5 SP |
124 | -default active \ |
125 | -command [list do_save_config $w] | |
126 | pack $w.buttons.save -side right | |
c80d7be5 | 127 | ${NS}::button $w.buttons.cancel -text [mc "Cancel"] \ |
f522c9b5 SP |
128 | -default normal \ |
129 | -command [list destroy $w] | |
130 | pack $w.buttons.cancel -side right -padx 5 | |
131 | pack $w.buttons -side bottom -fill x -pady 10 -padx 10 | |
132 | ||
c80d7be5 PT |
133 | ${NS}::labelframe $w.repo -text [mc "%s Repository" [reponame]] |
134 | ${NS}::labelframe $w.global -text [mc "Global (All Repositories)"] | |
f522c9b5 SP |
135 | pack $w.repo -side left -fill both -expand 1 -pady 5 -padx 5 |
136 | pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5 | |
137 | ||
138 | set optid 0 | |
139 | foreach option { | |
1ac17950 CS |
140 | {t user.name {mc "User Name"}} |
141 | {t user.email {mc "Email Address"}} | |
142 | ||
143 | {b merge.summary {mc "Summarize Merge Commits"}} | |
144 | {i-1..5 merge.verbosity {mc "Merge Verbosity"}} | |
145 | {b merge.diffstat {mc "Show Diffstat After Merge"}} | |
7e30682c | 146 | {t merge.tool {mc "Use Merge Tool"}} |
1ac17950 CS |
147 | |
148 | {b gui.trustmtime {mc "Trust File Modification Timestamps"}} | |
149 | {b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}} | |
150 | {b gui.matchtrackingbranch {mc "Match Tracking Branches"}} | |
1fbaccad | 151 | {b gui.textconv {mc "Use Textconv For Diffs and Blames"}} |
57cae87b | 152 | {b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}} |
d478056c | 153 | {i-0..100 gui.maxrecentrepo {mc "Maximum Length of Recent Repositories List"}} |
57cae87b | 154 | {i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}} |
a9c80b83 | 155 | {i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}} |
55ba8a34 | 156 | {i-1..99 gui.diffcontext {mc "Number of Diff Context Lines"}} |
54531e7c | 157 | {t gui.diffopts {mc "Additional Diff Parameters"}} |
11027d54 | 158 | {i-0..99 gui.commitmsgwidth {mc "Commit Message Text Width"}} |
1ac17950 | 159 | {t gui.newbranchtemplate {mc "New Branch Name Template"}} |
50102c56 | 160 | {c gui.encoding {mc "Default File Contents Encoding"}} |
f49517a8 | 161 | {b gui.warndetachedcommit {mc "Warn before committing to a detached head"}} |
bb196e26 | 162 | {s gui.stageuntracked {mc "Staging of untracked files"} {list "yes" "no" "ask"}} |
e632b3c0 | 163 | {b gui.displayuntracked {mc "Show untracked files"}} |
a43c5f51 | 164 | {i-1..99 gui.tabsize {mc "Tab spacing"}} |
f522c9b5 SP |
165 | } { |
166 | set type [lindex $option 0] | |
167 | set name [lindex $option 1] | |
1ac17950 | 168 | set text [eval [lindex $option 2]] |
f522c9b5 SP |
169 | incr optid |
170 | foreach f {repo global} { | |
171 | switch -glob -- $type { | |
172 | b { | |
c80d7be5 | 173 | ${NS}::checkbutton $w.$f.$optid -text $text \ |
f522c9b5 SP |
174 | -variable ${f}_config_new($name) \ |
175 | -onvalue true \ | |
176 | -offvalue false | |
177 | pack $w.$f.$optid -side top -anchor w | |
178 | } | |
179 | i-* { | |
180 | regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max | |
c80d7be5 | 181 | ${NS}::frame $w.$f.$optid |
eca96368 | 182 | ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text] |
f522c9b5 | 183 | pack $w.$f.$optid.l -side left -anchor w -fill x |
c80d7be5 | 184 | tspinbox $w.$f.$optid.v \ |
f522c9b5 SP |
185 | -textvariable ${f}_config_new($name) \ |
186 | -from $min \ | |
187 | -to $max \ | |
188 | -increment 1 \ | |
189 | -width [expr {1 + [string length $max]}] | |
190 | bind $w.$f.$optid.v <FocusIn> {%W selection range 0 end} | |
191 | pack $w.$f.$optid.v -side right -anchor e -padx 5 | |
192 | pack $w.$f.$optid -side top -anchor w -fill x | |
193 | } | |
50102c56 | 194 | c - |
f522c9b5 | 195 | t { |
c80d7be5 | 196 | ${NS}::frame $w.$f.$optid |
eca96368 | 197 | ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text] |
c80d7be5 | 198 | ${NS}::entry $w.$f.$optid.v \ |
f522c9b5 SP |
199 | -width 20 \ |
200 | -textvariable ${f}_config_new($name) | |
201 | pack $w.$f.$optid.l -side left -anchor w | |
202 | pack $w.$f.$optid.v -side left -anchor w \ | |
203 | -fill x -expand 1 \ | |
204 | -padx 5 | |
50102c56 AG |
205 | if {$type eq {c}} { |
206 | menu $w.$f.$optid.m | |
207 | build_encoding_menu $w.$f.$optid.m \ | |
208 | [list set ${f}_config_new($name)] 1 | |
c80d7be5 | 209 | ${NS}::button $w.$f.$optid.b \ |
50102c56 AG |
210 | -text [mc "Change"] \ |
211 | -command [list popup_btn_menu \ | |
212 | $w.$f.$optid.m $w.$f.$optid.b] | |
213 | pack $w.$f.$optid.b -side left -anchor w | |
214 | } | |
f522c9b5 SP |
215 | pack $w.$f.$optid -side top -anchor w -fill x |
216 | } | |
bb196e26 BW |
217 | s { |
218 | set opts [eval [lindex $option 3]] | |
219 | ${NS}::frame $w.$f.$optid | |
eca96368 | 220 | ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text] |
bb196e26 BW |
221 | if {$use_ttk} { |
222 | ttk::combobox $w.$f.$optid.v \ | |
223 | -textvariable ${f}_config_new($name) \ | |
224 | -values $opts -state readonly | |
225 | } else { | |
226 | eval tk_optionMenu $w.$f.$optid.v \ | |
227 | ${f}_config_new($name) \ | |
228 | $opts | |
229 | } | |
230 | pack $w.$f.$optid.l -side left -anchor w -fill x | |
231 | pack $w.$f.$optid.v -side right -anchor e -padx 5 | |
232 | pack $w.$f.$optid -side top -anchor w -fill x | |
233 | } | |
f522c9b5 SP |
234 | } |
235 | } | |
236 | } | |
237 | ||
95b002ee SP |
238 | set all_dicts [linsert \ |
239 | [spellcheck::available_langs] \ | |
240 | 0 \ | |
241 | none] | |
242 | incr optid | |
243 | foreach f {repo global} { | |
244 | if {![info exists ${f}_config_new(gui.spellingdictionary)]} { | |
245 | if {[info exists ui_comm_spell]} { | |
246 | set value [$ui_comm_spell lang] | |
247 | } else { | |
248 | set value none | |
249 | } | |
250 | set ${f}_config_new(gui.spellingdictionary) $value | |
251 | } | |
252 | ||
c80d7be5 PT |
253 | ${NS}::frame $w.$f.$optid |
254 | ${NS}::label $w.$f.$optid.l -text [mc "Spelling Dictionary:"] | |
255 | if {$use_ttk} { | |
256 | ttk::combobox $w.$f.$optid.v \ | |
257 | -textvariable ${f}_config_new(gui.spellingdictionary) \ | |
258 | -values $all_dicts -state readonly | |
259 | } else { | |
260 | eval tk_optionMenu $w.$f.$optid.v \ | |
261 | ${f}_config_new(gui.spellingdictionary) \ | |
262 | $all_dicts | |
263 | } | |
95b002ee | 264 | pack $w.$f.$optid.l -side left -anchor w -fill x |
740b9b9f | 265 | pack $w.$f.$optid.v -side right -anchor e -padx 5 |
95b002ee SP |
266 | pack $w.$f.$optid -side top -anchor w -fill x |
267 | } | |
268 | unset all_dicts | |
269 | ||
f522c9b5 SP |
270 | set all_fonts [lsort [font families]] |
271 | foreach option $font_descs { | |
272 | set name [lindex $option 0] | |
273 | set font [lindex $option 1] | |
1ac17950 | 274 | set text [eval [lindex $option 2]] |
f522c9b5 SP |
275 | |
276 | set global_config_new(gui.$font^^family) \ | |
277 | [font configure $font -family] | |
278 | set global_config_new(gui.$font^^size) \ | |
279 | [font configure $font -size] | |
280 | ||
c80d7be5 | 281 | ${NS}::frame $w.global.$name |
eca96368 | 282 | ${NS}::label $w.global.$name.l -text [mc "%s:" $text] |
c80d7be5 | 283 | ${NS}::button $w.global.$name.b \ |
afe2098d SP |
284 | -text [mc "Change Font"] \ |
285 | -command [list \ | |
c80d7be5 | 286 | tchoosefont \ |
afe2098d SP |
287 | $w \ |
288 | [mc "Choose %s" $text] \ | |
289 | global_config_new(gui.$font^^family) \ | |
290 | global_config_new(gui.$font^^size) \ | |
291 | ] | |
c80d7be5 PT |
292 | ${NS}::label $w.global.$name.f -textvariable global_config_new(gui.$font^^family) |
293 | ${NS}::label $w.global.$name.s -textvariable global_config_new(gui.$font^^size) | |
294 | ${NS}::label $w.global.$name.pt -text [mc "pt."] | |
afe2098d SP |
295 | pack $w.global.$name.l -side left -anchor w |
296 | pack $w.global.$name.b -side right -anchor e | |
297 | pack $w.global.$name.pt -side right -anchor w | |
298 | pack $w.global.$name.s -side right -anchor w | |
299 | pack $w.global.$name.f -side right -anchor w | |
f522c9b5 SP |
300 | pack $w.global.$name -side top -anchor w -fill x |
301 | } | |
302 | ||
303 | bind $w <Visibility> "grab $w; focus $w.buttons.save" | |
304 | bind $w <Key-Escape> "destroy $w" | |
305 | bind $w <Key-Return> [list do_save_config $w] | |
13824e2d SP |
306 | |
307 | if {[is_MacOSX]} { | |
308 | set t [mc "Preferences"] | |
309 | } else { | |
310 | set t [mc "Options"] | |
311 | } | |
312 | wm title $w "[appname] ([reponame]): $t" | |
c80d7be5 | 313 | wm deiconify $w |
f522c9b5 SP |
314 | tkwait window $w |
315 | } | |
316 | ||
317 | proc do_restore_defaults {} { | |
153ad78b | 318 | global font_descs default_config repo_config system_config |
f522c9b5 SP |
319 | global repo_config_new global_config_new |
320 | ||
321 | foreach name [array names default_config] { | |
153ad78b AG |
322 | set repo_config_new($name) $system_config($name) |
323 | set global_config_new($name) $system_config($name) | |
f522c9b5 SP |
324 | } |
325 | ||
326 | foreach option $font_descs { | |
327 | set name [lindex $option 0] | |
153ad78b | 328 | set repo_config(gui.$name) $system_config(gui.$name) |
f522c9b5 SP |
329 | } |
330 | apply_config | |
331 | ||
332 | foreach option $font_descs { | |
333 | set name [lindex $option 0] | |
334 | set font [lindex $option 1] | |
335 | set global_config_new(gui.$font^^family) \ | |
336 | [font configure $font -family] | |
337 | set global_config_new(gui.$font^^size) \ | |
338 | [font configure $font -size] | |
339 | } | |
340 | } | |
341 | ||
342 | proc do_save_config {w} { | |
72e6b002 | 343 | if {![config_check_encodings]} return |
f522c9b5 | 344 | if {[catch {save_config} err]} { |
31bb1d1b | 345 | error_popup [strcat [mc "Failed to completely save options:"] "\n\n$err"] |
f522c9b5 SP |
346 | } |
347 | reshow_diff | |
348 | destroy $w | |
349 | } |