"""
Frontend Systems Page File for AGE-ABM Visual Interface
@Author Meghan Ireland
@Co-Authors Max Hall and Matthew Fleischman
"""
import tkinter as tk
from tkinter import ttk
import customtkinter
from utils.helper_methods import getting_name_checker
[docs]
class Systems:
"""This class defines a sytem page
"""
def __init__(self, ec_app_ui):
"""Defines the variables and widgets for systesms page.
"""
self.ec_app_ui = ec_app_ui
self.class_component = tk.BooleanVar()
self.start = tk.BooleanVar()
self.end = tk.BooleanVar()
self.generators = tk.BooleanVar()
self.frequency = tk.BooleanVar()
self.selected_primitive = tk.StringVar()
self.current_generator = ""
self.clicked_attribute = ""
self.clicked_generator_to_delete = ""
self.gen_added = False
self.attr_number = None
self.temp_comp_arr = None
### Frames ###
self.frame_small = tk.Frame(master = self.ec_app_ui.page_frame, bg=self.ec_app_ui.frame_colour
, height = self.ec_app_ui.button_height
, width = 3*self.ec_app_ui.button_width//2)
### Titles ###
self.label_systems_title = tk.Label(self.ec_app_ui.title_frame, text="Systems"
, font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour
, fg=self.ec_app_ui.label_text_colour)
self.label_systems_add_new = tk.Label(self.ec_app_ui.title_frame, text="Add New System"
, font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour
, fg=self.ec_app_ui.label_text_colour)
self.label_systems_edit = tk.Label(self.ec_app_ui.title_frame, text="Edit System"
, font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour
, fg=self.ec_app_ui.label_text_colour)
self.label_system_gen_title = tk.Label(self.ec_app_ui.title_frame, text="Add Generator"
, font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour
, fg=self.ec_app_ui.label_text_colour)
self.label_system_gen_value_title = tk.Label(self.ec_app_ui.title_frame, text="Add Generator Default Value"
, font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour
, fg=self.ec_app_ui.label_text_colour)
### Labels ###
self.label_systems_name = tk.Label(self.ec_app_ui.page_frame, text="System Name:"
, font=self.ec_app_ui.font2, justify="left", bg=self.ec_app_ui.frame_colour
, fg=self.ec_app_ui.label_text_colour)
self.label_systems_description = tk.Label(self.ec_app_ui.page_frame, text="Description:"
, font=self.ec_app_ui.font2, justify="left", bg=self.ec_app_ui.frame_colour
, fg=self.ec_app_ui.label_text_colour)
self.label_system_generator_name = tk.Label(self.ec_app_ui.page_frame
, text="Generator Name:", font=self.ec_app_ui.font2, justify="left"
, bg=self.ec_app_ui.frame_colour, fg=self.ec_app_ui.label_text_colour)
self.label_system_generator_description = tk.Label(self.ec_app_ui.page_frame
, text="Description:", font=self.ec_app_ui.font2, justify="left"
, bg=self.ec_app_ui.frame_colour,fg=self.ec_app_ui.label_text_colour)
self.label_system_add_attribute = tk.Label(self.ec_app_ui.page_frame, text="Add Attribute"
, font=self.ec_app_ui.font3_underlined, justify="left",bg=self.ec_app_ui.frame_colour
, fg=self.ec_app_ui.label_text_colour)
self.label_system_attribute_name = tk.Label(self.ec_app_ui.page_frame
, text="Attribute Name:", font=self.ec_app_ui.font2, justify="left"
, bg=self.ec_app_ui.frame_colour,fg=self.ec_app_ui.label_text_colour)
self.label_system_attribute_type = tk.Label(self.ec_app_ui.page_frame
, text="Attribute Type:", font=self.ec_app_ui.font2, justify="left"
, bg=self.ec_app_ui.frame_colour, fg=self.ec_app_ui.label_text_colour)
self.label_systems_generator_return = tk.Label(self.ec_app_ui.page_frame
, text="Return Value Code:", font=self.ec_app_ui.font2, justify="left"
, bg=self.ec_app_ui.frame_colour,fg=self.ec_app_ui.label_text_colour)
### Entry ###
self.entry_system_name = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_system_description = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_system_start = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_system_end = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_system_frequency = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_system_generator_name = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_system_generator_description = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, fg_color = self.ec_app_ui.entry_colour, width = self.ec_app_ui.entry_width
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_system_attribute_name = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2 ,height=self.ec_app_ui.entry_height
, fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_system_attr_val = customtkinter.CTkTextbox(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=4*self.ec_app_ui.entry_height
, fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width
, text_color = self.ec_app_ui.entry_text_colour)
### Buttons ###
self.button_systems_add = customtkinter.CTkButton(self.frame_small
, hover_color=self.ec_app_ui.highlight_colour, text="Add", command=self.btn_systems_add
, fg_color=self.ec_app_ui.comp_btn_colour, font = self.ec_app_ui.font2
, height=self.ec_app_ui.button_height, width=self.ec_app_ui.button_width/2)
self.button_systems_edit = customtkinter.CTkButton(self.frame_small
, hover_color=self.ec_app_ui.highlight_colour, text="Edit"
, command=self.btn_systems_edit, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height=self.ec_app_ui.button_height
, width=self.ec_app_ui.button_width/2)
self.button_systems_remove = customtkinter.CTkButton(self.frame_small
, hover_color=self.ec_app_ui.highlight_colour, text="Remove"
, command=self.btn_systems_remove, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height=self.ec_app_ui.button_height
, width=self.ec_app_ui.button_width/2)
self.button_systems_save = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="✔️ Save System"
, command=self.btn_systems_save, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width = self.ec_app_ui.entry_width)
self.button_systems_save_edited = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="✔️ Save System"
, command=self.btn_systems_save_edited, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width = self.ec_app_ui.entry_width)
self.button_systems_generators = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="Add Generator"
, command=self.btn_systems_add_generator, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width = self.ec_app_ui.entry_width)
self.button_systems_done = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="Done"
, command=self.btn_systems_done, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width = self.ec_app_ui.entry_width)
self.button_system_complete_generator = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="✔️Generator Complete"
, command=self.btn_system_complete_generator, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2,height = self.ec_app_ui.button_height
, width = self.ec_app_ui.entry_width)
self.button_system_save_attribute = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="Save Attribute"
, command=self.btn_system_save_attribute, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2,height = self.ec_app_ui.button_height
, width = self.ec_app_ui.entry_width)
self.button_system_add_new_attribute = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="➕Add New Attribute"
, command=self.btn_system_add_new_attribute, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2,height = self.ec_app_ui.button_height
, width = self.ec_app_ui.entry_width)
self.button_generator_save = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="Save Generator"
, command=self.btn_generator_save, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height = self.ec_app_ui.button_height
, width = self.ec_app_ui.entry_width)
self.button_agents_insert_attr = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="Insert"
, command=self.btn_system_insert_attr, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width=self.ec_app_ui.entry_width)
self.button_system_save_attr_val = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="Save Value"
, command=self.btn_systems_attr_complete, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width=self.ec_app_ui.entry_width)
self.button_system_delete_gen = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="🗑️ Delete Generator"
, command=self.btn_system_delete_gen, fg_color=self.ec_app_ui.comp_btn_colour
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width=self.ec_app_ui.entry_width)
self.button_systems_add_execute = customtkinter.CTkButton(self.ec_app_ui.page_frame
, hover_color=self.ec_app_ui.highlight_colour, text="Edit Execute Function", command=self.btn_execute_func
, fg_color=self.ec_app_ui.comp_btn_colour, font = self.ec_app_ui.font2
, height=self.ec_app_ui.button_height, width=self.ec_app_ui.button_width/2)
### Dropdowns ###
self.dropdown_system_attribute_type = customtkinter.CTkOptionMenu(self.ec_app_ui.page_frame
, variable = self.selected_primitive,values=["int", "float", "bool"]
, button_hover_color= self.ec_app_ui.highlight_colour
, fg_color = self.ec_app_ui.dropdown_menu_color
, button_color=self.ec_app_ui.comp_btn_colour, height = self.ec_app_ui.entry_height
, width=self.ec_app_ui.entry_width, font = self.ec_app_ui.font2)
### Table for Systems ###
self.systems_frame = customtkinter.CTkFrame(self.ec_app_ui.page_frame
, fg_color=self.ec_app_ui.tbl_colour
, height = 300, width = 580)
self.vertical_scroll3 = tk.Scrollbar(self.systems_frame)
self.systems_tbl = ttk.Treeview(self.systems_frame,padding = 5,height = 8
, yscrollcommand=self.vertical_scroll3.set)
self.systems_tbl['columns'] = ('Name', 'Description')
self.systems_tbl.column("#0", width=0, stretch='NO')
self.systems_tbl.column("Name",anchor='center', width=190)
self.systems_tbl.column("Description",anchor='center',width=380)
self.systems_tbl.heading("#0",text="",anchor='center')
self.systems_tbl.heading("Name",text="Name",anchor='center')
self.systems_tbl.heading("Description",text="Description",anchor='center')
self.systems_tbl.bind("<<TreeviewSelect>>", self.display_selected_system)
### Table for generators ###
self.generators_frame = customtkinter.CTkFrame(self.ec_app_ui.page_frame
, fg_color=self.ec_app_ui.tbl_colour
, height = 200
, width = self.ec_app_ui.window_width/3)
self.vertical_scroll2 = tk.Scrollbar(self.generators_frame)
self.generators_tbl = ttk.Treeview(self.generators_frame,padding = 5,height = 4
, yscrollcommand=self.vertical_scroll2.set)
self.generators_tbl['columns'] = 'Name'
self.generators_tbl.column("#0", width=0, stretch='NO')
self.generators_tbl.column("Name",anchor='center', width=300)
self.generators_tbl.heading("#0",text="",anchor='center')
self.generators_tbl.heading("Name",text="Added Generators",anchor='center')
self.generators_tbl.bind("<<TreeviewSelect>>", self.display_selected_generator)
### Check box ###
self.checkbox_systems_start = customtkinter.CTkCheckBox(self.ec_app_ui.page_frame,
border_color=self.ec_app_ui.tbl_colour, font = self.ec_app_ui.font2,
text_color = self.ec_app_ui.button_font_colour,
command = self.on_tick_start,hover_color=self.ec_app_ui.highlight_colour,
variable=self.start, text = "Start", fg_color = self.ec_app_ui.check_color)
self.checkbox_systems_end = customtkinter.CTkCheckBox(self.ec_app_ui.page_frame,
border_color=self.ec_app_ui.tbl_colour, font = self.ec_app_ui.font2,
text_color = self.ec_app_ui.button_font_colour,
command = self.on_tick_end,hover_color=self.ec_app_ui.highlight_colour,
variable=self.end, text = "End", fg_color = self.ec_app_ui.check_color)
self.checkbox_systems_frequency = customtkinter.CTkCheckBox(self.ec_app_ui.page_frame,
border_color=self.ec_app_ui.tbl_colour, font = self.ec_app_ui.font2,
text_color = self.ec_app_ui.button_font_colour,
command = self.on_tick_frequency,hover_color=self.ec_app_ui.highlight_colour,
variable=self.frequency, text = "Frequency", fg_color = self.ec_app_ui.check_color)
self.checkbox_systems_generators = customtkinter.CTkCheckBox(self.ec_app_ui.page_frame,
border_color=self.ec_app_ui.tbl_colour, font = self.ec_app_ui.font2,
text_color = self.ec_app_ui.button_font_colour,
hover_color=self.ec_app_ui.highlight_colour,
command = self.on_tick_generator, variable=self.generators,
text = "Generators ", fg_color = self.ec_app_ui.check_color)
### Table for generator attributes ###
self.gen_attr_frame = customtkinter.CTkFrame(self.ec_app_ui.page_frame
, fg_color=self.ec_app_ui.tbl_colour
, height = 200
, width = self.ec_app_ui.window_width/6)
self.vertical_scroll = tk.Scrollbar(self.gen_attr_frame)
self.gen_attr_tbl = ttk.Treeview(self.gen_attr_frame,padding = 5,height=4
, yscrollcommand=self.vertical_scroll.set)
self.gen_attr_tbl['columns'] = 'Attribute'
self.gen_attr_tbl.column("#0", width=0, stretch='NO')
self.gen_attr_tbl.column("Attribute",anchor='center',width=300)
self.gen_attr_tbl.heading("#0",text="",anchor='center')
self.gen_attr_tbl.heading("Attribute",text="Attribute",anchor='center')
self.gen_attr_tbl.bind("<<TreeviewSelect>>", self.display_selected_attribute)
### Selection Variable ###
self.selected_system = ""
[docs]
def clear_systems(self):
"""Clears the systems page
"""
self.label_systems_title.grid_forget()
self.systems_frame.grid_forget()
self.systems_tbl.pack_forget()
self.button_systems_add.grid_forget()
self.button_systems_edit.grid_forget()
self.button_systems_remove.grid_forget()
self.label_systems_edit.grid_forget()
[docs]
def clear_add_system(self):
"""Clears adding a system's page
"""
self.label_systems_add_new.grid_forget()
self.label_systems_name.grid_forget()
self.entry_system_name.grid_forget()
self.label_systems_description.grid_forget()
self.entry_system_description.grid_forget()
self.button_systems_save.grid_forget()
self.button_systems_save_edited.grid_forget()
self.button_systems_generators.grid_forget()
self.entry_system_frequency.grid_forget()
self.entry_system_end.grid_forget()
self.entry_system_start.grid_forget()
self.checkbox_systems_generators.grid_forget()
self.checkbox_systems_start.grid_forget()
self.checkbox_systems_end.grid_forget()
self.checkbox_systems_frequency.grid_forget()
self.button_systems_done.grid_forget()
self.gen_attr_frame.grid_forget()
self.gen_attr_tbl.pack_forget()
self.button_agents_insert_attr.grid_forget()
self.entry_system_attr_val.grid_forget()
self.button_system_save_attr_val.grid_forget()
self.label_system_generator_name.grid_forget()
self.label_system_generator_description.grid_forget()
self.entry_system_generator_description.grid_forget()
self.entry_system_generator_name.grid_forget()
self.button_system_add_new_attribute.grid_forget()
self.button_system_complete_generator.grid_forget()
self.generators_frame.grid_forget()
self.generators_tbl.pack_forget()
self.button_system_delete_gen.grid_forget()
self.frame_small.grid_forget()
self.label_system_gen_title.grid_forget()
self.label_system_gen_value_title.grid_forget()
self.button_systems_add_execute.grid_forget()
self.label_system_add_attribute.grid_forget()
self.label_system_attribute_name.grid_forget()
self.label_system_add_attribute.grid_forget()
self.entry_system_attribute_name.grid_forget()
self.label_system_attribute_type.grid_forget()
self.dropdown_system_attribute_type.grid_forget()
self.button_system_save_attribute.grid_forget()
### Systems Tab ###
[docs]
def systems_tab_btn(self):
"""Sets up the systems page with the table
"""
### Enable buttons and entry boxes ###
self.entry_system_name.configure(state = "normal")
self.entry_system_description.configure(state = "normal")
self.entry_system_start.configure(state = "normal")
self.entry_system_end.configure(state = "normal")
self.entry_system_frequency.configure(state = "normal")
self.checkbox_systems_start.configure(state = "normal")
self.checkbox_systems_end.configure(state = "normal")
self.checkbox_systems_frequency.configure(state = "normal")
self.entry_system_name.delete(0, 'end')
self.entry_system_description.delete(0, 'end')
self.entry_system_start.delete(0, 'end')
self.entry_system_end.delete(0, 'end')
self.entry_system_frequency.delete(0, 'end')
self.ec_app_ui.clear_all()
self.selected_system = ""
self.gen_added = False
id5 = 0
for sys in self.systems_tbl.get_children():
self.systems_tbl.delete(sys)
system_names = self.ec_app_ui.new_model.get_list_systems()
for sys in system_names:
system = self.ec_app_ui.new_model.get_system(sys)
self.systems_tbl.insert(parent='',index="end",iid=id5,
text='',values=(sys, system.get_description()))
id5+=1
self.label_systems_title.grid(row = 0, column = 0)
### Table ###
self.systems_frame.grid(row = 0,columnspan = 3,column = 0,pady = (40,5))
self.vertical_scroll3.pack(side="right", fill="y", padx=(0,5), pady=5)
self.systems_tbl.pack(fill = "x", padx = (5,0), pady = 5)
### Add, edit, remove buttons ###
self.frame_small.grid(row=2, column = 0, columnspan=3,pady = 5)
self.button_systems_add.grid(row = 0,column = 0,padx = 5)
self.button_systems_edit.grid(row = 0, column = 1,padx = 5)
self.button_systems_remove.grid(row = 0, column = 2,padx = 5)
self.button_systems_add_execute.grid(row = 3, column = 0, columnspan=3)
[docs]
def btn_systems_add(self):
"""Method when user clicks add system, places widgets
user will need to do so.
"""
self.ec_app_ui.clear_all()
self.entry_system_name.configure(state = "normal")
self.entry_system_description.configure(state = "normal")
self.entry_system_name.delete(0, 'end')
self.entry_system_description.delete(0, 'end')
### Title ###
self.label_systems_add_new.grid(row = 0, column = 0)
### Check if a generator has been added ###
if self.gen_added:
### Name ###
self.entry_system_name.insert(0, self.selected_system)
self.entry_system_description.insert(0,
self.ec_app_ui.new_model.get_system(str(self.selected_system)).get_description())
self.generators_frame.grid(row = 0, column = 3,padx = 5, pady = 5, sticky="W"
, rowspan = 5)
self.vertical_scroll2.pack(side="right", fill="y", padx=(0,5), pady=5)
self.generators_tbl.pack(fill = "x", padx = (5,0), pady = 5)
### Disable buttons ###
self.entry_system_name.configure(state = "disabled")
self.entry_system_description.configure(state = "disabled")
self.entry_system_start.configure(state = "disabled")
self.entry_system_end.configure(state = "disabled")
self.entry_system_frequency.configure(state = "disabled")
self.checkbox_systems_start.configure(state = "disabled")
self.checkbox_systems_end.configure(state = "disabled")
self.checkbox_systems_frequency.configure(state = "disabled")
system_model = self.ec_app_ui.new_model.get_system(str(self.selected_system))
### Start ###
if system_model.get_start() is not None:
self.checkbox_systems_start.select()
self.entry_system_start.delete(0, 'end')
self.entry_system_start.insert(0, system_model.get_start())
self.on_tick_start()
else:
self.checkbox_systems_start.deselect()
### End ###
if system_model.get_end() is not None:
self.checkbox_systems_end.select()
self.entry_system_end.delete(0, 'end')
self.entry_system_end.insert(0, system_model.get_end())
self.on_tick_end()
else:
self.checkbox_systems_end.deselect()
### Frequency ###
if system_model.get_frequency() is not None:
self.checkbox_systems_frequency.select()
self.entry_system_frequency.delete(0, 'end')
self.entry_system_frequency.insert(0, system_model.get_frequency())
self.on_tick_frequency()
else:
self.checkbox_systems_frequency.deselect()
### Generators ###
self.checkbox_systems_generators.grid(row = 6, column = 0,padx = 150, pady = 5
, sticky="W")
self.checkbox_systems_generators.select()
self.checkbox_systems_generators.configure(state = "disabled")
self.on_tick_generator()
### Add done button ###
self.button_systems_done.grid(row = 7, column = 2,pady = 5)
else:
### Start ###
self.entry_system_start.delete(0, 'end')
self.checkbox_systems_start.deselect()
### End ###
self.entry_system_end.delete(0, 'end')
self.checkbox_systems_end.deselect()
### Frequency ###
self.entry_system_frequency.delete(0, 'end')
self.checkbox_systems_frequency.deselect()
### Generators ###
self.checkbox_systems_generators.deselect()
### Enable entry boxes ###
self.entry_system_name.configure(state = "normal")
self.entry_system_description.configure(state = "normal")
self.entry_system_start.configure(state = "normal")
self.entry_system_end.configure(state = "normal")
self.entry_system_frequency.configure(state = "normal")
self.checkbox_systems_start.configure(state = "normal")
self.checkbox_systems_end.configure(state = "normal")
self.checkbox_systems_frequency.configure(state = "normal")
### Save Button ###
self.button_systems_save.grid(row = 5, column = 2,pady = 5)
### Name ###
self.label_systems_name.grid(row = 0, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_system_name.grid(row = 0, column = 2,pady = 5)
### Description ###
self.label_systems_description.grid(row = 1, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_system_description.grid(row = 1, column = 2,pady = 5)
### Start ###
self.checkbox_systems_start.grid(row = 2, column = 0,padx = 150,pady = 5,sticky="W")
### End ###
self.checkbox_systems_end.grid(row = 3, column = 0,padx = 150,pady = 5,sticky="W")
### Frequency ###
self.checkbox_systems_frequency.grid(row = 4, column = 0,padx = 150,pady = 5,sticky="W")
### Generator Table ###
generator_tbl_id = 0
for sys in self.generators_tbl.get_children():
self.generators_tbl.delete(sys)
if not self.selected_system == "":
generator_names = self.ec_app_ui.new_model.get_list_generators(self.selected_system)
for gen in generator_names:
self.generators_tbl.insert(parent='',index="end",iid=generator_tbl_id,
text='',values=(gen, ))
generator_tbl_id+=1
[docs]
def btn_systems_save(self):
"""Saves the entered system details to the backend.
"""
### Add system to backend ###
self.ec_app_ui.new_model.add_system(self.entry_system_name.get(),
self.entry_system_description.get())
self.selected_system = getting_name_checker(self.entry_system_name.get()
, self.ec_app_ui.new_model.get_list_systems())
if self.checkbox_systems_start.get():
self.ec_app_ui.new_model.edit_system(self.selected_system
, start = self.entry_system_start.get())
if self.checkbox_systems_end.get():
self.ec_app_ui.new_model.edit_system(self.selected_system
, end = self.entry_system_end.get())
if self.checkbox_systems_frequency.get():
self.ec_app_ui.new_model.edit_system(self.selected_system
, frequency = self.entry_system_frequency.get())
### Place Generator check button and make it not selected ###
self.checkbox_systems_generators.grid(row = 6, column = 0,padx = 150,pady = 5,sticky="W")
self.checkbox_systems_generators.deselect()
self.checkbox_systems_generators.configure(state = "normal")
### Add done button ###
self.button_systems_done.grid(row = 7, column = 2,pady = 5)
### Disable Buttons ###
self.entry_system_name.configure(state = "disabled")
self.entry_system_description.configure(state = "disabled")
self.entry_system_start.configure(state = "disabled")
self.entry_system_end.configure(state = "disabled")
self.entry_system_frequency.configure(state = "disabled")
self.checkbox_systems_start.configure(state = "disabled")
self.checkbox_systems_end.configure(state = "disabled")
self.checkbox_systems_frequency.configure(state = "disabled")
### Remove save button ###
self.button_systems_save.grid_forget()
[docs]
def btn_systems_edit(self):
"""Allows a user to edit selected system.
"""
if self.selected_system!= "":
self.ec_app_ui.clear_all()
### Title ###
self.label_systems_edit.grid(row = 0, column = 0)
### Check if a generator has been added ###
### Save Button ###
self.button_systems_save_edited.grid(row = 5, column = 2,pady = 5)
if len(self.ec_app_ui.new_model.get_list_generators(self.selected_system)) != 0:
### Place generator things ###
self.checkbox_systems_generators.select()
self.on_tick_generator()
else:
self.checkbox_systems_generators.deselect()
### Generators ###
self.checkbox_systems_generators.grid(row = 6, column = 0,padx = 150,pady = 5,sticky="W")
self.checkbox_systems_generators.configure(state = "enabled")
### Name ###
self.entry_system_name.configure(state = "normal")
self.entry_system_description.configure(state = "normal")
self.entry_system_name.insert(0, self.selected_system)
self.entry_system_description.insert(0,
self.ec_app_ui.new_model.get_system(str(self.selected_system)).get_description())
self.generators_frame.grid(row = 0, column = 3,padx = 5, pady = 5, sticky="W", rowspan = 5)
self.vertical_scroll2.pack(side="right", fill="y", padx=(0,5), pady=5)
self.generators_tbl.pack(fill = "x", padx = (5,0), pady = 5)
### Enable buttons ###
self.entry_system_name.configure(state = "disabled")
system_model = self.ec_app_ui.new_model.get_system(str(self.selected_system))
### Start ###
if system_model.get_start() is not None:
self.checkbox_systems_start.select()
self.entry_system_start.delete(0, 'end')
self.entry_system_start.insert(0, system_model.get_start())
self.on_tick_start()
else:
self.checkbox_systems_start.deselect()
### End ###
if system_model.get_end() is not None:
self.checkbox_systems_end.select()
self.entry_system_end.delete(0, 'end')
self.entry_system_end.insert(0, system_model.get_end())
self.on_tick_end()
else:
self.checkbox_systems_end.deselect()
### Frequency ###
if system_model.get_frequency() is not None:
self.checkbox_systems_frequency.select()
self.entry_system_frequency.delete(0, 'end')
self.entry_system_frequency.insert(0, system_model.get_frequency())
self.on_tick_frequency()
else:
self.checkbox_systems_frequency.deselect()
### Add done button ###
self.button_systems_done.grid(row = 7, column = 2,pady = 5)
### Name ###
self.label_systems_name.grid(row = 0, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_system_name.grid(row = 0, column = 2,pady = 5)
### Description ###
self.label_systems_description.grid(row = 1, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_system_description.grid(row = 1, column = 2,pady = 5)
### Start ###
self.checkbox_systems_start.grid(row = 2, column = 0,padx = 150,pady = 5,sticky="W")
### End ###
self.checkbox_systems_end.grid(row = 3, column = 0,padx = 150,pady = 5,sticky="W")
### Frequency ###
self.checkbox_systems_frequency.grid(row = 4, column = 0,padx = 150,pady = 5,sticky="W")
### Generator Table ###
generator_tbl_id = 0
for sys in self.generators_tbl.get_children():
self.generators_tbl.delete(sys)
if not self.selected_system == "":
generator_names = self.ec_app_ui.new_model.get_list_generators(self.selected_system)
for gen in generator_names:
self.generators_tbl.insert(parent='',index="end",iid=generator_tbl_id,
text='',values=(gen, ))
generator_tbl_id+=1
[docs]
def btn_systems_save_edited(self):
"""Edited systems save on this method call
"""
self.ec_app_ui.new_model.edit_system(self.selected_system,
description = self.entry_system_description.get())
self.entry_system_name.configure(state= "normal")
### Disable Buttons ###
self.entry_system_name.configure(state = "disabled")
self.entry_system_description.configure(state = "disabled")
self.entry_system_start.configure(state = "disabled")
self.entry_system_end.configure(state = "disabled")
self.entry_system_frequency.configure(state = "disabled")
self.checkbox_systems_start.configure(state = "disabled")
self.checkbox_systems_end.configure(state = "disabled")
self.checkbox_systems_frequency.configure(state = "disabled")
if self.checkbox_systems_start.get():
self.ec_app_ui.new_model.edit_system(self.selected_system
, start = self.entry_system_start.get())
else:
self.ec_app_ui.new_model.get_system(self.selected_system).remove_start()
if self.checkbox_systems_end.get():
self.ec_app_ui.new_model.edit_system(self.selected_system
, end = self.entry_system_end.get())
else:
self.ec_app_ui.new_model.get_system(self.selected_system).remove_end()
if self.checkbox_systems_frequency.get():
self.ec_app_ui.new_model.edit_system(self.selected_system
, frequency = self.entry_system_frequency.get())
else:
self.ec_app_ui.new_model.get_system(self.selected_system).remove_frequency()
self.button_systems_save_edited.grid_forget()
self.button_systems_done.grid(row = 7, column = 2,pady = 5)
[docs]
def btn_systems_remove(self):
"""Allows a user to delete selected system.
"""
self.ec_app_ui.new_model.remove_system(self.selected_system)
self.systems_tab_btn()
[docs]
def display_selected_system(self, *args):
"""Saves the system the user clicked on.
"""
selected_items = self.systems_tbl.selection()
if selected_items:
selected_item = self.systems_tbl.selection()[0]
self.selected_system = self.systems_tbl.item(selected_item)['values'][0]
[docs]
def on_tick_start(self, *args):
"""When user clicks start checkbox
"""
if self.checkbox_systems_start.get():
### Place entry box ###
self.entry_system_start.grid(row = 2, column = 2,pady = 5)
else:
self.entry_system_start.grid_forget()
[docs]
def on_tick_end(self, *args):
"""When user clicks end checkbox
"""
if self.checkbox_systems_end.get():
### Place entry box ###
self.entry_system_end.grid(row = 3, column = 2,pady = 5)
else:
self.entry_system_end.grid_forget()
[docs]
def on_tick_frequency(self, *args):
"""When user clicks frequency checkbox
"""
if self.checkbox_systems_frequency.get():
### Place entry box ###
self.entry_system_frequency.grid(row = 4, column = 2,pady = 5)
else:
self.entry_system_frequency.grid_forget()
[docs]
def on_tick_generator(self, *args):
"""When user clicks generator checkbox
"""
if self.checkbox_systems_generators.get():
### Place button ###
self.button_systems_generators.grid(row = 6, column = 2,pady = 5)
else:
### Remove Button ###
self.button_systems_generators.grid_forget()
[docs]
def btn_systems_add_generator(self):
"""Places widgets which allow users to add a generator
"""
self.ec_app_ui.clear_all()
self.entry_system_generator_name.configure(state = "normal")
self.entry_system_generator_description.configure(state = "normal")
self.entry_system_generator_name.delete(0,'end')
self.entry_system_generator_description.delete(0,'end')
### Title ###
self.label_system_gen_title.grid(row = 0, column = 0)
### Component name ###
self.label_system_generator_name.grid(row = 0, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_system_generator_name.grid(row = 0, column = 2,pady = 5)
### Component description ###
self.label_system_generator_description.grid(row=1, column = 0,padx = 150, pady = 5
, sticky="W")
self.entry_system_generator_description.grid(row=1, column = 2,pady = 5)
### Save component ###
self.button_generator_save.grid(row = 3, column = 2,pady = 5)
### Change the number of attributes ###
self.attr_number = 0
self.label_system_add_attribute.config(text="Add Attribute "+str(self.attr_number))
### Add generators ###
[docs]
def btn_system_save_attribute(self):
"""Saves attribute to component
"""
### system, generator, type, attribute
self.ec_app_ui.new_model.add_gen_attribute(self.selected_system
, self.entry_system_generator_name.get()
, self.entry_system_attribute_name.get()
, self.dropdown_system_attribute_type.get())
### Now that the new attribute has been saved we allow the user to click add new attribute or complete
# Remove widgets:
self.label_system_add_attribute.grid_forget()
self.label_system_attribute_name.grid_forget()
self.label_system_add_attribute.grid_forget()
self.entry_system_attribute_name.grid_forget()
self.label_system_attribute_type.grid_forget()
self.dropdown_system_attribute_type.grid_forget()
### Add new Attribute or complete system button ###
self.button_system_add_new_attribute.grid(row = 4, column = 2,pady = 5)
self.button_system_complete_generator.grid(row = 5, column = 2,pady = 5)
self.entry_system_attribute_name.delete(0, 'end')# This clears the attribute name entry field
self.button_system_save_attribute.grid_forget()# This removes the save attribute button
[docs]
def btn_system_add_new_attribute(self):
"""Places the widgets to allow user to add an attribute
"""
self.entry_system_attribute_name.delete(0, 'end')
self.attr_number += 1
self.label_system_add_attribute.config(text="Add Attribute "+str(self.attr_number))
self.dropdown_system_attribute_type.set("int")
### Attribute name ###
self.label_system_add_attribute.grid(row = 4, column = 0, padx = 150, pady = 5, sticky="W")
self.entry_system_attribute_name.delete(0,'end')
self.label_system_attribute_name.grid(row = 5, column = 0, padx = 150, pady = 5, sticky="W")
self.entry_system_attribute_name.grid(row = 5, column = 2, pady = 5)
### Attribute type ###
self.label_system_attribute_type.grid(row = 6, column = 0, padx = 150, pady = 5, sticky="W")
self.dropdown_system_attribute_type.grid(row = 6, column = 2, pady = 5)
### Save button ###
self.button_system_save_attribute.grid(row = 9, column = 2, pady = 5)
self.button_system_add_new_attribute.grid_forget()
self.button_system_complete_generator.grid_forget()
[docs]
def btn_generator_save(self):
"""Saves the generator
"""
### Add generator to model ###
self.current_generator = self.entry_system_generator_name.get()
self.ec_app_ui.new_model.add_generator(self.selected_system, self.current_generator,
self.entry_system_generator_description.get())
self.button_generator_save.grid_forget()
self.entry_system_generator_name.configure(state= "disabled")
self.entry_system_generator_description.configure(state= "disabled")
### Add new attribute button and complete generator button ###
self.button_system_add_new_attribute.grid(row = 4, column = 2,pady = 5)
self.button_system_complete_generator.grid(row = 5, column = 2,pady = 5)
[docs]
def btn_system_complete_generator(self):
"""Clears entry boxes
"""
self.ec_app_ui.clear_all()
self.label_system_gen_value_title.grid(row=0, column=0)
self.entry_system_name.delete(0, 'end')# This clears the component name entry field
self.entry_system_description.delete(0, 'end')# Clears the component description entry field
self.entry_system_attribute_name.delete(0,'end')
### Clear table ###
for attr in self.gen_attr_tbl.get_children():
self.gen_attr_tbl.delete(attr)
### Populate table ###
attributes_id = 0
system = self.selected_system
for val in self.ec_app_ui.new_model.get_list_gen_attributes(system, self.current_generator):
self.gen_attr_tbl.insert(parent='',index="end",
iid=attributes_id,text='', values=(val,))
attributes_id += 1
self.temp_comp_arr = []
### Place Table ###
self.gen_attr_frame.grid(row = 0, column = 0, rowspan = 6,
pady = 5, padx = (40,5))
self.vertical_scroll.pack(side="right", fill="y", padx=(0,5), pady=5)
self.gen_attr_tbl.pack(fill = "x", padx = (5,0), pady = 5)
### Insert button ###
self.button_agents_insert_attr.grid(row = 6, column = 0, pady = 5, padx = (40,5))
### Entry ###
self.entry_system_attr_val.delete("1.0", 'end-1c')
self.entry_system_attr_val.insert("1.0", "{value} if {condition} else {value}")
self.entry_system_attr_val.grid(row = 1, column = 1, pady = 5, padx = 5)
### Save Button ###
self.button_system_save_attr_val.grid(row = 2, column = 1, pady = 5, padx = 5)
[docs]
def btn_systems_done(self):
"""Clears page and takes user back to systems main page
"""
self.systems_tab_btn()
[docs]
def display_selected_attribute(self, *args):
"""Saves the attribute the user clicked on.
"""
self.clicked_attribute = ""
selected_items = self.gen_attr_tbl.selection()
if selected_items:
selected_item = self.gen_attr_tbl.selection()[0]
self.clicked_attribute = self.gen_attr_tbl.item(selected_item)['values'][0]
[docs]
def btn_system_insert_attr(self):
"""Adds the specified attribute to the attribute value
"""
self.entry_system_attr_val.insert(tk.END, "$"+str(self.clicked_attribute)+"$")
[docs]
def btn_systems_attr_complete(self):
"""Allows Users to add agent level attributes, saves them to backend in required format
"""
value = self.entry_system_attr_val.get("1.0", 'end-1c')
if value != "{value} if {condition} else {value}":
system = self.selected_system
for val in self.ec_app_ui.new_model.get_list_gen_attributes(system, self.current_generator):
specific_string = f"${val}$"
value = value.replace(specific_string, f"{system.upper()}_{self.current_generator.upper()}_{val.upper()}")
self.ec_app_ui.new_model.edit_generator(system, self.current_generator
, return_value = value)
self.entry_system_attr_val.grid_forget()
self.button_system_save_attr_val.grid_forget()
self.selected_system = system
self.gen_added = True
self.btn_systems_add()
[docs]
def display_selected_generator(self, *args):
"""Gets the generator a user has clicked so it can be deleted
"""
### Place Delete button ###
self.button_system_delete_gen.grid(row = 5, column = 3,padx = 5, pady = 5)
### Get selected generator ###
self.clicked_generator_to_delete = ""
selected_items = self.generators_tbl.selection()
if selected_items:
selected_item = self.generators_tbl.selection()[0]
self.clicked_generator_to_delete = self.generators_tbl.item(selected_item)['values'][0]
[docs]
def btn_system_delete_gen(self):
"""Deletes the generator a user has clicked to be removed
"""
self.ec_app_ui.new_model.remove_generator((self.selected_system)
, self.clicked_generator_to_delete)
for sys in self.generators_tbl.get_children():
self.generators_tbl.delete(sys)
generator_tbl_id = 0
if not self.selected_system == "":
generator_names = self.ec_app_ui.new_model.get_list_generators(self.selected_system)
for gen in generator_names:
self.generators_tbl.insert(parent='',index="end",iid=generator_tbl_id,
text='',values=(gen, ))
generator_tbl_id+=1
[docs]
def btn_execute_func(self):
"""Takes user to execute page
"""
if self.selected_system != "":
self.ec_app_ui.execute.opened_from_systems(self.selected_system)