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