123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- # author: Ethosa
- ## Contains children in grid.
- import
- ../thirdparty/opengl,
- ../core/vector2,
- ../core/rect2,
- ../core/anchor,
- ../core/input,
- ../core/enums,
- ../nodes/node,
- ../nodes/canvas,
- control,
- box
- type
- GridBoxObj* = object of BoxObj
- separator*: float
- row*: int
- GridBoxRef* = ref GridBoxObj
- proc GridBox*(name: string = "GridBox"): GridBoxRef =
- ## Creates a new GridBox.
- ##
- ## Arguments:
- ## - `name` is a node name.
- runnableExamples:
- var grid = GridBox("GridBox")
- nodepattern(GridBoxRef)
- controlpattern()
- result.rect_size.x = 40
- result.rect_size.y = 40
- result.child_anchor = Anchor(0.5, 0.5, 0.5, 0.5)
- result.separator = 4f
- result.row = 2
- result.kind = GRID_BOX_NODE
- method getMaxChildSize*(self: GridBoxRef): Vector2Ref {.base.} =
- result = Vector2()
- for child in self.children:
- if child.CanvasRef.rect_size.x > result.x:
- result.x = child.CanvasRef.rect_size.x
- if child.CanvasRef.rect_size.y > result.y:
- result.y = child.CanvasRef.rect_size.y
- method getChildSize*(self: GridBoxRef): Vector2Ref =
- ## Returns size with all childs.
- var
- row = 0
- maxsize = self.getMaxChildSize()
- y = maxsize.y
- w = maxsize.x * self.row.float
- for child in self.children:
- if row < self.row:
- inc row
- else:
- if self.row > 1:
- row = 1
- y += self.separator + maxsize.y
- if y > maxsize.y:
- y -= self.separator
- if self.children.len() > 0:
- w += self.separator * (self.row.float - 1)
- Vector2(w, y)
- method addChild*(self: GridBoxRef, child: NodeRef) =
- ## Adds new child in current node.
- ##
- ## Arguments:
- ## - `child`: other node.
- self.children.add(child)
- child.parent = self
- self.rect_size = self.getChildSize()
- method draw*(self: GridBoxRef, w, h: GLfloat) =
- ## This method uses in the `window.nim`.
- var
- row = 0
- fakesize = self.getChildSize()
- maxsize = self.getMaxChildSize()
- x = self.rect_size.x*self.child_anchor.x1 - fakesize.x*self.child_anchor.x2
- y = self.rect_size.y*self.child_anchor.y1 - fakesize.y*self.child_anchor.y2
- for child in self.children:
- if row < self.row:
- child.CanvasRef.position.x = x + maxsize.x*self.child_anchor.x1 - child.CanvasRef.rect_size.x*self.child_anchor.x2
- child.CanvasRef.position.y = y + maxsize.y*self.child_anchor.y1 - child.CanvasRef.rect_size.y*self.child_anchor.y2
- x += maxsize.x + self.separator
- inc row
- else:
- if self.row > 1:
- row = 1
- x = self.rect_size.x*self.child_anchor.x1 - fakesize.x*self.child_anchor.x2
- y += maxsize.y + self.separator
- child.CanvasRef.position.x = x + maxsize.x*self.child_anchor.x1 - child.CanvasRef.rect_size.x*self.child_anchor.x2
- child.CanvasRef.position.y = y + maxsize.y*self.child_anchor.y1 - child.CanvasRef.rect_size.y*self.child_anchor.y2
- x += maxsize.x + self.separator
- procCall self.ControlRef.draw(w, h)
- method duplicate*(self: GridBoxRef): GridBoxRef {.base.} =
- ## Duplicates GridBox object and create a new GridBox.
- self.deepCopy()
- method resize*(self: GridBoxRef, w, h: GLfloat) =
- ## Resizes GridBox.
- ##
- ## Arguments:
- ## - `w` is a new width.
- ## - `h` is a new height.
- var size = self.getChildSize()
- if size.x < w:
- size.x = w
- if size.y < h:
- size.y = h
- self.rect_size.x = size.x
- self.rect_size.y = size.y
- self.can_use_anchor = false
- self.can_use_size_anchor = false
- method setRow*(self: GridBoxRef, row: int) {.base.} =
- ## Changes gridBox row count.
- self.row = row
- self.rect_size = self.getChildSize()
- method setSeparator*(self: GridBoxRef, separator: float) {.base.} =
- ## Changes separator between child nodes.
- self.separator = separator
- self.rect_size = self.getChildSize()
|