Skip to content

Commit be24948

Browse files
add basic settings dialog
1 parent 19d202c commit be24948

File tree

2 files changed

+89
-63
lines changed

2 files changed

+89
-63
lines changed

src/main.py

+12
Original file line numberDiff line numberDiff line change
@@ -988,12 +988,18 @@ def createMenubar(self):
988988
self.file_menu.add_command(label = 'Open', command = self.openLevel)
989989
self.file_menu.add_command(label = 'Save', command = self.saveLevel)
990990
self.file_menu.add_command(label = 'Save as...', command = self.saveLevelAs)
991+
self.file_menu.add_separator()
992+
self.file_menu.add_command(label = 'Settings', command = self.showSettings)
993+
991994
self.menubar.add_cascade(label = 'File', menu = self.file_menu)
992995

996+
997+
993998
self.help_menu = tk.Menu(self.menubar, tearoff=0)
994999

9951000
self.help_menu.add_command(label = 'Discord', command = lambda *args : webbrowser.open(__links__['discord']))
9961001
self.help_menu.add_command(label = 'About', command = self.showAbout)
1002+
9971003
self.menubar.add_cascade(label = 'Help', menu = self.help_menu)
9981004

9991005
def showAbout(self):
@@ -1008,6 +1014,12 @@ def showAbout(self):
10081014
logo = Image.open(self.getAsset(self.LOGO)),
10091015
)
10101016

