# Copyright 2004-2010 PyTom <pytom@bishoujo.us>
# See LICENSE.txt for license details.

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()
