浏览代码

add ProgressBar node.

SakiKawasaki 4 年之前
父节点
当前提交
d2c1dafd99
共有 6 个文件被更改,包括 104 次插入7 次删除
  1. 二进制
      examples/novel/assets/test.png
  2. 1 1
      examples/novel/main.nim
  3. 3 2
      src/nodesnim.nim
  4. 4 4
      src/nodesnim/core/image.nim
  5. 74 0
      src/nodesnim/nodescontrol/progress_bar.nim
  6. 22 0
      tests/test21.nim

二进制
examples/novel/assets/test.png


+ 1 - 1
examples/novel/main.nim

@@ -19,7 +19,7 @@ var
   night = load("assets/night.jpg")
 
   # Charapters:
-  akiko_default = load("assets/sharp.jpg")
+  akiko_default = load("assets/test.png", GL_RGBA)
 
   name_charapter_obj: LabelObj
   name_charapter = Label(name_charapter_obj)

+ 3 - 2
src/nodesnim.nim

@@ -31,7 +31,8 @@ import
   nodesnim/nodescontrol/edittext,
   nodesnim/nodescontrol/rich_label,
   nodesnim/nodescontrol/rich_edit_text,
-  nodesnim/nodescontrol/scroll
+  nodesnim/nodescontrol/scroll,
+  nodesnim/nodescontrol/progress_bar
 
 export
   opengl, glut,
@@ -39,4 +40,4 @@ export
   vector2, rect2, enums, anchor, color, exceptions, input, image, color_text,
   node, scene, canvas,
   control, color_rect, texture_rect, label, button, box, hbox, vbox, grid_box, edittext,
-  rich_label, rich_edit_text, scroll
+  rich_label, rich_edit_text, scroll, progress_bar

+ 4 - 4
src/nodesnim/core/image.nim

@@ -16,7 +16,7 @@ type
     size*: Vector2Ref
 
 
-proc load*(file: cstring, size: var Vector2Ref): Gluint =
+proc load*(file: cstring, size: var Vector2Ref, mode: Glenum = GL_RGB): Gluint =
   ## Loads image from file and returns texture ID.
   ##
   ## Arguments:
@@ -35,7 +35,7 @@ proc load*(file: cstring, size: var Vector2Ref): Gluint =
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
 
-  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB.GLint, surface.w,  surface.h, 0, GL_RGB, GL_UNSIGNED_BYTE, surface.pixels)
+  glTexImage2D(GL_TEXTURE_2D, 0, mode.GLint, surface.w,  surface.h, 0, mode, GL_UNSIGNED_BYTE, surface.pixels)
   glBindTexture(GL_TEXTURE_2D, 0)
 
   # free memory
@@ -45,7 +45,7 @@ proc load*(file: cstring, size: var Vector2Ref): Gluint =
   textureid
 
 
-proc load*(file: cstring): GlTexture =
+proc load*(file: cstring, mode: Glenum = GL_RGB): GlTexture =
   ## Loads GL texture.
   ##
   ## Arguments:
@@ -53,5 +53,5 @@ proc load*(file: cstring): GlTexture =
   var
     size: Vector2Ref = Vector2Ref()
     textureid: Gluint
-  textureid = load(file, size)
+  textureid = load(file, size, mode)
   GlTexture(texture: textureid, size: size)

+ 74 - 0
src/nodesnim/nodescontrol/progress_bar.nim

@@ -0,0 +1,74 @@
+# author: Ethosa
+import
+  ../thirdparty/opengl,
+
+  ../core/vector2,
+  ../core/rect2,
+  ../core/anchor,
+  ../core/input,
+  ../core/color,
+
+  ../nodes/node,
+  control
+
+
+type
+  ProgressBarObj* = object of ControlPtr
+    max_value*, value*: uint
+    progress_color*: ColorRef
+  ProgressBarPtr* = ptr ProgressBarObj
+
+
+proc ProgressBar*(name: string, variable: var ProgressBarObj): ProgressBarPtr =
+  nodepattern(ProgressBarObj)
+  controlpattern()
+  variable.background_color = Color(1f, 1f, 1f)
+  variable.rect_size.x = 120
+  variable.rect_size.y = 40
+  variable.progress_color = Color(0.5, 0.5, 0.5)
+  variable.max_value = 100
+  variable.value = 0
+
+proc ProgressBar*(obj: var ProgressBarObj): ProgressBarPtr {.inline.} =
+  ProgressBar("ProgressBar", obj)
+
+
+method draw*(self: ProgressBarPtr, w, h: GLfloat) =
+  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 progress = self.rect_size.x * (self.value.float / self.max_value.float)
+  glColor4f(self.progress_color.r, self.progress_color.g, self.progress_color.b, self.progress_color.a)
+  glRectf(x, y, x + progress, y - self.rect_size.y)
+
+  # Press
+  if self.pressed:
+    self.press(last_event.x, last_event.y)
+
+method dublicate*(self: ProgressBarPtr, obj: var ProgressBarObj): ProgressBarPtr {.base.} =
+  obj = self[]
+  obj.addr
+
+method setMaxValue*(self: ProgressBarPtr, value: uint) {.base.} =
+  if value > self.value:
+    self.max_value = value
+  else:
+    self.max_value = self.value
+
+method setProgress*(self: ProgressBarPtr, value: uint) {.base.} =
+  if value > self.max_value:
+    self.value = self.max_value
+  else:
+    self.value = value
+
+method setProgressColor*(self: ProgressBarPtr, color: ColorRef) {.base.} =
+  ## Changes progress color.
+  ## For change background color use `setBackgroundColor` method.
+  self.progress_color = color

+ 22 - 0
tests/test21.nim

@@ -0,0 +1,22 @@
+# --- Test 21. Use ProgressBar node. --- #
+import nodesnim
+
+
+Window("hello world")
+
+var
+  mainobj: SceneObj
+  main = Scene("Main", mainobj)
+
+  progressbarobj: ProgressBarObj
+  progressbar = ProgressBar(progressbarobj)
+
+main.addChild(progressbar)
+
+progressbar.setProgress(50)  # default max progress value is 100.
+progressbar.setMaxValue(150)
+
+
+addScene(main)
+setMainScene("Main")
+windowLaunch()