# FvwmScript Font Selector
# A Font Selector for Fvwm-Crystal
# Copyright Dominique Michel <dominique_libre@users.sourceforge.net> 2013
# Released under the GNU GPL license v2 or later

# Header ̣{{{1
UseGettext {$FVWM_USERDIR/locale;fvwm-crystal-script:$FVWM_SYSTEMDIR/locale;fvwm-crystal-script:+}
WindowLocaleTitle {FVWM-Crystal Font Selector}
WindowSize 705 600
#WindowPosition 300 300
Colorset	1
# Dont change it or the text titles will be shorted: 
Font	"xft:$[panel_font]:size=16:$[panel_font_style]"

# Initialisation {{{1
Init
Begin
   # Use user font
   # That doesn't change the font ???, but that's change its size
   Set $PanelFont = (GetOutput {echo \$[panel_font]} 1 -1)
   Set $PanelFontSize = (GetOutput {echo \$[panel_font_size]} 1 -1)
   Set $PanelFontStyle = (GetOutput {echo \$[panel_font_style]} 1 -1)
   Set $SelectorFont = {xft:}$PanelFont{:pixelsize=16:}$PanelFontStyle
   ChangeFont 1 $SelectorFont
   ChangeFont 2 $SelectorFont
   ChangeFont 3 $SelectorFont
   ChangeFont 4 $SelectorFont
   ChangeFont 5 $SelectorFont
   ChangeFont 6 $SelectorFont
   ChangeFont 12 $SelectorFont
   ChangeFont 13 $SelectorFont
   ChangeFont 14 $SelectorFont
   ChangeFont 15 $SelectorFont
   ChangeFont 16 $SelectorFont
   ChangeFont 20 $SelectorFont
   ChangeFont 30 $SelectorFont
   ChangeFont 40 $SelectorFont
   ChangeFont 50 $SelectorFont
   ChangeFont 70 $SelectorFont
   ChangeFont 71 $SelectorFont
   ChangeFont 100 $SelectorFont
   ChangeFont 101 $SelectorFont
   ChangeFont 102 $SelectorFont
   ChangeFont 121 $SelectorFont
   ChangeFont 122 $SelectorFont

   # Warp pointer to widget n
   #WarpPointer 12

   # Get the font list
   ChangeTitle 1 (GetOutput {exec fc-list : family 2>/dev/null | sort | tr '\n' '|' } 1 -1)
   
   # Set example default font
   #Set $FontString = {xft:Verdana:size=16}
   Set $FontString = $SelectorFont
   
   # Set "Set panel font" by default (which font)
   Set $SetFont = {panel_font}
   # Set default size
   Set $Size = {16}
   # Set Regular style by default
   Set $Style = {Regular}

   # Set font for example
   #Set $tmpFont
   #Set $FontExample = {xft:}$[panel_font]{:pixelsize=16:Regular}
   ChangeFont 12 {xft:Bistream Cyberbit:pixelsize=16} 

   # Set default example string (used by "Reset example" and if no pref file)
   Set $ExampleOrig = {abijk ABIJK éç ÀÉ O09 你好}
   # No quoting depend on context, uncomment the 3 following Echo calls to see it
   #Do {Echo Orig = }$ExampleOrig
   Set $PrefDir = (GetOutput {echo \$FVWM_USERDIR} 1 -1)
   Set $cmd = {exec cat }$PrefDir{/preferences/FontSelectorString}
   #Do {Echo CMD =}$cmd
   Set $Example = (GetOutput $cmd 1 -1)
   #Do {Echo Exemple = }$Example
   If $Example == {} Then
    Begin
	Set $Example = $ExampleOrig
    End
   ChangeTitle 7 $Example
   ChangeTitle 8 $Example
   ChangeTitle 9 $Example
   ChangeTitle 10 $Example
   ChangeTitle 11 $Example
   ChangeTitle 12 $Example
   ShowWidget 12
End

