def redo_buttons(self, button_ids: list[str], building: BuildingBase): self.scatter = get_screen("BaseBuildScreen").ids["scatter"] # Hacky fix so its not got every time the scatter is transformed self.clear_buttons() self.custom_buttons_holder.add_widget(self.spacer1) button_id: str for button_id in button_ids: button = BetterButton(button_id=button_id, size_type="big", on_release=button_pressed, button_storage=building) self.custom_buttons_holder.add_widget(button) self.custom_buttons_holder.add_widget(self.spacer2) if building.movable: # TODO: Fix problem of buttons going everywhere because of fix of positioning self.transform_button_1 = BetterButton( button_id="move", size_type="small", on_touch_down=self.button_touch_down, on_touch_move=self.button_touch_move, on_touch_up=self.button_touch_up, button_storage=building) self.transform_button_2 = BetterButton( button_id="rotate", size_type="small", on_touch_down=self.button_touch_down, on_touch_move=self.button_touch_move, on_touch_up=self.button_touch_up, button_storage=building) GlobalEvents.bind(on_scatter_transformed=lambda: self. redo_building_move_buttons(building)) self.move_buttons_holder.add_widget(self.transform_button_1) self.move_buttons_holder.add_widget(self.transform_button_2) # TODO: Find better solution Clock.schedule_once( lambda _elapsed_time: self.redo_building_move_buttons(building ), 0) self.log_deep_debug("Added buttons to self, they are", self.custom_buttons_holder.children)
def fix_transform_edges(self, touch: MotionEvent): (left, bottom), (width, height) = self.bbox right, top = left + width, bottom + height dx, dy, dz = 0, 0, 0 if left > 0: dx = 0 - left elif right < graphics.width(): dx = graphics.width() - right if bottom > 0: dy = 0 - bottom elif top < graphics.height(): dy = graphics.height() - top self.apply_transform(Matrix().translate(dx, dy, dz)) self.dispatch("on_transform_with_touch", touch) GlobalEvents.dispatch("on_scatter_transformed")
def on_touch_down(self, touch: MotionEvent): if touch.is_mouse_scrolling: # dx, dy, dz = 0, 0, 0 # z = self.scale if touch.button == 'scrolldown': if self.scale < self.scale_max: nextScale = self.scale * (1 + self.scroll_sensitivity) if nextScale < self.scale_max: self.scale = nextScale else: self.scale = self.scale_max elif touch.button == 'scrollup': if self.scale > self.scale_min: nextScale = self.scale * (1 - self.scroll_sensitivity) if nextScale > self.scale_min: self.scale = nextScale else: self.scale = self.scale_min else: self.log_warning( "Touch event was sent and mouse was scrolling but not up or down - ", touch) # bdz = self.scale - z # self.dispatch("on_transformed", dx, dy, dz) self.dispatch("on_transform_with_touch", touch) GlobalEvents.dispatch("on_scatter_transformed") else: ScatterLayout.on_touch_down(self, touch) self.fix_transform_edges(touch)
def __init__(self, **kwargs): BetterLogger.__init__(self) FloatLayout.__init__(self, **kwargs) GlobalEvents.bind(mine_batch_finished=self.batch_finished) GlobalEvents.bind(remove_mine_finished_icon=self.remove_finished_icon) GlobalEvents.bind(on_scatter_transformed=self.update_positions)
def __init__(self, **kwargs): BetterLogger.__init__(self) FloatLayout.__init__(self, **kwargs) self.create_renderer() if userSettings.get("debug", "building_hit_boxes"): self.bind(buildings=lambda _instance, _value: self.redraw_hit_boxes()) GlobalEvents.bind(building_moved=lambda _instance, _x, _y: self.redraw_hit_boxes(), building_rotated=lambda _instance, _rotation: self.redraw_hit_boxes()) self.log_info("Created renderer, starting to create building objects") for building_id in gameData.get("placed_buildings"): building_info = gameData.get("placed_buildings", building_id) building_class = str_to_building[building_info.pop("type")] building = building_class(**building_info) building.id = building_id self.log_debug("Created building object for building", building_id, "with info", building_info) self.add_building(building) self.log_info("Created objects -", self.buildings)
def on_rotation(self, _instance, value): self._obj.rotation.z = value GlobalEvents.dispatch("building_rotated", self, value)
def on_y(self, _instance, value): self._obj.pos.y = value GlobalEvents.dispatch("building_moved", self, self.x, value)
def on_x(self, _instance, value): self._obj.pos.x = value GlobalEvents.dispatch("building_moved", self, value, self.y)
def mine_batch_finished(self): self.log_deep_debug("Finished mining batch of", self.mine_batch_amount, self.mine_item) GlobalEvents.dispatch("mine_batch_finished", self)
def reset(self): self.scale = 1 self.rotation = 0 self.pos = 0, 0 GlobalEvents.dispatch("on_scatter_transformed")
def done_removing(self): GlobalEvents.dispatch("remove_mine_finished_icon", self)