From 47aa8b00b2b11df13a100489e0f904a4947177ef Mon Sep 17 00:00:00 2001 From: Andrej Shadura Date: Tue, 8 May 2018 15:59:31 +0200 Subject: Import Upstream version 1.4.7 --- lib/configdialogues/terminal_config.tcl | 396 ++++++++++++++++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 lib/configdialogues/terminal_config.tcl (limited to 'lib/configdialogues/terminal_config.tcl') diff --git a/lib/configdialogues/terminal_config.tcl b/lib/configdialogues/terminal_config.tcl new file mode 100644 index 0000000..732b5cb --- /dev/null +++ b/lib/configdialogues/terminal_config.tcl @@ -0,0 +1,396 @@ +#!/usr/bin/tclsh +# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net ) + +############################################################################ +# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 by Martin Ošmera # +# martin.osmera@gmail.com # +# # +# This program is free software; you can redistribute it and#or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program; if not, write to the # +# Free Software Foundation, Inc., # +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # +############################################################################ + +# >>> File inclusion guard +if { ! [ info exists _TERMINAL_CONFIG_TCL ] } { +set _TERMINAL_CONFIG_TCL _ +# <<< File inclusion guard + +# -------------------------------------------------------------------------- +# DESCRIPTION +# Implements terminal configuration dialog +# -------------------------------------------------------------------------- + +namespace eval terminal { + variable dialog_opened 0 ;# Bool: True if this dialog is already opened + variable win ;# ID of dialog toplevel window + variable changed 0 ;# Bool: Settings changed + variable example_text ;# Widget: Label widget containing example text + variable selected_font ;# Font: Current font + variable fg_clr_but ;# Widget: Button for selecting foreground color + variable bg_clr_but ;# Widget: Button for selecting background color + + ## Configuration variables + variable configuration ;# Array: Configuration array + + ## Create the dialog + # @return void + proc mkDialog {} { + variable win ;# ID of toplevel dialog window + variable dialog_opened ;# Bool: True if this dialog is already opened + variable configuration ;# Array: Configuration array + variable changed ;# Bool: Settings changed + variable example_text ;# Widget: Label widget containing example text + variable selected_font ;# Font: Current font + variable fg_clr_but ;# Widget: Button for selecting foreground color + variable bg_clr_but ;# Widget: Button for selecting background color + + # Destroy the dialog if it's already opened + if {$dialog_opened} { + destroy .terminal_config_dialog + } + + set dialog_opened 1 + set changed 0 + + # Get settings from main NS + getSettings + + # Create toplevel window + set win [toplevel .terminal_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}] + + # Create window header + label $win.header_label \ + -text [mc "Terminal configuration"] \ + -font [font create -size [expr {int(-20 * $::font_size_factor)}]] + + # Create horizontal separator + Separator $win.sep -orient horizontal + + ## Create main frame + set main_frame [frame $win.main_frame] + set row 0 + # Foreground color + grid [label $main_frame.fg_lbl \ + -text [mc "Foreground color"] \ + ] -row $row -column 0 -sticky w + set fg_clr_but [button $main_frame.fg_but \ + -bd 1 -relief raised -pady 0 -width 10 \ + -bg $configuration(fg) \ + -activebackground $configuration(fg) \ + -command "::configDialogues::terminal::select_color {foreground} fg $main_frame.fg_but" \ + ] + grid $fg_clr_but -column 1 -row $row -sticky wens + incr row + # Background color + grid [label $main_frame.bg_lbl \ + -text [mc "Background color"] \ + ] -row $row -column 0 -sticky w + set bg_clr_but [button $main_frame.bg_but \ + -bd 1 -relief raised -pady 0 -width 10 \ + -bg $configuration(bg) \ + -activebackground $configuration(bg) \ + -command "::configDialogues::terminal::select_color {background} bg $main_frame.bg_but" \ + ] + grid $bg_clr_but -column 1 -row $row -sticky wens + incr row + # Font size + grid [label $main_frame.font_size_lbl \ + -text [mc "Font size"] \ + ] -row $row -column 0 -sticky w + grid [ttk::spinbox $main_frame.font_size_spb \ + -from 4 -to 22 -validate all -width 0 \ + -validatecommand {::configDialogues::terminal::font_size_valiade %P} \ + -textvariable ::configDialogues::terminal::configuration(font_size) \ + -command ::configDialogues::terminal::font_changed \ + ] -row $row -column 1 -sticky we + incr row + # Font family + grid [label $main_frame.font_family_lbl \ + -text [mc "Font family"] \ + ] -row $row -column 0 -sticky w + grid [ttk::combobox $main_frame.font_family_cbx \ + -state readonly \ + -values [lsort [font families]] \ + -width 20 \ + -textvariable ::configDialogues::terminal::configuration(font_family) \ + ] -row $row -column 1 -sticky we + bind $main_frame.font_family_cbx <> \ + {::configDialogues::terminal::font_changed} + incr row + # Example text + set selected_font [font create \ + -family $configuration(font_family) \ + -size -$configuration(font_size) \ + ] + set example_text [label $main_frame.example_text_lbl \ + -text "rxvt-unicode " \ + -font $selected_font \ + ] + grid $example_text -row $row -column 0 -sticky w -columnspan 2 + # Finalize + grid columnconfigure $main_frame 0 -weight 1 + + # Button "Restart terminal emulator" + set restart_but [ttk::button $win.restart_but \ + -text [mc "Use settings and restart terminal emulator"] \ + -compound left \ + -image ::ICONS::16::reload \ + -command {::configDialogues::terminal::RESTART} \ + ] + + ## Button frame at the bottom + set but_frame [frame $win.button_frame] + # Button "Reset" + pack [ttk::button $but_frame.but_default \ + -text [mc "Reset to defaults"] \ + -command {::configDialogues::terminal::DEFAULTS} \ + ] -side left + DynamicHelp::add $but_frame.but_default \ + -text [mc "Reset all settings to defaults"] + # Button "Ok" + pack [ttk::button $but_frame.but_ok \ + -text [mc "Ok"] \ + -compound left \ + -image ::ICONS::16::ok \ + -command {::configDialogues::terminal::OK} \ + ] -side right -padx 2 + DynamicHelp::add $but_frame.but_ok \ + -text [mc "Commit new settings"] + # Button "Cancel" + pack [ttk::button $but_frame.but_cancel \ + -text [mc "Cancel"] \ + -compound left \ + -image ::ICONS::16::button_cancel \ + -command {::configDialogues::terminal::CANCEL} \ + ] -side right -padx 2 + DynamicHelp::add $but_frame.but_cancel \ + -text [mc "Take changes back and close dialog"] + + # Pack frames and notebook + pack $win.header_label -side top -pady 6 + pack $win.sep -side top -fill x -after $win.header_label + pack $main_frame -side top -padx 10 -anchor nw -pady 10 -fill x + pack $but_frame -side bottom -fill x -anchor s -padx 10 -pady 5 + pack $restart_but -side bottom -fill x -expand 1 -anchor s -padx 10 + + # Set window attributes + wm iconphoto $win ::ICONS::16::configure + wm transient $win . + wm title $win [mc "Configure terminal emulator"] + wm minsize $win 380 280 + raise $win + catch {grab $win} + wm protocol $win WM_DELETE_WINDOW { + ::configDialogues::terminal::CANCEL + } + tkwait window $win + } + + ## Valiadte content of font size spinbox + # @pamr String content - String to valiadte + # @return void + proc font_size_valiade {content} { + if {$content == {}} { + return 1 + } + if {![string is digit $content]} { + return 0 + } + if {$content > 22} { + return 0 + } + after idle { + ::configDialogues::terminal::font_changed + } + return 1 + } + + ## Change font for example text + # @return void + proc font_changed {} { + variable configuration ;# Array: Configuration array + variable example_text ;# Widget: Label widget containing example text + variable selected_font ;# Font: Current font + variable changed ;# Bool: Settings changed + + if {$configuration(font_size) == {} || $configuration(font_size) < 4} { + return + } + + font delete $selected_font + set selected_font [font create \ + -family $configuration(font_family) \ + -size -$configuration(font_size) \ + ] + $example_text configure -font $selected_font + set changed 1 + } + + ## Select color + # @parm String what_clr - What color (foreground / background ...) + # @parm String var - Key in configuration array + # @parm Widget button - Source button + # @return void + proc select_color {what_clr var button} { + variable configuration ;# Array: Configuration array + variable win ;# ID of toplevel dialog window + variable changed ;# Bool: Settings changed + + switch -- $what_clr { + {foreground} { + set txt [mc "Select foreground color"] + } + {background} { + set txt [mc "Select background color"] + } + } + + set color [SelectColor .select_color \ + -parent $win \ + -color $configuration($var) \ + -title $txt \ + ] + + # Set new content of the given variable and button background color + if {$color != {}} { + set configuration($var) $color + $button configure -bg $color -activebackground $color + + # Adjust status changed + set changed 1 + } + } + + ## Retrieve settings from main NS + # @return void + proc getSettings {} { + variable configuration ;# Array: Configuration array + array set configuration [array get ::Terminal::configuration] + } + + ## Set application according to local settings + # @return void + proc use_settings {} { + variable configuration ;# Array: Configuration array + if {$configuration(font_size) == {} || $configuration(font_size) < 4} { + set configuration(font_size) 13 + } + array set ::Terminal::configuration [array get configuration] + } + + ## Save settings to the config file + # @return void + proc save_config {} { + variable configuration ;# Array: Configuration array + + foreach key [array names configuration] { + ::settings setValue "Terminal emulator/$key" $::Terminal::configuration($key) + } + + ::settings saveConfig + } + + ## Load configuration from config file + # @return void + proc load_config {} { + # Load configuration + array set default_conf ${::Terminal::configuration_def} + foreach key [array names ::Terminal::configuration] { + set ::Terminal::configuration($key) [::settings getValue \ + "Terminal emulator/$key" $default_conf($key) \ + ] + } + + # Validate configuration + if {![regexp {^#[0-9a-fA-F]{6,12}$} ${::Terminal::configuration(bg)}]} { + puts stderr [mc "Invalid value of key: '%s'" {bg}] + set ::Terminal::configuration(bg) {#FFFFFF} + } + if {![regexp {^#[0-9a-fA-F]{6,12}$} ${::Terminal::configuration(fg)}]} { + puts stderr [mc "Invalid value of key: '%s'" {fg}] + set ::Terminal::configuration(fg) {#000000} + } + if { + ![regexp {^\d+$} ${::Terminal::configuration(font_size)}] + || + ${::Terminal::configuration(font_size)} < 4 + || + ${::Terminal::configuration(font_size)} > 22 + } then { + puts stderr [mc "Invalid value of key: '%s'" {font_size}] + set ::Terminal::configuration(font_size) 13 + } + if {![string length [string trim ${::Terminal::configuration(font_family)}]]} { + puts stderr [mc "Invalid value of key: '%s'" {font_family}] + set ::Terminal::configuration(font_family) $::DEFAULT_FIXED_FONT + } + } + + ## Resart terminal emulators for all projects + # @return void + proc RESTART {} { + use_settings + foreach project ${::X::openedProjects} { + $project terminal_restart + } + } + + ## Destroy the dialog + # @return void + proc CANCEL {} { + variable win ;# ID of toplevel dialog window + variable dialog_opened ;# Bool: True if this dialog is already opened + + # Destroy dialog window + set dialog_opened 0 + grab release $win + destroy $win + } + + ## Use settings and destroy the dialog + # @return void + proc OK {} { + variable win ;# ID of toplevel dialog window + variable changed ;# Bool: Settings changed + + # Use and save settings + if {$changed} { + use_settings + save_config + } + + # Destroy dialog window + CANCEL + } + + ## Restrore defaults + # @return void + proc DEFAULTS {} { + variable configuration ;# Array: Configuration array + variable fg_clr_but ;# Widget: Button for selecting foreground color + variable bg_clr_but ;# Widget: Button for selecting background color + + array set configuration ${::Terminal::configuration_def} + $fg_clr_but configure \ + -bg $configuration(fg) \ + -activebackground $configuration(fg) + $bg_clr_but configure \ + -bg $configuration(bg) \ + -activebackground $configuration(bg) + } +} + +# >>> File inclusion guard +} +# <<< File inclusion guard -- cgit v1.2.3