示例#1
0
class BoardConfig(Frame):
    def __init__(self, master=None, main=None):
        Frame.__init__(self, master)

        self.parent = master
        self.main = main

        self.parent.geometry("336x424")
        self.parent.title(os.getenv("NAME") + " - Board Config")
        self.master.configure(padx=10, pady=10)

        self.intvar = IntVar()

        #Arch
        self.arch_var = IntVar()
        lf_arch = LabelFrame(self.parent, text="Architecture")
        lf_arch.pack(fill=X, expand=True, side=TOP)

        frame_arch = Frame(lf_arch)
        frame_arch.pack(fill=X, expand=True, side=TOP)

        frame_left1 = Frame(frame_arch)
        frame_left1.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right1 = Frame(frame_arch)
        frame_right1.pack(expand=True, fill=BOTH, side=RIGHT)

        self.radioButton_arch_8 = Radiobutton(frame_left1,
                                              text="8-bit ",
                                              anchor="w",
                                              width=10,
                                              value=8,
                                              variable=self.arch_var,
                                              command=self.update_mode)
        self.radioButton_arch_8.pack(fill=X, side=TOP)

        self.radioButton_arch_32 = Radiobutton(frame_right1,
                                               text="32-bit",
                                               anchor="w",
                                               width=10,
                                               value=32,
                                               variable=self.arch_var,
                                               command=self.update_mode)
        self.radioButton_arch_32.pack(fill=X, side=TOP)

        #Mode
        self.mode_var = StringVar()
        lf_mode = LabelFrame(self.parent, text="Programming mode")
        lf_mode.pack(fill=X, expand=True, side=TOP)

        frame_mode = Frame(lf_mode)
        frame_mode.pack(fill=X, expand=True, side=TOP)

        frame_left2 = Frame(frame_mode)
        frame_left2.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right2 = Frame(frame_mode)
        frame_right2.pack(expand=True, fill=BOTH, side=RIGHT)

        self.radioButton_mode_icsp = Radiobutton(frame_left2,
                                                 text="ICSP",
                                                 anchor="w",
                                                 width=10,
                                                 value="icsp",
                                                 variable=self.mode_var,
                                                 command=self.update_mode)
        self.radioButton_mode_icsp.pack(side=TOP, fill=X)

        self.radioButton_mode_bootloader = Radiobutton(
            frame_right2,
            text="Bootloader",
            anchor="w",
            width=10,
            value="bootloader",
            variable=self.mode_var,
            command=self.update_mode)
        self.radioButton_mode_bootloader.pack(side=TOP, fill=X)

        #Bootloader
        self.boot_var = StringVar()
        self.lf_boot = LabelFrame(self.parent, text="Bootloader")
        self.lf_boot.pack(fill=X, expand=True, side=TOP)

        frame_boot = Frame(self.lf_boot)
        frame_boot.pack(fill=X, expand=True, side=TOP)

        frame_left3 = Frame(frame_boot)
        frame_left3.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right3 = Frame(frame_boot)
        frame_right3.pack(expand=True, fill=BOTH, side=RIGHT)

        self.radioButton_bootloader_v1_v2 = Radiobutton(frame_left3,
                                                        text="v1.x or v2.x",
                                                        anchor="w",
                                                        width=10,
                                                        value="v1_v2",
                                                        variable=self.boot_var)
        self.radioButton_bootloader_v1_v2.pack(fill=X, side=TOP, expand=True)
        self.radioButton_bootloader_v4 = Radiobutton(frame_right3,
                                                     text="v4.x",
                                                     anchor="w",
                                                     width=10,
                                                     value="v4",
                                                     variable=self.boot_var)
        self.radioButton_bootloader_v4.pack(fill=X, side=TOP, expand=True)

        #Devices 8bit
        self.dev8_var = StringVar()
        self.lf_dev8 = LabelFrame(self.parent, text="Devices")
        self.lf_dev8.pack(fill=X, expand=True, side=TOP)

        self.frame_8b = Frame(self.lf_dev8)
        self.frame_8b.pack(fill=X, expand=True, side=TOP)

        #Devices 32bit
        self.dev32_var = StringVar()
        self.lf_dev32 = LabelFrame(self.parent, text="Devices")
        self.lf_dev32.pack(fill=X, expand=True, side=TOP)

        self.frame_32b = Frame(self.lf_dev32)
        self.frame_32b.pack(fill=X, expand=True, side=TOP)

        frame_buttons = Frame(self.parent)
        Button(frame_buttons, text="Accept",
               command=self.accept_config).pack(fill=X,
                                                expand=True,
                                                side=RIGHT)
        Button(frame_buttons, text="Cancel",
               command=self.quit).pack(fill=X, expand=True, side=LEFT)
        frame_buttons.pack(fill=X, expand=True, side=BOTTOM)

        frame_advance = Frame(self.parent)
        self.advanceoptions = Button(frame_advance,
                                     text="Advance options",
                                     command=self.advance)
        self.advanceoptions.pack(fill=X, expand=True, side=BOTTOM)
        frame_advance.pack(fill=X, expand=True, side=BOTTOM)

        frame_warning = Frame(self.parent)
        self.label_warning = Label(frame_warning,
                                   fg="red",
                                   text="warning!",
                                   anchor="w")
        self.label_warning.pack(fill=X, expand=True, side=BOTTOM)
        frame_warning.pack(fill=X, expand=True, side=BOTTOM)

        self.build_devices_arch()
        self.load_config()
        self.init_groups()

    #----------------------------------------------------------------------
    def quit(self):

        self.master.destroy()

    #----------------------------------------------------------------------
    def build_devices_arch(self):

        #8bits
        name_checked = self.main.configIDE.config("Board", "board_8",
                                                  "Pinguino 2550")
        arch_8 = filter(lambda board: board.arch == 8,
                        self.main.pinguinoAPI._boards_)
        arch_8.sort()

        frame_left = Frame(self.frame_8b)
        frame_left.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right = Frame(self.frame_8b)
        frame_right.pack(expand=True, fill=BOTH, side=RIGHT)

        parent = frame_left  #left
        for board in arch_8:
            if arch_8.index(board) == (len(arch_8) / 2) + 1:
                parent = frame_right  #rigth

            radio = Radiobutton(
                parent,
                text=board.name,
                anchor="w",
                width=10,
                value=board.name,
                variable=self.dev8_var,
                command=lambda: self.set_board_name(board.name, "8"))
            radio.pack(expand=True, fill=X, side=TOP)

            #radio = QtGui.QRadioButton(self.board_config.groupBox_devices_8)
            #self.board_config.gridLayout_device_8.addWidget(radio, count, side, 1, 1)
            #radio.setText(board.name)
            #radio.setToolTip(board.proc)

            if name_checked == board.name: radio.select()
            #self.connect(radio, QtCore.SIGNAL("clicked()"), self.set_board_name(board.name, "8"))

        #32bits
        name_checked = self.main.configIDE.config("Board", "board_32",
                                                  "PIC32 Pinguino OTG")
        arch_32 = filter(lambda board: board.arch == 32,
                         self.main.pinguinoAPI._boards_)
        arch_32.sort()

        frame_left0 = Frame(self.frame_32b)
        frame_left0.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right0 = Frame(self.frame_32b)
        frame_right0.pack(expand=True, fill=BOTH, side=RIGHT)

        parent = frame_left0  #left
        for board in arch_32:
            if arch_32.index(board) == (len(arch_32) / 2) + 1:
                parent = frame_right0  #rigth

            radio = Radiobutton(
                parent,
                text=board.name,
                anchor="w",
                width=10,
                value=board.name,
                variable=self.dev32_var,
                command=lambda: self.set_board_name(board.name, "32"))
            radio.pack(expand=True, fill=X, side=TOP)

            #radio = QtGui.QRadioButton(self.board_config.groupBox_devices_32)
            #self.board_config.gridLayout_device_32.addWidget(radio, count, side, 1, 1)
            #radio.setText(board.name)
            #radio.setToolTip(board.proc)

            if name_checked == board.name: radio.select()
            #self.connect(radio, QtCore.SIGNAL("clicked()"), self.set_board_name(board.name, "32"))

    #----------------------------------------------------------------------
    def load_config(self):

        self.main.configIDE.load_config()

        arch = self.main.configIDE.config("Board", "arch", 8)
        getattr(self.radioButton_arch_8, "select" if
                (arch == 8) else "deselect")()
        getattr(self.radioButton_arch_32, "select" if
                (arch == 32) else "deselect")()

        if arch == 32:
            self.advanceoptions.pack(fill=X, expand=True, side=BOTTOM)
        else:
            self.advanceoptions.forget()

        mode = self.main.configIDE.config("Board", "mode", "bootloader")
        getattr(self.radioButton_mode_bootloader, "select" if
                (mode == "bootloader") else "deselect")()
        getattr(self.radioButton_mode_icsp, "select" if
                (mode == "icsp") else "deselect")()

        bootloader = self.main.configIDE.config("Board", "bootloader", "v1_v2")
        getattr(self.radioButton_bootloader_v1_v2, "select" if
                (bootloader == "v1_v2") else "deselect")()
        getattr(self.radioButton_bootloader_v4, "select" if
                (bootloader == "v4") else "deselect")()

        self.update_mode()

    #----------------------------------------------------------------------
    def update_mode(self):

        mode_boot = self.mode_var.get() == "bootloader"
        arch_8 = self.arch_var.get() == 8

        if mode_boot and arch_8:
            self.lf_boot.pack(fill=X, expand=True, side=TOP)
        else:
            self.lf_boot.forget()
        self.init_groups()

        if not mode_boot:
            self.label_warning.configure(
                text="WARNING!! this mode can overwite the bootloader code.")
        else:
            self.label_warning.configure(text="")

    #----------------------------------------------------------------------
    def set_board_name(self, name, arch):
        def dummy():
            self.main.configIDE.set("Board", "board_" + arch, name)

        return dummy

    #----------------------------------------------------------------------
    def init_groups(self):

        self.lf_dev32.forget()
        self.lf_dev8.forget()

        if self.arch_var.get() == 8:
            self.lf_dev8.pack(fill=X, expand=True, side=TOP)
            self.advanceoptions.forget()

        else:
            self.lf_dev32.pack(fill=X, expand=True, side=TOP)
            self.advanceoptions.pack(fill=X, expand=True, side=BOTTOM)

    #----------------------------------------------------------------------
    def save_config(self):

        #if self.board_config.radioButton_arch_8.isChecked(): arch = 8
        #else: arch = 32
        self.main.configIDE.set("Board", "arch", self.arch_var.get())

        #if self.board_config.radioButton_mode_bootloader.isChecked(): mode = "bootloader"
        #else: mode = "icsp"
        self.main.configIDE.set("Board", "mode", self.mode_var.get())

        #if self.board_config.radioButton_bootloader_v1_v2.isChecked(): bootloader = "v1_v2"
        #else: bootloader = "v4"
        self.main.configIDE.set("Board", "bootloader", self.boot_var.get())

        name = self.main.configIDE.config("Board",
                                          "board_" + str(self.arch_var.get()),
                                          None)
        self.main.configIDE.set("Board", "board", name)

    #----------------------------------------------------------------------
    def accept_config(self):

        self.save_config()
        self.main.configIDE.save_config()
        self.main.statusbar_ide(self.main.get_status_board())
        self.close_advance()
        self.quit()

    #----------------------------------------------------------------------
    def advance(self):

        root = Toplevel()
        self.frame_advance = BoardConfigAdvance(master=root, main=self.main)
        self.frame_advance.mainloop()

    #----------------------------------------------------------------------
    def close_advance(self):

        try:
            assert self.frame_advance
        except:
            return
        self.frame_advance.quit()
