Compare commits
3 Commits
e631d1717e
...
ac8b60c775
Author | SHA1 | Date | |
---|---|---|---|
|
ac8b60c775 | ||
|
fba043a052 | ||
|
3bab4faa46 |
43
.vscode/tasks.json
vendored
43
.vscode/tasks.json
vendored
@@ -29,8 +29,8 @@
|
|||||||
"dependsOn": ["Clean up"]
|
"dependsOn": ["Clean up"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Run (Python)",
|
"label": "Run (Python) [Dirty]",
|
||||||
"detail": "Copy source code from 'src' dir into 'testpython' and start main.py within venv",
|
"detail": "Remove all cache files and start main.py within venv",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"windows": {
|
"windows": {
|
||||||
"command": "./.vscode/tasks/windows/run_python.bat"
|
"command": "./.vscode/tasks/windows/run_python.bat"
|
||||||
@@ -43,10 +43,28 @@
|
|||||||
"isDefault": true
|
"isDefault": true
|
||||||
},
|
},
|
||||||
"problemMatcher": [],
|
"problemMatcher": [],
|
||||||
"dependsOn": ["Clean up", "Install requirements"]
|
"dependsOn": ["Clean up"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Run (Binary)",
|
"label": "Run (Python) [Clean]",
|
||||||
|
"detail": "Needs to be ran before the dirty version can be used. Copy source code from 'src' dir into 'testpython', install requirements and start main.py within venv",
|
||||||
|
"type": "shell",
|
||||||
|
"windows": {
|
||||||
|
"command": "./.vscode/tasks/windows/flush_and_run_python.bat"
|
||||||
|
},
|
||||||
|
"linux": {
|
||||||
|
"command": "bash ./.vscode/tasks/linux/flush_and_run_python.sh"
|
||||||
|
},
|
||||||
|
"group": {
|
||||||
|
"kind": "test",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [],
|
||||||
|
"dependsOn": ["Clean up"]
|
||||||
|
//, "Install requirements"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Run (Binary) [Dirty]",
|
||||||
"detail": "Copy compiled binaries from 'dest/%os%' dir into 'testbinary/%os%' and start it",
|
"detail": "Copy compiled binaries from 'dest/%os%' dir into 'testbinary/%os%' and start it",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"windows": {
|
"windows": {
|
||||||
@@ -62,6 +80,23 @@
|
|||||||
"problemMatcher": [],
|
"problemMatcher": [],
|
||||||
"dependsOn": ["Build"]
|
"dependsOn": ["Build"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": "Run (Binary) [Clean]",
|
||||||
|
"detail": "Needs to be ran before the dirty version can be used. Copy compiled binaries from 'dest/%os%' dir into 'testbinary/%os%' and start it",
|
||||||
|
"type": "shell",
|
||||||
|
"windows": {
|
||||||
|
"command": "./.vscode/tasks/windows/flush_and_run_binary.bat"
|
||||||
|
},
|
||||||
|
"linux": {
|
||||||
|
"command": "bash ./.vscode/tasks/linux/flush_and_run_binary.sh"
|
||||||
|
},
|
||||||
|
"group": {
|
||||||
|
"kind": "test",
|
||||||
|
"isDefault": false
|
||||||
|
},
|
||||||
|
"problemMatcher": [],
|
||||||
|
"dependsOn": ["Build"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": "Configure Setup",
|
"label": "Configure Setup",
|
||||||
"detail": "Configure IF setup file on Windows and .deb package on Linux",
|
"detail": "Configure IF setup file on Windows and .deb package on Linux",
|
||||||
|
12
.vscode/tasks/linux/flush_and_run_binary.sh
vendored
Normal file
12
.vscode/tasks/linux/flush_and_run_binary.sh
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
rm -rf ./testbinary/linux
|
||||||
|
mkdir ./testbinary/linux
|
||||||
|
|
||||||
|
cp -r ./dist/linux/* ./testbinary/linux/
|
||||||
|
|
||||||
|
cd "testbinary/linux/"
|
||||||
|
|
||||||
|
chmod +x "StardewSync"
|
||||||
|
|
||||||
|
"./StardewSync"
|
8
.vscode/tasks/linux/flush_and_run_python.sh
vendored
Normal file
8
.vscode/tasks/linux/flush_and_run_python.sh
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
rm -rf testpython
|
||||||
|
mkdir testpython
|
||||||
|
|
||||||
|
cp -r ./src/* ./testpython/
|
||||||
|
|
||||||
|
source venv/bin/activate && cd ./testpython && python ./main.py && deactivate
|
5
.vscode/tasks/linux/run_binary.sh
vendored
5
.vscode/tasks/linux/run_binary.sh
vendored
@@ -1,10 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
rm -rf ./testbinary/linux
|
|
||||||
mkdir ./testbinary/linux
|
|
||||||
|
|
||||||
cp -r ./dist/linux/* ./testbinary/linux/
|
|
||||||
|
|
||||||
cd "testbinary/linux/"
|
cd "testbinary/linux/"
|
||||||
|
|
||||||
chmod +x "StardewSync"
|
chmod +x "StardewSync"
|
||||||
|
5
.vscode/tasks/linux/run_python.sh
vendored
5
.vscode/tasks/linux/run_python.sh
vendored
@@ -1,8 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
rm -rf testpython
|
|
||||||
mkdir testpython
|
|
||||||
|
|
||||||
cp -r ./src/* ./testpython/
|
|
||||||
|
|
||||||
source venv/bin/activate && cd ./testpython && python ./main.py && deactivate
|
source venv/bin/activate && cd ./testpython && python ./main.py && deactivate
|
7
.vscode/tasks/windows/flush_and_run_binary.bat
vendored
Normal file
7
.vscode/tasks/windows/flush_and_run_binary.bat
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
rmdir /S /Q testbinary\windows
|
||||||
|
mkdir testbinary\windows
|
||||||
|
|
||||||
|
xcopy ".\dist\windows\" ".\testbinary\windows\" /h /i /c /k /e /r /y
|
||||||
|
|
||||||
|
cd ".\testbinary\windows\StardewSync"
|
||||||
|
".\StardewSync.exe"
|
6
.vscode/tasks/windows/flush_and_run_python.bat
vendored
Normal file
6
.vscode/tasks/windows/flush_and_run_python.bat
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
rmdir /S /Q testpython
|
||||||
|
mkdir testpython
|
||||||
|
|
||||||
|
xcopy ".\src\" ".\testpython\" /h /i /c /k /e /r /y
|
||||||
|
|
||||||
|
venv\Scripts\activate && cd .\testpython && python .\main.py && deactivate
|
5
.vscode/tasks/windows/run_binary.bat
vendored
5
.vscode/tasks/windows/run_binary.bat
vendored
@@ -1,7 +1,2 @@
|
|||||||
rmdir /S /Q testbinary\windows
|
|
||||||
mkdir testbinary\windows
|
|
||||||
|
|
||||||
xcopy ".\dist\windows\" ".\testbinary\windows\" /h /i /c /k /e /r /y
|
|
||||||
|
|
||||||
cd ".\testbinary\windows\StardewSync"
|
cd ".\testbinary\windows\StardewSync"
|
||||||
".\StardewSync.exe"
|
".\StardewSync.exe"
|
5
.vscode/tasks/windows/run_python.bat
vendored
5
.vscode/tasks/windows/run_python.bat
vendored
@@ -1,6 +1 @@
|
|||||||
rmdir /S /Q testpython
|
|
||||||
mkdir testpython
|
|
||||||
|
|
||||||
xcopy ".\src\" ".\testpython\" /h /i /c /k /e /r /y
|
|
||||||
|
|
||||||
venv\Scripts\activate && cd .\testpython && python .\main.py && deactivate
|
venv\Scripts\activate && cd .\testpython && python .\main.py && deactivate
|
@@ -11,7 +11,7 @@ from classes.custom.themed_frame import ThemedFrame
|
|||||||
from classes.enums import ConnectionState, Theme
|
from classes.enums import ConnectionState, Theme
|
||||||
from classes.frames.devices import FrameDevices, FrameDevicesEmpty
|
from classes.frames.devices import FrameDevices, FrameDevicesEmpty
|
||||||
from classes.frames.errors import FrameErrorConnection, FrameErrorFirstStart, FrameErrorSavesFolder, FrameErrorUnconfigured
|
from classes.frames.errors import FrameErrorConnection, FrameErrorFirstStart, FrameErrorSavesFolder, FrameErrorUnconfigured
|
||||||
from classes.frames.saves import FrameSaves, FrameSavesEmpty
|
from classes.frames.saves import FrameSaves
|
||||||
from classes.frames.settings import FrameSettings
|
from classes.frames.settings import FrameSettings
|
||||||
from classes.toplevel.welcome import ToplevelWelcome
|
from classes.toplevel.welcome import ToplevelWelcome
|
||||||
from modules.theme_titlebar import theme_title_bar
|
from modules.theme_titlebar import theme_title_bar
|
||||||
@@ -63,18 +63,19 @@ class App(ThemedTk):
|
|||||||
def frame_saves(self):
|
def frame_saves(self):
|
||||||
self.grid_rowconfigure(0, weight=1)
|
self.grid_rowconfigure(0, weight=1)
|
||||||
self.grid_columnconfigure(1, weight=1)
|
self.grid_columnconfigure(1, weight=1)
|
||||||
try:
|
# try:
|
||||||
self.frame_saves_saves = requests.get(f'{configGet("address")}/saves?only_ids=True&sort={(configGet("prefer_saves").split())[1]}', headers={"apikey": configGet("apikey")}, verify=not configGet("allow_self_signed"))
|
# self.frame_saves_saves = requests.get(f'{configGet("address")}/saves?only_ids=True&sort={(configGet("prefer_saves").split())[1]}', headers={"apikey": configGet("apikey")}, verify=not configGet("allow_self_signed"))
|
||||||
except Exception as exp:
|
# except Exception as exp:
|
||||||
messagebox.showerror(title="Connection error", message=f"We could not reach the server to check for save entries\n\n{exp}")
|
# messagebox.showerror(title="Connection error", message=f"We could not reach the server to check for save entries\n\n{exp}")
|
||||||
logger.error(format_exc())
|
# logger.error(format_exc())
|
||||||
self.frame_saves_object = FrameErrorConnection(self)
|
# self.frame_saves_object = FrameErrorConnection(self)
|
||||||
self.frame_saves_object.grid(column=1, row=0, sticky=NSEW)
|
# self.frame_saves_object.grid(column=1, row=0, sticky=NSEW)
|
||||||
return
|
# return
|
||||||
if self.frame_saves_saves.status_code == 200 and isinstance(self.frame_saves_saves.json(), list) is True and len(self.frame_saves_saves.json()) > 0:
|
# if self.frame_saves_saves.status_code == 200 and isinstance(self.frame_saves_saves.json(), list) is True and len(self.frame_saves_saves.json()) > 0:
|
||||||
self.frame_saves_object = FrameSaves(self, self.frame_saves_saves.json(), vscroll=True)
|
# self.frame_saves_object = FrameSaves(self, self.frame_saves_saves.json(), vscroll=True)
|
||||||
else:
|
# else:
|
||||||
self.frame_saves_object = FrameSaves(self, [], vscroll=True)
|
# self.frame_saves_object = FrameSaves(self, [], vscroll=True)
|
||||||
|
self.frame_saves_object = FrameSaves(self, vscroll=True)
|
||||||
self.frame_saves_object.grid(column=1, row=0, sticky=NSEW)
|
self.frame_saves_object.grid(column=1, row=0, sticky=NSEW)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@@ -1,9 +1,15 @@
|
|||||||
from datetime import datetime, timedelta, timezone
|
from datetime import datetime, timedelta, timezone
|
||||||
|
from functools import partial
|
||||||
|
from os import makedirs, path, remove
|
||||||
from tkinter import LEFT, NSEW, Misc, S, W, ttk
|
from tkinter import LEFT, NSEW, Misc, S, W, ttk
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
from zipfile import ZipFile
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
from classes.custom.themed_frame import ThemedFrame
|
from classes.custom.themed_frame import ThemedFrame
|
||||||
from classes.enums import SaveState
|
from classes.enums import SaveState, SaveType
|
||||||
from modules.utils import osname
|
from modules.utils import configGet, osname
|
||||||
|
|
||||||
|
|
||||||
class FrameSave(ThemedFrame):
|
class FrameSave(ThemedFrame):
|
||||||
@@ -18,6 +24,8 @@ class FrameSave(ThemedFrame):
|
|||||||
self.grid_columnconfigure(1, weight=3)
|
self.grid_columnconfigure(1, weight=3)
|
||||||
self.grid_columnconfigure(2, weight=3)
|
self.grid_columnconfigure(2, weight=3)
|
||||||
|
|
||||||
|
self.save_dict = save_dict
|
||||||
|
|
||||||
self.title = ttk.Label(self, text=f'{save_dict["data"]["farmer"]} ({save_dict["type"].value.upper()}, {save_dict["state"].value.upper()})', font=("SunValleyBodyStrongFont", 12, "bold"), justify=LEFT, width=self.widget_width)
|
self.title = ttk.Label(self, text=f'{save_dict["data"]["farmer"]} ({save_dict["type"].value.upper()}, {save_dict["state"].value.upper()})', font=("SunValleyBodyStrongFont", 12, "bold"), justify=LEFT, width=self.widget_width)
|
||||||
self.title.grid(column=0, row=0, padx=9, pady=9, sticky=W)
|
self.title.grid(column=0, row=0, padx=9, pady=9, sticky=W)
|
||||||
|
|
||||||
@@ -39,8 +47,25 @@ class FrameSave(ThemedFrame):
|
|||||||
# self.button_device_rename = ttk.Button(self.buttons, text="Rename", width=11, command=self.button_device_rename_action)
|
# self.button_device_rename = ttk.Button(self.buttons, text="Rename", width=11, command=self.button_device_rename_action)
|
||||||
# self.button_device_rename.grid(column=0, row=0, padx=9, sticky=E)
|
# self.button_device_rename.grid(column=0, row=0, padx=9, sticky=E)
|
||||||
|
|
||||||
#self.button_device_delete_action = partial(self.delete)
|
self.button_synchronize_action = partial(self.nothing)
|
||||||
self.button_synchronize = ttk.Button(self.buttons, text="Synchronize", style="Accent.TButton", width=11) #, command=self.button_device_delete_action)
|
|
||||||
|
if save_dict["type"] is SaveType.LOCAL:
|
||||||
|
if save_dict["state"] is SaveState.RECENT:
|
||||||
|
self.button_synchronize_action = partial(self.upload, save_dict["id"])
|
||||||
|
print(f'{save_dict["id"]}, local, recent')
|
||||||
|
elif save_dict["type"] is SaveType.REMOTE:
|
||||||
|
if save_dict["state"] is SaveState.RECENT:
|
||||||
|
self.button_synchronize_action = partial(self.download, save_dict["id"], save_dict["date"])
|
||||||
|
print(f'{save_dict["id"]}, remote, recent')
|
||||||
|
else:
|
||||||
|
if save_dict["state"] is SaveState.OUTDATED:
|
||||||
|
self.button_synchronize_action = partial(self.download, save_dict["id"], save_dict["date"])
|
||||||
|
print(f'{save_dict["id"]}, both, outdated')
|
||||||
|
elif save_dict["state"] is SaveState.RECENT:
|
||||||
|
self.button_synchronize_action = partial(self.upload, save_dict["id"])
|
||||||
|
print(f'{save_dict["id"]}, both, recent')
|
||||||
|
|
||||||
|
self.button_synchronize = ttk.Button(self.buttons, text="Synchronize", style="Accent.TButton", width=11, command=self.button_synchronize_action)
|
||||||
self.button_synchronize.grid(column=1, row=0, sticky=W)
|
self.button_synchronize.grid(column=1, row=0, sticky=W)
|
||||||
|
|
||||||
if save_dict["state"] is SaveState.CURRENT:
|
if save_dict["state"] is SaveState.CURRENT:
|
||||||
@@ -49,21 +74,51 @@ class FrameSave(ThemedFrame):
|
|||||||
def convert_date(self, year: int, season: int, day: int) -> str:
|
def convert_date(self, year: int, season: int, day: int) -> str:
|
||||||
|
|
||||||
if season == 0:
|
if season == 0:
|
||||||
season = "Spring"
|
season_name = "Spring"
|
||||||
elif season == 1:
|
elif season == 1:
|
||||||
season = "Summer"
|
season_name = "Summer"
|
||||||
elif season == 2:
|
elif season == 2:
|
||||||
season = "Fall"
|
season_name = "Fall"
|
||||||
else:
|
else:
|
||||||
season = "Winter"
|
season_name = "Winter"
|
||||||
|
|
||||||
return "Day {0} of {1}, Year {2}".format(day, season, year)
|
return "Day {0} of {1}, Year {2}".format(day, season_name, year)
|
||||||
|
|
||||||
def convert_playtime(self, seconds: int) -> str:
|
def convert_playtime(self, seconds: int) -> str:
|
||||||
pass
|
return ""
|
||||||
|
|
||||||
def upload(self):
|
def upload(self, id: int):
|
||||||
pass
|
|
||||||
|
|
||||||
def download(self):
|
print(f"Upload pressed for {id}")
|
||||||
|
|
||||||
|
files = [("files", open(path.join(configGet("saves_location"), f'{self.save_dict["data"]["farmer"]}_{self.save_dict["id"]}', f'{self.save_dict["data"]["farmer"]}_{self.save_dict["id"]}'), "rb")), ("files", open(path.join(configGet("saves_location"), f'{self.save_dict["data"]["farmer"]}_{self.save_dict["id"]}', "SaveGameInfo"), "rb"))]
|
||||||
|
response = requests.post(f'{configGet("address")}/saves?{urlencode({"device": configGet("name")})}', files=files, headers={"apikey": configGet("apikey")}, verify=not configGet("allow_self_signed"))
|
||||||
|
|
||||||
|
print(response.status_code)
|
||||||
|
|
||||||
|
self.master.render_saves()
|
||||||
|
|
||||||
|
def download(self, id: int, date: int):
|
||||||
|
|
||||||
|
print(f"Download pressed for {id}")
|
||||||
|
|
||||||
|
response = requests.get(f'{configGet("address")}/saves/{id}/{date}/download', headers={"apikey": configGet("apikey")}, verify=not configGet("allow_self_signed"))
|
||||||
|
|
||||||
|
makedirs("tmp", exist_ok=True)
|
||||||
|
|
||||||
|
with open(path.join("tmp", f"{id}.svsave"), "wb") as file:
|
||||||
|
file.write(response.content)
|
||||||
|
|
||||||
|
makedirs(path.join(configGet("saves_location"), f'{self.save_dict["data"]["farmer"]}_{self.save_dict["id"]}'), exist_ok=True)
|
||||||
|
|
||||||
|
with ZipFile(path.join("tmp", f"{id}.svsave"), "r") as file:
|
||||||
|
file.extractall(path.join(configGet("saves_location"), f'{self.save_dict["data"]["farmer"]}_{self.save_dict["id"]}'))
|
||||||
|
|
||||||
|
remove(path.join("tmp", f"{id}.svsave"))
|
||||||
|
|
||||||
|
print(response.status_code)
|
||||||
|
|
||||||
|
self.master.render_saves()
|
||||||
|
|
||||||
|
def nothing(self):
|
||||||
pass
|
pass
|
@@ -2,6 +2,7 @@ from os import path, walk
|
|||||||
from tkinter import E, NSEW, W, ttk
|
from tkinter import E, NSEW, W, ttk
|
||||||
from traceback import print_exc
|
from traceback import print_exc
|
||||||
import xmltodict
|
import xmltodict
|
||||||
|
import requests
|
||||||
|
|
||||||
from ttkthemes import ThemedTk
|
from ttkthemes import ThemedTk
|
||||||
|
|
||||||
@@ -14,18 +15,41 @@ from modules.utils import configGet
|
|||||||
|
|
||||||
class FrameSaves(ScrollableFrame):
|
class FrameSaves(ScrollableFrame):
|
||||||
|
|
||||||
def __init__(self, master: ThemedTk, saves: list, **kwargs) -> None:
|
def __init__(self, master: ThemedTk, **kwargs) -> None:
|
||||||
|
|
||||||
super().__init__(master, **kwargs)
|
super().__init__(master, **kwargs)
|
||||||
|
|
||||||
master.title("Saves - Stardew Sync")
|
master.title("Saves - Stardew Sync")
|
||||||
|
|
||||||
self.saves = saves
|
self.saves = self.fetch_saves()
|
||||||
self.saves_local = []
|
|
||||||
|
|
||||||
# self["borderwidth"] = 1
|
# self["borderwidth"] = 1
|
||||||
# self["relief"] = "solid"
|
# self["relief"] = "solid"
|
||||||
|
|
||||||
|
master.columnconfigure(1, weight=1)
|
||||||
|
|
||||||
|
if len(self.saves) == 0:
|
||||||
|
|
||||||
|
self.grid_columnconfigure(0, weight=1)
|
||||||
|
self.grid_rowconfigure(0, weight=2)
|
||||||
|
|
||||||
|
master.columnconfigure(1, weight=1)
|
||||||
|
|
||||||
|
self.label = ttk.Label(self, text="No saves found")
|
||||||
|
self.label.grid(column=0, row=0, padx=9, pady=9)
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
self.render_saves(refetch=False)
|
||||||
|
|
||||||
|
def fetch_saves_remote(self) -> list:
|
||||||
|
response = self.frame_saves_saves = requests.get(f'{configGet("address")}/saves?only_ids=True&sort={(configGet("prefer_saves").split())[1]}', headers={"apikey": configGet("apikey")}, verify=not configGet("allow_self_signed"))
|
||||||
|
return response.json() if response.status_code == 200 else []
|
||||||
|
|
||||||
|
def fetch_saves(self) -> list:
|
||||||
|
|
||||||
|
self.saves = self.fetch_saves_remote()
|
||||||
|
|
||||||
for index, entry in enumerate(self.saves):
|
for index, entry in enumerate(self.saves):
|
||||||
|
|
||||||
self.saves[index]["state"] = SaveState.RECENT
|
self.saves[index]["state"] = SaveState.RECENT
|
||||||
@@ -107,20 +131,20 @@ class FrameSaves(ScrollableFrame):
|
|||||||
except:
|
except:
|
||||||
print_exc()
|
print_exc()
|
||||||
|
|
||||||
# Merge local and remote saves.
|
return self.saves
|
||||||
# Maybe add something that indicates availability of an
|
|
||||||
# remote update to pull or local new version to push.
|
|
||||||
|
|
||||||
master.columnconfigure(1, weight=1)
|
def render_saves(self, refetch: bool = True):
|
||||||
|
|
||||||
self.render_saves()
|
if refetch is True:
|
||||||
|
self.saves = self.fetch_saves()
|
||||||
|
|
||||||
def render_saves(self):
|
for widget in self.winfo_children():
|
||||||
|
widget.destroy()
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
for save in self.saves:
|
for save in self.saves:
|
||||||
|
|
||||||
print(save)
|
# print(save)
|
||||||
|
|
||||||
save_frame = FrameSave(self, save_dict=save)
|
save_frame = FrameSave(self, save_dict=save)
|
||||||
save_frame.grid(column=0, row=i, pady=9, padx=9, sticky=W+E)
|
save_frame.grid(column=0, row=i, pady=9, padx=9, sticky=W+E)
|
||||||
@@ -132,18 +156,18 @@ class FrameSaves(ScrollableFrame):
|
|||||||
divider.grid(column=0, row=i+1, pady=9)
|
divider.grid(column=0, row=i+1, pady=9)
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
class FrameSavesEmpty(ThemedFrame):
|
# class FrameSavesEmpty(ThemedFrame):
|
||||||
|
|
||||||
def __init__(self, master: ThemedTk, **kwargs) -> None:
|
# def __init__(self, master: ThemedTk, **kwargs) -> None:
|
||||||
|
|
||||||
super().__init__(master, **kwargs)
|
# super().__init__(master, **kwargs)
|
||||||
|
|
||||||
master.title("Saves - Stardew Sync")
|
# master.title("Saves - Stardew Sync")
|
||||||
|
|
||||||
self.grid_columnconfigure(0, weight=1)
|
# self.grid_columnconfigure(0, weight=1)
|
||||||
self.grid_rowconfigure(0, weight=2)
|
# self.grid_rowconfigure(0, weight=2)
|
||||||
|
|
||||||
master.columnconfigure(1, weight=1)
|
# master.columnconfigure(1, weight=1)
|
||||||
|
|
||||||
self.label = ttk.Label(self, text="No saves found")
|
# self.label = ttk.Label(self, text="No saves found")
|
||||||
self.label.grid(column=0, row=0, padx=9, pady=9)
|
# self.label.grid(column=0, row=0, padx=9, pady=9)
|
Reference in New Issue
Block a user