crypt of decay - вынесу-ка из каментов кусочек tcl [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

вынесу-ка из каментов кусочек tcl [Oct. 9th, 2012|08:20 am]
Previous Entry Add to Memories Tell A Friend Next Entry
это 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% тупая копипаста. наверняка можно написать быстрее, короче и красивей.
Linkmeow!

Comments:
From:(Anonymous)
Date:October 9th, 2012 - 09:01 am
(Link)
спросонья визуально css'ка. а ведь идея! запилите мне новый веб на тикле
[User Picture]
From:[info]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]
From:[info]ketmar
Date:October 9th, 2012 - 11:43 am
(Link)
тест перекрывающихся свойств. заюзано должно быть только последнее, мне так удобно.
From:(Anonymous)
Date:October 9th, 2012 - 12:38 pm
(Link)
> заюзано должно быть только последнее
ну оно всегда же везде так, не?
[User Picture]
From:[info]ketmar
Date:October 9th, 2012 - 12:40 pm
(Link)
нет. может накапливаться, может меняться, может первое, может ошибкой срать.
From:[info]tzirechnoy.livejournal.com
Date:October 9th, 2012 - 02:16 pm
(Link)
Первый бэкслэш -- лишний.
[User Picture]
From:[info]ketmar
Date:October 9th, 2012 - 11:02 pm
(Link)
да, затесался откуда-то. ну, он и не мешает же.
From:[info]tzirechnoy.livejournal.com
Date:October 9th, 2012 - 02:17 pm
(Link)
А скорллбары к кому относятся? (И почему).
[User Picture]
From:[info]ketmar
Date:October 9th, 2012 - 11:04 pm
(Link)
а ни к кому, это «скроллбары в вакууме», чисто для тестов. на самом деле их можно слинковать с другим виджетом, и он будет получать событие «скролл дёрнули». где может уже у скролла непосредственно спросить, что произошло. собственно, listbox так слинкован с личным пацаком скроллбаром в конструкторе.
[User Picture]
From:[info]ketmar
Date:October 9th, 2012 - 11:08 pm
(Link)
там вон у lineedit есть свойство «linked-from» — это для «линкования задом наперёд», от уже объявленого виджета на текущий. и есть свойство, которое не показано, «linked» — это для «прямого» линкования, от текущего к уже объявленному (ну лень мне было делать два прохода; потом сделаю, может быть). а там уже разные виджеты по линку делают разные вещи.

UI-то простенький, мегазадач выполнять на нём не надо, супервиджетов тоже делать не надо.