Tixのグリッド (2)

今度の私たちの任務は次のふたつです。 一つ目は、先のページでちこっと触れた、画像データをセルに貼り付ける方法、 二つ目は、キーボードでセルのインライン編集ができるようにすることです。 両方とも、そんなに難しくないので、びしばしやってみましょう。

package require Tix
wm title . "Inventory II"

image create photo ImageHot  -file /usr/icons/hot.ppm
image create photo ImageCool -file /usr/icons/cool.ppm

proc CBFormat {w area x1 y1 x2 y2} {
    case $area {
        main {
	    $w format grid $x1 $y1 $x2 $y2 \
              -bd 1 -bordercolor #606060 -relief raised \
              -bg #c0c0c0 -fill 1
	}
        x-margin {
	    $w format grid $x1 $y1 $x2 $y2 \
              -bd 1 -bordercolor #606060 -relief raised \
              -bg #f0c0c0 -fill 1
	}
        y-margin {
	    $w format grid $x1 $y1 $x2 $y2 \
              -bd 1 -bordercolor #606060 -relief raised \
              -bg #c0c0f0 -fill 1
	}
        s-margin {
	    $w format grid $x1 $y1 $x2 $y2 \
              -bd 1 -bordercolor #606060 -relief raised \
              -bg #f0f0f0 -fill 1
	}
    }
}

proc EditNotifyCmd {w x y} {
    if {$x == 0 || $y == 0} {
	tk_messageBox -message "嗚呼! そこはタイトル部なので編集できぬのじゃ。"
        return 0
    } else {
	set currentValue [$w entrycget $x $y -text]
	if {"$currentValue" == "-"} {
             return 0
	} else {
	    return 1
	}
    }
}

proc EditDoneCmd {w x y} {
    set newValue [$w entrycget $x $y -text]
    tk_messageBox -message "($x, $y) = ${newValue}..."
}

set f [frame .f]
set g [tixGrid $f.g -width 8 -height 6 -format "CBFormat $f.g" \
       -xscrollcommand "$f.scrh set" -yscrollcommand "$f.scrv set" \
       -editnotify "EditNotifyCmd $f.g" -editdone "EditDoneCmd $f.g" ]
set scrv [scrollbar $f.scrv -ori v -com "$g yview"]
set scrh [scrollbar $f.scrh -ori h -com "$g xview"]
grid $g -row 0 -column 0
grid $scrv -row 0 -column 1 -sticky ns
grid $scrh -row 1 -column 0 -sticky ew

$g size col 0 -size 16char
$g set 0 0 -itemtype text -text 品目

set RowTitles {
    とりもも テンダーロイン ハンバーグ
    さかなフライ コロッケ 冷錦糸卵 冷いんげん 冷ブロッコリー
}
set y 1
foreach e $RowTitles {
    $g set 0 $y -itemtype imagetext -text $e -image ImageCool; incr y
}
set ColTitles { 10 11 12 13 14 15 16 17 18 }
set x 1
foreach e $ColTitles {
    $g size col $x -size 4char
    $g set $x 0 -itemtype text -text $e; incr x
}
set data {
    {2 * * 2 * * 2 * *}
    {1 3 * 2 * 1 3 * 2}
    {1 * 4 * 1 3 * 2 1}
    {* * * 2 * * * 3 *}
    {1 * 1 * * * 1 * *}
    {* 3 * * * 3 * * 2}
    {* * 2 2 * * 2 2 *}
    {* 1 1 * * 1 1 * 1}
}
set y 1
foreach e $data {
    set x 1
    foreach d $e {
        $g set $x $y -itemtype text -text $d; incr x
    }
    incr y
}

button .b -text 終了 -command exit
pack $f .b -side top -anc e
# end.

スクリーンショット

「COOL」アイコンの使い方が違うとかそのよーな矯激なツッコミは、要りません。 冷凍食品の素晴らしさを皆さんにどう伝えればいいのか、 むしろそれを考え抜いた末の決断でした。冷凍食品とは常にクールなのです(黙れ)
…それはともかく、あ、何でしたっけ、 セル?の?インライン?編集? あー、思い出しましたとも。 セルをキー入力で編集できるようにするには、 tixGridのオプション -editnotifycmdにこれまたコールバックプロシージャを指定します。 このプロシージャにはxとyという、 これから編集されようとしているセルの座標が自動的につけて渡されるので、 必ず1か0などの真偽値をプロシージャの値として返します (というか返すようにプログラマが書きます)。 これすなわち、このプロシージャが1(真)を返した場合、 このセル(x, y) は編集可能、そうでなければ編集不可能となります。

proc EditNotifyCmd {w x y} {
    return 1
}

そしてこちらはオプションですけども、 ユーザーが思う存分セルを編集してフォーカスが離れようとする瞬間に何か処理をしたい場合には、 tixGridのオプション-editdonecmdでコールバックプロシージャを指定しておきます。 このプロシージャはフォーカスが離れようとすると呼ばれ、 今編集して去られようとしているところのセルの座標xとyが引数として後ろにつけられます。 ここで日付がおかしいとか、数値が正でないといけないとか、 おやつは500円までとか、そのよーなチェックをかけて、結果により警告を出すなり、 編集前に戻すなり、ハイチュウはあきらめるなり、といった処理が可能です。

さて今度はそのCOOLアイコンの話です。 このグリッドに限らず、ハイアラキカルリストやタブらーリストボックスなど、 Tixのウィジェットの多くは、 共通の方法でセルやリスト項目に文字の代わりに画像データや他のウィジェットを貼り付けることができます。 その基本的な方法は、-itemtypeに標準のtextの代わりに imageやimagetextやwindowを指定し、さらにそれらに応じたオプション (-textとか-imageとか)をつけることです。 グリッドの場合は、set サブコマンドでこの指定をします。

$g set 0 4 -itemtype imagetext -text "さかなフライ" -image ImageCool
なお一度このようにセットしたセルの文字列や画像データは、 entryconfigureサブコマンドで変更でき、 現在設定されている値はentrycgetサブコマンドで知ることができます。
set oldValue [$w entrycget 0 4 -text]
$w entryconfigure 0 4 -text "えびフライ"

拡張レビュー分室 top
(first uploaded 2001/04/13 last updated 2010/09/24, MISUMI URANO)