[PATCH] git-gui: Font chooser to handle a large number of font families

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is now also available in my `pu` branch on repo.or.cz.
Does it fix your problem Simon?  Any comments?

-->8--
Simon Sasburg noticed that on X11 if there are more fonts than can
fit in the height of the screen Tk's native tk_optionMenu does not
offer scroll arrows to the user and it is not possible to review
all choices or to select those that are off-screen.  On Mac OS X
the tk_optionMenu works properly but is awkward to navigate if the
list is long.

This is a rewrite of our font selection by providing a new modal
dialog that the user can launch from the git-gui Options panel.
The dialog offers the user a scrolling list of fonts in a pane.
An example text shows the user what the font looks like at the
size they have selected.  But I have to admit the example pane
is less than ideal; in the case of a the diff font we really
should show the user an example diff complete with our native
diff syntax coloring.

Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx>
---

 lib/choose_font.tcl |  160 +++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/option.tcl      |   28 ++++++----
 2 files changed, 177 insertions(+), 11 deletions(-)
 create mode 100644 lib/choose_font.tcl

diff --git a/lib/choose_font.tcl b/lib/choose_font.tcl
new file mode 100644
index 0000000..f7e87ff
--- /dev/null
+++ b/lib/choose_font.tcl
@@ -0,0 +1,160 @@
+# git-gui font chooser
+# Copyright (C) 2007 Shawn Pearce
+
+class choose_font {
+
+field w
+field w_family    ; # UI widget of all known family names
+field w_example   ; # Example to showcase the chosen font
+
+field f_family    ; # Currently chosen family name
+field f_size      ; # Currently chosen point size
+
+field v_family    ; # Name of global variable for family
+field v_size      ; # Name of global variable for size
+
+variable all_families [list]  ; # All fonts known to Tk
+
+constructor pick {path title a_family a_size} {
+	variable all_families
+
+	set v_family $a_family
+	set v_size $a_size
+
+	upvar #0 $v_family pv_family
+	upvar #0 $v_size pv_size
+
+	set f_family $pv_family
+	set f_size $pv_size
+
+	make_toplevel top w
+	wm title $top "[appname] ([reponame]): $title"
+	wm geometry $top "+[winfo rootx $path]+[winfo rooty $path]"
+
+	label $w.header -text $title -font font_uibold
+	pack $w.header -side top -fill x
+
+	frame $w.buttons
+	button $w.buttons.select \
+		-text [mc Select] \
+		-default active \
+		-command [cb _select]
+	button $w.buttons.cancel \
+		-text [mc Cancel] \
+		-command [list destroy $w]
+	pack $w.buttons.select -side right
+	pack $w.buttons.cancel -side right -padx 5
+	pack $w.buttons -side bottom -fill x -pady 10 -padx 10
+
+	frame $w.inner
+
+	frame $w.inner.family
+	label $w.inner.family.l \
+		-text [mc "Font Family"] \
+		-anchor w
+	set w_family $w.inner.family.v
+	text $w_family \
+		-borderwidth 1 \
+		-relief sunken \
+		-cursor $::cursor_ptr \
+		-wrap none \
+		-width 30 \
+		-height 10 \
+		-yscrollcommand [list $w.inner.family.sby set]
+	scrollbar $w.inner.family.sby -command [list $w_family yview]
+	pack $w.inner.family.l -side top -fill x
+	pack $w.inner.family.sby -side right -fill y
+	pack $w_family -fill both -expand 1
+
+	frame $w.inner.size
+	label $w.inner.size.l \
+		-text [mc "Font Size"] \
+		-anchor w
+	spinbox $w.inner.size.v \
+		-textvariable @f_size \
+		-from 2 -to 80 -increment 1 \
+		-width 3
+	bind $w.inner.size.v <FocusIn> {%W selection range 0 end}
+	pack $w.inner.size.l -fill x -side top
+	pack $w.inner.size.v -fill x -padx 2
+
+	grid configure $w.inner.family $w.inner.size -sticky nsew
+	grid rowconfigure $w.inner 0 -weight 1
+	grid columnconfigure $w.inner 0 -weight 1
+	pack $w.inner -fill both -expand 1 -padx 5 -pady 5
+
+	frame $w.example
+	label $w.example.l \
+		-text [mc "Font Example"] \
+		-anchor w
+	set w_example $w.example.t
+	text $w_example \
+		-borderwidth 1 \
+		-relief sunken \
+		-height 3 \
+		-width 40
+	$w_example tag conf example -justify center
+	$w_example insert end [mc "This is example text.\nIf you like this text, it can be your font."] example
+	$w_example conf -state disabled
+	pack $w.example.l -fill x
+	pack $w_example -fill x
+	pack $w.example -fill x -padx 5
+
+	if {$all_families eq {}} {
+		set all_families [lsort [font families]]
+	}
+
+	$w_family tag conf pick
+	$w_family tag bind pick <1> [cb _pick_family %x %y]
+	$w_family tag conf cpck -background lightgray
+	foreach f $all_families {
+		set sel [list pick]
+		if {$f eq $f_family} {
+			lappend sel cpck
+		}
+		$w_family insert end "$f\n" $sel
+	}
+	$w_family conf -state disabled
+	_update $this
+
+	trace add variable @f_size write [cb _update]
+	bind $w <Key-Escape> [list destroy $w]
+	bind $w <Key-Return> [cb _select]\;break
+	grab $w
+	tkwait window $w
+}
+
+method _select {} {
+	upvar #0 $v_family pv_family
+	upvar #0 $v_size pv_size
+
+	set pv_family $f_family
+	set pv_size $f_size
+
+	destroy $w
+}
+
+method _pick_family {x y} {
+	variable all_families
+
+	set i [lindex [split [$w_family index @$x,$y] .] 0]
+	set n [lindex $all_families [expr {$i - 1}]]
+	if {$n ne {}} {
+		$w_family tag remove cpck 0.0 end
+		$w_family tag add cpck $i.0 [expr {$i + 1}].0
+		set f_family $n
+		_update $this
+	}
+}
+
+method _update {args} {
+	variable all_families
+
+	set i [lsearch -exact $all_families $f_family]
+	if {$i < 0} return
+
+	$w_example tag conf example -font [list $f_family $f_size]
+	$w_family see [expr {$i + 1}].0
+}
+
+}
diff --git a/lib/option.tcl b/lib/option.tcl
index 31c7d47..03bc08f 100644
--- a/lib/option.tcl
+++ b/lib/option.tcl
@@ -254,17 +254,23 @@ proc do_options {} {
 
 		frame $w.global.$name
 		label $w.global.$name.l -text "$text:"
-		pack $w.global.$name.l -side left -anchor w -fill x
-		eval tk_optionMenu $w.global.$name.family \
-			global_config_new(gui.$font^^family) \
-			$all_fonts
-		spinbox $w.global.$name.size \
-			-textvariable global_config_new(gui.$font^^size) \
-			-from 2 -to 80 -increment 1 \
-			-width 3
-		bind $w.global.$name.size <FocusIn> {%W selection range 0 end}
-		pack $w.global.$name.size -side right -anchor e
-		pack $w.global.$name.family -side right -anchor e
+		button $w.global.$name.b \
+			-text [mc "Change Font"] \
+			-command [list \
+				choose_font::pick \
+				$w \
+				[mc "Choose %s" $text] \
+				global_config_new(gui.$font^^family) \
+				global_config_new(gui.$font^^size) \
+				]
+		label $w.global.$name.f -textvariable global_config_new(gui.$font^^family)
+		label $w.global.$name.s -textvariable global_config_new(gui.$font^^size)
+		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
 	}
 
-- 
1.5.3.1.921.g8c3b
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux