blob: 4a89196938bb939bc3aed84cb7c1a3fa6cfcf590 [file] [log] [blame]
emayecs5656b2b2021-08-04 12:44:13 -04001#!/usr/bin/env python3
emayecs5966a532021-07-29 10:07:02 -04002#
3#--------------------------------------------------------
emayecs14748312021-08-05 14:21:26 -04004# Symbol Builder for the project manager
emayecs5966a532021-07-29 10:07:02 -04005#
6#--------------------------------------------------------
7# Written by Tim Edwards
8# efabless, inc.
9# September 21, 2016
10# Version 0.1
11#--------------------------------------------------------
12
13import tkinter
14from tkinter import ttk
15
16class SymbolBuilder(tkinter.Toplevel):
emayecs14748312021-08-05 14:21:26 -040017 """symbol builder."""
emayecs5966a532021-07-29 10:07:02 -040018
19 def __init__(self, parent = None, pinlist = None, fontsize = 11, *args, **kwargs):
20 '''See the __init__ for Tkinter.Toplevel.'''
21 tkinter.Toplevel.__init__(self, parent, *args, **kwargs)
22 self.transient(parent)
23 self.parent = parent
24
25 s = ttk.Style()
26 s.configure('normal.TButton', font=('Helvetica', fontsize), border = 3, relief = 'raised')
27
emayecs14748312021-08-05 14:21:26 -040028 self.title('Symbol Builder')
emayecs5966a532021-07-29 10:07:02 -040029 self.pframe = tkinter.Frame(self)
30 self.pframe.grid(column = 0, row = 0, sticky = "news")
31
32 self.pframe.pindisplay = tkinter.Text(self.pframe)
33 self.pframe.pindisplay.pack(side = 'left', fill = 'y')
34 # Add scrollbar to symbol builder window
35 self.pframe.scrollbar = ttk.Scrollbar(self.pframe)
36 self.pframe.scrollbar.pack(side='right', fill='y')
37 # attach symbol builder window to scrollbar
38 self.pframe.pindisplay.config(yscrollcommand = self.pframe.scrollbar.set)
39 self.pframe.scrollbar.config(command = self.pframe.pindisplay.yview)
40
41 self.bbar = ttk.Frame(self)
42 self.bbar.grid(column = 0, row = 1, sticky = "news")
43 self.bbar.cancel_button = ttk.Button(self.bbar, text='Cancel',
44 command=self.close, style = 'normal.TButton')
45 self.bbar.cancel_button.grid(column=0, row=0, padx = 5)
46
47 self.bbar.okay_button = ttk.Button(self.bbar, text='Okay',
48 command=self.okay, style = 'normal.TButton')
49 self.bbar.okay_button.grid(column=1, row=0, padx = 5)
50
51 typelist = ['input', 'output', 'inout', 'power', 'gnd']
52 self.pinlist = []
53 self.pvar = []
54 self.result = None
55
56 # Each pinlist entry is in the form <pin_name>:<type>
57 # where <type> is one of "input", "output", "inout",
58 # "power", or "gnd".
59
60 n = 0
61 for pin in pinlist:
62 p = pin.split(':')
63 pinname = p[0]
64 pintype = p[1]
65
66 newpvar = tkinter.StringVar(self.pframe.pindisplay)
67 self.pinlist.append(pinname)
68 self.pvar.append(newpvar)
69 newpvar.set(pintype)
70 ttk.Label(self.pframe.pindisplay, text=pinname,
71 style = 'normal.TButton').grid(row = n,
72 column = 0, padx = 5, sticky = 'nsew')
73 ttk.OptionMenu(self.pframe.pindisplay, newpvar,
74 pintype, *typelist, style = 'blue.TMenubutton').grid(row = n,
75 column = 1, padx = 5, sticky = 'nswe')
76 n += 1
77
78 self.grab_set()
79 self.initial_focus = self
80 self.protocol("WM_DELETE_WINDOW", self.close)
81 self.initial_focus.focus_set()
82 self.wait_window(self)
83
84 def grid_configure(self, padx, pady):
85 pass
86
87 def okay(self):
88 # return the new pin list.
89 pinlist = []
90 n = 0
91 for p in self.pinlist:
92 pinlist.append(p + ':' + str(self.pvar[n].get()))
93 n += 1
94
95 self.withdraw()
96 self.update_idletasks()
97 self.result = pinlist
98 self.close()
99
100 def close(self):
101 # remove symbol builder window
102 self.parent.focus_set()
103 self.destroy()