145 lines
5 KiB
Text
145 lines
5 KiB
Text
# Copyright 2004-2019 Tom Rothamel <pytom@bishoujo.us>
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person
|
|
# obtaining a copy of this software and associated documentation files
|
|
# (the "Software"), to deal in the Software without restriction,
|
|
# including without limitation the rights to use, copy, modify, merge,
|
|
# publish, distribute, sublicense, and/or sell copies of the Software,
|
|
# and to permit persons to whom the Software is furnished to do so,
|
|
# subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be
|
|
# included in all copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
init python:
|
|
|
|
class _ImageMapper(object):
|
|
|
|
def __init__(self, screen, ground, idle, hover, selected_idle, selected_hover, hotspots, navigation=True, variant=None):
|
|
|
|
# If the argument is a dict, look up the screen in that dict, and
|
|
# return the result. Otherwise, just return the result.
|
|
def maybe_variant(a):
|
|
if isinstance(a, dict):
|
|
if variant in a:
|
|
return a[variant]
|
|
else:
|
|
return a[None]
|
|
return a
|
|
|
|
ground = maybe_variant(ground)
|
|
|
|
self.idle = maybe_variant(idle) or ground
|
|
self.hover = maybe_variant(hover) or self.idle
|
|
self.selected_idle = maybe_variant(selected_idle) or self.idle
|
|
self.selected_hover = maybe_variant(selected_hover) or self.hover
|
|
|
|
self.hotspots = { }
|
|
for (x1, y1, x2, y2, name) in maybe_variant(hotspots):
|
|
self.hotspots[name] = (x1, y1, x2, y2)
|
|
|
|
self.remaining_hotspots = set(self.hotspots.keys())
|
|
|
|
if navigation:
|
|
|
|
# Display the layout navigation only if there are no
|
|
# game menu buttons defined.
|
|
for i in config.game_menu:
|
|
if i[1] in self.hotspots:
|
|
break
|
|
else:
|
|
layout.navigation(screen)
|
|
|
|
ui.fixed(style='imagemap')
|
|
ui.image(ground)
|
|
|
|
if navigation:
|
|
|
|
# Display any navigation buttons that exist.
|
|
for e in config.game_menu:
|
|
screen_ = e[0]
|
|
name = e[1]
|
|
act = e[2]
|
|
enable = e[3]
|
|
|
|
if not eval(enable):
|
|
continue
|
|
|
|
self.button(name, act, screen == screen_)
|
|
|
|
def button(self, name, clicked, selected, keymap={}):
|
|
|
|
if name not in self.hotspots:
|
|
return None
|
|
|
|
self.remaining_hotspots.discard(name)
|
|
|
|
x1, y1, x2, y2 = self.hotspots[name]
|
|
|
|
if clicked is None:
|
|
return (x1, y1, x2, y2)
|
|
|
|
if selected:
|
|
idle = self.selected_idle
|
|
hover = self.selected_hover
|
|
else:
|
|
idle = self.idle
|
|
hover = self.hover
|
|
|
|
ui.imagebutton(
|
|
LiveCrop((x1, y1, (x2 - x1), (y2 - y1)), idle),
|
|
LiveCrop((x1, y1, (x2 - x1), (y2 - y1)), hover),
|
|
xpos=x1,
|
|
ypos=y1,
|
|
xanchor=0,
|
|
yanchor=0,
|
|
clicked=clicked,
|
|
focus_mask=True,
|
|
style='imagemap_button',
|
|
keymap=keymap,
|
|
)
|
|
|
|
return (x1, y1, x2, y2)
|
|
|
|
|
|
def bar(self, name, range, value, changed):
|
|
|
|
if name not in self.hotspots:
|
|
return
|
|
|
|
self.remaining_hotspots.discard(name)
|
|
|
|
x1, y1, x2, y2 = self.hotspots[name]
|
|
|
|
ui.bar(
|
|
range,
|
|
value,
|
|
changed=changed,
|
|
left_gutter=0,
|
|
right_gutter=0,
|
|
left_bar=LiveCrop((x1, y1, (x2 - x1), (y2 - y1)), self.selected_idle),
|
|
right_bar=LiveCrop((x1, y1, (x2 - x1), (y2 - y1)), self.idle),
|
|
hover_left_bar=LiveCrop((x1, y1, (x2 - x1), (y2 - y1)), self.selected_hover),
|
|
hover_right_bar=LiveCrop((x1, y1, (x2 - x1), (y2 - y1)), self.hover),
|
|
bar_resizing=False,
|
|
xpos=x1,
|
|
ypos=y1,
|
|
xmaximum=(x2-x1),
|
|
ymaximum=(y2-y1),
|
|
thumb=None,
|
|
thumb_shadow=None,
|
|
thumb_offset=0)
|
|
|
|
def nothing(self, name):
|
|
self.remaining_hotspots.discard(name)
|
|
|
|
def close(self):
|
|
ui.close()
|