Class: Vedeu::Geometries::DSL

Inherits:
Object
  • Object
show all
Includes:
Common, DSL, DSL::Geometry, DSL::Use
Defined in:
lib/vedeu/geometries/dsl/dsl.rb

Overview

Geometry allows the configuration of the position and size of an interface. Within Vedeu, as the same for ANSI terminals, has the origin at top-left, y = 1, x = 1. The ‘y’ coordinate is deliberately first.

The Geometry DSL can be used within the Interface DSL or standalone. Here are example of declarations for a ‘geometry` block:

A standalone geometry definition:

Vedeu.geometry :some_interface do
  height 5 # Sets the height of the view to 5
  width 20 # Sets the width of the view to 20
  x 3      # Start drawing 3 spaces from left
  y 10     # Start drawing 10 spaces from top
  xn 30    # Stop drawing 30 spaces from the left
  yn 20    # Stop drawing 20 spaces from top
end

An interface including a geometry definition:

Vedeu.interface :some_interface do
  geometry do
    height 5
    width 20
    x 3
    y 10
    xn 30
    yn 20
  end
  # ... some code here
end

If a declaration is omitted for ‘height` or `width` the full remaining space available in the terminal will be used. `x` and `y` both default to 1.

You can also make a geometry declaration dependent on another view:

Vedeu.interface :other_panel do
  # ... some code here
end

Vedeu.interface :main do
  geometry do
    height 10
    y { use(:other_panel).south }
  end
  # ... some code here
end

This view will begin just below “other_panel”.

This crude ASCII diagram represents a Geometry within Vedeu, each of the labels is a value you can access or define.

     x    north    xn           # north:  y - 1
   y +--------------+           # top:    y
     |     top      |           # west:   x - 1
     |              |           # left:   x
west | left   right | east      # right:  xn
     |              |           # east:   xn + 1
     |    bottom    |           # bottom: yn
  yn +--------------+           # south:  yn + 1
          south

Instance Attribute Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Vedeu::DSL

Instance Attribute Details

#clientObject (readonly, protected) Originally defined in module DSL

Returns The object instance where the DSL is being used.

Returns:

  • (Object)

    The object instance where the DSL is being used.

#modelvoid (readonly, protected) Originally defined in module DSL

This method returns an undefined value.

Returns The new model object which the DSL is constructing.

Instance Method Details

#absent?(variable) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating whether a variable is nil or empty.

Parameters:

  • variable (String|Symbol|Array|Fixnum)

    The variable to check.

Returns:

#align(vertical: :none, horizontal: :none, width: nil, height: nil) ⇒ Vedeu::Geometries::Geometry

Align the interface/view horizontally or vertically within the terminal.

Parameters:

  • vertical (Symbol) (defaults to: :none)

    One of :bottom, :middle, :none, :top.

  • horizontal (Symbol) (defaults to: :none)

    One of :center, :centre, :left, :none, :right.

  • width (Fixnum) (defaults to: nil)

    The number of characters/columns wide; this is required when the given value for horizontal is any value other than :none.

  • height (Fixnum) (defaults to: nil)

    The number of lines/rows tall; this is required when the given value for vertical is any value other than :none.

Returns:

Raises:

  • (Vedeu::Error::InvalidSyntax)

    When the value given for an argument or parameter cannot be used because it is not valid for the use case, unsupported or the method expects a different type.



98
99
100
101
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 98

def align(vertical: :none, horizontal: :none, width: nil, height: nil)
  horizontal_alignment(horizontal, width)
  vertical_alignment(vertical, height)
end

#align_bottom(height = nil) ⇒ Vedeu::Geometries::Geometry

Note:

Vedeu.width in the example above will set the width to the default width of the terminal, this can be substituted for your own positive integer.

Vertically align the interface/view to the bottom of the terminal.

Vedeu.geometry :some_interface do
  # `height` is a positive integer, e.g. 30
  align_bottom 30

  # this is the same as:
  # vertical_alignment(:bottom, 30)

  # or you can use: (see notes)
  # align(vertical: :bottom, height: 30)

  # ... some code
end

Parameters:

  • height (Fixnum) (defaults to: nil)

    The number of lines/rows.

