Module pyspecan.controller.tkGUI.panels

Classes

class PanelController (parent,
panel: PanelView,
plots)
Expand source code
class PanelController:
    def __init__(self, parent, panel: PanelView, plots):
        self.log = logger.new("tkGUI.Panels")
        self.parent = parent
        self.panel = panel
        self.rows = []
        self.cols = {}
        self.view = {}
        self.active = []
        self.plots = plots

        self.panel.btn_row.configure(command=self.add_row)
        self.add_row()

    def add_row(self):
        if len(self.rows) > 5:
            return
        frame = ttk.LabelFrame(self.panel.main, text=f"Row {len(self.rows)}")
        child = PanelChild(self, frame)
        self.rows.append(child)
        self.cols[child] = []
        self.view[child] = {}

        self.panel.main.add(frame, weight=1)

        child.btn_close.configure(command=lambda c=child: self.del_row(c))
        child.btn_col.configure(command=lambda c=child: self.add_col(c))

        self.add_col(child)
        self.panel.update_layout()

    def del_row(self, child: PanelChild):
        idx = self.rows.index(child)
        del self.cols[child]
        self.panel.main.remove(child.master)
        self.rows.pop(idx).root.destroy()

    def add_col(self, child: PanelChild):
        if len(self.cols[child]) > 5:
            return
        frame = ttk.LabelFrame(child.main, text=f"Col {len(self.cols[child])}")
        pane = Panel(self, frame)
        self.cols[child].append(pane)
        self.view[child][pane] = None

        child.main.add(frame, weight=1)
        #ttk.Label(self.panes[-1].main, text=f"Row {len(self.parent.panes)}, Col {len(self.panes)}").pack()

        pane.btn_close.configure(command=lambda c=child, p=pane: self.del_col(c,p))
        pane.btn_toggle.configure(command=lambda c=child, p=pane: self.toggle_settings(c,p))
        self.toggle_settings(child, pane)

        self.set_settings(child, pane)
        child.update_layout()

    def del_col(self, child: PanelChild, pane: Panel):
        idx = self.cols[child].index(pane)
        child.main.remove(pane.master)
        plot = self.view[child][pane]
        if plot is not None:
            self.active.pop(self.active.index(plot))
        del self.view[child][pane]
        self.cols[child].pop(idx).root.destroy()
        if len(self.cols[child]) == 0:
            self.del_row(child)

    def toggle_settings(self, child: PanelChild, pane: Panel):
        """Toggle settings panel visibility"""
        if pane.fr_sets.winfo_ismapped():
            pane.fr_sets.forget()
            # self.btn_toggle.config(text="Show Settings")
        else:
            pane.fr_sets.pack(side=tk.LEFT, fill=tk.Y, before=pane.fr_main)
            # self.btn_toggle.config(text="Hide Settings")

    def set_settings(self, child: PanelChild, pane: Panel):
        pane.cb_view.config(values=list(k for k in self.plots.keys()))
        pane.cb_view.bind("<<ComboboxSelected>>", lambda e,c=child, p=pane: self.set_view(e,c,p))

    def set_view(self, e, child: PanelChild, pane: Panel):
        view = pane.var_view.get()
        if view in self.plots:
            if self.view[child][pane] is not None:
                pane.wgts = {}
                pane.sets = {}
                for ch in pane.fr_main.winfo_children():
                    ch.destroy()
                for ch in pane.settings.winfo_children():
                    ch.destroy()
                self.del_active(child, pane, self.view[child][pane])
            plot = self.plots[view](self.parent, pane)
            self.view[child][pane] = plot
            self.add_active(child, pane, plot)

    def get_pane(self, child: PanelChild, pane: Panel):
        return self.cols[child][self.cols[child].index(pane)]

    def get_view(self, child: PanelChild, pane: Panel):
        return self.view[child][pane]

    def add_active(self, child, pane, plot):
        self.active.append(plot)

    def del_active(self, child, pane, plot):
        plot.enabled = False
        self.active.pop(self.active.index(plot))

    def on_plot(self, model):
        for view in self.active:
            if not isinstance(view.plotter, BlitPlot):
                view.plotter.cla()
                self.log.info("Cleared plot on %s", type(view).__name__)
            # self.log.trace("Calling plot() on %s", type(view).__name__)
            view.plot(model.samples)

    def on_update_f(self, f):
        for view in self.active:
            if isinstance(view, FreqPlotController):
                self.log.trace("Calling update_f() on %s", type(view).__name__)
                view.update_f(f)

    def on_update_nfft(self, nfft):
        for view in self.active:
            if isinstance(view, FreqPlotController):
                self.log.trace("Calling update_nfft() on %s", type(view).__name__)
                view.update_nfft(nfft)

    def on_update_fs(self, Fs):
        for view in self.active:
            self.log.trace("Calling update_Fs() on %s", type(view).__name__)
            view.update_fs(Fs)

    def on_reset(self):
        for view in self.active:
            self.log.trace("Calling reset() on %s", type(view).__name__)
            view.reset()

Methods

def add_active(self, child, pane, plot)
Expand source code
def add_active(self, child, pane, plot):
    self.active.append(plot)
def add_col(self,
child: PanelChild)
Expand source code
def add_col(self, child: PanelChild):
    if len(self.cols[child]) > 5:
        return
    frame = ttk.LabelFrame(child.main, text=f"Col {len(self.cols[child])}")
    pane = Panel(self, frame)
    self.cols[child].append(pane)
    self.view[child][pane] = None

    child.main.add(frame, weight=1)
    #ttk.Label(self.panes[-1].main, text=f"Row {len(self.parent.panes)}, Col {len(self.panes)}").pack()

    pane.btn_close.configure(command=lambda c=child, p=pane: self.del_col(c,p))
    pane.btn_toggle.configure(command=lambda c=child, p=pane: self.toggle_settings(c,p))
    self.toggle_settings(child, pane)

    self.set_settings(child, pane)
    child.update_layout()
def add_row(self)
Expand source code
def add_row(self):
    if len(self.rows) > 5:
        return
    frame = ttk.LabelFrame(self.panel.main, text=f"Row {len(self.rows)}")
    child = PanelChild(self, frame)
    self.rows.append(child)
    self.cols[child] = []
    self.view[child] = {}

    self.panel.main.add(frame, weight=1)

    child.btn_close.configure(command=lambda c=child: self.del_row(c))
    child.btn_col.configure(command=lambda c=child: self.add_col(c))

    self.add_col(child)
    self.panel.update_layout()
def del_active(self, child, pane, plot)
Expand source code
def del_active(self, child, pane, plot):
    plot.enabled = False
    self.active.pop(self.active.index(plot))
def del_col(self,
child: PanelChild,
pane: Panel)
Expand source code
def del_col(self, child: PanelChild, pane: Panel):
    idx = self.cols[child].index(pane)
    child.main.remove(pane.master)
    plot = self.view[child][pane]
    if plot is not None:
        self.active.pop(self.active.index(plot))
    del self.view[child][pane]
    self.cols[child].pop(idx).root.destroy()
    if len(self.cols[child]) == 0:
        self.del_row(child)
def del_row(self,
child: PanelChild)
Expand source code
def del_row(self, child: PanelChild):
    idx = self.rows.index(child)
    del self.cols[child]
    self.panel.main.remove(child.master)
    self.rows.pop(idx).root.destroy()
def get_pane(self,
child: PanelChild,
pane: Panel)
Expand source code
def get_pane(self, child: PanelChild, pane: Panel):
    return self.cols[child][self.cols[child].index(pane)]
def get_view(self,
child: PanelChild,
pane: Panel)
Expand source code
def get_view(self, child: PanelChild, pane: Panel):
    return self.view[child][pane]
def on_plot(self, model)
Expand source code
def on_plot(self, model):
    for view in self.active:
        if not isinstance(view.plotter, BlitPlot):
            view.plotter.cla()
            self.log.info("Cleared plot on %s", type(view).__name__)
        # self.log.trace("Calling plot() on %s", type(view).__name__)
        view.plot(model.samples)
def on_reset(self)
Expand source code
def on_reset(self):
    for view in self.active:
        self.log.trace("Calling reset() on %s", type(view).__name__)
        view.reset()
def on_update_f(self, f)
Expand source code
def on_update_f(self, f):
    for view in self.active:
        if isinstance(view, FreqPlotController):
            self.log.trace("Calling update_f() on %s", type(view).__name__)
            view.update_f(f)
def on_update_fs(self, Fs)
Expand source code
def on_update_fs(self, Fs):
    for view in self.active:
        self.log.trace("Calling update_Fs() on %s", type(view).__name__)
        view.update_fs(Fs)
def on_update_nfft(self, nfft)
Expand source code
def on_update_nfft(self, nfft):
    for view in self.active:
        if isinstance(view, FreqPlotController):
            self.log.trace("Calling update_nfft() on %s", type(view).__name__)
            view.update_nfft(nfft)
def set_settings(self,
child: PanelChild,
pane: Panel)
Expand source code
def set_settings(self, child: PanelChild, pane: Panel):
    pane.cb_view.config(values=list(k for k in self.plots.keys()))
    pane.cb_view.bind("<<ComboboxSelected>>", lambda e,c=child, p=pane: self.set_view(e,c,p))
def set_view(self,
e,
child: PanelChild,
pane: Panel)
Expand source code
def set_view(self, e, child: PanelChild, pane: Panel):
    view = pane.var_view.get()
    if view in self.plots:
        if self.view[child][pane] is not None:
            pane.wgts = {}
            pane.sets = {}
            for ch in pane.fr_main.winfo_children():
                ch.destroy()
            for ch in pane.settings.winfo_children():
                ch.destroy()
            self.del_active(child, pane, self.view[child][pane])
        plot = self.plots[view](self.parent, pane)
        self.view[child][pane] = plot
        self.add_active(child, pane, plot)
def toggle_settings(self,
child: PanelChild,
pane: Panel)
Expand source code
def toggle_settings(self, child: PanelChild, pane: Panel):
    """Toggle settings panel visibility"""
    if pane.fr_sets.winfo_ismapped():
        pane.fr_sets.forget()
        # self.btn_toggle.config(text="Show Settings")
    else:
        pane.fr_sets.pack(side=tk.LEFT, fill=tk.Y, before=pane.fr_main)
        # self.btn_toggle.config(text="Hide Settings")

Toggle settings panel visibility