summaryrefslogtreecommitdiff
path: root/examples/go-dashboard/src/github.com/mum4k/termdash/container/options.go
diff options
context:
space:
mode:
Diffstat (limited to 'examples/go-dashboard/src/github.com/mum4k/termdash/container/options.go')
1 files changed, 0 insertions, 817 deletions
diff --git a/examples/go-dashboard/src/github.com/mum4k/termdash/container/options.go b/examples/go-dashboard/src/github.com/mum4k/termdash/container/options.go
deleted file mode 100644
index 2d34af4db..000000000
--- a/examples/go-dashboard/src/github.com/mum4k/termdash/container/options.go
+++ /dev/null
@@ -1,817 +0,0 @@
-// 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 container
-
-// options.go defines container options.
-
-import (
- "errors"
- "fmt"
- "image"
-
- "github.com/mum4k/termdash/align"
- "github.com/mum4k/termdash/cell"
- "github.com/mum4k/termdash/linestyle"
- "github.com/mum4k/termdash/private/area"
- "github.com/mum4k/termdash/widgetapi"
-)
-
-// applyOptions applies the options to the container and validates them.
-func applyOptions(c *Container, opts ...Option) error {
- for _, opt := range opts {
- if err := opt.set(c); err != nil {
- return err
- }
- }
- return nil
-}
-
-// ensure all the container identifiers are either empty or unique.
-func validateIds(c *Container, seen map[string]bool) error {
- if c.opts.id == "" {
- return nil
- } else if seen[c.opts.id] {
- return fmt.Errorf("duplicate container ID %q", c.opts.id)
- }
- seen[c.opts.id] = true
-
- return nil
-}
-
-// ensure all the container only have one split modifier.
-func validateSplits(c *Container) error {
- if c.opts.splitFixed > DefaultSplitFixed && c.opts.splitPercent != DefaultSplitPercent {
- return fmt.Errorf(
- "only one of splitFixed `%v` and splitPercent `%v` is allowed to be set per container",
- c.opts.splitFixed,
- c.opts.splitPercent,
- )
- }
-
- return nil
-}
-
-// validateOptions validates options set in the container tree.
-func validateOptions(c *Container) error {
- var errStr string
- seenID := map[string]bool{}
- preOrder(c, &errStr, func(c *Container) error {
- if err := validateIds(c, seenID); err != nil {
- return err
- }
- if err := validateSplits(c); err != nil {
- return err
- }
-
- return nil
- })
- if errStr != "" {
- return errors.New(errStr)
- }
-
- return nil
-}
-
-// Option is used to provide options to a container.
-type Option interface {
- // set sets the provided option.
- set(*Container) error
-}
-
-// options stores the options provided to the container.
-type options struct {
- // id is the identifier provided by the user.
- id string
-
- // inherited are options that are inherited by child containers.
- inherited inherited
-
- // split identifies how is this container split.
- split splitType
- splitPercent int
- splitFixed int
-
- // widget is the widget in the container.
- // A container can have either two sub containers (left and right) or a
- // widget. But not both.
- widget widgetapi.Widget
-
- // Alignment of the widget if present.
- hAlign align.Horizontal
- vAlign align.Vertical
-
- // border is the border around the container.
- border linestyle.LineStyle
- borderTitle string
- borderTitleHAlign align.Horizontal
-
- // padding is a space reserved between the outer edge of the container and
- // its content (the widget or other sub-containers).
- padding padding
-
- // margin is a space reserved on the outside of the container.
- margin margin
-}
-
-// margin stores the configured margin for the container.
-// For each margin direction, only one of the percentage or cells is set.
-type margin struct {
- topCells int
- topPerc int
- rightCells int
- rightPerc int
- bottomCells int
- bottomPerc int
- leftCells int
- leftPerc int
-}
-
-// apply applies the configured margin to the area.
-func (p *margin) apply(ar image.Rectangle) (image.Rectangle, error) {
- switch {
- case p.topCells != 0 || p.rightCells != 0 || p.bottomCells != 0 || p.leftCells != 0:
- return area.Shrink(ar, p.topCells, p.rightCells, p.bottomCells, p.leftCells)
- case p.topPerc != 0 || p.rightPerc != 0 || p.bottomPerc != 0 || p.leftPerc != 0:
- return area.ShrinkPercent(ar, p.topPerc, p.rightPerc, p.bottomPerc, p.leftPerc)
- }
- return ar, nil
-}
-
-// padding stores the configured padding for the container.
-// For each padding direction, only one of the percentage or cells is set.
-type padding struct {
- topCells int
- topPerc int
- rightCells int
- rightPerc int
- bottomCells int
- bottomPerc int
- leftCells int
- leftPerc int
-}
-
-// apply applies the configured padding to the area.
-func (p *padding) apply(ar image.Rectangle) (image.Rectangle, error) {
- switch {
- case p.topCells != 0 || p.rightCells != 0 || p.bottomCells != 0 || p.leftCells != 0:
- return area.Shrink(ar, p.topCells, p.rightCells, p.bottomCells, p.leftCells)
- case p.topPerc != 0 || p.rightPerc != 0 || p.bottomPerc != 0 || p.leftPerc != 0:
- return area.ShrinkPercent(ar, p.topPerc, p.rightPerc, p.bottomPerc, p.leftPerc)
- }
- return ar, nil
-}
-
-// inherited contains options that are inherited by child containers.
-type inherited struct {
- // borderColor is the color used for the border.
- borderColor cell.Color
- // focusedColor is the color used for the border when focused.
- focusedColor cell.Color
-}
-
-// newOptions returns a new options instance with the default values.
-// Parent are the inherited options from the parent container or nil if these
-// options are for a container with no parent (the root).
-func newOptions(parent *options) *options {
- opts := &options{
- inherited: inherited{
- focusedColor: cell.ColorYellow,
- },
- hAlign: align.HorizontalCenter,
- vAlign: align.VerticalMiddle,
- splitPercent: DefaultSplitPercent,
- splitFixed: DefaultSplitFixed,
- }
- if parent != nil {
- opts.inherited = parent.inherited
- }
- return opts
-}
-
-// option implements Option.
-type option func(*Container) error
-
-// set implements Option.set.
-func (o option) set(c *Container) error {
- return o(c)
-}
-
-// SplitOption is used when splitting containers.
-type SplitOption interface {
- // setSplit sets the provided split option.
- setSplit(*options) error
-}
-
-// splitOption implements SplitOption.
-type splitOption func(*options) error
-
-// setSplit implements SplitOption.setSplit.
-func (so splitOption) setSplit(opts *options) error {
- return so(opts)
-}
-
-// DefaultSplitPercent is the default value for the SplitPercent option.
-const DefaultSplitPercent = 50
-
-// DefaultSplitFixed is the default value for the SplitFixed option.
-const DefaultSplitFixed = -1
-
-// SplitPercent sets the relative size of the split as percentage of the available space.
-// When using SplitVertical, the provided size is applied to the new left
-// container, the new right container gets the reminder of the size.
-// When using SplitHorizontal, the provided size is applied to the new top
-// container, the new bottom container gets the reminder of the size.
-// The provided value must be a positive number in the range 0 < p < 100.
-// If not provided, defaults to DefaultSplitPercent.
-func SplitPercent(p int) SplitOption {
- return splitOption(func(opts *options) error {
- if min, max := 0, 100; p <= min || p >= max {
- return fmt.Errorf("invalid split percentage %d, must be in range %d < p < %d", p, min, max)
- }
- opts.splitPercent = p
- return nil
- })
-}
-
-// SplitFixed sets the size of the first container to be a fixed value
-// and makes the second container take up the remaining space.
-// When using SplitVertical, the provided size is applied to the new left
-// container, the new right container gets the reminder of the size.
-// When using SplitHorizontal, the provided size is applied to the new top
-// container, the new bottom container gets the reminder of the size.
-// The provided value must be a positive number in the range 0 <= cells.
-// If SplitFixed() is not specified, it defaults to SplitPercent() and its given value.
-// Only one of SplitFixed() and SplitPercent() can be specified per container.
-func SplitFixed(cells int) SplitOption {
- return splitOption(func(opts *options) error {
- if cells < 0 {
- return fmt.Errorf("invalid fixed value %d, must be in range %d <= cells", cells, 0)
- }
- opts.splitFixed = cells
- return nil
- })
-}
-
-// SplitVertical splits the container along the vertical axis into two sub
-// containers. The use of this option removes any widget placed at this
-// container, containers with sub containers cannot contain widgets.
-func SplitVertical(l LeftOption, r RightOption, opts ...SplitOption) Option {
- return option(func(c *Container) error {
- c.opts.split = splitTypeVertical
- c.opts.widget = nil
- for _, opt := range opts {
- if err := opt.setSplit(c.opts); err != nil {
- return err
- }
- }
-
- if err := c.createFirst(l.lOpts()); err != nil {
- return err
- }
- return c.createSecond(r.rOpts())
- })
-}
-
-// SplitHorizontal splits the container along the horizontal axis into two sub
-// containers. The use of this option removes any widget placed at this
-// container, containers with sub containers cannot contain widgets.
-func SplitHorizontal(t TopOption, b BottomOption, opts ...SplitOption) Option {
- return option(func(c *Container) error {
- c.opts.split = splitTypeHorizontal
- c.opts.widget = nil
- for _, opt := range opts {
- if err := opt.setSplit(c.opts); err != nil {
- return err
- }
- }
-
- if err := c.createFirst(t.tOpts()); err != nil {
- return err
- }
-
- return c.createSecond(b.bOpts())
- })
-}
-
-// ID sets an identifier for this container.
-// This ID can be later used to perform dynamic layout changes by passing new
-// options to this container. When provided, it must be a non-empty string that
-// is unique among all the containers.
-func ID(id string) Option {
- return option(func(c *Container) error {
- if id == "" {
- return errors.New("the ID cannot be an empty string")
- }
- c.opts.id = id
- return nil
- })
-}
-
-// Clear clears this container.
-// If the container contains a widget, the widget is removed.
-// If the container had any sub containers or splits, they are removed.
-func Clear() Option {
- return option(func(c *Container) error {
- c.opts.widget = nil
- c.first = nil
- c.second = nil
- return nil
- })
-}
-
-// PlaceWidget places the provided widget into the container.
-// The use of this option removes any sub containers. Containers with sub
-// containers cannot have widgets.
-func PlaceWidget(w widgetapi.Widget) Option {
- return option(func(c *Container) error {
- c.opts.widget = w
- c.first = nil
- c.second = nil
- return nil
- })
-}
-
-// MarginTop sets reserved space outside of the container at its top.
-// The provided number is the absolute margin in cells and must be zero or a
-// positive integer. Only one of MarginTop or MarginTopPercent can be specified.
-func MarginTop(cells int) Option {
- return option(func(c *Container) error {
- if min := 0; cells < min {
- return fmt.Errorf("invalid MarginTop(%d), must be in range %d <= value", cells, min)
- }
- if c.opts.margin.topPerc > 0 {
- return fmt.Errorf("cannot specify both MarginTop(%d) and MarginTopPercent(%d)", cells, c.opts.margin.topPerc)
- }
- c.opts.margin.topCells = cells
- return nil
- })
-}
-
-// MarginRight sets reserved space outside of the container at its right.
-// The provided number is the absolute margin in cells and must be zero or a
-// positive integer. Only one of MarginRight or MarginRightPercent can be specified.
-func MarginRight(cells int) Option {
- return option(func(c *Container) error {
- if min := 0; cells < min {
- return fmt.Errorf("invalid MarginRight(%d), must be in range %d <= value", cells, min)
- }
- if c.opts.margin.rightPerc > 0 {
- return fmt.Errorf("cannot specify both MarginRight(%d) and MarginRightPercent(%d)", cells, c.opts.margin.rightPerc)
- }
- c.opts.margin.rightCells = cells
- return nil
- })
-}
-
-// MarginBottom sets reserved space outside of the container at its bottom.
-// The provided number is the absolute margin in cells and must be zero or a
-// positive integer. Only one of MarginBottom or MarginBottomPercent can be specified.
-func MarginBottom(cells int) Option {
- return option(func(c *Container) error {
- if min := 0; cells < min {
- return fmt.Errorf("invalid MarginBottom(%d), must be in range %d <= value", cells, min)
- }
- if c.opts.margin.bottomPerc > 0 {
- return fmt.Errorf("cannot specify both MarginBottom(%d) and MarginBottomPercent(%d)", cells, c.opts.margin.bottomPerc)
- }
- c.opts.margin.bottomCells = cells
- return nil
- })
-}
-
-// MarginLeft sets reserved space outside of the container at its left.
-// The provided number is the absolute margin in cells and must be zero or a
-// positive integer. Only one of MarginLeft or MarginLeftPercent can be specified.
-func MarginLeft(cells int) Option {
- return option(func(c *Container) error {
- if min := 0; cells < min {
- return fmt.Errorf("invalid MarginLeft(%d), must be in range %d <= value", cells, min)
- }
- if c.opts.margin.leftPerc > 0 {
- return fmt.Errorf("cannot specify both MarginLeft(%d) and MarginLeftPercent(%d)", cells, c.opts.margin.leftPerc)
- }
- c.opts.margin.leftCells = cells
- return nil
- })
-}
-
-// MarginTopPercent sets reserved space outside of the container at its top.
-// The provided number is a relative margin defined as percentage of the container's height.
-// Only one of MarginTop or MarginTopPercent can be specified.
-// The value must be in range 0 <= value <= 100.
-func MarginTopPercent(perc int) Option {
- return option(func(c *Container) error {
- if min, max := 0, 100; perc < min || perc > max {
- return fmt.Errorf("invalid MarginTopPercent(%d), must be in range %d <= value <= %d", perc, min, max)
- }
- if c.opts.margin.topCells > 0 {
- return fmt.Errorf("cannot specify both MarginTopPercent(%d) and MarginTop(%d)", perc, c.opts.margin.topCells)
- }
- c.opts.margin.topPerc = perc
- return nil
- })
-}
-
-// MarginRightPercent sets reserved space outside of the container at its right.
-// The provided number is a relative margin defined as percentage of the container's height.
-// Only one of MarginRight or MarginRightPercent can be specified.
-// The value must be in range 0 <= value <= 100.
-func MarginRightPercent(perc int) Option {
- return option(func(c *Container) error {
- if min, max := 0, 100; perc < min || perc > max {
- return fmt.Errorf("invalid MarginRightPercent(%d), must be in range %d <= value <= %d", perc, min, max)
- }
- if c.opts.margin.rightCells > 0 {
- return fmt.Errorf("cannot specify both MarginRightPercent(%d) and MarginRight(%d)", perc, c.opts.margin.rightCells)
- }
- c.opts.margin.rightPerc = perc
- return nil
- })
-}
-
-// MarginBottomPercent sets reserved space outside of the container at its bottom.
-// The provided number is a relative margin defined as percentage of the container's height.
-// Only one of MarginBottom or MarginBottomPercent can be specified.
-// The value must be in range 0 <= value <= 100.
-func MarginBottomPercent(perc int) Option {
- return option(func(c *Container) error {
- if min, max := 0, 100; perc < min || perc > max {
- return fmt.Errorf("invalid MarginBottomPercent(%d), must be in range %d <= value <= %d", perc, min, max)
- }
- if c.opts.margin.bottomCells > 0 {
- return fmt.Errorf("cannot specify both MarginBottomPercent(%d) and MarginBottom(%d)", perc, c.opts.margin.bottomCells)
- }
- c.opts.margin.bottomPerc = perc
- return nil
- })
-}
-
-// MarginLeftPercent sets reserved space outside of the container at its left.
-// The provided number is a relative margin defined as percentage of the container's height.
-// Only one of MarginLeft or MarginLeftPercent can be specified.
-// The value must be in range 0 <= value <= 100.
-func MarginLeftPercent(perc int) Option {
- return option(func(c *Container) error {
- if min, max := 0, 100; perc < min || perc > max {
- return fmt.Errorf("invalid MarginLeftPercent(%d), must be in range %d <= value <= %d", perc, min, max)
- }
- if c.opts.margin.leftCells > 0 {
- return fmt.Errorf("cannot specify both MarginLeftPercent(%d) and MarginLeft(%d)", perc, c.opts.margin.leftCells)
- }
- c.opts.margin.leftPerc = perc
- return nil
- })
-}
-
-// PaddingTop sets reserved space between container and the top side of its widget.
-// The widget's area size is decreased to accommodate the padding.
-// The provided number is the absolute padding in cells and must be zero or a
-// positive integer. Only one of PaddingTop or PaddingTopPercent can be specified.
-func PaddingTop(cells int) Option {
- return option(func(c *Container) error {
- if min := 0; cells < min {
- return fmt.Errorf("invalid PaddingTop(%d), must be in range %d <= value", cells, min)
- }
- if c.opts.padding.topPerc > 0 {
- return fmt.Errorf("cannot specify both PaddingTop(%d) and PaddingTopPercent(%d)", cells, c.opts.padding.topPerc)
- }
- c.opts.padding.topCells = cells
- return nil
- })
-}
-
-// PaddingRight sets reserved space between container and the right side of its widget.
-// The widget's area size is decreased to accommodate the padding.
-// The provided number is the absolute padding in cells and must be zero or a
-// positive integer. Only one of PaddingRight or PaddingRightPercent can be specified.
-func PaddingRight(cells int) Option {
- return option(func(c *Container) error {
- if min := 0; cells < min {
- return fmt.Errorf("invalid PaddingRight(%d), must be in range %d <= value", cells, min)
- }
- if c.opts.padding.rightPerc > 0 {
- return fmt.Errorf("cannot specify both PaddingRight(%d) and PaddingRightPercent(%d)", cells, c.opts.padding.rightPerc)
- }
- c.opts.padding.rightCells = cells
- return nil
- })
-}
-
-// PaddingBottom sets reserved space between container and the bottom side of its widget.
-// The widget's area size is decreased to accommodate the padding.
-// The provided number is the absolute padding in cells and must be zero or a
-// positive integer. Only one of PaddingBottom or PaddingBottomPercent can be specified.
-func PaddingBottom(cells int) Option {
- return option(func(c *Container) error {
- if min := 0; cells < min {
- return fmt.Errorf("invalid PaddingBottom(%d), must be in range %d <= value", cells, min)
- }
- if c.opts.padding.bottomPerc > 0 {
- return fmt.Errorf("cannot specify both PaddingBottom(%d) and PaddingBottomPercent(%d)", cells, c.opts.padding.bottomPerc)
- }
- c.opts.padding.bottomCells = cells
- return nil
- })
-}
-
-// PaddingLeft sets reserved space between container and the left side of its widget.
-// The widget's area size is decreased to accommodate the padding.
-// The provided number is the absolute padding in cells and must be zero or a
-// positive integer. Only one of PaddingLeft or PaddingLeftPercent can be specified.
-func PaddingLeft(cells int) Option {
- return option(func(c *Container) error {
- if min := 0; cells < min {
- return fmt.Errorf("invalid PaddingLeft(%d), must be in range %d <= value", cells, min)
- }
- if c.opts.padding.leftPerc > 0 {
- return fmt.Errorf("cannot specify both PaddingLeft(%d) and PaddingLeftPercent(%d)", cells, c.opts.padding.leftPerc)
- }
- c.opts.padding.leftCells = cells
- return nil
- })
-}
-
-// PaddingTopPercent sets reserved space between container and the top side of
-// its widget. The widget's area size is decreased to accommodate the padding.
-// The provided number is a relative padding defined as percentage of the
-// container's height. The value must be in range 0 <= value <= 100.
-// Only one of PaddingTop or PaddingTopPercent can be specified.
-func PaddingTopPercent(perc int) Option {
- return option(func(c *Container) error {
- if min, max := 0, 100; perc < min || perc > max {
- return fmt.Errorf("invalid PaddingTopPercent(%d), must be in range %d <= value <= %d", perc, min, max)
- }
- if c.opts.padding.topCells > 0 {
- return fmt.Errorf("cannot specify both PaddingTopPercent(%d) and PaddingTop(%d)", perc, c.opts.padding.topCells)
- }
- c.opts.padding.topPerc = perc
- return nil
- })
-}
-
-// PaddingRightPercent sets reserved space between container and the right side of
-// its widget. The widget's area size is decreased to accommodate the padding.
-// The provided number is a relative padding defined as percentage of the
-// container's width. The value must be in range 0 <= value <= 100.
-// Only one of PaddingRight or PaddingRightPercent can be specified.
-func PaddingRightPercent(perc int) Option {
- return option(func(c *Container) error {
- if min, max := 0, 100; perc < min || perc > max {
- return fmt.Errorf("invalid PaddingRightPercent(%d), must be in range %d <= value <= %d", perc, min, max)
- }
- if c.opts.padding.rightCells > 0 {
- return fmt.Errorf("cannot specify both PaddingRightPercent(%d) and PaddingRight(%d)", perc, c.opts.padding.rightCells)
- }
- c.opts.padding.rightPerc = perc
- return nil
- })
-}
-
-// PaddingBottomPercent sets reserved space between container and the bottom side of
-// its widget. The widget's area size is decreased to accommodate the padding.
-// The provided number is a relative padding defined as percentage of the
-// container's height. The value must be in range 0 <= value <= 100.
-// Only one of PaddingBottom or PaddingBottomPercent can be specified.
-func PaddingBottomPercent(perc int) Option {
- return option(func(c *Container) error {
- if min, max := 0, 100; perc < min || perc > max {
- return fmt.Errorf("invalid PaddingBottomPercent(%d), must be in range %d <= value <= %d", perc, min, max)
- }
- if c.opts.padding.bottomCells > 0 {
- return fmt.Errorf("cannot specify both PaddingBottomPercent(%d) and PaddingBottom(%d)", perc, c.opts.padding.bottomCells)
- }
- c.opts.padding.bottomPerc = perc
- return nil
- })
-}
-
-// PaddingLeftPercent sets reserved space between container and the left side of
-// its widget. The widget's area size is decreased to accommodate the padding.
-// The provided number is a relative padding defined as percentage of the
-// container's width. The value must be in range 0 <= value <= 100.
-// Only one of PaddingLeft or PaddingLeftPercent can be specified.
-func PaddingLeftPercent(perc int) Option {
- return option(func(c *Container) error {
- if min, max := 0, 100; perc < min || perc > max {
- return fmt.Errorf("invalid PaddingLeftPercent(%d), must be in range %d <= value <= %d", perc, min, max)
- }
- if c.opts.padding.leftCells > 0 {
- return fmt.Errorf("cannot specify both PaddingLeftPercent(%d) and PaddingLeft(%d)", perc, c.opts.padding.leftCells)
- }
- c.opts.padding.leftPerc = perc
- return nil
- })
-}
-
-// AlignHorizontal sets the horizontal alignment for the widget placed in the
-// container. Has no effect if the container contains no widget.
-// Defaults to alignment in the center.
-func AlignHorizontal(h align.Horizontal) Option {
- return option(func(c *Container) error {
- c.opts.hAlign = h
- return nil
- })
-}
-
-// AlignVertical sets the vertical alignment for the widget placed in the container.
-// Has no effect if the container contains no widget.
-// Defaults to alignment in the middle.
-func AlignVertical(v align.Vertical) Option {
- return option(func(c *Container) error {
- c.opts.vAlign = v
- return nil
- })
-}
-
-// Border configures the container to have a border of the specified style.
-func Border(ls linestyle.LineStyle) Option {
- return option(func(c *Container) error {
- c.opts.border = ls
- return nil
- })
-}
-
-// BorderTitle sets a text title within the border.
-func BorderTitle(title string) Option {
- return option(func(c *Container) error {
- c.opts.borderTitle = title
- return nil
- })
-}
-
-// BorderTitleAlignLeft aligns the border title on the left.
-func BorderTitleAlignLeft() Option {
- return option(func(c *Container) error {
- c.opts.borderTitleHAlign = align.HorizontalLeft
- return nil
- })
-}
-
-// BorderTitleAlignCenter aligns the border title in the center.
-func BorderTitleAlignCenter() Option {
- return option(func(c *Container) error {
- c.opts.borderTitleHAlign = align.HorizontalCenter
- return nil
- })
-}
-
-// BorderTitleAlignRight aligns the border title on the right.
-func BorderTitleAlignRight() Option {
- return option(func(c *Container) error {
- c.opts.borderTitleHAlign = align.HorizontalRight
- return nil
- })
-}
-
-// BorderColor sets the color of the border around the container.
-// This option is inherited to sub containers created by container splits.
-func BorderColor(color cell.Color) Option {
- return option(func(c *Container) error {
- c.opts.inherited.borderColor = color
- return nil
- })
-}
-
-// FocusedColor sets the color of the border around the container when it has
-// keyboard focus.
-// This option is inherited to sub containers created by container splits.
-func FocusedColor(color cell.Color) Option {
- return option(func(c *Container) error {
- c.opts.inherited.focusedColor = color
- return nil
- })
-}
-
-// splitType identifies how a container is split.
-type splitType int
-
-// String implements fmt.Stringer()
-func (st splitType) String() string {
- if n, ok := splitTypeNames[st]; ok {
- return n
- }
- return "splitTypeUnknown"
-}
-
-// splitTypeNames maps splitType values to human readable names.
-var splitTypeNames = map[splitType]string{
- splitTypeVertical: "splitTypeVertical",
- splitTypeHorizontal: "splitTypeHorizontal",
-}
-
-const (
- splitTypeVertical splitType = iota
- splitTypeHorizontal
-)
-
-// LeftOption is used to provide options to the left sub container after a
-// vertical split of the parent.
-type LeftOption interface {
- // lOpts returns the options.
- lOpts() []Option
-}
-
-// leftOption implements LeftOption.
-type leftOption func() []Option
-
-// lOpts implements LeftOption.lOpts.
-func (lo leftOption) lOpts() []Option {
- if lo == nil {
- return nil
- }
- return lo()
-}
-
-// Left applies options to the left sub container after a vertical split of the parent.
-func Left(opts ...Option) LeftOption {
- return leftOption(func() []Option {
- return opts
- })
-}
-
-// RightOption is used to provide options to the right sub container after a
-// vertical split of the parent.
-type RightOption interface {
- // rOpts returns the options.
- rOpts() []Option
-}
-
-// rightOption implements RightOption.
-type rightOption func() []Option
-
-// rOpts implements RightOption.rOpts.
-func (lo rightOption) rOpts() []Option {
- if lo == nil {
- return nil
- }
- return lo()
-}
-
-// Right applies options to the right sub container after a vertical split of the parent.
-func Right(opts ...Option) RightOption {
- return rightOption(func() []Option {
- return opts
- })
-}
-
-// TopOption is used to provide options to the top sub container after a
-// horizontal split of the parent.
-type TopOption interface {
- // tOpts returns the options.
- tOpts() []Option
-}
-
-// topOption implements TopOption.
-type topOption func() []Option
-
-// tOpts implements TopOption.tOpts.
-func (lo topOption) tOpts() []Option {
- if lo == nil {
- return nil
- }
- return lo()
-}
-
-// Top applies options to the top sub container after a horizontal split of the parent.
-func Top(opts ...Option) TopOption {
- return topOption(func() []Option {
- return opts
- })
-}
-
-// BottomOption is used to provide options to the bottom sub container after a
-// horizontal split of the parent.
-type BottomOption interface {
- // bOpts returns the options.
- bOpts() []Option
-}
-
-// bottomOption implements BottomOption.
-type bottomOption func() []Option
-
-// bOpts implements BottomOption.bOpts.
-func (lo bottomOption) bOpts() []Option {
- if lo == nil {
- return nil
- }
- return lo()
-}
-
-// Bottom applies options to the bottom sub container after a horizontal split of the parent.
-func Bottom(opts ...Option) BottomOption {
- return bottomOption(func() []Option {
- return opts
- })
-}