示例#1
0
	def mouseReleased(self,  evt):
		"""Tear selected instances and set selection tool as cursor"""
		self.log.debug("TearingTool: mouseReleased")
		if fife.MouseEvent.LEFT == evt.getButton():
			coords = self.get_world_location(evt).to_tuple()
			if self.coords is None:
				self.coords = coords
			self._mark(self.coords, coords)
			for i in [i for i in self.selected]:
				self.session.view.renderer['InstanceRenderer'].removeColored(i._instance)
				Tear(i).execute(self.session)
			else:
				if self._hovering_over:
					# we're hovering over a building, but none is selected, so this tear action isn't allowed
					warehouses = [ b for b in self._hovering_over if \
					               b.id == BUILDINGS.WAREHOUSE ]
					if warehouses:
						# tried to tear a warehouse, this is especially non-tearable
						pos = warehouses[0].position.origin
						self.session.ingame_gui.message_widget.add( pos.x, pos.y, "WAREHOUSE_NOT_TEARABLE" )

			self.selected = WeakList()
			self._hovering_over = WeakList()

			if not evt.isShiftPressed() and not horizons.main.fife.get_uh_setting('UninterruptedBuilding'):
				self.tear_tool_active = False
				self.on_escape()
			evt.consume()
示例#2
0
	def _mark(self, *edges):
		"""Highights building instances and keeps self.selected up to date."""
		self.log.debug("TearingTool: mark")
		if len(edges) == 1:
			edges = (edges[0], edges[0])
		elif len(edges) == 2:
			edges = ((min(edges[0][0], edges[1][0]), min(edges[0][1], edges[1][1])), \
					 (max(edges[0][0], edges[1][0]), max(edges[0][1], edges[1][1])))
		else:
			edges = None
		if self.oldedges != edges or edges is None:
			for i in self.selected:
				self.session.view.renderer['InstanceRenderer'].removeColored(i._instance)
			self.selected = WeakList()
			self.oldedges = edges
		if edges is not None:
			self._hovering_over = WeakList()
			for x in xrange(edges[0][0], edges[1][0] + 1):
				for y in xrange(edges[0][1], edges[1][1] + 1):
					b = self.session.world.get_building(Point(x, y))
					if b is not None:
						if b not in self._hovering_over:
							self._hovering_over.append(b)
						if b.tearable and b.owner is not None and b.owner.is_local_player:
							if b not in self.selected:
								self.selected.append(b)
			for i in self.selected:
				self.session.view.renderer['InstanceRenderer'].addColored(i._instance, \
				                                                          *self.tear_selection_color)
		self.log.debug("TearingTool: mark done")
示例#3
0
	def __init__(self, session):
		super(TearingTool, self).__init__(session)
		self.coords = None
		self.selected = WeakList()
		self.oldedges = None
		self.tear_tool_active = True
		self.session.gui.on_escape = self.on_escape
		self.session.ingame_gui.hide_menu()
		horizons.main.fife.set_cursor_image("tearing")
		self._hovering_over = WeakList()
示例#4
0
	def __init__(self, session):
		super(TearingTool, self).__init__(session)
		self.coords = None
		self.selected = WeakList()
		self.oldedges = None
		self.tear_tool_active = True
		self.session.gui.on_escape = self.on_escape
		self.session.ingame_gui.hide_menu()
		horizons.main.fife.set_cursor_image("tearing")
		self._hovering_over = WeakList()
		self.session.message_bus.subscribe_globally(WorldObjectDeleted, self._on_object_deleted)
