183 lines
5.5 KiB
Tcl
183 lines
5.5 KiB
Tcl
######################################################
|
|
# ProjMan 2
|
|
# Distributed under GNU Public License
|
|
# Author: Sergey Kalinin svk@nuk-svk.ru
|
|
# Copyright (c) "", 2022, https://nuk-svk.ru
|
|
######################################################
|
|
# The config file procedures
|
|
# create
|
|
# copy
|
|
# save
|
|
######################################################
|
|
|
|
namespace eval Config {} {
|
|
variable cfgINISections
|
|
variable cfgVariables
|
|
}
|
|
|
|
if [info exists env(LANG)] {
|
|
set locale $env(LANG)
|
|
} else {
|
|
set locale "en"
|
|
}
|
|
|
|
set ::configDefault "\[General\]
|
|
cfgModifyDate=''
|
|
searchCommand=/usr/bin/grep
|
|
searchCommandOptions=-r -n -H
|
|
gitCommand=
|
|
# must return a mime type of file
|
|
fileTypeCommand=/usr/bin/file
|
|
fileTypeCommandOptions=-i -b
|
|
\[GUI\]
|
|
locale=$locale
|
|
theme=dark
|
|
toolBarShow=true
|
|
menuShow=true
|
|
statusBarShow=true
|
|
filesPanelShow=true
|
|
filesPanelPlace=left
|
|
geometry=800x600
|
|
guiFont={Droid Sans Mono} 9
|
|
guiFontBold={Droid Sans Mono} 9 bold
|
|
guiFG=#cccccc
|
|
\[Editor\]
|
|
autoFormat=true
|
|
font=Monospace 10
|
|
fontBold=Monospace 10
|
|
backGround=#333333
|
|
foreground=#cccccc
|
|
selectbg=#10a410a410a4
|
|
selectLightBg=grey
|
|
nbNormal=#000000
|
|
nbModify=#ffff5d705d70
|
|
lineNumberFG=#444444
|
|
lineNumberBG=#151515
|
|
selectBorder=0
|
|
# must be: none, word or char
|
|
editorWrap=word
|
|
lineNumberShow=true
|
|
tabSize=4
|
|
procedureHelper=false
|
|
variableHelper=true
|
|
multilineComments=true
|
|
\[UserSession\]
|
|
opened=
|
|
editedFiles=
|
|
recentFolder=
|
|
\[Executor\]
|
|
TCL=tclsh
|
|
GO=go
|
|
PY=python3
|
|
SH=bash
|
|
PL=perl
|
|
RB=ruby
|
|
HTM=firefox
|
|
HTML=firefox
|
|
LUA=lua
|
|
\[Debug\]
|
|
debug=false
|
|
debugOut=stdout
|
|
"
|
|
proc Config::create {dir} {
|
|
set cfgFile [open [file join $dir projman.ini] "w+"]
|
|
puts $cfgFile $::configDefault
|
|
close $cfgFile
|
|
}
|
|
|
|
proc Config::read {dir} {
|
|
set cfgFile [ini::open [file join $dir projman.ini] "r"]
|
|
foreach section [ini::sections $cfgFile] {
|
|
foreach key [ini::keys $cfgFile $section] {
|
|
lappend ::cfgINIsections($section) $key
|
|
set ::cfgVariables($key) [ini::value $cfgFile $section $key]
|
|
}
|
|
}
|
|
ini::close $cfgFile
|
|
}
|
|
|
|
proc Config::write {dir} {
|
|
global activeProject editors
|
|
set cfgFile [ini::open [file join $dir projman.ini] "w"]
|
|
foreach section [array names ::cfgINIsections] {
|
|
foreach key $::cfgINIsections($section) {
|
|
ini::set $cfgFile $section $key $::cfgVariables($key)
|
|
}
|
|
}
|
|
set systemTime [clock seconds]
|
|
# Set a config modify time (i don't know why =))'
|
|
ini::set $cfgFile "General" cfgModifyDate [clock format $systemTime -format "%D %H:%M:%S"]
|
|
ini::set $cfgFile "UserSession" editedFiles ""
|
|
|
|
# Save an top level window geometry into config
|
|
ini::set $cfgFile "GUI" geometry [wm geometry .]
|
|
if {[info exists activeProject] !=0 && $activeProject ne ""} {
|
|
ini::set $cfgFile "UserSession" opened $activeProject
|
|
# Добавим пути к открытым в редакторе файлам в переменную
|
|
if [info exists editors] {
|
|
foreach i [dict keys $editors] {
|
|
# puts [dict get $editors $i]
|
|
if [dict exists $editors $i fileFullPath] {
|
|
lappend edited [dict get $editors $i fileFullPath]
|
|
}
|
|
}
|
|
if [info exists edited] {
|
|
ini::set $cfgFile "UserSession" editedFiles $edited
|
|
}
|
|
}
|
|
} else {
|
|
ini::set $cfgFile "UserSession" opened ""
|
|
ini::set $cfgFile "UserSession" editedFiles ""
|
|
}
|
|
# puts $editors
|
|
|
|
ini::commit $cfgFile
|
|
ini::close $cfgFile
|
|
}
|
|
|
|
# Добавление перменной в список
|
|
# если отсутствует нужная секция то она будет добавлена.
|
|
proc Config::AddVariable {key value section} {
|
|
# Проверяем, существует ли уже такая переменная
|
|
if {[info exists ::cfgVariables($key)]} {
|
|
DebugPuts "The variable '$key' already exists: $::cfgVariables($key)"
|
|
return 0
|
|
}
|
|
|
|
# Добавляем в массив переменных
|
|
set ::cfgVariables($key) $value
|
|
|
|
# Добавляем в список ключей секции
|
|
if {[info exists ::cfgINIsections($section)]} {
|
|
# Проверяем, нет ли уже такого ключа в секции
|
|
if {[lsearch -exact $::cfgINIsections($section) $key] == -1} {
|
|
lappend ::cfgINIsections($section) $key
|
|
}
|
|
} else {
|
|
set ::cfgINIsections($section) [list $key]
|
|
}
|
|
DebugPuts "Config::AddVariable: The variable '$key' has been added to the array 'cfgVariables'"
|
|
|
|
return 1
|
|
}
|
|
|
|
# Проверяем наличие переменных в конфиге на основе "эталонного" списка
|
|
# и выставляем значение по умолчанию если в конфиге переменной нет
|
|
proc Config::CheckVariables {} {
|
|
set valList [split $::configDefault "\n"]
|
|
foreach item $valList {
|
|
if {[regexp -nocase -all -- {\[(\w+)\]} $item -> v1]} {
|
|
set section $v1
|
|
}
|
|
if {[regexp {^([^=]+)=(.*)$} $item -> var value]} {
|
|
if ![info exists ::cfgVariables($var)] {
|
|
DebugPuts "Error in Config::CheckVariables: variable ::cfgVariables($var) not found"
|
|
# set ::cfgVariables($var) $value
|
|
DebugPuts "Config::CheckVariables: The variable cfgVariables($var) setting to default value \"$value\""
|
|
Config::AddVariable "$var" "$value" "$section"
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|