Skip to content

Commit f8af0ba

Browse files
committed
Allow maps to be downloaded via grid reference
1 parent 0d4d021 commit f8af0ba

2 files changed

Lines changed: 88 additions & 14 deletions

File tree

controllers/download.py

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from controllers.controller import Controller
66
from core.dynmap import Dynmap
77
from core.dynmapcoords import DynmapCoords
8+
from core.gridref import GridRef
89
from core.map import Map
910
from core.state import State
1011
from models.config import Config
@@ -81,25 +82,60 @@ def download(self):
8182
input_range['to_x'], input_range['to_y'],
8283
input_range['to_z']
8384
)
84-
85-
map_id = user_input['map_id'].split(' - ')
86-
world_name, map_name = map_id[0], map_id[1]
87-
85+
elif user_input['coord_mode'] == 'grid':
8886
try:
89-
stitch_args = Dynmap.download_tiles(tiles_dir, self.state.selected_server.dynmap_url, world_name,
90-
map_name,
91-
input_range['zoom'], from_tile_x, from_tile_y,
92-
to_tile_x, to_tile_y, self.update_progress)
93-
except Exception:
94-
self.view.display_error('Failed to download tiles')
87+
from_region_x, from_region_y = GridRef.grid_ref_to_mc(input_range['from'])
88+
except ValueError as e:
89+
self.view.display_error('From grid reference: {}'.format(str(e)))
9590
return
9691

9792
try:
98-
Map.stitch(tiles_dir, user_input['output_dir'], stitch_args, self.update_progress)
99-
except Exception:
100-
self.view.display_error('Failed to stitch tiles')
93+
to_region_x, to_region_y = GridRef.grid_ref_to_mc(input_range['to'])
94+
except ValueError as e:
95+
self.view.display_error('To grid reference: {}'.format(str(e)))
10196
return
10297

98+
low_region_x = min(from_region_x, to_region_x)
99+
low_region_y = min(from_region_y, to_region_y)
100+
high_region_x = max(from_region_x, to_region_x)
101+
high_region_y = max(from_region_y, to_region_y)
102+
103+
from_x = (low_region_x << 5) << 4
104+
from_y = (low_region_y << 5) << 4
105+
to_x = (((high_region_x + 1 << 5) - 1) + 1 << 4) - 1
106+
to_y = (((high_region_y + 1 << 5) - 1) + 1 << 4) - 1
107+
108+
from_tile_x, from_tile_y = DynmapCoords.mc_to_tile(map_obj, input_range['zoom'], from_x, 64, from_y)
109+
to_tile_x, to_tile_y = DynmapCoords.mc_to_tile(map_obj, input_range['zoom'], to_x, 64, to_y)
110+
elif user_input['coord_mode'] == 'dynmap':
111+
pass
112+
else:
113+
self.view.display_error('Invalid coordinate mode')
114+
return
115+
116+
low_tile_x = min(from_tile_x, to_tile_x)
117+
low_tile_y = min(from_tile_y, to_tile_y)
118+
high_tile_x = max(from_tile_x, to_tile_x)
119+
high_tile_y = max(from_tile_y, to_tile_y)
120+
121+
map_id = user_input['map_id'].split(' - ')
122+
world_name, map_name = map_id[0], map_id[1]
123+
124+
try:
125+
stitch_args = Dynmap.download_tiles(tiles_dir, self.state.selected_server.dynmap_url, world_name,
126+
map_name,
127+
input_range['zoom'], low_tile_x, low_tile_y,
128+
high_tile_x, high_tile_y, self.update_progress)
129+
except Exception:
130+
self.view.display_error('Failed to download tiles')
131+
return
132+
133+
try:
134+
Map.stitch(tiles_dir, user_input['output_dir'], stitch_args, self.update_progress)
135+
except Exception:
136+
self.view.display_error('Failed to stitch tiles')
137+
return
138+
103139
self.update_progress('Idle', 0, 1)
104140

105141
def update_progress(self, message: str, i, total):

views/download.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ def get_input(self) -> dict:
114114

115115
class DownloadGridRefFrame(View):
116116
controller: DownloadGridRefController
117+
grid_ref_from_txt: ttk.Entry
118+
grid_ref_to_txt: ttk.Entry
119+
zoom_txt: ttk.Entry
117120

118121
def __init__(self):
119122
super().__init__()
@@ -122,12 +125,47 @@ def __init__(self):
122125
def build_view(self, parent, controller: DownloadGridRefController):
123126
self.controller = controller
124127

128+
# Create the view if it's being shown for the first time
129+
if self.frame is None:
130+
self.frame = ttk.Frame(parent)
131+
132+
self.frame.columnconfigure(index=0, weight=1)
133+
self.frame.columnconfigure(index=1, weight=1)
134+
135+
from_lbl = ttk.Label(self.frame, text='From: ')
136+
from_lbl.grid(row=0, column=0, padx=7, pady=7, columnspan=2)
137+
138+
self.grid_ref_from_txt = ttk.Entry(self.frame)
139+
self.grid_ref_from_txt.grid(row=1, column=0, padx=7, pady=7, sticky='we', columnspan=2)
140+
141+
to_lbl = ttk.Label(self.frame, text='To: ')
142+
to_lbl.grid(row=2, column=0, padx=7, pady=7, columnspan=2)
143+
144+
self.grid_ref_to_txt = ttk.Entry(self.frame)
145+
self.grid_ref_to_txt.grid(row=3, column=0, padx=7, pady=7, sticky='we', columnspan=2)
146+
147+
zoom_lbl = ttk.Label(self.frame, text='Zoom: ')
148+
zoom_lbl.grid(row=4, column=0, padx=7, pady=7)
149+
150+
self.zoom_txt = ttk.Entry(self.frame)
151+
self.zoom_txt.grid(row=4, column=1, padx=7, pady=7, sticky='we')
152+
self.zoom_txt.insert(0, '0')
153+
154+
self.frame.grid(row=2, column=0, columnspan=3, padx=0, pady=0, sticky='nsew')
155+
125156
def hide_view(self):
126157
if self.frame is not None:
127158
self.frame.grid_forget()
128159

129160
def get_input(self) -> dict:
130-
return {}
161+
grid_ref_input = {'from': self.grid_ref_from_txt.get(), 'to': self.grid_ref_to_txt.get()}
162+
163+
try:
164+
grid_ref_input['zoom'] = int(self.zoom_txt.get())
165+
except ValueError:
166+
raise ValueError('Zoom must be an integer')
167+
168+
return grid_ref_input
131169

132170

133171
class DownloadDynmapTileFrame(View):

0 commit comments

Comments
 (0)