示例#5
0
class TearingTool(NavigationTool):
	"""
	Represents a dangling tool to remove (tear) buildings.
	"""
	tear_selection_color = (255, 255, 255)

	def __init__(self, session):
		super(TearingTool, self).__init__(session)
		self.coords = None
		self.selected = WeakList()
		self.oldedges = None
		self.tear_tool_active = True
		self.session.gui.on_escape = self.on_escape
		self.session.ingame_gui.hide_menu()
		horizons.main.fife.set_cursor_image("tearing")
		self._hovering_over = WeakList()
		WorldObjectDeleted.subscribe(self._on_object_deleted)

	def remove(self):
		self._mark()
		self.tear_tool_active = False
		horizons.main.fife.set_cursor_image("default")
		WorldObjectDeleted.subscribe(self._on_object_deleted)
		super(TearingTool, self).remove()

	def mouseDragged(self, evt):
		coords = self.get_world_location(evt).to_tuple()
		if self.coords is None:
			self.coords = coords
		self._mark(self.coords, coords)
		evt.consume()

	def mouseMoved(self,  evt):
		super(TearingTool, self).mouseMoved(evt)
		coords = self.get_world_location(evt).to_tuple()
		self._mark(coords)
		evt.consume()

	def on_escape(self):
		self.session.set_cursor()

	def mouseReleased(self,  evt):
		"""Tear selected instances and set selection tool as cursor"""
		self.log.debug("TearingTool: mouseReleased")
		if fife.MouseEvent.LEFT == evt.getButton():
			coords = self.get_world_location(evt).to_tuple()
			if self.coords is None:
				self.coords = coords
			self._mark(self.coords, coords)
			for i in [i for i in self.selected]:
				self.session.view.renderer['InstanceRenderer'].removeColored(i._instance)
				Tear(i).execute(self.session)
			else:
				if self._hovering_over:
					# we're hovering over a building, but none is selected, so this tear action isn't allowed
					warehouses = [ b for b in self._hovering_over if \
					               b.id == BUILDINGS.WAREHOUSE ]
					if warehouses:
						# tried to tear a warehouse, this is especially non-tearable
						pos = warehouses[0].position.origin
						self.session.ingame_gui.message_widget.add( pos.x, pos.y, "WAREHOUSE_NOT_TEARABLE" )

			self.selected = WeakList()
			self._hovering_over = WeakList()

			if not evt.isShiftPressed() and not horizons.main.fife.get_uh_setting('UninterruptedBuilding'):
				self.tear_tool_active = False
				self.on_escape()
			evt.consume()

	def mousePressed(self,  evt):
		if fife.MouseEvent.RIGHT == evt.getButton():
			self.on_escape()
		elif fife.MouseEvent.LEFT == evt.getButton():
			self.coords = self.get_world_location(evt).to_tuple()
			self._mark(self.coords)
		else:
			return
		self.tear_tool_active = False
		evt.consume()

	def _mark(self, *edges):
		"""Highights building instances and keeps self.selected up to date."""
		self.log.debug("TearingTool: mark")
		if len(edges) == 1:
			edges = (edges[0], edges[0])
		elif len(edges) == 2:
			edges = ((min(edges[0][0], edges[1][0]), min(edges[0][1], edges[1][1])), \
					 (max(edges[0][0], edges[1][0]), max(edges[0][1], edges[1][1])))
		else:
			edges = None
		if self.oldedges != edges or edges is None:
			for i in self.selected:
				self.session.view.renderer['InstanceRenderer'].removeColored(i._instance)
			self.selected = WeakList()
			self.oldedges = edges
		if edges is not None:
			self._hovering_over = WeakList()
			for x in xrange(edges[0][0], edges[1][0] + 1):
				for y in xrange(edges[0][1], edges[1][1] + 1):
					b = self.session.world.get_building(Point(x, y))
					if b is not None:
						if b not in self._hovering_over:
							self._hovering_over.append(b)
						if b.tearable and b.owner is not None and b.owner.is_local_player:
							if b not in self.selected:
								self.selected.append(b)
			for i in self.selected:
				self.session.view.renderer['InstanceRenderer'].addColored(i._instance, \
				                                                          *self.tear_selection_color)
		self.log.debug("TearingTool: mark done")


	def _on_object_deleted(self, message):
		self.log.debug("TearingTool: on deletion notification %s", message.worldid)
		if message.sender in self.selected:
			self.log.debug("TearingTool: deleted obj present")
			self.selected.remove(message.sender)