1017+
def showSettings(self):
1018+
settings = popups.SettingsDialog(
1019+
self,
1020+
self.settings,
1021+
)
1022+
10111023
def openLevel(self, *args):
10121024
xml = filedialog.askopenfilename(
10131025
defaultextension = '.xml',

src/popups.py

+77-63
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import typing
1111

1212
from scrollframe import ScrollFrame
13+
from settings import Settings
1314

1415
class About(tk.Toplevel):
1516
def __init__(
@@ -174,22 +175,23 @@ def addProgress(self, value):
174175
def close(self):
175176
self.window.destroy()
176177

177-
class settings_dialog():
178-
def __init__(self, root, settings: dict, page=0) -> None:
179-
self.window = tk.Toplevel()
180-
self._settings = copy.deepcopy(settings)
181-
self.settings = copy.deepcopy(settings)
178+
class SettingsDialog(tk.Toplevel):
179+
def __init__(self, root, settings: Settings, page=0) -> None:
180+
super().__init__(root)
181+
182+
self._settings = copy.deepcopy(settings.settings)
183+
self.settings = settings
182184
self.page = page
183185

184-
self.window.geometry('500x400')
186+
self.geometry('500x400')
185187

186-
self.notebook = ttk.Notebook(self.window)
188+
self.notebook = ttk.Notebook(self)
187189
self.tabs = {}
188190
self.load_tabs()
189191
self.notebook.pack(fill='both', expand=True)
190192

191193
self.confirm = {
192-
'frame': ttk.Frame(self.window)
194+
'frame': ttk.Frame(self)
193195
}
194196

195197
self.confirm['ok'] = ttk.Button(self.confirm['frame'], text='Ok', command=lambda : self.close(True))
@@ -199,17 +201,20 @@ def __init__(self, root, settings: dict, page=0) -> None:
199201
self.confirm['cancel'].pack(side='right', padx=2, pady=2)
200202

201203
self.confirm['frame'].pack(anchor='s', fill='x')
204+
205+
self.protocol("WM_DELETE_WINDOW", lambda *args : self.close(False))
202206

203-
self.window.transient(root)
204-
self.window.wait_window()
207+
self.transient(root)
208+
self.wait_window()
205209

206210
def close(self, saveSettings = True):
207-
print(self.settings)
208-
print(self._settings)
211+
# print(self.settings)
212+
# print(self._settings)
209213
if not saveSettings:
210-
self.settings = self._settings
214+
self.settings.settings = self._settings
215+
self.settings.save()
211216

212-
self.window.destroy()
217+
self.destroy()
213218

214219
def load_tabs(self):
215220
# self.paths()
@@ -234,30 +239,28 @@ def browse(entry, type='file', **kwargs):
234239
'frame': ttk.Frame(self.notebook),
235240
'contents': {
236241
'gamepaths': {
237-
'wmw': {
238-
'var': tk.StringVar(value=self.settings['gamedir'])
239-
}
242+
'var': tk.StringVar(value=self.settings.get('game.gamepath'))
240243
},
241244
'level': {
242245
'image': {
243-
'var': tk.StringVar(value=self.settings['default_level']['image'])
246+
'var': tk.StringVar(value=self.settings.get('game.default_level.image'))
244247
},
245248
'xml': {
246-
'var': tk.StringVar(value=self.settings['default_level']['xml'])
249+
'var': tk.StringVar(value=self.settings.get('game.default_level.xml'))
247250
}
248251
}
249252
}
250253
}
251254

252255
self.paths['contents']['gamepaths']['frame'] = ttk.LabelFrame(self.paths['frame'], text='Game paths')
253256
# self.paths['contents']['gamepaths']['wmw']['frame'] = ttk.Frame(self.paths['contents']['gamepaths']['frame'])
254-
self.paths['contents']['gamepaths']['wmw']['label'] = ttk.Label(self.paths['contents']['gamepaths']['frame'], text="Where's My Water?")
255-
self.paths['contents']['gamepaths']['wmw']['entry'] = ttk.Entry(self.paths['contents']['gamepaths']['frame'], textvariable=self.paths['contents']['gamepaths']['wmw']['var'])
256-
self.paths['contents']['gamepaths']['wmw']['button'] = ttk.Button(self.paths['contents']['gamepaths']['frame'], text='Browse', command=lambda : browse(
257-
self.paths['contents']['gamepaths']['wmw']['entry'],
257+
self.paths['contents']['gamepaths']['label'] = ttk.Label(self.paths['contents']['gamepaths']['frame'], text="Where's My Water?")
258+
self.paths['contents']['gamepaths']['entry'] = ttk.Entry(self.paths['contents']['gamepaths']['frame'], textvariable=self.paths['contents']['gamepaths']['var'])
259+
self.paths['contents']['gamepaths']['button'] = ttk.Button(self.paths['contents']['gamepaths']['frame'], text='Browse', command=lambda : browse(
260+
self.paths['contents']['gamepaths']['entry'],
258261
'dir',
259262
title='Choose game directory',
260-
initialdir = self.paths['contents']['gamepaths']['wmw']['var'].get()
263+
initialdir = self.paths['contents']['gamepaths']['var'].get()
261264
)
262265
)
263266

@@ -298,11 +301,11 @@ def browse(entry, type='file', **kwargs):
298301
)
299302
)
300303

301-
self.paths['contents']['gamepaths']['wmw']['label'].grid(row=0, column=0, sticky='e', padx=2, pady=2)
302-
self.paths['contents']['gamepaths']['wmw']['entry'].grid(row=0, column=1, sticky='ew', padx=2, pady=2)
303-
self.paths['contents']['gamepaths']['wmw']['button'].grid(row=0, column=2, padx=2, pady=2)
304+
self.paths['contents']['gamepaths']['label'].grid(row=0, column=0, sticky='e', padx=2, pady=2)
305+
self.paths['contents']['gamepaths']['entry'].grid(row=0, column=1, sticky='ew', padx=2, pady=2)
306+
self.paths['contents']['gamepaths']['button'].grid(row=0, column=2, padx=2, pady=2)
304307

305-
self.paths['contents']['gamepaths']['wmw']['var'].trace('w', lambda name, index, mode: self.updateSettings())
308+
self.paths['contents']['gamepaths']['var'].trace('w', lambda name, index, mode: self.updateSettings())
306309

307310
self.paths['contents']['level']['image']['label'].grid(row=0, column=0, sticky='e', padx=2, pady=2)
308311
self.paths['contents']['level']['image']['entry'].grid(row=0, column=1, sticky='ew', padx=2, pady=2)
@@ -327,43 +330,54 @@ def browse(entry, type='file', **kwargs):
327330
self.notebook.add(self.paths['frame'], text='Paths', sticky='nsew')
328331

329332
def updateSettings(self):
330-
self.settings['gamedir'] = self.paths['contents']['gamepaths']['wmw']['var'].get()
331-
self.settings['default_level']['image'] = self.paths['contents']['level']['image']['var'].get()
332-
self.settings['default_level']['xml'] = self.paths['contents']['level']['xml']['var'].get()
333+
self.settings.set('game.gamepath', self.paths['contents']['gamepaths']['var'].get())
334+
self.settings.set('game.default_level.image', self.paths['contents']['level']['image']['var'].get())
335+
self.settings.set('game.default_level.xml', self.paths['contents']['level']['xml']['var'].get())
333336

334337
if __name__ == '__main__':
338+
test = 'settings'
335339

336-
__version__ = '2.0.0'
337-
__author__ = 'ego-lay-atman-bay'
338-
__credits__ = [
339-
{
340-
'name' : 'wmwpy',
341-
'url' : 'https://github.com/wmw-modding/wmwpy',
342-
'description' : "Where's My Editor? uses wmwpy to read and modify Where's My Water? data, e.g. levels."
343-
},
344-
{
345-
'name' : 'rubice!',
346-
'url' : 'https://www.youtube.com/channel/UCsY-c5mJYWnK6PhrkHqPwig',
347-
'description' : 'Thanks to @rubice for creating the logo.'
348-
},
349-
{
350-
'name' : 'campbellsonic',
351-
'url' : 'https://github.com/campbellsonic',
352-
'description' : 'Thanks to @campbellsonic for helping to read waltex images.'
353-
}
354-
]
340+
if test == 'about':
341+
__version__ = '2.0.0'
342+
__author__ = 'ego-lay-atman-bay'
343+
__credits__ = [
344+
{
345+
'name' : 'wmwpy',
346+
'url' : 'https://github.com/wmw-modding/wmwpy',
347+
'description' : "Where's My Editor? uses wmwpy to read and modify Where's My Water? data, e.g. levels."
348+
},
349+
{
350+
'name' : 'rubice!',
351+
'url' : 'https://www.youtube.com/channel/UCsY-c5mJYWnK6PhrkHqPwig',
352+
'description' : 'Thanks to @rubice for creating the logo.'
353+
},
354+
{
355+
'name' : 'campbellsonic',
356+
'url' : 'https://github.com/campbellsonic',
357+
'description' : 'Thanks to @campbellsonic for helping to read waltex images.'
358+
}
359+
]
355360

356361

357-
app = tk.Tk()
358-
about = About(
359-
app,
360-
title = "About",
361-
author = __author__,
362-
program = "Where's My Editor?",
363-
version = __version__,
364-
description = """Where's My Editor? is a level editor for the Where's My Water? game series.""",
365-
credits = __credits__,
366-
logo = Image.open('assets/images/WME_logo.png'),
367-
)
368-
369-
app.mainloop()
362+
app = tk.Tk()
363+
about = About(
364+
app,
365+
title = "About",
366+
author = __author__,
367+
program = "Where's My Editor?",
368+
version = __version__,
369+
description = """Where's My Editor? is a level editor for the Where's My Water? game series.""",
370+
credits = __credits__,
371+
logo = Image.open('assets/images/WME_logo.png'),
372+
)
373+
374+
app.mainloop()
375+
376+
elif test == 'settings':
377+
settings = Settings('settings.json')
378+
379+
app = tk.Tk()
380+
dialog = SettingsDialog(
381+
app,
382+
settings = settings
383+
)

0 commit comments

Comments
 (0)