#!/ef/efabless/opengalaxy/venv/bin/python3
#
#--------------------------------------------------------
# Symbol Builder for the Open Galaxy project manager
#
#--------------------------------------------------------
# Written by Tim Edwards
# efabless, inc.
# September 21, 2016
# Version 0.1
#--------------------------------------------------------

import tkinter
from tkinter import ttk

class SymbolBuilder(tkinter.Toplevel):
    """Open Galaxy symbol builder."""

    def __init__(self, parent = None, pinlist = None, fontsize = 11, *args, **kwargs):
        '''See the __init__ for Tkinter.Toplevel.'''
        tkinter.Toplevel.__init__(self, parent, *args, **kwargs)
        self.transient(parent)
        self.parent = parent

        s = ttk.Style()
        s.configure('normal.TButton', font=('Helvetica', fontsize), border = 3, relief = 'raised')

        self.title('Open Galaxy Symbol Builder')
        self.pframe = tkinter.Frame(self)
        self.pframe.grid(column = 0, row = 0, sticky = "news")

        self.pframe.pindisplay = tkinter.Text(self.pframe)
        self.pframe.pindisplay.pack(side = 'left', fill = 'y')
        # Add scrollbar to symbol builder window
        self.pframe.scrollbar = ttk.Scrollbar(self.pframe)
        self.pframe.scrollbar.pack(side='right', fill='y')
        # attach symbol builder window to scrollbar
        self.pframe.pindisplay.config(yscrollcommand = self.pframe.scrollbar.set)
        self.pframe.scrollbar.config(command = self.pframe.pindisplay.yview)

        self.bbar = ttk.Frame(self)
        self.bbar.grid(column = 0, row = 1, sticky = "news")
        self.bbar.cancel_button = ttk.Button(self.bbar, text='Cancel',
		command=self.close, style = 'normal.TButton')
        self.bbar.cancel_button.grid(column=0, row=0, padx = 5)

        self.bbar.okay_button = ttk.Button(self.bbar, text='Okay',
		command=self.okay, style = 'normal.TButton')
        self.bbar.okay_button.grid(column=1, row=0, padx = 5)

        typelist = ['input', 'output', 'inout', 'power', 'gnd']
        self.pinlist = []
        self.pvar = []
        self.result = None

        # Each pinlist entry is in the form <pin_name>:<type>
        # where <type> is one of "input", "output", "inout",
        # "power", or "gnd".

        n = 0
        for pin in pinlist:
            p = pin.split(':')
            pinname = p[0]
            pintype = p[1]

            newpvar = tkinter.StringVar(self.pframe.pindisplay)
            self.pinlist.append(pinname)
            self.pvar.append(newpvar)
            newpvar.set(pintype) 
            ttk.Label(self.pframe.pindisplay, text=pinname,
			style = 'normal.TButton').grid(row = n,
			column = 0, padx = 5, sticky = 'nsew')
            ttk.OptionMenu(self.pframe.pindisplay, newpvar,
			pintype, *typelist, style = 'blue.TMenubutton').grid(row = n,
			column = 1, padx = 5, sticky = 'nswe')
            n += 1

        self.grab_set()
        self.initial_focus = self
        self.protocol("WM_DELETE_WINDOW", self.close)
        self.initial_focus.focus_set()
        self.wait_window(self)

    def grid_configure(self, padx, pady):
        pass

    def okay(self):
        # return the new pin list.
        pinlist = []
        n = 0
        for p in self.pinlist:
            pinlist.append(p + ':' + str(self.pvar[n].get()))
            n += 1

        self.withdraw()
        self.update_idletasks()
        self.result = pinlist
        self.close()

    def close(self):
        # remove symbol builder window
        self.parent.focus_set()
        self.destroy()
