playscii/ui_toolbar.py

120 lines
4.4 KiB
Python

from ui_element import UIElement
from ui_button import UIButton
from renderable_sprite import UISpriteRenderable
from renderable_line import ToolSelectionBoxRenderable
class ToolBar(UIElement):
tile_width, tile_height = 4, 1 # real size will be set based on buttons
icon_scale_factor = 4
snap_left = True
def __init__(self, ui):
self.ui = ui
self.icon_renderables = []
self.create_toolbar_buttons()
UIElement.__init__(self, ui)
self.selection_box = ToolSelectionBoxRenderable(ui.app, self.art)
def reset_art(self):
# by default, a 1D vertical bar
self.tile_width = ToolBarButton.width
# dynamically set height based on # of buttons
self.tile_height = ToolBarButton.height * len(self.buttons)
self.art.resize(self.tile_width, self.tile_height)
UIElement.reset_art(self)
def reset_loc(self):
UIElement.reset_loc(self)
# by default, a vertical bar centered along left edge of the screen
height = self.art.quad_height * len(self.buttons) * self.buttons[0].height
self.y = height / 2
# (x is set by snap_left property in UIElement.reset_loc)
self.renderable.x, self.renderable.y = self.x, self.y
# scale and position button icons only now that we're positioned
self.reset_button_icons()
def create_toolbar_buttons(self):
# (override in subclass)
pass
def update_selection_box(self):
# (override in subclass)
pass
def update(self):
UIElement.update(self)
self.update_selection_box()
def render(self):
UIElement.render(self)
for r in self.icon_renderables:
r.render()
self.selection_box.render()
class ToolBarButton(UIButton):
width, height = 4, 2
caption = ''
tooltip_on_hover = True
def get_tooltip_text(self):
return self.cb_arg.button_caption
def get_tooltip_location(self):
x = self.width
window_height_chars = self.element.ui.app.window_height / (self.element.ui.charset.char_height * self.element.ui.scale)
cursor_y = self.element.ui.app.mouse_y / self.element.ui.app.window_height
y = int(cursor_y * window_height_chars)
return x, y
class ArtToolBar(ToolBar):
def create_toolbar_buttons(self):
for i,tool in enumerate(self.ui.tools):
button = ToolBarButton(self)
# button.caption = tool.button_caption # DEBUG
button.x = 0
button.y = i * button.height
# alternate colors
button.normal_bg_color = self.ui.colors.white if i % 2 == 0 else self.ui.colors.lightgrey
button.hovered_bg_color = self.ui.colors.medgrey
# callback: tell ui to set this tool as selected
button.callback = self.ui.set_selected_tool
button.cb_arg = tool
self.buttons.append(button)
# create button icon
sprite = UISpriteRenderable(self.ui.app, self.ui.asset_dir + tool.icon_filename)
self.icon_renderables.append(sprite)
def reset_button_icons(self):
button_height = self.art.quad_height * ToolBarButton.height
for i,icon in enumerate(self.icon_renderables):
# scale: same screen size as cursor icon
scale_x = icon.texture.width / self.ui.app.window_width
scale_x *= self.icon_scale_factor * self.ui.scale
icon.scale_x = scale_x
scale_y = icon.texture.height / self.ui.app.window_height
scale_y *= self.icon_scale_factor * self.ui.scale
icon.scale_y = scale_y
# position
# remember that in renderable space, (0, 0) = center of screen
icon.x = self.x
icon.x += (icon.scale_x / 8)
icon.y = self.y
icon.y -= button_height * i
icon.y -= icon.scale_y
icon.y -= (icon.scale_y / 8)
def update_selection_box(self):
# scale and position box around currently selected tool
self.selection_box.scale_x = ToolBarButton.width
self.selection_box.scale_y = ToolBarButton.height
self.selection_box.x = self.x
self.selection_box.y = self.y
sel_index = self.ui.tools.index(self.ui.selected_tool)
self.selection_box.y -= sel_index * self.art.quad_height * ToolBarButton.height