120 lines
4.4 KiB
Python
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
|