class Facade(Frame):
    """This is a Frame that contains group info, group order, apex and prime
    graph.
    """
    def __init__(self, parent, group, show_graph=True, graph_class=None, **kw):
        """
        Parameters:
            show_graph: whether to create and show graph instantly or provide a button to do that lately
            graph_factory: callable accepting one argument - the Group instance and returning Graph instance. Note that
                __str__ method of the callable is used in the UI.
        """
        Frame.__init__(self, parent, **kw)
        self._group = group
        #        self._show_apex = True
        self._show_graph = show_graph
        self._graph_class = graph_class
        self._init_variables()
        self._init_menu()
        self._init_components()

    @property
    def group(self):
        return self._group

    @property
    def apex_list_container(self):
        return self._apex_container

    @property
    def graph_canvas(self):
        return self._graph_canvas

    def _show_graph_canvas(self):
        self._show_graph_button.forget()
        # TODO: add different layouts and other options
        graph_class = self._graph_class
        self.graph = graph_class(self._group)
        self._graph_canvas = GraphCanvas(self._right_pane,
                                         SpringLayout(self.graph),
                                         caption=str(graph_class))
        self._graph_canvas.pack(expand=True, fill='both')

        self._graph_canvas.vertex_label_mode = self.getvar(
            name=self.winfo_name() + ".vertexlabelposition")

        self._iterations_plugin = IterationsPlugin()
        self._iterations_plugin.apply(self._graph_canvas)

        self.update_layout()

    def _init_components(self):
        self._panes = PanedWindow(self,
                                  orient='horizontal',
                                  sashrelief='raised')
        self._panes.pack(expand=True, fill='both')

        self._left_pane = Frame(self._panes, padx=2, pady=2)
        self._right_pane = Frame(self._panes)
        self._panes.add(self._left_pane, width=250)
        self._panes.add(self._right_pane)

        # group name
        group_name_pane = LabelFrame(self._left_pane,
                                     text="Group",
                                     padx=10,
                                     pady=5)
        group_name_pane.pack(fill='x')

        self._group_name = GroupNameLabel(group_name_pane, self._group)
        self._group_name.pack(expand=True, fill='both')

        # group order
        group_order_pane = LabelFrame(self._left_pane,
                                      text="Order",
                                      padx=10,
                                      pady=5)
        group_order_pane.pack(fill='x')

        self._group_order = IntegerContainer(group_order_pane,
                                             integer=self._group.order())
        self._group_order.pack(expand=True, fill='both')

        # apex
        self._apex_pane = LabelFrame(self._left_pane,
                                     text="Apex",
                                     padx=10,
                                     pady=5)
        self._apex_pane.pack(expand=True, fill='both')

        self._apex_container = ApexListContainer(self._apex_pane,
                                                 apex=self._group.apex())
        self._apex_container.pack(expand=True, fill='both')

        # graph controls
        cocliques_frame = LabelFrame(self._left_pane,
                                     text="Cocliques",
                                     padx=10,
                                     pady=5)
        cocliques_frame.pack(fill='x')

        self._cocliques_button = Button(cocliques_frame,
                                        text="Calculate",
                                        command=self._show_cocliques)
        self._cocliques_button.pack(anchor='nw')

        self._cocliques_container = ListContainer(cocliques_frame)
        self._cocliques_list = Listbox(self._cocliques_container)
        self._cocliques_container.set_listbox(self._cocliques_list)

        # Button(graph_controls, text='Group equivalent vertices').pack(anchor='nw')

        # this is a button that show up instead of graph canvas if we uncheck 'Show graph' checkbox.
        self._show_graph_button = Button(self._right_pane,
                                         text='Show graph',
                                         command=self._show_graph_canvas)
        self._graph_canvas = None
        if self._show_graph:
            self._show_graph_canvas()
        else:
            self._show_graph_button.pack()

    def _init_variables(self):
        def set_default_var(self, name):
            """Sets widget-specific var with same value as root.
            """
            default_var = self.getvar(name)
            local_var_name = self.winfo_name() + "." + name
            self.setvar(local_var_name, default_var)
            return local_var_name

        local_name = set_default_var(self, "vertexlabelposition")
        tools.trace_variable(self, local_name, "w",
                             self._change_vertex_label_position)

    def _change_vertex_label_position(self, name, *arg):
        # override default value
        self.setvar("vertexlabelposition", self.getvar(name))
        if self._graph_canvas is not None:
            self._graph_canvas.vertex_label_mode = self.getvar(name)

    def _init_menu(self):
        """Init menu bar content.
        """
        toplevel = self.winfo_toplevel()
        if toplevel['menu']:
            self._menu = self.nametowidget(name=toplevel['menu'])
        else:
            self._menu = Menu(toplevel)
            toplevel['menu'] = self._menu

        graph_options = Menu(self._menu, tearoff=0)
        self._menu.add_cascade(label="Graph", menu=graph_options)
        self._menu_index = self._menu.index("end")

        vertex_label_position_menu = Menu(graph_options, tearoff=0)
        graph_options.add_cascade(label="Label position",
                                  menu=vertex_label_position_menu)

        menu_var = self.winfo_name() + ".vertexlabelposition"
        vertex_label_position_menu.add_radiobutton(variable=menu_var,
                                                   label="Auto",
                                                   value="auto")
        vertex_label_position_menu.add_radiobutton(variable=menu_var,
                                                   label="Center",
                                                   value="center")

        graph_options.add_command(label="Save graph...",
                                  command=self.call_graph_save_dialog)

        self.bind("<Destroy>", self.__destroy_menu)

    #noinspection PyUnusedLocal
    def __destroy_menu(self, event):
        try:
            self._menu.delete(self._menu_index)
        except TclError:
            pass

    def _show_cocliques(self):
        cocliques = self.graph.max_cocliques()

        def select_coclique(*_):
            index = next(iter(self._cocliques_list.curselection()), None)
            if index is not None:
                selected = cocliques[int(index)]
                pick_state = self._graph_canvas.picked_vertex_state
                pick_state.clear()
                for value in selected:
                    pick_state.pick(self._graph_canvas.get_vertex(value))

        self._cocliques_list.insert(
            0, *[', '.join(map(str, coclique)) for coclique in cocliques])
        self._cocliques_list.bind("<Double-Button-1>", select_coclique)

        self._cocliques_button.forget()
        self._cocliques_container.pack(expand=True, fill='both')

    def call_graph_save_dialog(self):
        file_name = tkFileDialog.asksaveasfilename(
            defaultextension='.ps',
            filetypes=[('PostScript', '.ps')],
            parent=self.winfo_toplevel(),
            title="Save graph as image")
        if file_name:
            with codecs.open(file_name, 'w', encoding='utf-8') as f:
                f.write(self._graph_canvas.postscript())

    def update_layout(self):
        try:
            self._iterations_plugin.iterate(50)
        except AttributeError:
            pass
