вынесу-ка из каментов кусочек tcl |
[Oct. 9th, 2012|08:20 am] |
это tcl, да:
set win_x 0
set win_y 0
proc nw {} {
set win [ \
window: {
scheme: red
id: win1
id: win0
title: mytitle
position: {$::win_x $::win_y}
size: {180 120}
margins: {2 1}
#
static: {
id: static0
caption: "&name:"
position: {2 2}
}
#
lineedit: {
id: led0
position: {after static0}
width: 60
text: "text"
linked-from: static0
}
#
checkbox: {
id: cb1
caption: "checkbox &1"
position: {under static0}
#state: 1
checked
}
#
checkbox: {
id: cb2
caption: "checkbox &2"
position: {under cb1}
#state: 2
question
}
#
radio: {
group: rgroup1
id: g1r1
caption: "r&adio 1"
position: { {{x cb2} + 4} {{under cb2} + 11} }
}
#
radio: {
group: rgroup1
id: g1r2
caption: "ra&dio 2"
position: {under g1r1}
radioactive
}
#
frame: {
id: frm
caption: frame
#framebox sets both position and size
framebox: g1r1 g1r1
}
#
scrollbar: {
horiz
id: hsb
position: { {{x g1r1}} {{y frm} + {height frm} + 4} }
size: 64
}
#
scrollbar: {
vert
id: vsb
position: { {{x hsb} + {width hsb} + 4} {{y hsb} - 32} }
size: 60
max: 32
pos: 6
}
#
listbox: {
id: lsb
position: {100 10}
size: {60 90}
vbar
multi
items: {
"xitem 0"
"xitem 1"
}
}
#
button: {
id: ok
caption: O&K
position: {2 {{height window} - 9 - 12}}
onclick: {
set win [$me window]
puts "=== OK ==="
puts [$me type]
puts [$win type]
puts "<$me>"
puts "<$win>"
#
puts "cb1: [[$win cb1] getstate]"
puts "cb2: puts [[$win cb2] getstate]"
puts "radiogroup 'rgroup1': [$win getradioactive rgroup1]"
puts "g1r1 group: [[$win g1r1] getgroup]"
puts "g1r1: [[$win g1r1] getradioactive]"
puts "g1r2: [[$win g1r2] getradioactive]"
puts "edt: \[[[$win led0] gettext]\]"
}
default
active
}
#
button: {
id: cancel
caption: Cancel
position: {after ok}
onclick: {
set win [$me window]
puts "=== CANCEL ==="
puts [$me type]
puts [$win type]
[$me window] close
}
cancel
}
}]
#
set lsb [$win lsb]
loop ic 0 22 {
$lsb additem "item $ic"
}
#
set ::win_x $($::win_x + 16)
set ::win_y $($::win_y + 16)
if {$::win_x > 300} { set ::win_x 1 }
if {$::win_y > 220} { set ::win_y 1 }
#
set ::win0 $win
} «парзер» этой байды написан опять же на самом tcl. и в итоге он преобразует описание в вызовы, которые показаны в посте ниже. естественно, парзер активно пользуется фичами типа namespaces и eval. тут не видно, но в принципе в математике можно использовать локальные переменные, объявленые до описания window.
это всё заняло пару часов экспериментов — с учётом того, что я tcl вообще толком не знаю. размер парзера — ~20 кил, но там больше 80% тупая копипаста. наверняка можно написать быстрее, короче и красивей. |
|
|
Comments: |
From: | (Anonymous) |
Date: | October 9th, 2012 - 09:01 am |
---|
| | | (Link) |
|
спросонья визуально css'ка. а ведь идея! запилите мне новый веб на тикле
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | October 9th, 2012 - 09:08 am |
---|
| | | (Link) |
|
ну, есть немного общего, да.
From: | (Anonymous) |
Date: | October 9th, 2012 - 10:28 am |
---|
| | | (Link) |
|
объясните идиотам нафига их два: id: win1 id: win0 ?
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | October 9th, 2012 - 11:43 am |
---|
| | | (Link) |
|
тест перекрывающихся свойств. заюзано должно быть только последнее, мне так удобно.
From: | (Anonymous) |
Date: | October 9th, 2012 - 12:38 pm |
---|
| | | (Link) |
|
> заюзано должно быть только последнее ну оно всегда же везде так, не?
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | October 9th, 2012 - 12:40 pm |
---|
| | | (Link) |
|
нет. может накапливаться, может меняться, может первое, может ошибкой срать.
Первый бэкслэш -- лишний.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | October 9th, 2012 - 11:02 pm |
---|
| | | (Link) |
|
да, затесался откуда-то. ну, он и не мешает же.
А скорллбары к кому относятся? (И почему).
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | October 9th, 2012 - 11:04 pm |
---|
| | | (Link) |
|
а ни к кому, это «скроллбары в вакууме», чисто для тестов. на самом деле их можно слинковать с другим виджетом, и он будет получать событие «скролл дёрнули». где может уже у скролла непосредственно спросить, что произошло. собственно, listbox так слинкован с личным пацаком скроллбаром в конструкторе.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | October 9th, 2012 - 11:08 pm |
---|
| | | (Link) |
|
там вон у lineedit есть свойство «linked-from» — это для «линкования задом наперёд», от уже объявленого виджета на текущий. и есть свойство, которое не показано, «linked» — это для «прямого» линкования, от текущего к уже объявленному (ну лень мне было делать два прохода; потом сделаю, может быть). а там уже разные виджеты по линку делают разные вещи.
UI-то простенький, мегазадач выполнять на нём не надо, супервиджетов тоже делать не надо. | |