# Periodic Tasks {{{1
PeriodicTasks
Begin
    # show the example
    If $ChangeFont == 1 Then
    Begin
	Set $ChangeFont = 0
	Set $FontString = {xft:}$FontName{:pixelsize=}$Size{:}$Style
	Set $FontExample = {xft:}$FontName{:pixelsize=16:Regular}
	Set $FontLabel = $FontName{ }$Size{ }$Style
	HideWidget 7
	HideWidget 8
	HideWidget 9
	HideWidget 10
	HideWidget 11
	HideWidget 12
	Set $tmp = 0
	If $Size < 13 Then
	    Set $tmp = 7
	If $Size < 25 Then
	Begin
	    If $tmp == 0 Then
		Set $tmp = 8
	End
	If $Size < 37 Then
	Begin
	    If $tmp == 0 Then
		Set $tmp = 9
	End
	If $Size < 51 Then
	Begin
	    If $tmp == 0 Then
		Set $tmp = 10
	End
	If $tmp == 0 Then
	    Set $tmp = 11
	
	ChangeFont $tmp $FontString
	ChangeFont 1 $FontString
	ChangeTitle $tmp $Example
	ShowWidget $tmp
	ChangeFont 12 $FontExample
	ChangeTitle 12 $Example
	ShowWidget 12
	ChangeFont 71 $FontExample
	ChangeTitle 71 $FontLabel
	ShowWidget 71

    End
End

# Quit Function {{{1
QuitFunc
Begin
  Do Nop
#  Do {Echo The font: }$SetFont{ is xft:}$FontName{:pixelsize=}$Size{:}$Style
End

# Main {{{1
# List of fonts {{{2
Widget 1
Property
    Flags NoReliefString	
    #Flags Hidden
    Font "xft:Verdana:size=16"
    Position 5 50
    Size 395 250
    Type List
    Title {|||Loading fonts ...}
Main
Case message of
 SingleClic :
 Begin
    Set $findex = (GetValue 1)
    Set $FontList = (GetTitle 1)
    Set $cmd = {exec echo "}$FontList{" | cut -d '|' -f } $findex 
    Set $FontName = (GetOutput $cmd 1 -1)
    Set $ChangeFont = 1
 End
End

# Styles {{{2
# Flags determine the button style
# Regular
Widget 2
Property
Flags NoReliefString Hidden
 Position 410 50
 Size 170 35
 Type PushButton
 LocaleTitle {Regular}
Main
 Case message of
  SingleClic :
  Begin
    Set $Style = {Regular}
    Set $ChangeFont = 1
    HideWidget 2
    HideWidget 30
    HideWidget 40
    HideWidget 50
    ShowWidget 20
    ShowWidget 3
    ShowWidget 4
    ShowWidget 5
  End
End
# selected
Widget 20
Property
#Flags Hidden
 Position 410 50
 Size 170 35
 Type PushButton
 LocaleTitle {Regular}
Main
 Case message of
  SingleClic :
  Begin
    Do {Nop}
  End
End

# Bold
Widget 3
Property
 Flags NoReliefString
 Position 410 95
 Size 170 35
 Type PushButton
 LocaleTitle {Bold}
Main
 Case message of
  SingleClic :
  Begin
    Set $Style = {Bold}
    Set $ChangeFont = 1
    HideWidget 20
    HideWidget 3
    HideWidget 40
    HideWidget 50
    ShowWidget 2
    ShowWidget 30
    ShowWidget 4
    ShowWidget 5
  End
End
# selected
Widget 30
Property
 Flags Hidden
 Position 410 95
 Size 170 35
 Type PushButton
 LocaleTitle {Bold}
Main
 Case message of
  SingleClic :
  Begin
   Do {Nop} 
  End
End

# Italic
Widget 4
Property
 Flags NoReliefString
 Position 410 140
 Size 170 35
 Type PushButton
 LocaleTitle {Italic}
Main
 Case message of
  SingleClic :
  Begin
    Set $Style = {Italic}
    Set $ChangeFont = 1
    HideWidget 20
    HideWidget 30
    HideWidget 4
    HideWidget 50
    ShowWidget 2
    ShowWidget 3
    ShowWidget 40
    ShowWidget 5
  End
End
# selected
Widget 40
Property
 Flags Hidden
 Position 410 140
 Size 170 35
 Type PushButton
 LocaleTitle {Italic}
Main
 Case message of
  SingleClic :
  Begin
    Do {Nop}
  End
End

# Bold Italic
Widget 5
Property
 Flags NoReliefString
 Position 410 185
 Size 170 35
 Type PushButton
 LocaleTitle {Bold Italic}
Main
 Case message of
  SingleClic :
  Begin
    Set $Style = {Bold:Italic}
    Set $ChangeFont = 1
    HideWidget 20
    HideWidget 30
    HideWidget 40
    HideWidget 5
    ShowWidget 2
    ShowWidget 3
    ShowWidget 4
    ShowWidget 50
  End
End
# selected
Widget 50
Property
 Flags Hidden
 Position 410 185
 Size 170 35
 Type PushButton
 LocaleTitle {Bold Italic}