class BoardConfig(Frame):

    def __init__(self, master=None, main=None):
        Frame.__init__(self, master)

        self.parent = master
        self.main = main

        self.parent.geometry("336x424")
        self.parent.title(os.getenv("NAME") + " - Board Config")
        self.master.configure(padx=10, pady=10)

        self.intvar = IntVar()

        #Arch
        self.arch_var = IntVar()
        lf_arch = LabelFrame(self.parent, text="Architecture")
        lf_arch.pack(fill=X, expand=True, side=TOP)

        frame_arch = Frame(lf_arch)
        frame_arch.pack(fill=X, expand=True, side=TOP)

        frame_left1 = Frame(frame_arch)
        frame_left1.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right1 = Frame(frame_arch)
        frame_right1.pack(expand=True, fill=BOTH, side=RIGHT)

        self.radioButton_arch_8 = Radiobutton(frame_left1, text="8-bit ", anchor="w", width=10, value=8, variable=self.arch_var, command=self.update_mode)
        self.radioButton_arch_8.pack(fill=X, side=TOP)

        self.radioButton_arch_32 = Radiobutton(frame_right1, text="32-bit", anchor="w", width=10, value=32, variable=self.arch_var, command=self.update_mode)
        self.radioButton_arch_32.pack(fill=X, side=TOP)


        #Mode
        self.mode_var = StringVar()
        lf_mode = LabelFrame(self.parent, text="Programming mode")
        lf_mode.pack(fill=X, expand=True, side=TOP)

        frame_mode = Frame(lf_mode)
        frame_mode.pack(fill=X, expand=True, side=TOP)

        frame_left2 = Frame(frame_mode)
        frame_left2.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right2 = Frame(frame_mode)
        frame_right2.pack(expand=True, fill=BOTH, side=RIGHT)

        self.radioButton_mode_icsp = Radiobutton(frame_left2, text="ICSP", anchor="w", width=10, value="icsp", variable=self.mode_var, command=self.update_mode)
        self.radioButton_mode_icsp.pack(side=TOP, fill=X)

        self.radioButton_mode_bootloader = Radiobutton(frame_right2, text="Bootloader", anchor="w", width=10, value="bootloader", variable=self.mode_var, command=self.update_mode)
        self.radioButton_mode_bootloader.pack(side=TOP, fill=X)


        #Bootloader
        self.boot_var = StringVar()
        self.lf_boot = LabelFrame(self.parent, text="Bootloader")
        self.lf_boot.pack(fill=X, expand=True, side=TOP)

        frame_boot = Frame(self.lf_boot)
        frame_boot.pack(fill=X, expand=True, side=TOP)

        frame_left3 = Frame(frame_boot)
        frame_left3.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right3 = Frame(frame_boot)
        frame_right3.pack(expand=True, fill=BOTH, side=RIGHT)

        self.radioButton_bootloader_v1_v2 = Radiobutton(frame_left3, text="v1.x or v2.x", anchor="w", width=10, value="v1_v2", variable=self.boot_var)
        self.radioButton_bootloader_v1_v2.pack(fill=X, side=TOP, expand=True)
        self.radioButton_bootloader_v4 = Radiobutton(frame_right3, text="v4.x", anchor="w", width=10, value="v4", variable=self.boot_var)
        self.radioButton_bootloader_v4.pack(fill=X, side=TOP, expand=True)


        #Devices 8bit
        self.dev8_var = StringVar()
        self.lf_dev8 = LabelFrame(self.parent, text="Devices")
        self.lf_dev8.pack(fill=X, expand=True, side=TOP)

        self.frame_8b = Frame(self.lf_dev8)
        self.frame_8b.pack(fill=X, expand=True, side=TOP)


        #Devices 32bit
        self.dev32_var = StringVar()
        self.lf_dev32 = LabelFrame(self.parent, text="Devices")
        self.lf_dev32.pack(fill=X, expand=True, side=TOP)

        self.frame_32b = Frame(self.lf_dev32)
        self.frame_32b.pack(fill=X, expand=True, side=TOP)

        frame_buttons = Frame(self.parent)
        Button(frame_buttons, text="Accept", command=self.accept_config).pack(fill=X, expand=True, side=RIGHT)
        Button(frame_buttons, text="Cancel", command=self.quit).pack(fill=X, expand=True, side=LEFT)
        frame_buttons.pack(fill=X, expand=True, side=BOTTOM)

        frame_advance = Frame(self.parent)
        self.advanceoptions = Button(frame_advance, text="Advance options", command=self.advance)
        self.advanceoptions.pack(fill=X, expand=True, side=BOTTOM)
        frame_advance.pack(fill=X, expand=True, side=BOTTOM)

        frame_warning = Frame(self.parent)
        self.label_warning = Label(frame_warning, fg="red", text="warning!", anchor="w")
        self.label_warning.pack(fill=X, expand=True, side=BOTTOM)
        frame_warning.pack(fill=X, expand=True, side=BOTTOM)

        self.build_devices_arch()
        self.load_config()
        self.init_groups()




    #----------------------------------------------------------------------
    def quit(self):

        self.master.destroy()


    #----------------------------------------------------------------------
    def build_devices_arch(self):

        #8bits
        name_checked = self.main.configIDE.config("Board", "board_8", "Pinguino 2550")
        arch_8 = filter(lambda board:board.arch==8, self.main.pinguinoAPI._boards_)
        arch_8.sort()

        frame_left = Frame(self.frame_8b)
        frame_left.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right = Frame(self.frame_8b)
        frame_right.pack(expand=True, fill=BOTH, side=RIGHT)

        parent = frame_left  #left
        for board in arch_8:
            if arch_8.index(board) == (len(arch_8) / 2) + 1:
                parent = frame_right  #rigth

            radio = Radiobutton(parent, text=board.name, anchor="w", width=10, value=board.name, variable=self.dev8_var, command=lambda :self.set_board_name(board.name, "8"))
            radio.pack(expand=True, fill=X, side=TOP)

            #radio = QtGui.QRadioButton(self.board_config.groupBox_devices_8)
            #self.board_config.gridLayout_device_8.addWidget(radio, count, side, 1, 1)
            #radio.setText(board.name)
            #radio.setToolTip(board.proc)

            if name_checked == board.name: radio.select()
            #self.connect(radio, QtCore.SIGNAL("clicked()"), self.set_board_name(board.name, "8"))


        #32bits
        name_checked = self.main.configIDE.config("Board", "board_32", "PIC32 Pinguino OTG")
        arch_32 = filter(lambda board:board.arch==32, self.main.pinguinoAPI._boards_)
        arch_32.sort()

        frame_left0 = Frame(self.frame_32b)
        frame_left0.pack(expand=True, fill=BOTH, side=LEFT)

        frame_right0 = Frame(self.frame_32b)
        frame_right0.pack(expand=True, fill=BOTH, side=RIGHT)

        parent = frame_left0  #left
        for board in arch_32:
            if arch_32.index(board) == (len(arch_32) / 2) + 1:
                parent = frame_right0  #rigth

            radio = Radiobutton(parent, text=board.name, anchor="w", width=10, value=board.name, variable=self.dev32_var, command=lambda :self.set_board_name(board.name, "32"))
            radio.pack(expand=True, fill=X, side=TOP)

            #radio = QtGui.QRadioButton(self.board_config.groupBox_devices_32)
            #self.board_config.gridLayout_device_32.addWidget(radio, count, side, 1, 1)
            #radio.setText(board.name)
            #radio.setToolTip(board.proc)

            if name_checked == board.name: radio.select()
            #self.connect(radio, QtCore.SIGNAL("clicked()"), self.set_board_name(board.name, "32"))



    #----------------------------------------------------------------------
    def load_config(self):

        self.main.configIDE.load_config()

        arch = self.main.configIDE.config("Board", "arch", 8)
        getattr(self.radioButton_arch_8, "select" if (arch == 8) else "deselect")()
        getattr(self.radioButton_arch_32, "select" if (arch == 32) else "deselect")()

        if arch == 32: self.advanceoptions.pack(fill=X, expand=True, side=BOTTOM)
        else: self.advanceoptions.forget()

        mode = self.main.configIDE.config("Board", "mode", "bootloader")
        getattr(self.radioButton_mode_bootloader, "select" if (mode == "bootloader") else "deselect")()
        getattr(self.radioButton_mode_icsp, "select" if (mode == "icsp") else "deselect")()

        bootloader = self.main.configIDE.config("Board", "bootloader", "v1_v2")
        getattr(self.radioButton_bootloader_v1_v2, "select" if (bootloader == "v1_v2") else "deselect")()
        getattr(self.radioButton_bootloader_v4, "select" if (bootloader == "v4") else "deselect")()

        self.update_mode()


    #----------------------------------------------------------------------
    def update_mode(self):

        mode_boot = self.mode_var.get() == "bootloader"
        arch_8 = self.arch_var.get() == 8

        if mode_boot and arch_8: self.lf_boot.pack(fill=X, expand=True, side=TOP)
        else: self.lf_boot.forget()
        self.init_groups()

        if not mode_boot:
            self.label_warning.configure(text="WARNING!! this mode can overwite the bootloader code.")
        else:
            self.label_warning.configure(text="")



    #----------------------------------------------------------------------
    def set_board_name(self, name, arch):

        def dummy():
            self.main.configIDE.set("Board", "board_"+arch, name)
        return dummy


    #----------------------------------------------------------------------
    def init_groups(self):

        self.lf_dev32.forget()
        self.lf_dev8.forget()

        if self.arch_var.get() == 8:
            self.lf_dev8.pack(fill=X, expand=True, side=TOP)
            self.advanceoptions.forget()

        else:
            self.lf_dev32.pack(fill=X, expand=True, side=TOP)
            self.advanceoptions.pack(fill=X, expand=True, side=BOTTOM)



    #----------------------------------------------------------------------
    def save_config(self):

        #if self.board_config.radioButton_arch_8.isChecked(): arch = 8
        #else: arch = 32
        self.main.configIDE.set("Board", "arch", self.arch_var.get())

        #if self.board_config.radioButton_mode_bootloader.isChecked(): mode = "bootloader"
        #else: mode = "icsp"
        self.main.configIDE.set("Board", "mode", self.mode_var.get())

        #if self.board_config.radioButton_bootloader_v1_v2.isChecked(): bootloader = "v1_v2"
        #else: bootloader = "v4"
        self.main.configIDE.set("Board", "bootloader", self.boot_var.get())

        name = self.main.configIDE.config("Board", "board_"+str(self.arch_var.get()), None)
        self.main.configIDE.set("Board", "board", name)



    #----------------------------------------------------------------------
    def accept_config(self):

        self.save_config()
        self.main.configIDE.save_config()
        self.main.statusbar_ide(self.main.get_status_board())
        self.close_advance()
        self.quit()


    #----------------------------------------------------------------------
    def advance(self):

        root = Toplevel()
        self.frame_advance = BoardConfigAdvance(master=root, main=self.main)
        self.frame_advance.mainloop()


    #----------------------------------------------------------------------
    def close_advance(self):

        try: assert self.frame_advance
        except: return
        self.frame_advance.quit()