Returns:



148
149
150
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 148

def align_bottom(height = nil)
  vertical_alignment(:bottom, height)
end

#align_centre(width = nil) ⇒ Vedeu::Geometries::Geometry Also known as: align_center

Note:

Vedeu.height in the example above will set the height to the default height of the terminal, this can be substituted for your own positive integer.

Horizontally align the interface/view centrally.

Vedeu.geometry :some_interface do
  # `width` is a positive integer, e.g. 30
  align_centre 30

  # this is the same as:
  # horizontal_alignment(:centre, 30)

  # or you can use: (see notes)
  # align(horizontal: :centre, width: 30)

  # ... some code
end

# Also allows `align_center` if preferred.

Parameters:

  • width (Fixnum) (defaults to: nil)

    The number of characters/columns.

Returns:



175
176
177
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 175

def align_centre(width = nil)
  horizontal_alignment(:centre, width)
end

#align_left(width = nil) ⇒ Vedeu::Geometries::Geometry

Note:

Vedeu.height in the example above will set the height to the default height of the terminal, this can be substituted for your own positive integer.

Horizontally align the interface/view to the left.

Vedeu.geometry :some_interface do
  # `width` is a positive integer, e.g. 30
  align_left 30

  # this is the same as:
  # horizontal_alignment(:left, 30)

  # or you can use: (see notes)
  # align(horizontal: :left, width: 30)

  # ... some code
end

Parameters:

  • width (Fixnum) (defaults to: nil)

    The number of characters/columns.

Returns:



201
202
203
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 201

def align_left(width = nil)
  horizontal_alignment(:left, width)
end

#align_middle(height = nil) ⇒ Vedeu::Geometries::Geometry

Note:

Vedeu.width in the example above will set the width to the default width of the terminal, this can be substituted for your own positive integer.

Vertically align the interface/view to the middle of the terminal.

Vedeu.geometry :some_interface do
  # `height` is a positive integer, e.g. 30
  align_middle 30

  # this is the same as:
  # vertical_alignment(:middle, 30)

  # or you can use: (see notes)
  # align(vertical: :middle, height: 30)

  # ... some code
end

Parameters:

  • height (Fixnum) (defaults to: nil)

    The number of lines/rows.

Returns:



227
228
229
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 227

def align_middle(height = nil)
  vertical_alignment(:middle, height)
end

#align_right(width = nil) ⇒ Vedeu::Geometries::Geometry

Note:

Vedeu.height in the example above will set the height to the default height of the terminal, this can be substituted for your own positive integer.

Align the interface/view to the right.

Vedeu.geometry :some_interface do
  # `width` is a positive integer, e.g. 30
  align_right 30

  # this is the same as:
  # horizontal_alignment(:right, 30)

  # or you can use: (see notes)
  # align(horizontal: :right, width: 30)

  # ... some code
end

Parameters:

  • width (Fixnum) (defaults to: nil)

    The number of characters/columns.

Returns:



252
253
254
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 252

def align_right(width = nil)
  horizontal_alignment(:right, width)
end

#align_top(height = nil) ⇒ Vedeu::Geometries::Geometry

Note:

Vedeu.width in the example above will set the width to the default width of the terminal, this can be substituted for your own positive integer.

Vertically align the interface/view to the top of the terminal.

Vedeu.geometry :some_interface do
  # `height` is a positive integer, e.g. 30
  align_top 30

  # this is the same as:
  # vertical_alignment(:top, 30)

  # or you can use: (see notes)
  # align(vertical: :top, height: 30)

  # ... some code
end

Parameters:

  • height (Fixnum) (defaults to: nil)

    The number of lines/rows.

Returns:



278
279
280
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 278

def align_top(height = nil)
  vertical_alignment(:top, height)
end

#attributesHash<Symbol => void> (private) Originally defined in module DSL

Note:

Specific DSL classes may be overriding this method.

Returns the default attributes for the new model.

Returns:

  • (Hash<Symbol => void>)

#become(klass, attributes) ⇒ Class Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Converts one class into another.

Parameters:

  • klass (Class)

    The class to become an instance of.

  • attributes (Hash)

    The attributes of klass.

Returns:

  • (Class)

    Returns a new instance of klass.

