347 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Tcl
		
	
	
			
		
		
	
	
			347 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Tcl
		
	
	
| # git-gui options editor
 | |
| # Copyright (C) 2006, 2007 Shawn Pearce
 | |
| 
 | |
| proc config_check_encodings {} {
 | |
| 	global repo_config_new global_config_new
 | |
| 
 | |
| 	set enc $global_config_new(gui.encoding)
 | |
| 	if {$enc eq {}} {
 | |
| 		set global_config_new(gui.encoding) [encoding system]
 | |
| 	} elseif {[tcl_encoding $enc] eq {}} {
 | |
| 		error_popup [mc "Invalid global encoding '%s'" $enc]
 | |
| 		return 0
 | |
| 	}
 | |
| 
 | |
| 	set enc $repo_config_new(gui.encoding)
 | |
| 	if {$enc eq {}} {
 | |
| 		set repo_config_new(gui.encoding) [encoding system]
 | |
| 	} elseif {[tcl_encoding $enc] eq {}} {
 | |
| 		error_popup [mc "Invalid repo encoding '%s'" $enc]
 | |
| 		return 0
 | |
| 	}
 | |
| 
 | |
| 	return 1
 | |
| }
 | |
| 
 | |
| proc save_config {} {
 | |
| 	global default_config font_descs
 | |
| 	global repo_config global_config system_config
 | |
| 	global repo_config_new global_config_new
 | |
| 	global ui_comm_spell
 | |
| 
 | |
| 	foreach option $font_descs {
 | |
| 		set name [lindex $option 0]
 | |
| 		set font [lindex $option 1]
 | |
| 		font configure $font \
 | |
| 			-family $global_config_new(gui.$font^^family) \
 | |
| 			-size $global_config_new(gui.$font^^size)
 | |
| 		font configure ${font}bold \
 | |
| 			-family $global_config_new(gui.$font^^family) \
 | |
| 			-size $global_config_new(gui.$font^^size)
 | |
| 		font configure ${font}italic \
 | |
| 			-family $global_config_new(gui.$font^^family) \
 | |
| 			-size $global_config_new(gui.$font^^size)
 | |
| 		set global_config_new(gui.$name) [font configure $font]
 | |
| 		unset global_config_new(gui.$font^^family)
 | |
| 		unset global_config_new(gui.$font^^size)
 | |
| 	}
 | |
| 
 | |
| 	foreach name [array names default_config] {
 | |
| 		set value $global_config_new($name)
 | |
| 		if {$value ne $global_config($name)} {
 | |
| 			if {$value eq $system_config($name)} {
 | |
| 				catch {git config --global --unset $name}
 | |
| 			} else {
 | |
| 				regsub -all "\[{}\]" $value {"} value
 | |
| 				git config --global $name $value
 | |
| 			}
 | |
| 			set global_config($name) $value
 | |
| 			if {$value eq $repo_config($name)} {
 | |
| 				catch {git config --unset $name}
 | |
| 				set repo_config($name) $value
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	foreach name [array names default_config] {
 | |
| 		set value $repo_config_new($name)
 | |
| 		if {$value ne $repo_config($name)} {
 | |
| 			if {$value eq $global_config($name)} {
 | |
| 				catch {git config --unset $name}
 | |
| 			} else {
 | |
| 				regsub -all "\[{}\]" $value {"} value
 | |
| 				git config $name $value
 | |
| 			}
 | |
| 			set repo_config($name) $value
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if {[info exists repo_config(gui.spellingdictionary)]} {
 | |
| 		set value $repo_config(gui.spellingdictionary)
 | |
| 		if {$value eq {none}} {
 | |
| 			if {[info exists ui_comm_spell]} {
 | |
| 				$ui_comm_spell stop
 | |
| 			}
 | |
| 		} elseif {[info exists ui_comm_spell]} {
 | |
| 			$ui_comm_spell lang $value
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| proc do_options {} {
 | |
| 	global repo_config global_config font_descs
 | |
| 	global repo_config_new global_config_new
 | |
| 	global ui_comm_spell use_ttk NS
 | |
| 
 | |
| 	array unset repo_config_new
 | |
| 	array unset global_config_new
 | |
| 	foreach name [array names repo_config] {
 | |
| 		set repo_config_new($name) $repo_config($name)
 | |
| 	}
 | |
| 	load_config 1
 | |
| 	foreach name [array names repo_config] {
 | |
| 		switch -- $name {
 | |
| 		gui.diffcontext {continue}
 | |
| 		}
 | |
| 		set repo_config_new($name) $repo_config($name)
 | |
| 	}
 | |
| 	foreach name [array names global_config] {
 | |
| 		set global_config_new($name) $global_config($name)
 | |
| 	}
 | |
| 
 | |
| 	set w .options_editor
 | |
| 	Dialog $w
 | |
| 	wm withdraw $w
 | |
| 	wm transient $w [winfo parent $w]
 | |
| 	wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
 | |
| 
 | |
| 	${NS}::frame $w.buttons
 | |
| 	${NS}::button $w.buttons.restore -text [mc "Restore Defaults"] \
 | |
| 		-default normal \
 | |
| 		-command do_restore_defaults
 | |
| 	pack $w.buttons.restore -side left
 | |
| 	${NS}::button $w.buttons.save -text [mc Save] \
 | |
| 		-default active \
 | |
| 		-command [list do_save_config $w]
 | |
| 	pack $w.buttons.save -side right
 | |
| 	${NS}::button $w.buttons.cancel -text [mc "Cancel"] \
 | |
| 		-default normal \
 | |
| 		-command [list destroy $w]
 | |
| 	pack $w.buttons.cancel -side right -padx 5
 | |
| 	pack $w.buttons -side bottom -fill x -pady 10 -padx 10
 | |
| 
 | |
| 	${NS}::labelframe $w.repo -text [mc "%s Repository" [reponame]]
 | |
| 	${NS}::labelframe $w.global -text [mc "Global (All Repositories)"]
 | |
| 	pack $w.repo -side left -fill both -expand 1 -pady 5 -padx 5
 | |
| 	pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5
 | |
| 
 | |
| 	set optid 0
 | |
| 	foreach option {
 | |
| 		{t user.name {mc "User Name"}}
 | |
| 		{t user.email {mc "Email Address"}}
 | |
| 
 | |
| 		{b merge.summary {mc "Summarize Merge Commits"}}
 | |
| 		{i-1..5 merge.verbosity {mc "Merge Verbosity"}}
 | |
| 		{b merge.diffstat {mc "Show Diffstat After Merge"}}
 | |
| 		{t merge.tool {mc "Use Merge Tool"}}
 | |
| 
 | |
| 		{b gui.trustmtime  {mc "Trust File Modification Timestamps"}}
 | |
| 		{b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}}
 | |
| 		{b gui.matchtrackingbranch {mc "Match Tracking Branches"}}
 | |
| 		{b gui.textconv {mc "Use Textconv For Diffs and Blames"}}
 | |
| 		{b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}}
 | |
| 		{i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}}
 | |
| 		{i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}}
 | |
| 		{i-1..99 gui.diffcontext {mc "Number of Diff Context Lines"}}
 | |
| 		{t gui.diffopts {mc "Additional Diff Parameters"}}
 | |
| 		{i-0..99 gui.commitmsgwidth {mc "Commit Message Text Width"}}
 | |
| 		{t gui.newbranchtemplate {mc "New Branch Name Template"}}
 | |
| 		{c gui.encoding {mc "Default File Contents Encoding"}}
 | |
| 		{b gui.warndetachedcommit {mc "Warn before committing to a detached head"}}
 | |
| 		{s gui.stageuntracked {mc "Staging of untracked files"} {list "yes" "no" "ask"}}
 | |
| 		} {
 | |
| 		set type [lindex $option 0]
 | |
| 		set name [lindex $option 1]
 | |
| 		set text [eval [lindex $option 2]]
 | |
| 		incr optid
 | |
| 		foreach f {repo global} {
 | |
| 			switch -glob -- $type {
 | |
| 			b {
 | |
| 				${NS}::checkbutton $w.$f.$optid -text $text \
 | |
| 					-variable ${f}_config_new($name) \
 | |
| 					-onvalue true \
 | |
| 					-offvalue false
 | |
| 				pack $w.$f.$optid -side top -anchor w
 | |
| 			}
 | |
| 			i-* {
 | |
| 				regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max
 | |
| 				${NS}::frame $w.$f.$optid
 | |
| 				${NS}::label $w.$f.$optid.l -text "$text:"
 | |
| 				pack $w.$f.$optid.l -side left -anchor w -fill x
 | |
| 				tspinbox $w.$f.$optid.v \
 | |
| 					-textvariable ${f}_config_new($name) \
 | |
| 					-from $min \
 | |
| 					-to $max \
 | |
| 					-increment 1 \
 | |
| 					-width [expr {1 + [string length $max]}]
 | |
| 				bind $w.$f.$optid.v <FocusIn> {%W selection range 0 end}
 | |
| 				pack $w.$f.$optid.v -side right -anchor e -padx 5
 | |
| 				pack $w.$f.$optid -side top -anchor w -fill x
 | |
| 			}
 | |
| 			c -
 | |
| 			t {
 | |
| 				${NS}::frame $w.$f.$optid
 | |
| 				${NS}::label $w.$f.$optid.l -text "$text:"
 | |
| 				${NS}::entry $w.$f.$optid.v \
 | |
| 					-width 20 \
 | |
| 					-textvariable ${f}_config_new($name)
 | |
| 				pack $w.$f.$optid.l -side left -anchor w
 | |
| 				pack $w.$f.$optid.v -side left -anchor w \
 | |
| 					-fill x -expand 1 \
 | |
| 					-padx 5
 | |
| 				if {$type eq {c}} {
 | |
| 					menu $w.$f.$optid.m
 | |
| 					build_encoding_menu $w.$f.$optid.m \
 | |
| 						[list set ${f}_config_new($name)] 1
 | |
| 					${NS}::button $w.$f.$optid.b \
 | |
| 						-text [mc "Change"] \
 | |
| 						-command [list popup_btn_menu \
 | |
| 							$w.$f.$optid.m $w.$f.$optid.b]
 | |
| 					pack $w.$f.$optid.b -side left -anchor w
 | |
| 				}
 | |
| 				pack $w.$f.$optid -side top -anchor w -fill x
 | |
| 			}
 | |
| 			s {
 | |
| 				set opts [eval [lindex $option 3]]
 | |
| 				${NS}::frame $w.$f.$optid
 | |
| 				${NS}::label $w.$f.$optid.l -text "$text:"
 | |
| 				if {$use_ttk} {
 | |
| 					ttk::combobox $w.$f.$optid.v \
 | |
| 						-textvariable ${f}_config_new($name) \
 | |
| 						-values $opts -state readonly
 | |
| 				} else {
 | |
| 					eval tk_optionMenu $w.$f.$optid.v \
 | |
| 						${f}_config_new($name) \
 | |
| 						$opts
 | |
| 				}
 | |
| 				pack $w.$f.$optid.l -side left -anchor w -fill x
 | |
| 				pack $w.$f.$optid.v -side right -anchor e -padx 5
 | |
| 				pack $w.$f.$optid -side top -anchor w -fill x
 | |
| 			}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	set all_dicts [linsert \
 | |
| 		[spellcheck::available_langs] \
 | |
| 		0 \
 | |
| 		none]
 | |
| 	incr optid
 | |
| 	foreach f {repo global} {
 | |
| 		if {![info exists ${f}_config_new(gui.spellingdictionary)]} {
 | |
| 			if {[info exists ui_comm_spell]} {
 | |
| 				set value [$ui_comm_spell lang]
 | |
| 			} else {
 | |
| 				set value none
 | |
| 			}
 | |
| 			set ${f}_config_new(gui.spellingdictionary) $value
 | |
| 		}
 | |
| 
 | |
| 		${NS}::frame $w.$f.$optid
 | |
| 		${NS}::label $w.$f.$optid.l -text [mc "Spelling Dictionary:"]
 | |
| 		if {$use_ttk} {
 | |
| 			ttk::combobox $w.$f.$optid.v \
 | |
| 				-textvariable ${f}_config_new(gui.spellingdictionary) \
 | |
| 				-values $all_dicts -state readonly
 | |
| 		} else {
 | |
| 			eval tk_optionMenu $w.$f.$optid.v \
 | |
| 				${f}_config_new(gui.spellingdictionary) \
 | |
| 				$all_dicts
 | |
| 		}
 | |
| 		pack $w.$f.$optid.l -side left -anchor w -fill x
 | |
| 		pack $w.$f.$optid.v -side right -anchor e -padx 5
 | |
| 		pack $w.$f.$optid -side top -anchor w -fill x
 | |
| 	}
 | |
| 	unset all_dicts
 | |
| 
 | |
| 	set all_fonts [lsort [font families]]
 | |
| 	foreach option $font_descs {
 | |
| 		set name [lindex $option 0]
 | |
| 		set font [lindex $option 1]
 | |
| 		set text [eval [lindex $option 2]]
 | |
| 
 | |
| 		set global_config_new(gui.$font^^family) \
 | |
| 			[font configure $font -family]
 | |
| 		set global_config_new(gui.$font^^size) \
 | |
| 			[font configure $font -size]
 | |
| 
 | |
| 		${NS}::frame $w.global.$name
 | |
| 		${NS}::label $w.global.$name.l -text "$text:"
 | |
| 		${NS}::button $w.global.$name.b \
 | |
| 			-text [mc "Change Font"] \
 | |
| 			-command [list \
 | |
| 				tchoosefont \
 | |
| 				$w \
 | |
| 				[mc "Choose %s" $text] \
 | |
| 				global_config_new(gui.$font^^family) \
 | |
| 				global_config_new(gui.$font^^size) \
 | |
| 				]
 | |
| 		${NS}::label $w.global.$name.f -textvariable global_config_new(gui.$font^^family)
 | |
| 		${NS}::label $w.global.$name.s -textvariable global_config_new(gui.$font^^size)
 | |
| 		${NS}::label $w.global.$name.pt -text [mc "pt."]
 | |
| 		pack $w.global.$name.l -side left -anchor w
 | |
| 		pack $w.global.$name.b -side right -anchor e
 | |
| 		pack $w.global.$name.pt -side right -anchor w
 | |
| 		pack $w.global.$name.s -side right -anchor w
 | |
| 		pack $w.global.$name.f -side right -anchor w
 | |
| 		pack $w.global.$name -side top -anchor w -fill x
 | |
| 	}
 | |
| 
 | |
| 	bind $w <Visibility> "grab $w; focus $w.buttons.save"
 | |
| 	bind $w <Key-Escape> "destroy $w"
 | |
| 	bind $w <Key-Return> [list do_save_config $w]
 | |
| 
 | |
| 	if {[is_MacOSX]} {
 | |
| 		set t [mc "Preferences"]
 | |
| 	} else {
 | |
| 		set t [mc "Options"]
 | |
| 	}
 | |
| 	wm title $w "[appname] ([reponame]): $t"
 | |
| 	wm deiconify $w
 | |
| 	tkwait window $w
 | |
| }
 | |
| 
 | |
| proc do_restore_defaults {} {
 | |
| 	global font_descs default_config repo_config system_config
 | |
| 	global repo_config_new global_config_new
 | |
| 
 | |
| 	foreach name [array names default_config] {
 | |
| 		set repo_config_new($name) $system_config($name)
 | |
| 		set global_config_new($name) $system_config($name)
 | |
| 	}
 | |
| 
 | |
| 	foreach option $font_descs {
 | |
| 		set name [lindex $option 0]
 | |
| 		set repo_config(gui.$name) $system_config(gui.$name)
 | |
| 	}
 | |
| 	apply_config
 | |
| 
 | |
| 	foreach option $font_descs {
 | |
| 		set name [lindex $option 0]
 | |
| 		set font [lindex $option 1]
 | |
| 		set global_config_new(gui.$font^^family) \
 | |
| 			[font configure $font -family]
 | |
| 		set global_config_new(gui.$font^^size) \
 | |
| 			[font configure $font -size]
 | |
| 	}
 | |
| }
 | |
| 
 | |
| proc do_save_config {w} {
 | |
| 	if {![config_check_encodings]} return
 | |
| 	if {[catch {save_config} err]} {
 | |
| 		error_popup [strcat [mc "Failed to completely save options:"] "\n\n$err"]
 | |
| 	}
 | |
| 	reshow_diff
 | |
| 	destroy $w
 | |
| }
 |