示例#4
0
class Facade(Frame):
    """This is a Frame that contains group info, group order, apex and prime
    graph.
    """
    def __init__(self, parent, group, show_graph=True, graph_class=None, **kw):
        """
        Parameters:
            show_graph: whether to create and show graph instantly or provide a button to do that lately
            graph_factory: callable accepting one argument - the Group instance and returning Graph instance. Note that
                __str__ method of the callable is used in the UI.
        """
        Frame.__init__(self, parent, **kw)
        self._group = group
        #        self._show_apex = True
        self._show_graph = show_graph
        self._graph_class = graph_class
        self._init_variables()
        self._init_menu()
        self._init_components()

    @property
    def group(self):
        return self._group

    @property
    def apex_list_container(self):
        return self._apex_container

    @property
    def graph_canvas(self):
        return self._graph_canvas

    def _show_graph_canvas(self):
        self._show_graph_button.forget()
        # TODO: add different layouts and other options
        graph_class = self._graph_class
        self.graph = graph_class(self._group)
        self._graph_canvas = GraphCanvas(self._right_pane, SpringLayout(self.graph), caption=str(graph_class))
        self._graph_canvas.pack(expand=True, fill='both')

        self._graph_canvas.vertex_label_mode = self.getvar(
            name=self.winfo_name() + ".vertexlabelposition")

        self._iterations_plugin = IterationsPlugin()
        self._iterations_plugin.apply(self._graph_canvas)

        self.update_layout()

    def _init_components(self):
        self._panes = PanedWindow(self, orient='horizontal', sashrelief='raised')
        self._panes.pack(expand=True, fill='both')

        self._left_pane = Frame(self._panes, padx=2, pady=2)
        self._right_pane = Frame(self._panes)
        self._panes.add(self._left_pane, width=250)
        self._panes.add(self._right_pane)

        # group name
        group_name_pane = LabelFrame(self._left_pane, text="Group", padx=10, pady=5)
        group_name_pane.pack(fill='x')

        self._group_name = GroupNameLabel(group_name_pane, self._group)
        self._group_name.pack(expand=True, fill='both')

        # group order
        group_order_pane = LabelFrame(self._left_pane, text="Order", padx=10, pady=5)
        group_order_pane.pack(fill='x')

        self._group_order = IntegerContainer(group_order_pane, integer=self._group.order())
        self._group_order.pack(expand=True, fill='both')

        # apex
        self._apex_pane = LabelFrame(self._left_pane, text="Apex", padx=10, pady=5)
        self._apex_pane.pack(expand=True, fill='both')

        self._apex_container = ApexListContainer(self._apex_pane, apex=self._group.apex())
        self._apex_container.pack(expand=True, fill='both')

        # graph controls
        cocliques_frame = LabelFrame(self._left_pane, text="Cocliques", padx=10, pady=5)
        cocliques_frame.pack(fill='x')

        self._cocliques_button = Button(cocliques_frame, text="Calculate", command=self._show_cocliques)
        self._cocliques_button.pack(anchor='nw')

        self._cocliques_container = ListContainer(cocliques_frame)
        self._cocliques_list = Listbox(self._cocliques_container)
        self._cocliques_container.set_listbox(self._cocliques_list)

        # Button(graph_controls, text='Group equivalent vertices').pack(anchor='nw')

        # this is a button that show up instead of graph canvas if we uncheck 'Show graph' checkbox.
        self._show_graph_button = Button(self._right_pane, text='Show graph',
                                         command=self._show_graph_canvas)
        self._graph_canvas = None
        if self._show_graph:
            self._show_graph_canvas()
        else:
            self._show_graph_button.pack()

    def _init_variables(self):
        def set_default_var(self, name):
            """Sets widget-specific var with same value as root.
            """
            default_var = self.getvar(name)
            local_var_name = self.winfo_name() + "." + name
            self.setvar(local_var_name, default_var)
            return local_var_name

        local_name = set_default_var(self, "vertexlabelposition")
        tools.trace_variable(self, local_name, "w",
                             self._change_vertex_label_position)

    def _change_vertex_label_position(self, name, *arg):
        # override default value
        self.setvar("vertexlabelposition", self.getvar(name))
        if self._graph_canvas is not None:
            self._graph_canvas.vertex_label_mode = self.getvar(name)

    def _init_menu(self):
        """Init menu bar content.
        """
        toplevel = self.winfo_toplevel()
        if toplevel['menu']:
            self._menu = self.nametowidget(name=toplevel['menu'])
        else:
            self._menu = Menu(toplevel)
            toplevel['menu'] = self._menu

        graph_options = Menu(self._menu, tearoff=0)
        self._menu.add_cascade(label="Graph", menu=graph_options)
        self._menu_index = self._menu.index("end")

        vertex_label_position_menu = Menu(graph_options, tearoff=0)
        graph_options.add_cascade(label="Label position", menu=vertex_label_position_menu)

        menu_var = self.winfo_name() + ".vertexlabelposition"
        vertex_label_position_menu.add_radiobutton(variable=menu_var, label="Auto", value="auto")
        vertex_label_position_menu.add_radiobutton(variable=menu_var, label="Center", value="center")

        graph_options.add_command(label="Save graph...", command=self.call_graph_save_dialog)

        self.bind("<Destroy>", self.__destroy_menu)

    #noinspection PyUnusedLocal
    def __destroy_menu(self, event):
        try:
            self._menu.delete(self._menu_index)
        except TclError:
            pass

    def _show_cocliques(self):
        cocliques = self.graph.max_cocliques()

        def select_coclique(*_):
            index = next(iter(self._cocliques_list.curselection()), None)
            if index is not None:
                selected = cocliques[int(index)]
                pick_state = self._graph_canvas.picked_vertex_state
                pick_state.clear()
                for value in selected:
                    pick_state.pick(self._graph_canvas.get_vertex(value))

        self._cocliques_list.insert(0, *[', '.join(map(str, coclique)) for coclique in cocliques])
        self._cocliques_list.bind("<Double-Button-1>", select_coclique)

        self._cocliques_button.forget()
        self._cocliques_container.pack(expand=True, fill='both')

    def call_graph_save_dialog(self):
        file_name = tkFileDialog.asksaveasfilename(defaultextension='.ps',
                                                   filetypes=[('PostScript', '.ps')], parent=self.winfo_toplevel(),
                                                   title="Save graph as image")
        if file_name:
            with codecs.open(file_name, 'w', encoding='utf-8') as f:
                f.write(self._graph_canvas.postscript())

    def update_layout(self):
        try:
            self._iterations_plugin.iterate(50)
        except AttributeError:
            pass