Skip to content

Instantly share code, notes, and snippets.

@Skaruts
Last active July 6, 2019 06:04
Show Gist options
  • Save Skaruts/da66219c55445838f61268310ab3e769 to your computer and use it in GitHub Desktop.
Save Skaruts/da66219c55445838f61268310ab3e769 to your computer and use it in GitHub Desktop.
type
BaseButton* = ref object of Widget
mouse_over*:bool
hit_on_release*:bool
is_toggle*:bool
is_pressed*:bool
style:ButtonStyle
is_hovered:bool
is_down:bool
mouse_hit_actions*:seq[Callback]
mouse_enter_actions*:seq[Callback]
mouse_exit_actions*:seq[Callback]
method draw*(b:BaseButton) =
echo(" !! BaseButton.draw() to override.")
method super*(self:BaseButton, con:Console, x, y, w, h:int, style:ButtonStyle) {.base.} =
self.super(con, x, y, w, h)
self.style = style
self.bg = self.style.bg_up
self.fg = self.style.fg_up
self.hit_on_release = true
# getter
method `style`*(self:BaseButton):ButtonStyle {.base.} =
self.style
# setter
method `style=`*(self:BaseButton, style:ButtonStyle) {.base.} =
self.style = style
self.bg = self.style.bg_up
self.fg = self.style.fg_up
method on_mouse_enter*(b:BaseButton) {.base.} =
for i in 0..<len(b.mouse_enter_actions):
b.mouse_enter_actions[i]()
method on_mouse_exit*(b:BaseButton) {.base.} =
for i in 0..<len(b.mouse_exit_actions):
b.mouse_exit_actions[i]()
method on_mouse_hit*(b:BaseButton) {.base.} =
for i in 0..<len(b.mouse_hit_actions):
b.mouse_hit_actions[i]()
method on_toggle*(b:BaseButton) {.base.} =
for i in 0..<len(b.mouse_hit_actions):
b.mouse_hit_actions[i]()
method add_action*(b:BaseButton, fn:Callback, state:string = "on_hit") {.base.} =
if state == "on_hit": b.mouse_hit_actions.add(fn)
elif state == "on_exit": b.mouse_exit_actions.add(fn)
elif state == "on_enter": b.mouse_enter_actions.add(fn)
method handle_mouse*(self:BaseButton, event:Event) =
if self.is_visible and self.is_active:
if event.kind == EventType.MouseMoved or event.kind == EventType.MouseButtonPressed:
self.mouse_over = self.check_mouse()
if not self.is_toggle:
if self.mouse_over:
if not self.is_hovered:
self.is_hovered = true
self.on_mouse_enter()
if event.kind == EventType.MouseButtonPressed:
if mouse_isButtonPressed(MouseButton.Left) and not self.is_down:
self.is_down = true
self.bg = self.style.bg_down
self.fg = self.style.fg_down
if not self.hit_on_release:
self.on_mouse_hit()
elif event.kind == EventType.MouseButtonReleased:
if event.mouseButton.button == MouseButton.Left and self.is_down:
self.is_down = false
if self.is_hovered:
self.bg = self.style.bg_hover
self.fg = self.style.fg_hover
else:
self.bg = self.style.bg_up
self.fg = self.style.fg_up
if self.hit_on_release:
self.on_mouse_hit()
else:
self.bg = self.style.bg_hover
self.fg = self.style.fg_hover
else:
if self.is_hovered:
self.is_hovered = false
self.is_down = false
self.bg = self.style.bg_up
self.fg = self.style.fg_up
self.on_mouse_exit()
else:
# toggle not working properly yet
if self.mouse_over:
if not self.is_hovered:
self.is_hovered = true
self.bg = self.style.bg_hover
self.fg = self.style.fg_down
self.on_mouse_enter()
if event.kind == EventType.MouseButtonPressed:
if mouse_isButtonPressed(MouseButton.Left):
self.is_down = not self.is_down
if self.is_down: self.fg = self.style.fg_down
else: self.fg = self.style.fg_up
if self.is_hovered: self.bg = self.style.bg_hover
else: self.bg = self.style.bg_up
self.on_toggle()
else:
if self.is_hovered:
self.is_hovered = false
self.bg = self.style.bg_up
if self.is_down: self.fg = self.style.fg_hover
else: self.fg = self.style.fg_up
self.on_mouse_exit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment