class RoiEditor:
"""
Edit the Configuration File in an inset window
"""
def __init__(self, root: tk.Misc, config: dict | None = None, close_func = None):
self.root = root
self.close_func = close_func
if config is None:
self.config = get_config()
else:
self.config = config
window = ttk.Frame(root, borderwidth=2, relief='ridge')
window.pack(expand=False, pady=2, padx=5)
self.roi_table = ttk.Frame(window, borderwidth=20, relief='raised')
self.roi_table.pack(side='top', fill='both')
frm = ttk.Frame(self.roi_table)
frm.pack(side='top', expand=True, fill='both')
ttk.Label(frm, text='Image ROIs', style="title.TLabel").pack(expand=True, fill='x', padx=10, pady=10)
self.roi_values: list[tuple] = []
self.roi_lines: list[tuple[bool, ttk.Frame]] = []
rois = self.config.get(C.roi)
if rois:
for name, cen_i, cen_j, wid_i, wid_j, det_name in rois:
self.add_roi(name, cen_i, cen_j, wid_i, wid_j, det_name)
ln = ttk.Frame(window, borderwidth=2)
ln.pack(side='top')
ttk.Button(ln, text='Add ROI', command=self.add_roi).pack(side='left', padx=2)
ttk.Button(ln, text='Copy Code', command=self.copy_roi_code).pack(side='left')
ln = ttk.Frame(window, borderwidth=6)
ln.pack(side='bottom', fill='x')
ttk.Button(ln, text='Close', command=self.close).pack(fill='x', expand=True)
def add_roi(self, name: str = '', cen_i: int | str = '', cen_j: int | str = '',
wid_i: int = 30, wid_j: int = 30, det_name: str = 'IMAGE'):
tkvars = (
# label, tkVar, width
('Name:', tk.StringVar(self.root, name), 8),
('Centre_i:', tk.StringVar(self.root, cen_i), 6),
('Centre_j:', tk.StringVar(self.root, cen_j), 6),
('Width_i', tk.IntVar(self.root, wid_i), 6),
('Width_j', tk.IntVar(self.root, wid_j), 6),
('Detector', tk.StringVar(self.root, det_name), 10)
)
def copy_roi():
self.add_roi(*(var[1].get() for var in tkvars))
def copy_code():
vals = [var[1].get() for var in tkvars]
code = "exp.add_roi('{}','{}','{}',{},{},'{}')".format(*vals)
self.root.clipboard_clear()
self.root.clipboard_append(code)
self.roi_values.append(tkvars)
ln = ttk.Frame(self.roi_table, borderwidth=2)
ln.pack(side='top', fill='x')
self.roi_lines.append((True, ln))
for label, tkvar, width in tkvars:
ttk.Label(ln, text=label).pack(side='left', padx=2)
ttk.Entry(ln, textvariable=tkvar, width=width).pack(side='left', padx=2)
ttk.Button(ln, text='X', width=2,
command=lambda index=len(self.roi_lines)-1: self.remove_roi(index)
).pack(side='left', padx=2)
ttk.Button(ln, text='D', width=2, command=copy_roi).pack(side='left', padx=2)
ttk.Button(ln, text='Copy Code', command=copy_code).pack(side='left', padx=2)
def remove_roi(self, index: int):
check, frame = self.roi_lines[index]
frame.pack_forget()
self.roi_lines[index] = (False, frame)
def create_config_rois(self):
rois = [
tuple(var[1].get() for var in roi_values)
for index, roi_values in enumerate(self.roi_values)
if self.roi_lines[index][0] is True and roi_values[0][1].get()
]
return rois
def update_config(self):
self.config[C.roi] = self.create_config_rois()
def copy_roi_code(self):
folder = self.config.get(C.current_dir)
beamline = self.config.get(C.beamline)
rois = self.create_config_rois()
code = f"exp = Experiment('{folder}', instrument='{beamline}')\n"
for roi in rois:
code += "exp.add_roi('{}','{}','{}',{},{},'{}')\n".format(*roi)
self.root.clipboard_clear()
self.root.clipboard_append(code)
def close(self):
self.update_config()
if self.close_func:
self.close_func()
else:
self.root.destroy()