diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2021-11-21 11:45:45 +0100 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2021-11-21 11:45:45 +0100 |
commit | cfecf3e11017142193428e8830d8e0e8562d795b (patch) | |
tree | feba563945c738f5a7e7e85e78403ca0363d0a0f /examples/go-dashboard/src/github.com/mum4k/termdash/widgetapi/widgetapi.go | |
parent | 25b974af67d98fa19e0953194347a1260d684ef5 (diff) |
go-dashboard renaming, ignore go-mod and it's file structure
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'examples/go-dashboard/src/github.com/mum4k/termdash/widgetapi/widgetapi.go')
-rw-r--r-- | examples/go-dashboard/src/github.com/mum4k/termdash/widgetapi/widgetapi.go | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/examples/go-dashboard/src/github.com/mum4k/termdash/widgetapi/widgetapi.go b/examples/go-dashboard/src/github.com/mum4k/termdash/widgetapi/widgetapi.go new file mode 100644 index 000000000..ee27136a1 --- /dev/null +++ b/examples/go-dashboard/src/github.com/mum4k/termdash/widgetapi/widgetapi.go @@ -0,0 +1,185 @@ +// Copyright 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package widgetapi defines the API of a widget on the dashboard. +package widgetapi + +import ( + "image" + + "github.com/mum4k/termdash/private/canvas" + "github.com/mum4k/termdash/terminal/terminalapi" +) + +// KeyScope indicates the scope at which the widget wants to receive keyboard +// events. +type KeyScope int + +// String implements fmt.Stringer() +func (ks KeyScope) String() string { + if n, ok := keyScopeNames[ks]; ok { + return n + } + return "KeyScopeUnknown" +} + +// keyScopeNames maps KeyScope values to human readable names. +var keyScopeNames = map[KeyScope]string{ + KeyScopeNone: "KeyScopeNone", + KeyScopeFocused: "KeyScopeFocused", + KeyScopeGlobal: "KeyScopeGlobal", +} + +const ( + // KeyScopeNone is used when the widget doesn't want to receive any + // keyboard events. + KeyScopeNone KeyScope = iota + + // KeyScopeFocused is used when the widget wants to only receive keyboard + // events when its container is focused. + KeyScopeFocused + + // KeyScopeGlobal is used when the widget wants to receive all keyboard + // events regardless of which container is focused. + KeyScopeGlobal +) + +// MouseScope indicates the scope at which the widget wants to receive mouse +// events. +type MouseScope int + +// String implements fmt.Stringer() +func (ms MouseScope) String() string { + if n, ok := mouseScopeNames[ms]; ok { + return n + } + return "MouseScopeUnknown" +} + +// mouseScopeNames maps MouseScope values to human readable names. +var mouseScopeNames = map[MouseScope]string{ + MouseScopeNone: "MouseScopeNone", + MouseScopeWidget: "MouseScopeWidget", + MouseScopeContainer: "MouseScopeContainer", + MouseScopeGlobal: "MouseScopeGlobal", +} + +const ( + // MouseScopeNone is used when the widget doesn't want to receive any mouse + // events. + MouseScopeNone MouseScope = iota + + // MouseScopeWidget is used when the widget only wants mouse events that + // fall onto its canvas. + // The position of these widgets is always relative to widget's canvas. + MouseScopeWidget + + // MouseScopeContainer is used when the widget only wants mouse events that + // fall onto its container. The area size of a container is always larger + // or equal to the one of the widget's canvas. So a widget selecting + // MouseScopeContainer will either receive the same or larger amount of + // events as compared to MouseScopeWidget. + // The position of mouse events that fall outside of widget's canvas is + // reset to image.Point{-1, -1}. + // The widgets are allowed to process the button event. + MouseScopeContainer + + // MouseScopeGlobal is used when the widget wants to receive all mouse + // events regardless on where on the terminal they land. + // The position of mouse events that fall outside of widget's canvas is + // reset to image.Point{-1, -1} and must not be used by the widgets. + // The widgets are allowed to process the button event. + MouseScopeGlobal +) + +// Options contains registration options for a widget. +// This is how the widget indicates its needs to the infrastructure. +type Options struct { + // Ratio allows a widget to request a canvas whose size will always have + // the specified ratio of width:height (Ratio.X:Ratio.Y). + // The zero value i.e. image.Point{0, 0} indicates that the widget accepts + // canvas of any ratio. + Ratio image.Point + + // MinimumSize allows a widget to specify the smallest allowed canvas size. + // If the terminal size and/or splits cause the assigned canvas to be + // smaller than this, the widget will be skipped. I.e. The Draw() method + // won't be called until a resize above the specified minimum. + MinimumSize image.Point + + // MaximumSize allows a widget to specify the largest allowed canvas size. + // If the terminal size and/or splits cause the assigned canvas to be larger + // than this, the widget will only receive a canvas of this size within its + // container. Setting any of the two coordinates to zero indicates + // unlimited. + MaximumSize image.Point + + // WantKeyboard allows a widget to request keyboard events and specify + // their desired scope. If set to KeyScopeNone, no keyboard events are + // forwarded to the widget. + WantKeyboard KeyScope + + // WantMouse allows a widget to request mouse events and specify their + // desired scope. If set to MouseScopeNone, no mouse events are forwarded + // to the widget. + // Note that the widget is only able to see the position of the mouse event + // if it falls onto its canvas. See the documentation next to individual + // MouseScope values for details. + WantMouse MouseScope +} + +// Meta provide additional metadata to widgets. +type Meta struct { + // Focused asserts whether the widget's container is focused. + Focused bool +} + +// Widget is a single widget on the dashboard. +// Implementations must be thread safe. +type Widget interface { + // When the infrastructure calls Draw(), the widget must block on the call + // until it finishes drawing onto the provided canvas. When given the + // canvas, the widget must first determine its size by calling + // Canvas.Size(), then limit all its drawing to this area. + // + // The widget must not assume that the size of the canvas or its content + // remains the same between calls. + // + // The argument meta is guaranteed to be valid (i.e. non-nil). + Draw(cvs *canvas.Canvas, meta *Meta) error + + // Keyboard is called when the widget is focused on the dashboard and a key + // shortcut the widget registered for was pressed. Only called if the widget + // registered for keyboard events. + Keyboard(k *terminalapi.Keyboard) error + + // Mouse is called when the widget is focused on the dashboard and a mouse + // event happens on its canvas. Only called if the widget registered for mouse + // events. + Mouse(m *terminalapi.Mouse) error + + // Options returns registration options for the widget. + // This is how the widget indicates to the infrastructure whether it is + // interested in keyboard or mouse shortcuts, what is its minimum canvas + // size, etc. + // + // Most widgets will return statically compiled options (minimum and + // maximum size, etc.). If the returned options depend on the runtime state + // of the widget (e.g. the user data provided to the widget), the widget + // must protect against a case where the infrastructure calls the Draw + // method with a canvas that doesn't meet the requested options. This is + // because the data in the widget might change between calls to Options and + // Draw. + Options() Options +} |