]>
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 | |
28 | global repo_config global_config | |
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)} { | |
52 | if {$value eq $default_config($name)} { | |
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 | |
95b002ee | 94 | global ui_comm_spell |
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 | |
113 | toplevel $w | |
114 | wm geometry $w "+[winfo rootx .]+[winfo rooty .]" | |
115 | ||
f522c9b5 | 116 | frame $w.buttons |
1ac17950 | 117 | button $w.buttons.restore -text [mc "Restore Defaults"] \ |
f522c9b5 SP |
118 | -default normal \ |
119 | -command do_restore_defaults | |
120 | pack $w.buttons.restore -side left | |
1ac17950 | 121 | button $w.buttons.save -text [mc Save] \ |
f522c9b5 SP |
122 | -default active \ |
123 | -command [list do_save_config $w] | |
124 | pack $w.buttons.save -side right | |
1ac17950 | 125 | button $w.buttons.cancel -text [mc "Cancel"] \ |
f522c9b5 SP |
126 | -default normal \ |
127 | -command [list destroy $w] | |
128 | pack $w.buttons.cancel -side right -padx 5 | |
129 | pack $w.buttons -side bottom -fill x -pady 10 -padx 10 | |
130 | ||
1ac17950 CS |
131 | labelframe $w.repo -text [mc "%s Repository" [reponame]] |
132 | labelframe $w.global -text [mc "Global (All Repositories)"] | |
f522c9b5 SP |
133 | pack $w.repo -side left -fill both -expand 1 -pady 5 -padx 5 |
134 | pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5 | |
135 | ||
136 | set optid 0 | |
137 | foreach option { | |
1ac17950 CS |
138 | {t user.name {mc "User Name"}} |
139 | {t user.email {mc "Email Address"}} | |
140 | ||
141 | {b merge.summary {mc "Summarize Merge Commits"}} | |
142 | {i-1..5 merge.verbosity {mc "Merge Verbosity"}} | |
143 | {b merge.diffstat {mc "Show Diffstat After Merge"}} | |
7e30682c | 144 | {t merge.tool {mc "Use Merge Tool"}} |
1ac17950 CS |
145 | |
146 | {b gui.trustmtime {mc "Trust File Modification Timestamps"}} | |
147 | {b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}} | |
148 | {b gui.matchtrackingbranch {mc "Match Tracking Branches"}} | |
57cae87b AG |
149 | {b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}} |
150 | {i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}} | |
a9c80b83 | 151 | {i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}} |
55ba8a34 | 152 | {i-1..99 gui.diffcontext {mc "Number of Diff Context Lines"}} |
11027d54 | 153 | {i-0..99 gui.commitmsgwidth {mc "Commit Message Text Width"}} |
1ac17950 | 154 | {t gui.newbranchtemplate {mc "New Branch Name Template"}} |
50102c56 | 155 | {c gui.encoding {mc "Default File Contents Encoding"}} |
f522c9b5 SP |
156 | } { |
157 | set type [lindex $option 0] | |
158 | set name [lindex $option 1] | |
1ac17950 | 159 | set text [eval [lindex $option 2]] |
f522c9b5 SP |
160 | incr optid |
161 | foreach f {repo global} { | |
162 | switch -glob -- $type { | |
163 | b { | |
164 | checkbutton $w.$f.$optid -text $text \ | |
165 | -variable ${f}_config_new($name) \ | |
166 | -onvalue true \ | |
167 | -offvalue false | |
168 | pack $w.$f.$optid -side top -anchor w | |
169 | } | |
170 | i-* { | |
171 | regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max | |
172 | frame $w.$f.$optid | |
173 | label $w.$f.$optid.l -text "$text:" | |
174 | pack $w.$f.$optid.l -side left -anchor w -fill x | |
175 | spinbox $w.$f.$optid.v \ | |
176 | -textvariable ${f}_config_new($name) \ | |
177 | -from $min \ | |
178 | -to $max \ | |
179 | -increment 1 \ | |
180 | -width [expr {1 + [string length $max]}] | |
181 | bind $w.$f.$optid.v <FocusIn> {%W selection range 0 end} | |
182 | pack $w.$f.$optid.v -side right -anchor e -padx 5 | |
183 | pack $w.$f.$optid -side top -anchor w -fill x | |
184 | } | |
50102c56 | 185 | c - |
f522c9b5 SP |
186 | t { |
187 | frame $w.$f.$optid | |
188 | label $w.$f.$optid.l -text "$text:" | |
189 | entry $w.$f.$optid.v \ | |
190 | -borderwidth 1 \ | |
191 | -relief sunken \ | |
192 | -width 20 \ | |
193 | -textvariable ${f}_config_new($name) | |
194 | pack $w.$f.$optid.l -side left -anchor w | |
195 | pack $w.$f.$optid.v -side left -anchor w \ | |
196 | -fill x -expand 1 \ | |
197 | -padx 5 | |
50102c56 AG |
198 | if {$type eq {c}} { |
199 | menu $w.$f.$optid.m | |
200 | build_encoding_menu $w.$f.$optid.m \ | |
201 | [list set ${f}_config_new($name)] 1 | |
202 | button $w.$f.$optid.b \ | |
203 | -text [mc "Change"] \ | |
204 | -command [list popup_btn_menu \ | |
205 | $w.$f.$optid.m $w.$f.$optid.b] | |
206 | pack $w.$f.$optid.b -side left -anchor w | |
207 | } | |
f522c9b5 SP |
208 | pack $w.$f.$optid -side top -anchor w -fill x |
209 | } | |
210 | } | |
211 | } | |
212 | } | |
213 | ||
95b002ee SP |
214 | set all_dicts [linsert \ |
215 | [spellcheck::available_langs] \ | |
216 | 0 \ | |
217 | none] | |
218 | incr optid | |
219 | foreach f {repo global} { | |
220 | if {![info exists ${f}_config_new(gui.spellingdictionary)]} { | |
221 | if {[info exists ui_comm_spell]} { | |
222 | set value [$ui_comm_spell lang] | |
223 | } else { | |
224 | set value none | |
225 | } | |
226 | set ${f}_config_new(gui.spellingdictionary) $value | |
227 | } | |
228 | ||
229 | frame $w.$f.$optid | |
230 | label $w.$f.$optid.l -text [mc "Spelling Dictionary:"] | |
231 | eval tk_optionMenu $w.$f.$optid.v \ | |
232 | ${f}_config_new(gui.spellingdictionary) \ | |
233 | $all_dicts | |
234 | pack $w.$f.$optid.l -side left -anchor w -fill x | |
740b9b9f | 235 | pack $w.$f.$optid.v -side right -anchor e -padx 5 |
95b002ee SP |
236 | pack $w.$f.$optid -side top -anchor w -fill x |
237 | } | |
238 | unset all_dicts | |
239 | ||
f522c9b5 SP |
240 | set all_fonts [lsort [font families]] |
241 | foreach option $font_descs { | |
242 | set name [lindex $option 0] | |
243 | set font [lindex $option 1] | |
1ac17950 | 244 | set text [eval [lindex $option 2]] |
f522c9b5 SP |
245 | |
246 | set global_config_new(gui.$font^^family) \ | |
247 | [font configure $font -family] | |
248 | set global_config_new(gui.$font^^size) \ | |
249 | [font configure $font -size] | |
250 | ||
251 | frame $w.global.$name | |
252 | label $w.global.$name.l -text "$text:" | |
afe2098d SP |
253 | button $w.global.$name.b \ |
254 | -text [mc "Change Font"] \ | |
255 | -command [list \ | |
256 | choose_font::pick \ | |
257 | $w \ | |
258 | [mc "Choose %s" $text] \ | |
259 | global_config_new(gui.$font^^family) \ | |
260 | global_config_new(gui.$font^^size) \ | |
261 | ] | |
262 | label $w.global.$name.f -textvariable global_config_new(gui.$font^^family) | |
263 | label $w.global.$name.s -textvariable global_config_new(gui.$font^^size) | |
264 | label $w.global.$name.pt -text [mc "pt."] | |
265 | pack $w.global.$name.l -side left -anchor w | |
266 | pack $w.global.$name.b -side right -anchor e | |
267 | pack $w.global.$name.pt -side right -anchor w | |
268 | pack $w.global.$name.s -side right -anchor w | |
269 | pack $w.global.$name.f -side right -anchor w | |
f522c9b5 SP |
270 | pack $w.global.$name -side top -anchor w -fill x |
271 | } | |
272 | ||
273 | bind $w <Visibility> "grab $w; focus $w.buttons.save" | |
274 | bind $w <Key-Escape> "destroy $w" | |
275 | bind $w <Key-Return> [list do_save_config $w] | |
13824e2d SP |
276 | |
277 | if {[is_MacOSX]} { | |
278 | set t [mc "Preferences"] | |
279 | } else { | |
280 | set t [mc "Options"] | |
281 | } | |
282 | wm title $w "[appname] ([reponame]): $t" | |
f522c9b5 SP |
283 | tkwait window $w |
284 | } | |
285 | ||
286 | proc do_restore_defaults {} { | |
287 | global font_descs default_config repo_config | |
288 | global repo_config_new global_config_new | |
289 | ||
290 | foreach name [array names default_config] { | |
291 | set repo_config_new($name) $default_config($name) | |
292 | set global_config_new($name) $default_config($name) | |
293 | } | |
294 | ||
295 | foreach option $font_descs { | |
296 | set name [lindex $option 0] | |
297 | set repo_config(gui.$name) $default_config(gui.$name) | |
298 | } | |
299 | apply_config | |
300 | ||
301 | foreach option $font_descs { | |
302 | set name [lindex $option 0] | |
303 | set font [lindex $option 1] | |
304 | set global_config_new(gui.$font^^family) \ | |
305 | [font configure $font -family] | |
306 | set global_config_new(gui.$font^^size) \ | |
307 | [font configure $font -size] | |
308 | } | |
309 | } | |
310 | ||
311 | proc do_save_config {w} { | |
72e6b002 | 312 | if {![config_check_encodings]} return |
f522c9b5 | 313 | if {[catch {save_config} err]} { |
31bb1d1b | 314 | error_popup [strcat [mc "Failed to completely save options:"] "\n\n$err"] |
f522c9b5 SP |
315 | } |
316 | reshow_diff | |
317 | destroy $w | |
318 | } |