#boolean(value) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating the value was a boolean.

Parameters:

  • value (void)

Returns:

#boolean?(value) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating whether the value is a Boolean.

Parameters:

Returns:

#columns(value) ⇒ Fixnum|Vedeu::Error::OutOfRange

Returns the width in characters for the number of columns specified.

Vedeu.geometry :main_interface do
  # ... some code
  width columns(9) # Vedeu.width # => 92 (for example)
                   # 92 / 12 = 7
                   # 7 * 9 = 63
                   # Therefore, width is 63 characters.
end

Parameters:

  • value (Fixnum)

Returns:

Raises:



297
298
299
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 297

def columns(value)
  Vedeu::Geometries::Grid.columns(value)
end

#escape?(value) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating whether the value is an escape sequence object (e.g. Vedeu::Cells::Escape.)

Returns:

#falsy?(value) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating whether the value should be considered false.

Parameters:

  • value (void)

Returns:

#hash?(value) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating whether the value is a Hash.

Parameters:

  • value (Hash|void)

Returns:

#height(value) ⇒ Fixnum Also known as: height=

Specify the number of characters/rows/lines tall the interface will be. This value will be ignored when ‘y` and `yn` are set.

Vedeu.geometry :some_interface do
  height 8
  # ... some code
end

Parameters:

  • value (Fixnum)

Returns:

  • (Fixnum)


311
312
313
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 311

def height(value)
  model.height = proc { value }
end

#horizontal_alignment(value = :none, width = nil) ⇒ Vedeu::Geometries::Geometry

Parameters:

  • value (Symbol) (defaults to: :none)

    One of :center, :centre, :left, :none, :right.

  • width (Fixnum) (defaults to: nil)

    The number of characters/columns.

Returns:



107
108
109
110
111
112
113
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 107

def horizontal_alignment(value = :none, width = nil)
  alignment = Vedeu::Coercers::HorizontalAlignment.validate(value)

  model.width = width if width
  model.horizontal_alignment = alignment
  model
end

#initialize(model, client = nil) ⇒ void Originally defined in module DSL

Returns a new instance of the DSL class including Vedeu::DSL.

Parameters:

  • model (void)

    The model class which the DSL class is wrapping.

  • client (void) (defaults to: nil)

    The class where the DSL methods are being used.

#line_model?Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating the model is a Views::Line.

Returns:

#nameNilClass|String|Symbol Originally defined in module DSL

Returns the model name if available.

Returns:

  • (NilClass|String|Symbol)

#numeric?(value) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating whether the value is a Fixnum.

Parameters:

  • value (Fixnum|void)

Returns:

#present?(variable) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating whether a variable has a useful value.

Parameters:

  • variable (String|Symbol|Array|Fixnum)

    The variable to check.

Returns:

#rows(value) ⇒ Fixnum

Returns the height in characters for the number of rows specified.

Vedeu.geometry :main_interface do
  # ... some code
  height rows(3)  # Vedeu.height # => 38 (for example)
                  # 38 / 12 = 3
                  # 3 * 3 = 9
                  # Therefore, height is 9 characters.
end

Parameters:

  • value (Fixnum)

Returns:

  • (Fixnum)

Raises:



331
332
333
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 331

def rows(value)
  Vedeu::Geometries::Grid.rows(value)
end

#snake_case(klass) ⇒ String Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Converts a class name to a lowercase snake case string.

Examples:

snake_case(MyClassName) # => "my_class_name"
snake_case(NameSpaced::ClassName)
# => "name_spaced/class_name"

snake_case('MyClassName') # => "my_class_name"
snake_case(NameSpaced::ClassName)
# => "name_spaced/class_name"

Parameters:

  • klass (Module|Class|String)

Returns:

  • (String)

#stream_model?Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating the model is a Views::Stream.

Returns:

#string?(value) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating whether the value is a Fixnum.

Parameters:

  • value (String|void)

Returns:

#truthy?(value) ⇒ Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating whether the value should be considered true.

Parameters:

  • value (void)

Returns:

#use(name) ⇒ void Originally defined in module DSL::Use

Note:
  • Only models of the same repository can be used in this way.

  • If the stored model cannot be found, a ModelNotFound exception may be raised, or the request for an attribute may raise a NoMethodError exception.

This method returns an undefined value.

Use the attribute of stored model.

This DSL method provides access to a stored model by name. You can then request an attribute of that model for use within the current model. The models which current support this are Border, Geometry and Interface.

Examples:

# Here the character used for :my_border is used in
# :my_other_border.
Vedeu.border :my_other_border do
  top_right use(:my_border).top_right
end

Parameters:

  • name (String|Symbol)

    The name of the model with the value you wish to use.

Raises:

  • Vedeu::Error::ModelNotFound|Vedeu::Error::NoMethodError

    The model or attribute cannot be found.

#vertical_alignment(value = :none, height = nil) ⇒ Vedeu::Geometries::Geometry

Parameters:

  • value (Symbol) (defaults to: :none)

    One of :bottom, :middle, :none, :top.

  • height (Fixnum) (defaults to: nil)

    The number of lines/rows.

Returns:



118
119
120
121
122
123
124
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 118

def vertical_alignment(value = :none, height = nil)
  alignment = Vedeu::Coercers::VerticalAlignment.validate(value)

  model.height = height if height
  model.vertical_alignment = alignment
  model
end

#view_model?Boolean Originally defined in module Common

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a boolean indicating the model is a Views::View.

Returns:

#width(value) ⇒ Fixnum Also known as: width=

Specify the number of characters/columns wide the interface will be. This value will be ignored when ‘x` and `xn` are set.