Main
 Case message of
  SingleClic :
  Begin
    Do {Nop}
  End
End

# Size {{{2
Widget 6
Property
 Flags NoReliefString
 Position 590 50
 Size 110 250
 Type List
 Title { 6|7|8|9|10|11|12|13|14|15|16|17|18|20|22|24|26|28|32|36|40|48|56|64|72 }
 Value 11
 MinValue 6
Main
 Case message of
  SingleClic :
  Begin
    Set $FontSizes = {6|7|8|9|10|11|12|13|14|15|16|17|18|20|22|24|26|28|32|36|40|48|56|64|72}
    Set $sindex = (GetValue 6)
    Set $cmd = {exec echo "}$FontSizes{" | cut -d '|' -f } $sindex 
    Set $Size = (GetOutput $cmd 1 -1)
    Set $ChangeFont = 1
  End
End

# View Font {{{2
# Label
Widget 70
Property
    Font "xft:Verdana:size=14:Regular"
    Flags NoReliefString Center	
    Position 5 310
    Size 120 35
    Type ItemDraw
    LocaleTitle {With}
Main
Case message of
 SingleClic :
 Begin
   Do Nop
 End
End

# The font
Widget 71
Property
    Font "xft:Verdana:size=14:Regular"
    Flags NoReliefString Left Hidden	
    Position 125 310
    Size 420 35
    Type ItemDraw
    Title {}
Main
Case message of
 SingleClic :
 Begin
   Do Nop
 End
End

# Example 0 - 12
Widget 7
Property
    Font "xft:Verdana:size=12"	
    Flags Hidden
    Position 5 392
    MaxValue 0
    Size 640 35
    Type TextField
    Title {abijk ABIJK éç ÀÉ O09 你好}
Main
Case message of
 SingleClic :
 Begin
 End
End

# Example 13 - 24
Widget 8
Property
    Font "xft:Verdana:size=24"	
    Flags Hidden
    Position 5 387
    Size 640 35
    MaxValue 0
    Type TextField
    Title {abijk ABIJK éç ÀÉ O09 你好}
Main
Case message of
 SingleClic :
 Begin
 End
End

# Example 25 - 36
Widget 9
Property
    Font "xft:Verdana:size=36"	
    Flags Hidden
    Position 5 380
    Size 640 35
    MaxValue 0
    Type TextField
    Title {abijk ABIJK éç ÀÉ O09 你好}
Main
Case message of
 SingleClic :
 Begin
 End
End

# Example 37 - 50
Widget 10
Property
    Font "xft:Verdana:size=48"	
    Flags Hidden
    Position 5 374
    Size 640 35
    MaxValue 0
    Type TextField
    Title {abijk ABIJK éç ÀÉ O09 你好}
Main
Case message of
 SingleClic :
 Begin
 End
End

# Example 51 - 72
Widget 11
Property
    Font "xft:Verdana:size=72"	
    Flags Hidden
    Position 5 360
    Size 640 35
    MaxValue 0
    Type TextField
    Title {abijk ABIJK éç ÀÉ O09 你好}
Main
Case message of
 SingleClic :
 Begin
 End
End

# Input text {{{2
# Edit label
Widget 13
Property
    Font "xft:Verdana:size=14:Regular"
    Flags NoReliefString Left	
    Position 5 480
    Size 170 35
    Type ItemDraw
    LocaleTitle { Edit me:}
Main
Case message of
 SingleClic :
 Begin
   Do Nop
 End
End

# Input string
Widget 12
Property
    Font "xft:Verdana:size=16"	
    Flags Hidden	
    Position 5 520
    Size 640 35
    MinValue 40
    MaxValue 0
    Type TextField
    Title {abijk ABIJK éç ÀÉ O09 你好}
Main
Case message of
 SingleClic :
 Begin
   Set $Example = (GetTitle 12)
   Set $ChangeFont = 1
 End
End

# Seve editing
Widget 121
Property
 Flags NoReliefString
 Position 200 480
 Size 170 35
 Type PushButton
 LocaleTitle {Save editing}
Main
 Case message of
  SingleClic :
  Begin
    Do {SavePreferences FontSelectorString "}$Example{"}
  End
End

# Reset to default string
Widget 122
Property
 Flags NoReliefString
 Position 450 480
 Size 170 35
 Type PushButton
 LocaleTitle {Reset editing}
