Spacetraders/mainwindow.py
2025-10-15 20:23:50 -04:00

127 lines
4.2 KiB
Python

#builtins
import tkinter as Tk
from tkinter import ttk as Ttk
from tkinter import font
from os import path
#packages
from PIL import ImageTk, Image
#custom stuff
from storage import readSave, save
import api, ui
#load icon
icoPng = Image.open(path.join("assets","babynet.png"))
#initialize root
root = Tk.Tk()
root.title("SPASESHUPS")
ico = ImageTk.PhotoImage(icoPng)
root.wm_iconphoto(False, ico)
#add the three main sections
#header contains auth keys and such
headerFrame = ui.Container(root, freezeCols=1)
headerFrame.widget.grid(row=0, column=0, sticky='new')
#requestFrame is the main body where the request buttons will be
requestFrame = ui.Container(root)
requestFrame.widget.grid(row=1, column=0, sticky='nesw')
#response frame is where the output lives
responseFrame = ui.Container(root)
responseFrame.widget.grid(row=2, column=0, sticky="snew")
#populate the header
accToken = Tk.StringVar()
accAuthBox = ui.SavedEntryBox(headerFrame.widget, 'acc_token', accToken)
Ttk.Label(headerFrame.widget, text="ACCOUNT TOKEN:").grid(row=0, column=0, sticky='e')
accAuthBox.widget.grid(row=0, column=1, columnspan=5, sticky='ew')
agentToken = Tk.StringVar()
agentAuthBox = ui.SavedEntryBox(headerFrame.widget, 'active_agent_token', agentToken)
Ttk.Label(headerFrame.widget, text="AGENT TOKEN:").grid(row=1, column=0, sticky='e')
agentAuthBox.widget.grid(row=1, column=1, columnspan=5, sticky='ew')
#freeze the label column
headerFrame.widget.columnconfigure(0, weight=0)
#populate and style the response frame
resLabel = Tk.Text(responseFrame.widget, background='grey17', foreground='white')
resLabel.grid(row=0, column=0, sticky='news')
resLabel.insert('1.0', "Awaiting call...")
resLabel['state'] = 'disabled'
resScrollbarV = Ttk.Scrollbar(responseFrame.widget, orient='vertical', command=resLabel.yview)
resLabel.configure(yscrollcommand=resScrollbarV.set)
resScrollbarV.grid(row=0, column=1, rowspan=2, sticky='ns')
def updateResponse(newText):
resLabel['state'] = 'normal'
resLabel.delete('1.0', 'end')
resLabel.insert('1.0', newText)
resLabel['state'] = 'disabled'
Ttk.Style().configure('Shaded.TFrame', background='grey17')
responseFrame.widget.configure(borderwidth=2, relief='groove', style='Shaded.TFrame')
#populate the request frame
makeFrame = ui.RequesterFrame(requestFrame.widget, 'CREATE')
makeFrame.widget.grid(row=0, column=0, sticky='nsew')
#new agent
callsignVar = Tk.StringVar()
factionVar = Tk.StringVar()
ui.FieldLabel(makeFrame.widget, 'Callsign:', 1)
ui.EntryBox(makeFrame.widget, callsignVar).widget.grid(row=1, column=2, sticky='ew')
ui.FieldLabel(makeFrame.widget, 'Faction Name:', 2)
ui.EntryBox(makeFrame.widget, factionVar).widget.grid(row=2, column=2, sticky='ew')
def newAgent(args):
resCode, resData = api.newAgent(*args)
updateResponse(ui.formatResponse(resCode, resData))
try:
agentToken.set(resData['token'])
if int(resCode) < 300:
agentAuthBox.saveValue()
except:
pass
return resCode, resData
newAgentButton = ui.ApiButton(makeFrame.widget, 'NEW AGENT', 3, newAgent, (accToken, callsignVar, factionVar))
viewFrame = ui.RequesterFrame(requestFrame.widget, 'VIEW')
viewFrame.widget.grid(row=0, column=1, sticky='nesw')
#view agent
def viewAgent(args):
resCode, resData = api.viewAgent(*args)
updateResponse(ui.formatResponse(resCode, resData))
return resCode, resData
viewAgentButton = ui.ApiButton(viewFrame.widget, 'VIEW AGENT', 2, viewAgent, (agentToken))
useFrame = ui.RequesterFrame(requestFrame.widget, 'USE')
useFrame.widget.grid(row=0, column=2, sticky='nsew')
#finalize the layout
makeFrame.finalize()
useFrame.finalize()
viewFrame.finalize()
headerFrame.finalize()
requestFrame.finalize()
#response frame finalize doesnt help much so do it manually
responseFrame.widget.grid_rowconfigure(0, weight=1)
responseFrame.widget.grid_columnconfigure(0, weight=1)
responseFrame.widget.grid_columnconfigure(1, weight=0)
for child in root.winfo_children():
child.grid_configure(padx = 5, pady = 5)
#sort out scaling for the top 3 frames
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=0)
root.rowconfigure(1, weight=1)
root.rowconfigure(2, weight=1, minsize=300)
#aaaand go
root.mainloop()