Last active
July 6, 2019 06:04
-
-
Save Skaruts/da66219c55445838f61268310ab3e769 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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