Main
 Case message of
  SingleClic :
  Begin
   Set $Example = $ExampleOrig
   ChangeTitle 7 $Example
   ChangeTitle 8 $Example
   ChangeTitle 9 $Example
   ChangeTitle 10 $Example
   ChangeTitle 11 $Example
   ChangeTitle 12 $Example
  End
End


# Bottom buttons {{{2
# Quit
Widget 14
Property
 Flags NoReliefString
 Position 80 560
 Size 170 35
 Type PushButton
 LocaleTitle {Quit}
Main
 Case message of
  SingleClic :
  Begin
    Quit
  End
End

# Apply
Widget 15
Property
 Flags NoReliefString
 Position 267 560
 Size 170 35
 Type PushButton
 LocaleTitle {Apply}
Main
 Case message of
  SingleClic :
  Begin
    Do {SetEnv }$SetFont{ "}$FontName{"}
    Do {SetEnv }$SetFont{_size "}$Size{"}
    Do {SetEnv }$SetFont{_style "}$Style{"}
    If $SetFont=={panel_font} Then
    Begin
      Do {Style FvwmScript Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
      Do {Style FvwmForm Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
      Do {Style FvwmIdent Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
    End
    If $SetFont=={title_font} Then
    Begin
      Do {Style * Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
    End
    If $SetFont=={menu_font} Then
    Begin
      Do {MenuStyle * Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
    End
  End
End

# Save
Widget 16
Property
 Flags NoReliefString
 Position 455 560
 Size 170 35
 Type PushButton
 LocaleTitle {Save}
Main
 Case message of
  SingleClic :
  Begin
    Do {SetEnv }$SetFont{ "}$FontName{"}
    Do {SetEnv }$SetFont{_size "}$Size{"}
    Do {SetEnv }$SetFont{_style "}$Style{"}
    If $SetFont=={panel_font} Then
    Begin
      Do {Style FvwmScript Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
      Do {Style FvwmForm Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
      Do {Style FvwmIdent Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
      Do {SavePreferences PanelFont "SetEnv panel_font \\\"}$FontName{\\\""}
      Do {SavePreferences PanelFontSize "SetEnv panel_font_size }$Size{"}
      Do {SavePreferences PanelFontStyle "SetEnv panel_font_style }$Style{"}
    End
    If $SetFont=={title_font} Then
    Begin
      Do {Style * Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
      Do {SavePreferences TitleFont "SetEnv title_font \\\"}$FontName{\\\""}
      Do {SavePreferences TitleFontSize "SetEnv title_font_size }$Size{"}
      Do {SavePreferences TitleFontStyle "SetEnv title_font_style }$Style{"}
    End
    If $SetFont=={menu_font} Then
    Begin
      Do {MenuStyle * Font "xft:}$FontName{:pixelsize=}$Size{:}$Style{"}
      Do {SavePreferences MenuFont "SetEnv menu_font \\\"}$FontName{\\\""}
      Do {SavePreferences MenuFontSize "SetEnv menu_font_size }$Size{"}
      Do {SavePreferences MenuFontStyle "SetEnv menu_font_style }$Style{"}
    End
  End
End

# Top buttons {{{2
# Panel font
Widget 100
Property
 Flags NoReliefString
 Position 5 5
 Type CheckBox
 LocaleTitle {. Panel Font}
 Value 1
Main
 Case message of
  SingleClic :
  Begin
    Set $clickeditem = (GetValue 100)
    If $clickeditem==1 Then
    Begin
     Set $SetFont = {panel_font}
     ChangeValue 101 0
     ChangeValue 102 0
    End
    Else
     ChangeValue 100 1
  End
End

# Title font
Widget 101
Property
 Flags NoReliefString
 Position 225 5
 Type CheckBox
 Value 0
 LocaleTitle {. Title Font}
Main
 Case message of
  SingleClic :
  Begin
    Set $clickeditem = (GetValue 101)
    If $clickeditem==1 Then
    Begin
     Set $SetFont = {title_font}
     ChangeValue 100 0
     ChangeValue 102 0
    End
    Else
    Begin
     ChangeValue 101 1
    End
  End
End

# Menu font
Widget 102
Property
 Flags NoReliefString
 Position 450 0
 Type CheckBox
 Value 0
 LocaleTitle {. Menu Font}
Main
 Case message of
  SingleClic :
  Begin
    Set $clickeditem = (GetValue 102)
    If $clickeditem==1 Then
    Begin
     Set $SetFont = {menu_font}
     ChangeValue 100 0
     ChangeValue 101 0
    End
    Else
    Begin
     ChangeValue 102 1
    End
  End
End

# vim:ft=fvwm
