fonteditor/main.py

128 lines
3.3 KiB
Python

import os
import unicodedata
from exporter import export
from canvas import *
from project import *
##### CONFIG #####
WINDOW_SIZE = (
(1280,720),
(1920,1019)
)[0]
cross_color = (255, 60, 25)
pixel_color = (255,) * 3
##################
project=Project()
def menu_file_open_project_click():
global project
global canvas_editor
file_path = tkinter.filedialog.askopenfilename(
title="Open font project",
filetypes=[("Font project (json)", "*.fontproj")]
)
if file_path == "":
return
# save last path to cache
with open("last_path_cache.txt", "w") as f:
f.write(file_path)
try:
project.load(file_path)
except AttributeError as e:
tkinter.messagebox.showerror("Opening project",f"Project '{file_path}' is invalid: {e}")
except IOError as e:
tkinter.messagebox.showerror("Opening project",f"Failed to open project '{file_path}': {e}")
finally:
canvas_editor.after_project_load()
canvas_editor.draw()
def menu_file_save_project_click():
global project
path=None
if project.loaded:
path=project.path
else:
# show file save dialog
path=filedialog.asksaveasfilename(
title="Save font project",
filetypes=[("Font project (json)", "*.fontproj")],
defaultextension=".fontproj"
)
if path=="":
return
try:
project.save(path)
except IOError as e:
tkinter.messagebox.showerror("Saving project",f"Failed to save project '{path}': {e}")
def menu_file_save_project_as_click():
pass
def button_prev_glyph_click():
canvas_editor.prev_glyph()
def button_next_glyph_click():
canvas_editor.next_glyph()
def number_only_validate(val):
return str.isdigit(val) or val==""
window=tkinter.Tk()
window.title("fonteditor")
window.geometry(f"{WINDOW_SIZE[0]}x{WINDOW_SIZE[1]}")
menubar=tkinter.Menu(window)
menu_file=tkinter.Menu(menubar,tearoff=False)
menu_file.add_command(label="Open project",command=menu_file_open_project_click)
menu_file.add_command(label="Save project",command=menu_file_save_project_click)
menu_file.add_command(label="Save project as",command=menu_file_save_project_as_click)
menubar.add_cascade(label="File",menu=menu_file)
canvas_editor=EditorCanvas(project,window,bg="black")
canvas_editor.pack(side="left")
frame_controls=tkinter.Frame(window)
frame_controls.pack()
canvas_preview=tkinter.Canvas(frame_controls,width=100,height=200,bg="black")
canvas_preview.pack(side="top")
label_glyph_name=tkinter.Label(frame_controls,text="Placeholder")
label_glyph_name.pack(side="top")
frame_nav=tkinter.Frame(frame_controls)
frame_nav.pack(side="top",pady=10)
button_prev_glyph=tkinter.Button(frame_nav,width=10,text="Previous",command=button_prev_glyph_click)
button_prev_glyph.pack(side="left")
button_next_glyph=tkinter.Button(frame_nav,width=10,text="Next",command=button_next_glyph_click)
button_next_glyph.pack(side="left")
frame_glyph_id=tkinter.Frame(frame_controls)
frame_glyph_id.pack(side="top",pady=10)
entry_glyph_id=tkinter.Entry(frame_glyph_id,validate="all",validatecommand=((window.register(number_only_validate)),"%P"))
entry_glyph_id.pack(side="left")
button_glyph_search=tkinter.Button(frame_glyph_id,width=10,text="Search")
button_glyph_search.pack(side="left")
window.config(menu=menubar)
window.mainloop()