Vedeu.geometry :some_interface do
  width 25
  # ... some code
end

Parameters:

  • value (Fixnum)

    The number of characters/columns.

Returns:

  • (Fixnum)


345
346
347
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 345

def width(value)
  model.width = proc { value }
end

#x(value = 1, &block) ⇒ Fixnum Also known as: x=

Specify the starting x position (column) of the interface.

Vedeu.geometry :some_interface do
  x 7 # start on column 7.

  # start on column 8, if :other_interface changes position
  # then :some_interface will too.
  x { use(:other_interface).east }
  # ... some code
end

Parameters:

  • value (Fixnum) (defaults to: 1)
  • block (Proc)

Returns:

  • (Fixnum)


364
365
366
367
368
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 364

def x(value = 1, &block)
  return model.x = block if block_given?

  model.x = value
end

#xn(value = 1, &block) ⇒ Fixnum Also known as: xn=

Specify the ending x position (column) of the interface. This value will override ‘width`.

Vedeu.geometry :some_interface do
  xn 37 # end at column 37.

  # when :other_interface changes position,
  # :some_interface will too.
  xn  { use(:other_interface).right }
  # ... some code
end

Parameters:

  • value (Fixnum) (defaults to: 1)
  • block (Proc)

Returns:

  • (Fixnum)


386
387
388
389
390
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 386

def xn(value = 1, &block)
  return model.xn = block if block_given?

  model.xn = value
end

#y(value = 1, &block) ⇒ Fixnum Also known as: y=

Specify the starting y position (row/line) of the interface.

Vedeu.geometry :some_interface do
  y  4 # start at row 4

  # start on row/line 3, when :other_interface changes
  # position, :some_interface will too.
  y  { use(:other_interface).north }
  # ... some code
end

Parameters:

  • value (Fixnum) (defaults to: 1)
  • block (Proc)

Returns:

  • (Fixnum)


407
408
409
410
411
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 407

def y(value = 1, &block)
  return model.y = block if block_given?

  model.y = value
end

#yn(value = 1, &block) ⇒ Fixnum Also known as: yn=

Specify the ending y position (row/line) of the interface. This value will override ‘height`.

Vedeu.geometry :some_interface do
  yn 24 # end at row 24.

  # if :other_interface changes position, :some_interface
  # will too.
  yn { use(:other_interface).bottom }
  # ... some code
end

Parameters:

  • value (Fixnum) (defaults to: 1)
  • block (Proc)

Returns:

  • (Fixnum)


429
430
431
432
433
# File 'lib/vedeu/geometries/dsl/dsl.rb', line 429

def yn(value = 1, &block)
  return model.yn = block if block_given?

  model.yn = value
end