1// Copyright 2019 Graham Clark. All rights reserved.  Use of this source
2// code is governed by the MIT license that can be found in the LICENSE
3// file.
4
5// Package disable provides a widget that forces its inner widget to be disable (or enabled).
6package disable
7
8import (
9	"fmt"
10
11	"github.com/gcla/gowid"
12)
13
14//======================================================================
15
16// If you would like a non-selectable widget like TextWidget to be selectable
17// in some context, wrap it in Widget
18//
19type Widget struct {
20	gowid.IWidget
21	*gowid.Callbacks
22	gowid.SubWidgetCallbacks
23	isDisabled bool
24}
25
26func New(w gowid.IWidget) *Widget {
27	return NewWith(w, true)
28}
29
30func NewDisabled(w gowid.IWidget) *Widget {
31	return NewWith(w, true)
32}
33
34func NewEnabled(w gowid.IWidget) *Widget {
35	return NewWith(w, false)
36}
37
38func NewWith(w gowid.IWidget, isDisabled bool) *Widget {
39	res := &Widget{
40		IWidget:    w,
41		isDisabled: isDisabled,
42	}
43	res.SubWidgetCallbacks = gowid.SubWidgetCallbacks{CB: &res.Callbacks}
44	var _ gowid.ICompositeWidget = res
45	return res
46}
47
48func (w *Widget) Enable() {
49	w.isDisabled = false
50}
51
52func (w *Widget) Disable() {
53	w.isDisabled = true
54}
55
56func (w *Widget) Set(val bool) {
57	w.isDisabled = val
58}
59
60func (w *Widget) String() string {
61	return fmt.Sprintf("disabled[d=%v,%v]", w.isDisabled, w.SubWidget())
62}
63
64func (w *Widget) SubWidget() gowid.IWidget {
65	return w.IWidget
66}
67
68func (w *Widget) SetSubWidget(wi gowid.IWidget, app gowid.IApp) {
69	w.IWidget = wi
70	gowid.RunWidgetCallbacks(w.Callbacks, gowid.SubWidgetCB{}, app, w)
71}
72
73func (w *Widget) SubWidgetSize(size gowid.IRenderSize, focus gowid.Selector, app gowid.IApp) gowid.IRenderSize {
74	return size
75}
76
77func (w *Widget) Selectable() bool {
78	return !w.isDisabled && w.SubWidget().Selectable()
79}
80
81func (w *Widget) UserInput(ev interface{}, size gowid.IRenderSize, focus gowid.Selector, app gowid.IApp) bool {
82	if w.isDisabled {
83		return false
84	}
85	return w.SubWidget().UserInput(ev, size, focus, app)
86}
87
88//======================================================================
89// Local Variables:
90// mode: Go
91// fill-column: 110
92// End:
93