93 lines
2.7 KiB
Go
93 lines
2.7 KiB
Go
/*
|
|
Copyright © Brian Buller <brian@bullercodeworks.com>
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
*/
|
|
package widgets
|
|
|
|
import "github.com/gdamore/tcell"
|
|
|
|
type Widget interface {
|
|
Init(string, tcell.Style)
|
|
Id() string
|
|
// HandleResize receives a resize event from the parent with the amount of
|
|
// space available to the widget.
|
|
// If there is not enough space, the widget is allowed to freak out.
|
|
HandleResize(*tcell.EventResize)
|
|
HandleKey(*tcell.EventKey) bool
|
|
HandleTime(*tcell.EventTime)
|
|
Draw(tcell.Screen)
|
|
Active() bool
|
|
SetActive(bool)
|
|
Visible() bool
|
|
SetVisible(bool)
|
|
Focusable() bool
|
|
Tabbable() bool
|
|
SetTabbable(bool)
|
|
SetX(int)
|
|
SetY(int)
|
|
GetX() int
|
|
GetY() int
|
|
GetPos() Coord
|
|
SetPos(Coord)
|
|
SetSize(Coord)
|
|
// Whatever is managing this widget (parent widget, screen, etc) should
|
|
// tell it exactly what the Width & Height are.
|
|
// It _should_ try to base this off of WantW/WantH & MinW/MinH
|
|
SetW(int)
|
|
SetH(int)
|
|
GetW() int
|
|
GetH() int
|
|
// Given infinite space, WantW & WantH are what this widget wants
|
|
// This should reflect the current state of the widget, not potential
|
|
WantW() int
|
|
WantH() int
|
|
// MinW & MinH are what this widget must have to be functional.
|
|
// This should reflect the current state of the widget, not potential
|
|
MinW() int
|
|
MinH() int
|
|
}
|
|
|
|
func WidgetBottom(w Widget) int {
|
|
return w.GetY() + w.GetH()
|
|
}
|
|
|
|
func WidgetRight(w Widget) int {
|
|
return w.GetX() + w.GetW()
|
|
}
|
|
|
|
// To validate that a struct satisfies this interface, you can do:
|
|
// var _ Widget - (*<struct>)(nil)
|
|
// where <struct> is the actual struct that you're validating.
|
|
|
|
type WidgetList []Widget
|
|
|
|
func (w *WidgetList) Contains(id string) bool {
|
|
return w.Find(id) != nil
|
|
}
|
|
|
|
func (w *WidgetList) Find(id string) Widget {
|
|
for _, wi := range *w {
|
|
if wi.Id() == id {
|
|
return wi
|
|
}
|
|
}
|
|
return nil
|
|
}
|