Преглед изворни кода

add TextureProgressBar node.

SakiKawasaki пре 5 година
родитељ
комит
a394e4cfc2

+ 1 - 0
README.md

@@ -63,6 +63,7 @@
    -  [VSlider](https://ethosa.github.io/nodesnim/vslider.html)
    -  [Popup](https://ethosa.github.io/nodesnim/popup.html)
    -  [TextureButton](https://ethosa.github.io/nodesnim/texture_button.html)
+   -  [TextureProgressBar](https://ethosa.github.io/nodesnim/texture_progress_bar.html)
 -  2D nodes
    -  [Node2D](https://ethosa.github.io/nodesnim/node2d.html)
    -  [Sprite](https://ethosa.github.io/nodesnim/sprite.html)

+ 2 - 1
src/nodesnim.nim

@@ -41,6 +41,7 @@ import
   nodesnim/nodescontrol/vslider,
   nodesnim/nodescontrol/popup,
   nodesnim/nodescontrol/texture_button,
+  nodesnim/nodescontrol/texture_progress_bar,
 
   nodesnim/nodes2d/node2d,
   nodesnim/nodes2d/sprite,
@@ -59,6 +60,6 @@ export
   # Control nodes
   control, color_rect, texture_rect, label, button, box, hbox, vbox, grid_box, edittext,
   rich_label, rich_edit_text, scroll, progress_bar, vprogress_bar, slider, vslider, popup,
-  texture_button,
+  texture_button, texture_progress_bar,
   # 2D nodes
   node2d, sprite, animated_sprite

+ 132 - 0
src/nodesnim/nodescontrol/texture_progress_bar.nim

@@ -0,0 +1,132 @@
+# author: Ethosa
+import
+  ../thirdparty/opengl,
+
+  ../core/vector2,
+  ../core/rect2,
+  ../core/anchor,
+  ../core/input,
+  ../core/image,
+
+  ../nodes/node,
+  control
+
+
+type
+  TextureProgressBarObj* = object of ControlPtr
+    max_value*, value*: uint
+    progress_texture*, back_texture*: GlTextureObj
+  TextureProgressBarPtr* = ptr TextureProgressBarObj
+
+
+proc TextureProgressBar*(name: string, variable: var TextureProgressBarObj): TextureProgressBarPtr =
+  ## Creates a new TextureProgressBar pointer.
+  ##
+  ## Arguments:
+  ## - `name` is a node name.
+  ## - `variable` is a TextureProgressBarObj variable.
+  runnableExamples:
+    var
+      pobj: TextureProgressBarObj
+      p = TextureProgressBar("TextureProgressBar", pobj)
+  nodepattern(TextureProgressBarObj)
+  controlpattern()
+  variable.rect_size.x = 120
+  variable.rect_size.y = 40
+  variable.progress_texture = GlTextureObj()
+  variable.back_texture = GlTextureObj()
+  variable.max_value = 100
+  variable.value = 0
+
+proc TextureProgressBar*(obj: var TextureProgressBarObj): TextureProgressBarPtr {.inline.} =
+  ## Creates a new TextureProgressBar pointer with default node name "TextureProgressBar".
+  ##
+  ## Arguments:
+  ## - `variable` is a TextureProgressBarObj variable.
+  runnableExamples:
+    var
+      pobj: TextureProgressBarObj
+      p = TextureProgressBar(pobj)
+  TextureProgressBar("TextureProgressBar", obj)
+
+
+method draw*(self: TextureProgressBarPtr, w, h: GLfloat) =
+  ## This uses in the `window.nim`.
+  self.calcGlobalPosition()
+  let
+    x = -w/2 + self.global_position.x
+    y = h/2 - self.global_position.y
+
+  # Background
+  glColor4f(self.background_color.r, self.background_color.g, self.background_color.b, self.background_color.a)
+  glRectf(x, y, x + self.rect_size.x, y - self.rect_size.y)
+
+  # Progress
+  let
+    texture_w = self.value.float / self.max_value.float
+    progress = self.rect_size.x * texture_w
+  glColor4f(1f, 1f, 1f, 1f)
+  if self.back_texture.texture > 0:
+    glEnable(GL_TEXTURE_2D)
+    glBindTexture(GL_TEXTURE_2D, self.back_texture.texture)
+
+    glBegin(GL_QUADS)
+    glTexCoord2f(0, 0)
+    glVertex2f(x, y)
+    glTexCoord2f(0, 1)
+    glVertex2f(x, y - self.rect_size.y)
+    glTexCoord2f(1, 1)
+    glVertex2f(x + self.rect_size.x, y - self.rect_size.y)
+    glTexCoord2f(1, 0)
+    glVertex2f(x + self.rect_size.x, y)
+    glEnd()
+
+    glDisable(GL_TEXTURE_2D)
+
+  if self.progress_texture.texture > 0:
+    glEnable(GL_TEXTURE_2D)
+    glBindTexture(GL_TEXTURE_2D, self.progress_texture.texture)
+
+    glBegin(GL_QUADS)
+    glTexCoord2f(0, 0)
+    glVertex2f(x, y)
+    glTexCoord2f(0, 1)
+    glVertex2f(x, y - self.rect_size.y)
+    glTexCoord2f(texture_w, 1)
+    glVertex2f(x + progress, y - self.rect_size.y)
+    glTexCoord2f(texture_w, 0)
+    glVertex2f(x + progress, y)
+    glEnd()
+
+    glDisable(GL_TEXTURE_2D)
+
+  # Press
+  if self.pressed:
+    self.press(last_event.x, last_event.y)
+
+method duplicate*(self: TextureProgressBarPtr, obj: var TextureProgressBarObj): TextureProgressBarPtr {.base.} =
+  ## Duplicates TextureProgressBar object and create a new TextureProgressBar pointer.
+  obj = self[]
+  obj.addr
+
+method setMaxValue*(self: TextureProgressBarPtr, value: uint) {.base.} =
+  ## Changes max value.
+  if value > self.value:
+    self.max_value = value
+  else:
+    self.max_value = self.value
+
+method setProgress*(self: TextureProgressBarPtr, value: uint) {.base.} =
+  ## Changes progress.
+  if value > self.max_value:
+    self.value = self.max_value
+  else:
+    self.value = value
+
+method setProgressTexture*(self: TextureProgressBarPtr, texture: GlTextureObj) {.base.} =
+  ## Changes progress texture.
+  self.progress_texture = texture
+
+method setBackgroundTexture*(self: TextureProgressBarPtr, texture: GlTextureObj) {.base.} =
+  ## Changes background progress texture.
+  self.back_texture = texture

+ 1 - 0
tests/README.md

@@ -28,3 +28,4 @@
 26. [Use Sprite node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test26.nim)
 27. [Use TextureButton node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test27.nim)
 28. [Use AnimatedSprite node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test28.nim)
+29. [Use TextureProgressBar node.](https://github.com/Ethosa/nodesnim/blob/master/tests/test29.nim)

BIN
tests/assets/texture_progress_0.png


BIN
tests/assets/texture_progress_1.png


+ 29 - 0
tests/test29.nim

@@ -0,0 +1,29 @@
+# --- Test 21. Use TextureProgressBar node. --- #
+import nodesnim
+
+
+Window("hello world")
+
+var
+  mainobj: SceneObj
+  main = Scene("Main", mainobj)
+
+  progressbarobj: TextureProgressBarObj
+  progressbar = TextureProgressBar(progressbarobj)
+
+  back = load("assets/texture_progress_0.png", GL_RGBA)
+  progress = load("assets/texture_progress_1.png", GL_RGBA)
+
+main.addChild(progressbar)
+
+progressbar.setProgress(50)  # default max progress value is 100.
+progressbar.setMaxValue(150)
+progressbar.resize(256, 85)
+
+progressbar.setProgressTexture(progress)
+progressbar.setBackgroundTexture(back)
+
+
+addScene(main)
+setMainScene("Main")
+windowLaunch()