タブが複数表示されているときに、特定のタブ(TabPane)を、「選択できないようにする」にはどうすればよいでしょうか。
TabPane.enabled?= false に指定したらいけるかな、と思ったのですが、
タブの中のグラフィックが非活性になるだけで、私の望みとは異なります。
タブコンテナの中身をいったんクリアし、必要なタブのみ追加表示し、
不要なタブは表示しないようにするしかないでしょうか。
ハック的なやり方だが、次のような方法がある(標準コントロールのUI構成が変更されたら、動かなくなるなどの相性問題が生じる可能性があることをご理解したうえで…)
Code:
{def tp2 =
{TabPane
{text font-size = 28pt, 2}
}
}
{TabContainer
{TabPane
{text font-size = 28pt, 1}
},
tp2,
{TabPane
{text font-size = 28pt, 3}
}
}
||--{def vb = {VBox}}
{after 0s do
def tab-selector =
tp2.label.parent.parent.parent.parent
||-- {vb.add
||-- {type-of tab-selector}
||-- }
{tab-selector.add-event-handler
{on e:PointerEnvelopeEvent do
{e.consume}
}
}
}
||--{value vb}
なるほど TabPane.label の親をたどっていくと、選択用のボタンがあるので、
そのイベントをconsume する、という方法があるのですね。
ただ、いただいたコードだけだと、キーボードの矢印キーを操作されたときには、
対象のTabPaneが表示できてしまったので、
TabContainer.tab-index セッターと、TabContainer.showpane メソッドをオーバーライドする方法を考えてみました。
それでも、この方法だと、
・矢印キー操作時、無効TabPane の隣を表示したい
・無効TabPaneが表示されているときに無効化されたらどうする?
など、いろいろ考慮が必要そうですね・・・。
Code:
||表示無効化が可能なタブペイン
{define-class public DisabledTabPane {inherits TabPane}
field disabled?:bool = false
field private attatched?:bool = false
{constructor public {default
disabled?:bool = false,
...}
set self.disabled? = disabled?
{construct-super {splice ...}}
||表示時に、タブセレクトボタンの押下時に
||無効化されているかどうかを判断する処理を追加する
{self.add-event-handler
{on AttachEvent do
{if not self.attatched? then
set self.attatched? = true
def tab-selector =
self.label.parent.parent.parent.parent asa TabSelectorButton
{tab-selector.add-event-handler
{on e:Action do
{e.consume}
}
}
}
}
}
}
}
||無効タブペインを保持できるタブコンテナ
{define-class public CustomTabContainer {inherits TabContainer}
{constructor public {default ...}
{construct-super {splice ...}}
}
{setter public open {current-pane-index index:int}:void
def tp = self.tab-panes[index]
{type-switch tp
case dtp:DisabledTabPane do
{if dtp.disabled? then
{return}
}
}
set super.current-pane-index = index
}
{method public open {show-pane pane:TabPane}:bool
{type-switch pane
case dtp:DisabledTabPane do
{if dtp.disabled? then
{return false}
}
}
{return
{if {super.show-pane pane} then
{self.ensure-button-visible {non-null self.current-pane}}
true
else
false
}
}
}
}
{def disabled-tp =
{DisabledTabPane
disabled? = true,
{text font-size = 28pt, A}
}
}
{def tc =
{CustomTabContainer
disabled-tp,
{TabPane
enabled? = true,
{text font-size = 28pt, B}
},
{TabPane
enabled? = true,
{text font-size = 28pt, C}
}
}}
{value tc}
{CheckButton
label = "タブ表示無効",
value = disabled-tp.disabled?,
{on ValueChanged at chkb:CheckButton do
set disabled-tp.disabled? = chkb.value
}
}