diff --git a/kidiff_gui.py b/kidiff_gui.py index 2dfe21b..0ca385d 100644 --- a/kidiff_gui.py +++ b/kidiff_gui.py @@ -34,7 +34,7 @@ fossilProg = '/usr/local/bin/fossil' svnProg = '/usr/bin/svn' plotDir = '/Plots' webDir = '/web' -pcbDraw = '/Users/johnpateman/Kicad/PcbDraw/pcbdraw.py' +# pcbDraw = '~/Kicad/PcbDraw/pcbdraw.py' layerCols = { 'F_Cu': "#952927", diff --git a/tkUI.py b/tkUI.py new file mode 100644 index 0000000..e6ff590 --- /dev/null +++ b/tkUI.py @@ -0,0 +1,197 @@ +#!/usr/local/bin/python3 + +import subprocess +import tkinter as tk +from tkinter import * +from tkinter import filedialog, ttk, messagebox + +global resolution, buttons, root, commitTop, commitBottom + + +def runProgram(): + # Just break out of mainloop to return current variables + root.quit() + + +class Splash(tk.Toplevel): + def __init__(self, parent): + tk.Toplevel.__init__(self, parent) + self.title("Kicad Visual Diff") + action = messagebox.askokcancel(self, + message="Select a *.kicad_pcb file under version control", detail="Git, Fossil or SVN supported") + + self.update() + if action == "cancel": + self.quit() + + +def CurSelect(event): + global commitTop, commitBottom + widget = event.widget + selection = widget.curselection() + picked = widget.get(selection) + source = ((str(widget).split('.'))[1])[-1:] + # TOP window is 3 + if source == '3': + commitTop = picked + # BOTTOM window is 4 + elif source == '4': + commitBottom = picked + + +def runGUI(checkouts_top, prjctName, prjctPath, scm): + + global resolution, buttons, root, commitTop, commitBottom + + checkouts_bottom = checkouts_top[:] + + root = Tk() + + root.configure(background='#ececec') + + root.title("Kicad Visual Diff") + root.geometry('1200x700') + + frame1 = tk.LabelFrame(root, text=scm, width=1000, + height=50, bd=1, background='#ececec') + frame2 = tk.LabelFrame(root, text="Layers", width=200, + height=200, bd=1, background='#ececec') + frame3 = tk.LabelFrame(root, text="Commit 1", width=400, + height=200, bd=1, background='#ececec') + frame4 = tk.LabelFrame(root, text="Commit 2", width=400, + height=200, bd=1, background='#ececec') + frame5 = tk.LabelFrame(root, text="Resolution (dpi)", width=1000, + height=50, bd=0, background='#ececec') + + frame1.grid(row=0, column=0, columnspan=2, padx=5, sticky='N E W S') + frame2.grid(row=1, column=0, rowspan=2, padx=5, sticky='N E W S') + frame3.grid(row=1, column=1, padx=5, sticky='N E W S') + frame4.grid(row=2, column=1, padx=5, sticky='N E W S') + frame5.grid(row=3, column=0, columnspan=2, padx=5, sticky='N E W S') + + root.grid_columnconfigure(0, weight=1) + root.grid_columnconfigure(1, weight=10) + + root.grid_rowconfigure(0, minsize=50, weight=1) + root.grid_rowconfigure(1, minsize=200, weight=2) + root.grid_rowconfigure(2, minsize=200, weight=2) + root.grid_rowconfigure(3, minsize=50, weight=1) + + tk.Label(frame1, text=prjctPath, bg='#ececec').pack(side=LEFT, padx=10) + tk.Label(frame1, text=prjctName, bg='#ececec').pack(side=LEFT, padx=10) + + buttons = {'Top layer': '1', + 'Bottom layer': '1', + 'Paste bottom': '1', + 'Paste top': '1', + 'Silk top': '1', + 'Silk bottom': '1', + 'Mask top': '1', + 'Mask bottom': '1', + 'Edge cuts': '1', + 'Margin': '1', + 'Inner1': '1', + 'Inner2': '1', + 'Dwgs_User': '1', + 'Comments_User': '1', + 'ECO1': '1', + 'ECO2': '1', + 'Fab bottom': '1', + 'Fab top': '1', + 'Adhesive bottom': '1', + 'Adhesive top': '1', + 'Courtyard bottom': '1', + 'Courtyard top': '1' + } + + initLayers = [] + + for b in buttons: + buttons[b] = Variable() + buttons[b].set(1) + l = ttk.Checkbutton( + frame2, text=b, variable=buttons[b], onvalue=1, offvalue=0).pack(anchor='w') + + commitTop = Variable() + listTop = Listbox(frame3, bd=0, selectmode=SINGLE, exportselection=False) + listTop.grid(column=0, row=0, sticky=(N, E, W)) + scrollTop = ttk.Scrollbar(frame3, orient=VERTICAL, command=listTop.yview) + scrollTop.grid(column=1, row=0, sticky=(N, E, W)) + listTop['yscrollcommand'] = scrollTop.set + + listTop.bind('<>', CurSelect) + + commitBottom = Variable() + listBottom = Listbox(frame4, bd=0, selectmode=SINGLE, + exportselection=False) + listBottom.grid(column=0, row=0, sticky=(N, E, W)) + scrollBottom = ttk.Scrollbar( + frame4, orient=VERTICAL, command=listBottom.yview) + scrollBottom.grid(column=1, row=0, sticky=(N, E, W)) + listBottom['yscrollcommand'] = scrollBottom.set + listBottom.bind('<>', CurSelect) + + frame3.grid_columnconfigure(0, weight=1) + frame3.grid_columnconfigure(1, weight=0) + frame3.grid_rowconfigure(0, weight=1) + + frame4.grid_columnconfigure(0, weight=1) + frame4.grid_columnconfigure(1, weight=0) + frame4.grid_rowconfigure(0, weight=1) + + buttonOK = ttk.Button( + frame5, text="OK", command=runProgram, default='active') + buttonOK.grid(column=7, row=0, sticky='w', pady=10) + + buttonCancel = ttk.Button(frame5, text="Cancel", command=quit) + buttonCancel.grid(column=6, row=0, sticky='e', pady=10) + + resolution = IntVar() + resolution.set(300) + + button100 = ttk.Radiobutton( + frame5, text="100", variable=resolution, value=100) + button300 = ttk.Radiobutton( + frame5, text="300", variable=resolution, value=300, ) + button600 = ttk.Radiobutton( + frame5, text="600", variable=resolution, value=600) + button1000 = ttk.Radiobutton( + frame5, text="1000", variable=resolution, value=1000) + + button100.grid(column=1, row=0) + button300.grid(column=2, row=0) + button600.grid(column=3, row=0) + button1000.grid(column=4, row=0) + + frame5.grid_columnconfigure(0, weight=0) + frame5.grid_columnconfigure(1, weight=0) + frame5.grid_columnconfigure(2, weight=0) + frame5.grid_columnconfigure(3, weight=0) + frame5.grid_columnconfigure(4, weight=0) + frame5.grid_columnconfigure(5, weight=5) + frame5.grid_columnconfigure(6, weight=0) + frame5.grid_columnconfigure(7, weight=1) + frame5.grid_rowconfigure(0, weight=1) + + for line in checkouts_top: + listTop.insert(END, line) + + for i in range(1, len(checkouts_top), 2): + listTop.itemconfigure(i, background='#ececec') + + for line in checkouts_bottom: + # listBottom.insert(END, line[0:-1]) + listBottom.insert(END, line) + + for i in range(1, len(checkouts_bottom), 2): + listBottom.itemconfigure(i, background='#ececec') + + for child in root.winfo_children(): + child.grid_configure(padx=5, pady=5) + + root.bind('', runProgram) + + root.update() + root.mainloop() + + return(resolution, commitTop, commitBottom, buttons)