Example #1
0
class Controller():

    def __init__(self, name):
        self.root = Tk()
        self.model = Model()
        self.view = View(self, self.root)
        self.__name = name
        self.__filename = ""
        self.stateTools = True
        self.mode = "SELECT"
        self.step = 0  # Used to keep track of mouse presses, i.e. line, circle and rectangle need 2, pline > 1
        self.x = 0  # Previous click coords
        self.y = 0  # Previous click coords

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    def cmd_new(self):
        if self.model.get_dirty():
            self.cmd_save()
        self.model = Model()
        self.__filename = ""
        self.make_title()
            
    
    def cmd_open(self):
        if self.model.get_dirty():
            '''App has unsaved data so ask user to save it'''
            if self.view.question_box(self.__name, "Do you want to save your work?"):
                self.cmd_save()
        self.__filename = self.view.open_file_dialog()
        if self.__filename != "":
            self.make_title()

    def cmd_save(self):

        if self.__filename != "":  # if app already has a filename simply save else do save as
            tg = TextGroup(self.model.graph,sys.stdout)
            tg.show()
        else:
            self.cmd_save_as()

    def cmd_save_as(self):
        try:
            file = self.view.save_file_dialog(self.__filename)
        except IOError:
            self.view.warning_box(self.__name, "Can't open file %s" % self.__filename)
        else:
            if file:  # if valid file
                # self.model.save(filename)
                tg=TextGroup(self.model.graph, file)
                tg.show()
                self.__filename = file.name
                file.close()
                self.model.set_dirty(False)
                self.make_title()

    def cmd_dirty(self):
        self.cmd_set_dirty(True)

    def cmd_clean(self):
        self.cmd_set_dirty(False)

    def cmd_exit(self):
        if self.model.get_dirty():
            if self.view.question_box(self.__name, "Do you want to save your work?"):
                self.cmd_save()
        self.root.destroy()  # This is tkinter specific

    def cmd_toolbar(self):
        self.view.hide_toolbar()

    def cmd_left_click(self, x, y):
        if self.mode == "LINE":
            if self.step == 0:
                self.x = x
                self.y = y
                self.step += 1
            else:
                print("Line (%d,%d), (%d,%d)" % (self.x, self.y, x, y))
                self.model.add_line(self.x, self.y, x, y)
                self.x = x
                self.y = y
                self.step = 0
        elif self.mode == "CIRCLE":
            if self.step ==0:
                self.x = x
                self.y = y
                self.step += 1
            else:
                print("Circle (%d, %d), %d" % (self.x, self.y, x))
                self.x = x
                self.y = y
                self.step = 0
        elif self.mode == "RECTANGLE":
            if self.step == 0:
                self.x = x
                self.y = y
                self.step += 1
            else:
                print("Rectangle (%d,%d), (%d,%d)" % (self.x, self.y, x, y))
                self.model.add_rectangle(self.x, self.y, x, y)
                self.x = x
                self.y = y
                self.step = 0

    def cmd_right_click(self, x, y):
        # self.view.info_box("User pressed","x %d, y %d" % (x,y))
        self.view.show_context_menu(x, y)

    def cmd_null(self):
        self.view.info_box(self.__name, "Not yet implemented")

    def cmd_set_dirty(self, dirty):
        self.model.set_dirty(dirty)
        self.make_title()

    def cmd_tools(self):
        self.stateTools = not self.stateTools
        if self.stateTools:
            self.view.show_toolbar()
        else:
            self.view.hide_toolbar()

    # Drawing Commands
    def cmd_line(self):
        self.mode = "LINE"
        self.step = 0

    def cmd_circle(self):
        self.mode = "CIRCLE"
        self.step = 0
        
    def cmd_rectangle(self):
        self.mode = "RECTANGLE"
        self.step = 0

    def get_title(self):
        """Makes the title for the Window"""
        if self.model.get_dirty():
            title = "*"
        else:
            title = " "
        title += self.__name
        title += " - " + self.__filename
        return title
    
    def make_title(self):
        self.root.title(self.get_title())
        
    def run(self):
        self.make_title()
        self.root.mainloop()  # This is tkinter specific