def __init__(self, session): super().__init__(session) self.setGlobalListener(True) self._last_mmb_scroll_point = [0, 0] # coordinates of last mouse positions self.last_exact_world_location = fife.ExactModelCoordinate() self._hover_instances_update_scheduled = False self.middle_scroll_active = False class CmdListener(fife.ICommandListener): pass self.cmdlist = CmdListener() horizons.globals.fife.eventmanager.addCommandListener(self.cmdlist) self.cmdlist.onCommand = self.onCommand if not self.__class__.send_hover_instances_update: # clear HoverInstancesChanged.broadcast(self, set()) self.__class__.last_hover_instances = WeakList() else: # need updates about scrolling here self.session.view.add_change_listener(self._schedule_hover_instance_update) self._schedule_hover_instance_update() class CoordsTooltip: @classmethod def get_instance(cls, cursor_tool): if cursor_tool.session.ingame_gui.coordinates_tooltip is not None: inst = cursor_tool.session.ingame_gui.coordinates_tooltip inst.cursor_tool = cursor_tool return inst else: return CoordsTooltip(cursor_tool) def __init__(self, cursor_tool, **kwargs): super().__init__(**kwargs) cursor_tool.session.ingame_gui.coordinates_tooltip = self self.cursor_tool = cursor_tool self.enabled = False self.icon = Icon(position=(1, 1)) # 0, 0 is currently not supported by tooltips def toggle(self): self.enabled = not self.enabled if not self.enabled and self.icon.tooltip_shown: self.icon.hide_tooltip() def show_evt(self, evt): if self.enabled: if evt.isConsumedByWidgets(): if self.icon.tooltip_shown: self.icon.hide_tooltip() return x, y = self.cursor_tool.get_world_location(evt).to_tuple() self.icon.helptext = '{:d}, {:d} '.format(x, y) + T("Press H to remove this hint") self.icon.position_tooltip(evt) self.icon.show_tooltip() self.tooltip = CoordsTooltip.get_instance(self)
def __init__(self, session): super(NavigationTool, self).__init__(session) self._last_mmb_scroll_point = [0, 0] # coordinates of last mouse positions self.last_exact_world_location = fife.ExactModelCoordinate() self._hover_instances_update_scheduled = False self.middle_scroll_active = False class CmdListener(fife.ICommandListener): pass self.cmdlist = CmdListener() horizons.globals.fife.eventmanager.addCommandListener(self.cmdlist) self.cmdlist.onCommand = self.onCommand if not self.__class__.send_hover_instances_update: # clear HoverInstancesChanged.broadcast(self, set()) self.__class__.last_hover_instances = WeakList() else: # need updates about scrolling here self.session.view.add_change_listener( self._schedule_hover_instance_update) self._schedule_hover_instance_update() class CoordsTooltip(object): @classmethod def get_instance(cls, cursor_tool): if cursor_tool.session.ingame_gui.coordinates_tooltip is not None: inst = cursor_tool.session.ingame_gui.coordinates_tooltip inst.cursor_tool = cursor_tool return inst else: return CoordsTooltip(cursor_tool) def __init__(self, cursor_tool, **kwargs): super(CoordsTooltip, self).__init__(**kwargs) cursor_tool.session.ingame_gui.coordinates_tooltip = self self.cursor_tool = cursor_tool self.enabled = False self.icon = Icon(position=( 1, 1)) # 0, 0 is currently not supported by tooltips def toggle(self): self.enabled = not self.enabled if not self.enabled and self.icon.tooltip_shown: self.icon.hide_tooltip() def show_evt(self, evt): if self.enabled: x, y = self.cursor_tool.get_world_location(evt).to_tuple() self.icon.helptext = u'%d, %d ' % (x, y) + _( "Press H to remove this hint") self.icon.position_tooltip(evt) self.icon.show_tooltip() self.tooltip = CoordsTooltip.get_instance(self)
def _send_hover_instance_upate(self): """Broadcast update with new instances below mouse (hovered). At most called in a certain interval, not after every mouse move in order to prevent delays.""" self._hover_instances_update_scheduled = False where = fife.Point(self.last_event_pos.x, self.last_event_pos.y) instances = set(self.get_hover_instances(where)) # only send when there were actual changes if instances != set(self.__class__.last_hover_instances): self.__class__.last_hover_instances = WeakList(instances) HoverInstancesChanged.broadcast(self, instances)
def _send_hover_instance_upate(self): """Broadcast update with new instances below mouse (hovered). At most called in a certain interval, not after every mouse move in order to prevent delays.""" self._hover_instances_update_scheduled = False where = fife.Point(self.__class__.last_event_pos.x, self.__class__.last_event_pos.y) instances = set(self.get_hover_instances(where)) # only send when there were actual changes if instances != set(self.__class__.last_hover_instances): self.__class__.last_hover_instances = WeakList(instances) HoverInstancesChanged.broadcast(self, instances)
def __init__(self, session): super(NavigationTool, self).__init__(session) self._last_mmb_scroll_point = [0, 0] # coordinates of last mouse positions self.last_exact_world_location = fife.ExactModelCoordinate() self._hover_instances_update_scheduled = False self.middle_scroll_active = False class CmdListener(fife.ICommandListener): pass self.cmdlist = CmdListener() horizons.main.fife.eventmanager.addCommandListener(self.cmdlist) self.cmdlist.onCommand = self.onCommand if not self.__class__.send_hover_instances_update: # clear HoverInstancesChanged.broadcast(self, set()) self.__class__.last_hover_instances = WeakList() else: # need updates about scrolling here self.session.view.add_change_listener(self._schedule_hover_instance_update) self._schedule_hover_instance_update() class CoordsTooltip(object): @classmethod def get_instance(cls, cursor_tool): if cursor_tool.session.coordinates_tooltip is not None: inst = cursor_tool.session.coordinates_tooltip inst.cursor_tool = cursor_tool return inst else: return CoordsTooltip(cursor_tool) def __init__(self, cursor_tool, **kwargs): super(CoordsTooltip, self).__init__(**kwargs) cursor_tool.session.coordinates_tooltip = self self.cursor_tool = cursor_tool self.enabled = False self.icon = Icon() def toggle(self): self.enabled = not self.enabled if not self.enabled and self.icon.tooltip_shown: self.icon.hide_tooltip() def show_evt(self, evt): if self.enabled: x, y = self.cursor_tool.get_world_location_from_event(evt).to_tuple() self.icon.helptext = u'%f, %f ' % (x, y) + _("Press H to remove this hint") self.icon.position_tooltip(evt) self.icon.show_tooltip() self.tooltip = CoordsTooltip.get_instance(self)
def end(self): self.tooltip_instance = None self.tooltip_icon.hide_tooltip() self.tooltip_icon = None self.renderer = None self.icons = None AddStatusIcon.unsubscribe(self.on_add_icon_message) HoverInstancesChanged.unsubscribe(self.on_hover_instances_changed) RemoveStatusIcon.unsubscribe(self.on_remove_icon_message) WorldObjectDeleted.unsubscribe(self.on_worldobject_deleted_message)
def __init__(self, session): self.session = session # {instance: [list of icons]} self.icons = {} # Renderer used to render the icons self.renderer = self.session.view.renderer['GenericRenderer'] self.tooltip_instance = None # no weakref: # we need to remove the tooltip always anyway, and along with it the entry here self.tooltip_icon = Icon(position=(1,1)) # 0, 0 is currently not supported by tooltips AddStatusIcon.subscribe(self.on_add_icon_message) HoverInstancesChanged.subscribe(self.on_hover_instances_changed) RemoveStatusIcon.subscribe(self.on_remove_icon_message) WorldObjectDeleted.subscribe(self.on_worldobject_deleted_message)
def on_worldobject_deleted_message(self, message): assert isinstance(message, WorldObjectDeleted) # remove icon if message.worldobject in self.icons: self.renderer.removeAll(self.get_status_string(message.worldobject)) del self.icons[message.worldobject] # remove icon tooltip if message.worldobject is self.tooltip_instance: self.on_hover_instances_changed( HoverInstancesChanged(self, []) )
def __init__(self, renderer, layer): """ @param renderer: Renderer used to render the icons @param layer: map layer, needed to place icon """ self.layer = layer self.renderer = renderer # {instance: [list of icons]} self.icons = {} self.tooltip_instance = None # no weakref: # we need to remove the tooltip always anyway, and along with it the entry here self.tooltip_icon = Icon(position=(1, 1)) # 0, 0 is currently not supported by tooltips AddStatusIcon.subscribe(self.on_add_icon_message) HoverInstancesChanged.subscribe(self.on_hover_instances_changed) RemoveStatusIcon.subscribe(self.on_remove_icon_message) WorldObjectDeleted.subscribe(self.on_worldobject_deleted_message)
def on_add_icon_message(self, message): """This is called by the message bus with AddStatusIcon messages""" assert isinstance(message, AddStatusIcon) icon_instance = message.icon.instance if not icon_instance in self.icons: self.icons[icon_instance] = [] assert not message.icon in self.icons[icon_instance] self.icons[icon_instance].append(message.icon) # Sort, make sure highest icon is at top self.icons[icon_instance] = sorted(self.icons[icon_instance], key=StatusIcon.get_sorting_key(), reverse=True) # Now render the most important one self.__render_status(icon_instance, self.icons[icon_instance][0]) if self.tooltip_instance is not None and self.tooltip_instance is icon_instance: # possibly have to update tooltip self.on_hover_instances_changed( HoverInstancesChanged(self, [self.tooltip_instance]) )
def on_remove_icon_message(self, message): """Called by the MessageBus with RemoveStatusIcon messages.""" assert isinstance(message, RemoveStatusIcon) icon_instance = message.instance if icon_instance in self.icons: for registered_icon in self.icons[icon_instance][:]: if message.icon_class is registered_icon.__class__: self.icons[icon_instance].remove(registered_icon) if not self.icons[icon_instance]: # No icon left for this building, remove it self.renderer.removeAll(self.get_status_string(icon_instance)) del self.icons[icon_instance] else: # Render next icon self.__render_status(icon_instance, self.icons[icon_instance][0]) break if self.tooltip_instance is not None and self.tooltip_instance is icon_instance: # possibly have to update tooltip self.on_hover_instances_changed( HoverInstancesChanged(self, [self.tooltip_instance]) )