From 505bc9df3709ceb06d57ced04209e9b3e23fcdfd Mon Sep 17 00:00:00 2001 From: Axo-xD <83178024+Axo-xD@users.noreply.github.com> Date: Wed, 3 Aug 2022 13:29:27 +0200 Subject: [PATCH 1/2] Mouse wheel zoom error fixed [Windows] When mouse wheel is used to zoom on the map, the zoom value somtimes return a float value. This messes with the decimal to osm calculations. --- tkintermapview/map_widget.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tkintermapview/map_widget.py b/tkintermapview/map_widget.py index 11975ed..3e6cc78 100644 --- a/tkintermapview/map_widget.py +++ b/tkintermapview/map_widget.py @@ -816,9 +816,9 @@ def mouse_zoom(self, event): relative_mouse_y = event.y / self.height if sys.platform == "darwin": - new_zoom = self.zoom + event.delta * 0.1 + new_zoom = self.zoom + int(event.delta * 0.1) elif sys.platform.startswith("win"): - new_zoom = self.zoom + event.delta * 0.01 + new_zoom = self.zoom + int(event.delta * 0.01) elif event.num == 4: new_zoom = self.zoom + 1 elif event.num == 5: From 45e3848d801487f3124c788e0b9a6a737c637370 Mon Sep 17 00:00:00 2001 From: meimar12 Date: Sun, 27 Nov 2022 20:48:46 +0100 Subject: [PATCH 2/2] add range option to canvas marker. --- tkintermapview/canvas_position_marker.py | 43 +++++++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/tkintermapview/canvas_position_marker.py b/tkintermapview/canvas_position_marker.py index 8d65c5e..71ca129 100644 --- a/tkintermapview/canvas_position_marker.py +++ b/tkintermapview/canvas_position_marker.py @@ -19,8 +19,9 @@ def __init__(self, marker_color_outside: str = "#C5542D", command: Callable = None, image=None, - image_zoom_visibility: tuple = (13, float("inf")), - data: any = None): + image_zoom_visibility: tuple = (0, float("inf")), + data: any = None, + range: float = None): self.map_widget = map_widget self.position = position @@ -34,11 +35,14 @@ def __init__(self, self.deleted = False self.command = command self.data = data + self.range = range self.polygon = None self.big_circle = None self.canvas_text = None self.canvas_image = None + self.canvas_icon = None + self.canvas_range = None if font is None: if sys.platform == "darwin": @@ -84,6 +88,11 @@ def click(self, event=None): if self.command is not None: self.command(self) + def get_canvas_range(self, range:float): + tile_position = decimal_to_osm(*self.position, round(self.map_widget.zoom)) + tile_range = decimal_to_osm(self.position[0]+range, self.position[1], round(self.map_widget.zoom)) + return abs(tile_position[1]-tile_range[1]) + def get_canvas_pos(self, position): tile_position = decimal_to_osm(*position, round(self.map_widget.zoom)) @@ -97,9 +106,15 @@ def get_canvas_pos(self, position): def draw(self, event=None): canvas_pos_x, canvas_pos_y = self.get_canvas_pos(self.position) + x_offset = 50 + y_offset = 70 + if self.range is not None: + image_range = self.get_canvas_range(self.range) + x_offset = max(2*image_range, x_offset) + y_offset = max(2*image_range, y_offset) if not self.deleted: - if 0 - 50 < canvas_pos_x < self.map_widget.width + 50 and 0 < canvas_pos_y < self.map_widget.height + 70: + if 0 - x_offset < canvas_pos_x < self.map_widget.width + x_offset and 0-y_offset < canvas_pos_y < self.map_widget.height + y_offset: if self.polygon is None: self.polygon = self.map_widget.canvas.create_polygon(canvas_pos_x - 14, canvas_pos_y - 23, canvas_pos_x, canvas_pos_y, @@ -162,8 +177,26 @@ def draw(self, event=None): if self.canvas_image is not None: self.map_widget.canvas.delete(self.canvas_image) self.canvas_image = None + if self.range is not None: + if self.canvas_range is None: + self.canvas_range = self.map_widget.canvas.create_oval(canvas_pos_x - image_range, canvas_pos_y - image_range, + canvas_pos_x + image_range, canvas_pos_y + image_range, + width=3, + outline=self.marker_color_outside, + tag=("marker")) + if self.command is not None: + self.map_widget.canvas.tag_bind(self.canvas_range, "", self.mouse_enter) + self.map_widget.canvas.tag_bind(self.canvas_range, "", self.mouse_leave) + self.map_widget.canvas.tag_bind(self.canvas_range, "", self.click) + else: + self.map_widget.canvas.coords(self.canvas_range, canvas_pos_x - image_range, canvas_pos_y - image_range, + canvas_pos_x + image_range, canvas_pos_y + image_range) + else: + if self.canvas_range is not None: + self.map_widget.canvas.delete(self.canvas_range) + self.canvas_range = None else: - self.map_widget.canvas.delete(self.polygon, self.big_circle, self.canvas_text, self.canvas_image) - self.polygon, self.big_circle, self.canvas_text, self.canvas_image = None, None, None, None + self.map_widget.canvas.delete(self.polygon, self.big_circle, self.canvas_text, self.canvas_image, self.canvas_range) + self.polygon, self.big_circle, self.canvas_text, self.canvas_image, self.canvas_range = None, None, None, None, None self.map_widget.manage_z_order()