Ejemplo n.º 1
0
 def exit(self, *args):
     logger.info("Bye")
     self.save_config()
     self.root.quit()
     self.appCmdQueue.put(COMMAND.CLOSE_APP)
     sys.exit()
Ejemplo n.º 2
0
    def __init__(self, root, project_filename, cmdQueue, appCmdQueue, cmdPipe):
        logger.info("Create MainWindow.")

        self.root = root
        self.project_filename = project_filename
        self.cmdQueue = cmdQueue
        self.appCmdQueue = appCmdQueue
        self.cmdPipe = cmdPipe
        self.selected_item = None
        self.selected_item_categoty = ''
        self.isFillAttributeTree = False

        # MessageThread
        self.message_thread = MessageThread(self.cmdQueue)
        self.message_thread.start()
        self.message_thread.connect(get_command_name(COMMAND.SHOW_UI), self.show)
        self.message_thread.connect(get_command_name(COMMAND.HIDE_UI), self.hide)

        self.message_thread.connect(get_command_name(COMMAND.TRANS_SCREEN_INFO), self.set_screen_info)
        self.message_thread.connect(get_command_name(COMMAND.CLEAR_RENDERTARGET_LIST), self.clear_render_target_list)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_RENDERTARGET_INFO), self.add_render_target)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_RENDERING_TYPE_LIST), self.add_rendering_type)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_ANTIALIASING_LIST), self.add_anti_aliasing)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_GAME_BACKEND_LIST), self.add_game_backend)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_GAME_BACKEND_INDEX), self.set_game_backend_index)

        self.message_thread.connect(get_command_name(COMMAND.CLOSE_UI), self.exit)
        self.message_thread.connect(get_command_name(COMMAND.SORT_UI_ITEMS), self.sort_items)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_RESOURCE_LIST), self.add_resource_list)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_RESOURCE_INFO), self.set_resource_info)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_RESOURCE_ATTRIBUTE), self.fill_resource_attribute)
        self.message_thread.connect(get_command_name(COMMAND.DELETE_RESOURCE_INFO), self.delete_resource_info)

        self.message_thread.connect(get_command_name(COMMAND.DELETE_OBJECT_INFO), self.delete_object_info)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_OBJECT_INFO), self.add_object_info)
        self.message_thread.connect(get_command_name(COMMAND.TRANS_OBJECT_ATTRIBUTE), self.fill_object_attribute)
        self.message_thread.connect(get_command_name(COMMAND.CLEAR_OBJECT_LIST), self.clear_object_list)

        width = 600
        height = 800
        screen_width = root.winfo_screenwidth()
        screen_height = root.winfo_screenheight()
        x = int(screen_width - width)
        y = int((screen_height / 2) - (height / 2))
        frame_width = int(width / 2)
        property_width = int(frame_width / 2)

        root.resizable(width=True, height=True)
        root.bind('<Escape>', self.exit)
        root.geometry('%dx%d+%d+%d' % (width, height, x, y))

        main_frame = tk.PanedWindow(root, orient=tk.HORIZONTAL, sashrelief=tk.RAISED)
        main_frame.pack(fill="both", expand=True)
        main_tab = ttk.Notebook(main_frame)

        # set windows title
        self.set_window_title(project_filename if project_filename else "Default Project")

        def donothing(*args):
            pass

        # Menu
        menubar = tk.Menu(root)
        root.config(menu=menubar)

        menu = tk.Menu(menubar, tearoff=0)
        menu.add_command(label="New Project", command=self.new_project)
        menu.add_command(label="Open Project", command=self.open_project)
        menu.add_command(label="Save Project", command=self.save_project)
        menu.add_separator()
        menu.add_command(label="New Scene", command=self.new_scene)
        menu.add_command(label="Save Scene", command=self.save_scene)
        menu.add_separator()
        menu.add_command(label="Exit", command=self.exit)
        menubar.add_cascade(label="Menu", menu=menu)

        view_mode_menu = tk.Menu(menubar, tearoff=0)
        view_mode_menu.add_command(label="Wireframe", command=lambda: self.set_view_mode(COMMAND.VIEWMODE_WIREFRAME))
        view_mode_menu.add_command(label="Shading", command=lambda: self.set_view_mode(COMMAND.VIEWMODE_SHADING))
        view_mode_menu.add_separator()
        menubar.add_cascade(label="View Mode", menu=view_mode_menu)

        helpmenu = tk.Menu(menubar, tearoff=0)
        helpmenu.add_command(label="Help", command=donothing)
        helpmenu.add_command(label="About...", command=donothing)
        menubar.add_cascade(label="Help", menu=helpmenu)

        # command layout
        command_frame = tk.Frame(main_tab, relief="sunken", padx=10, pady=10)

        variable = tk.StringVar()
        self.comboGameBackend = ttk.Combobox(command_frame, textvariable=variable)
        self.comboGameBackend.bind("<<ComboboxSelected>>", self.change_game_backend, "+")
        self.comboGameBackend.pack(fill="x", side="top")

        separator = ttk.Separator(command_frame, orient='horizontal')
        separator.pack(fill="x", side="top", pady=10)

        self.play_button = tk.Button(command_frame, text="Play")
        self.play_button.pack(fill="x", side="top")
        self.play_button.bind("<Button-1>", self.toggle_play)

        label_frame = ttk.LabelFrame(command_frame, text='Resolution')
        label_frame.pack(fill="x", side="top", pady=10)

        frame = tk.Frame(label_frame, relief="sunken", padx=5)
        frame.pack(fill="x", side="top")
        label = tk.Label(frame, text="Width", width=1)
        label.pack(fill="x", side="left", expand=True)

        self.spinWidth = tk.IntVar()
        self.spinWidth.set(10)
        spinbox = tk.Spinbox(frame, from_=0, to=9999, textvariable=self.spinWidth, width=1)
        spinbox.pack(fill="x", side="left", expand=True)

        frame = tk.Frame(label_frame, relief="sunken", padx=5)
        frame.pack(fill="x", side="top")
        label = tk.Label(frame, text="Height", width=1)
        label.pack(fill="x", side="left", expand=True)

        self.spinHeight = tk.IntVar()
        self.spinHeight.set(0)
        spinbox = tk.Spinbox(frame, from_=0, to=9999, textvariable=self.spinHeight, width=1)
        spinbox.pack(fill="x", side="left", expand=True)

        self.checkFullScreen = tk.IntVar()
        self.checkFullScreen.set(0)
        checkbutton = tk.Checkbutton(label_frame, text="Full Screen", variable=self.checkFullScreen)
        checkbutton.pack(fill="x", side="top")

        button = tk.Button(label_frame, text="Change Resolution")
        button.pack(fill="x", side="top")
        button.bind("<Button-1>", self.change_resolution)

        label_frame = ttk.LabelFrame(command_frame, text='Rendering Type')
        label_frame.pack(fill="x", side="top", pady=10)

        self.comboRenderingType = ttk.Combobox(label_frame)
        self.comboRenderingType.pack(fill="x", side="top")
        self.comboRenderingType.bind("<<ComboboxSelected>>", self.set_rendering_type, "+")

        label_frame = ttk.LabelFrame(command_frame, text='Anti Aliasing')
        label_frame.pack(fill="x", side="top", pady=10)

        self.comboAntiAliasing = ttk.Combobox(label_frame)
        self.comboAntiAliasing.pack(fill="x", side="top")
        self.comboAntiAliasing.bind("<<ComboboxSelected>>", self.set_anti_aliasing, "+")

        label_frame = ttk.LabelFrame(command_frame, text='Render Target')
        label_frame.pack(fill="x", side="top", pady=10)

        self.comboRenderTargets = ttk.Combobox(label_frame)
        self.comboRenderTargets.pack(fill="x", side="top")
        self.comboRenderTargets.bind("<<ComboboxSelected>>", self.view_rendertarget, "+")

        # resource layout
        resource_frame = tk.Frame(main_tab, relief="sunken", padx=10, pady=10)

        label_frame = ttk.LabelFrame(resource_frame, text='Create Resource')
        label_frame.pack(fill="x", side="top", pady=10)

        button = tk.Button(label_frame, text="Create Particle")
        button.pack(fill="x", side="top")
        button.bind("<Button-1>", self.create_particle)

        self.resource_menu = tk.Menu(root, tearoff=0)
        self.resource_menu.add_command(label="Load", command=self.load_resource)
        self.resource_menu.add_command(label="Action", command=self.action_resource)
        self.resource_menu.add_command(label="Duplicate", command=self.duplicate_resource)
        self.resource_menu.add_command(label="Save", command=self.save_resource)
        self.resource_menu.add_command(label="Delete", command=self.delete_resource)
        # self.resource_menu.bind("<FocusOut>", self.resource_menu.unpost)

        self.resource_treeview = ttk.Treeview(resource_frame)
        self.resource_treeview["columns"] = ("#1", )
        self.resource_treeview.column("#0", width=property_width)
        self.resource_treeview.column("#1", width=property_width)
        self.resource_treeview.heading("#0", text="Resource Name",
                                       command=lambda: self.sort_treeview(self.resource_treeview, 0))
        self.resource_treeview.heading("#1", text="Resource Type",
                                       command=lambda: self.sort_treeview(self.resource_treeview, 1))

        self.resource_treeview.bind("<<TreeviewSelect>>", self.select_resource)
        self.resource_treeview.bind("<Button-1>", lambda event: self.resource_menu.unpost())
        self.resource_treeview.bind("<Double-1>", lambda event: self.load_resource())
        self.resource_treeview.bind("<Button-3>", self.open_resource_menu)
        self.resource_treeview.bind("<FocusOut>", lambda event: self.resource_menu.unpost())
        self.resource_treeview.bind("<4>", lambda event: self.resource_menu.unpost())
        self.resource_treeview.bind("<5>", lambda event: self.resource_menu.unpost())
        self.resource_treeview.bind("<MouseWheel>", lambda event: self.resource_menu.unpost())

        vsb = ttk.Scrollbar(self.resource_treeview, orient="vertical", command=self.resource_treeview.yview)
        vsb.pack(side='right', fill='y')
        self.resource_treeview.configure(yscrollcommand=vsb.set)
        self.resource_treeview.pack(fill='both', expand=True)

        # object layout
        object_frame = tk.Frame(main_tab, relief="sunken", padx=10, pady=10)

        label_frame = ttk.LabelFrame(object_frame, text='Add Object')
        label_frame.pack(fill="x", side="top", pady=10)

        button = tk.Button(label_frame, text="Add Camera")
        button.pack(fill="x", side="top")
        button.bind("<Button-1>", self.add_camera)

        button = tk.Button(label_frame, text="Add Light")
        button.pack(fill="x", side="top")
        button.bind("<Button-1>", self.add_light)

        self.object_menu = tk.Menu(root, tearoff=0)
        self.object_menu.add_command(label="Action", command=self.action_object)
        self.object_menu.add_command(label="Focus", command=self.focus_object)
        self.object_menu.add_command(label="Delete", command=self.delete_object)
        self.object_menu.bind("<FocusOut>", self.object_menu.unpost)

        self.object_treeview = ttk.Treeview(object_frame)
        self.object_treeview["columns"] = ("#1",)
        self.object_treeview.column("#0", width=property_width)
        self.object_treeview.column("#1", width=property_width)
        self.object_treeview.heading("#0", text="Object Name",
                                     command=lambda: self.sort_treeview(self.object_treeview, 0))
        self.object_treeview.heading("#1", text="Object Type",
                                     command=lambda: self.sort_treeview(self.object_treeview, 1))

        self.object_treeview.bind("<<TreeviewSelect>>", lambda event: self.select_object())
        self.object_treeview.bind("<Button-1>", lambda event: self.object_menu.unpost())
        self.object_treeview.bind("<Double-1>", lambda event: self.focus_object())
        self.object_treeview.bind("<Button-3>", self.open_object_menu)
        self.object_treeview.bind("<FocusOut>", lambda event: self.object_menu.unpost())
        self.object_treeview.bind("<4>", lambda event: self.object_menu.unpost())
        self.object_treeview.bind("<5>", lambda event: self.object_menu.unpost())
        self.object_treeview.bind("<MouseWheel>", lambda event: self.object_menu.unpost())

        vsb = ttk.Scrollbar(self.object_treeview, orient="vertical", command=self.object_treeview.yview)
        vsb.pack(side='right', fill='y')
        self.object_treeview.configure(yscrollcommand=vsb.set)
        self.object_treeview.pack(fill='both', expand=True)

        # attribute layout
        self.attribute_menu = tk.Menu(root, tearoff=0)
        self.attribute_menu.add_command(label="Add", command=self.add_attribute_component)
        self.attribute_menu.add_command(label="Delete", command=self.delete_attribute_component)
        self.object_menu.bind("<FocusOut>", self.attribute_menu.unpost)

        attribute_frame = tk.Frame(main_frame, relief="sunken", padx=10, pady=10)
        self.attribute_treeview = SimpleEditableTreeview(attribute_frame)
        self.attribute_treeview.item_infos = dict()
        self.attribute_treeview["columns"] = ("#1",)
        self.attribute_treeview.column("#0", width=property_width)
        self.attribute_treeview.column("#1", width=property_width)
        self.attribute_treeview.heading("#0", text="Attribute",
                                        command=lambda: self.sort_treeview(self.attribute_treeview, 0))
        self.attribute_treeview.heading("#1", text="Value",
                                        command=lambda: self.sort_treeview(self.attribute_treeview, 1))

        self.attribute_treeview.bind("<<TreeviewSelect>>", self.select_attribute)
        self.attribute_treeview.bind("<<TreeviewCellEdited>>", self.attribute_changed)
        self.attribute_treeview.bind("<Button-1>", lambda event: self.attribute_menu.unpost())
        self.attribute_treeview.bind("<Button-3>", self.open_attribute_menu)

        def attribute_treeview_on_mouse_wheel(event):
            self.attribute_menu.unpost()
            self.attribute_treeview.clear_inplace_widgets()
        # mouse wheel up, down, click
        self.attribute_treeview.bind("<4>", attribute_treeview_on_mouse_wheel)
        self.attribute_treeview.bind("<5>", attribute_treeview_on_mouse_wheel)
        self.attribute_treeview.bind("<MouseWheel>", attribute_treeview_on_mouse_wheel)

        self.attribute_treeview.pack(fill='both', side='left', expand=True)

        vsb = ttk.Scrollbar(self.attribute_treeview, orient="vertical", command=self.attribute_treeview.yview)
        vsb.pack(side='right', fill='y')
        self.attribute_treeview.configure(yscrollcommand=vsb.set)

        # tabs
        main_tab.add(command_frame, text="Application")
        main_tab.add(resource_frame, text="Resource List")
        main_tab.add(object_frame, text="Object List")
        main_frame.add(main_tab, width=frame_width)
        main_frame.add(attribute_frame, width=frame_width)

        # wait a UI_RUN message, and send success message
        if self.cmdPipe:
            self.cmdPipe.RecvAndSend(COMMAND.UI_RUN, None, COMMAND.UI_RUN_OK, None)
Ejemplo n.º 3
0
 def closeEvent(self, event):
     # let the window close
     logger.info("Bye")
     event.accept()
     self.exit()
Ejemplo n.º 4
0
 def exit(self, *args):
     if args != () and args[0] is not None:
         logger.info(*args)
     self.appCmdQueue.put(COMMAND.CLOSE_APP)
     self.close()
     sys.exit()
Ejemplo n.º 5
0
    def __init__(self, project_filename, cmdQueue, appCmdQueue, cmdPipe):
        logger.info("Create MainWindow.")
        super(MainWindow, self).__init__()
        self.project_filename = project_filename
        self.cmdQueue = cmdQueue
        self.appCmdQueue = appCmdQueue
        self.cmdPipe = cmdPipe
        self.selected_item = None
        self.selected_item_categoty = ''
        self.isFillAttributeTree = False

        # MessageThread
        self.message_thread = MessageThread(self.cmdQueue)
        self.message_thread.start()

        self.connect(self.message_thread,
                     QtCore.SIGNAL(get_command_name(COMMAND.CLOSE_UI)),
                     self.exit)

        # load ui file
        uic.loadUi(UI_FILENAME, self)

        # set windows title
        self.set_window_title(
            project_filename if project_filename else "Default Project")

        # exit
        actionExit = self.findChild(QtGui.QAction, "actionExit")
        QtCore.QObject.connect(actionExit, QtCore.SIGNAL("triggered()"),
                               self.exit)
        # project
        actionNewProject = self.findChild(QtGui.QAction, "actionNewProject")
        QtCore.QObject.connect(actionNewProject, QtCore.SIGNAL("triggered()"),
                               self.new_project)
        actionOpenProject = self.findChild(QtGui.QAction, "actionOpenProject")
        QtCore.QObject.connect(actionOpenProject, QtCore.SIGNAL("triggered()"),
                               self.open_project)
        actionSaveProject = self.findChild(QtGui.QAction, "actionSaveProject")
        QtCore.QObject.connect(actionSaveProject, QtCore.SIGNAL("triggered()"),
                               self.save_project)
        # scene
        actionNewScene = self.findChild(QtGui.QAction, "actionNewScene")
        QtCore.QObject.connect(actionNewScene, QtCore.SIGNAL("triggered()"),
                               self.new_scene)
        actionSaveScene = self.findChild(QtGui.QAction, "actionSaveScene")
        QtCore.QObject.connect(actionSaveScene, QtCore.SIGNAL("triggered()"),
                               self.save_scene)

        # action draw mode
        actionWireframe = self.findChild(QtGui.QAction, "actionWireframe")
        actionShading = self.findChild(QtGui.QAction, "actionShading")
        QtCore.QObject.connect(
            actionWireframe, QtCore.SIGNAL("triggered()"),
            lambda: self.set_view_mode(COMMAND.VIEWMODE_WIREFRAME))
        QtCore.QObject.connect(
            actionShading, QtCore.SIGNAL("triggered()"),
            lambda: self.set_view_mode(COMMAND.VIEWMODE_SHADING))

        # sort ui items
        self.connect(self.message_thread,
                     QtCore.SIGNAL(get_command_name(COMMAND.SORT_UI_ITEMS)),
                     self.sort_items)

        # Resource list
        self.resourceListWidget = self.findChild(QtGui.QTreeWidget,
                                                 "resourceListWidget")
        self.resource_menu = QMenu()
        self.resource_menu.addAction(self.tr("Load"), self.load_resource)
        self.resource_menu.addAction(self.tr("Open"), self.openResource)
        self.resource_menu.addAction(self.tr("Duplicate"),
                                     self.duplicate_resource)
        self.resource_menu.addAction(self.tr("Save"), self.save_resource)
        self.resource_menu.addAction(self.tr("Delete"), self.delete_resource)
        self.resourceListWidget.setContextMenuPolicy(Qt.CustomContextMenu)
        self.resourceListWidget.customContextMenuRequested.connect(
            self.openResourceMenu)
        self.resourceListWidget.setSelectionMode(
            QtGui.QAbstractItemView.ExtendedSelection)
        self.resourceListWidget.setSortingEnabled(True)
        self.resourceListWidget.sortItems(0, 0)
        self.resourceListWidget.sortItems(1, 0)
        self.resourceListWidget.itemDoubleClicked.connect(self.load_resource)
        self.resourceListWidget.itemClicked.connect(self.select_resource)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_RESOURCE_LIST)),
            self.add_resource_list)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_RESOURCE_INFO)),
            self.set_resource_info)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_RESOURCE_ATTRIBUTE)),
            self.fill_resource_attribute)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.DELETE_RESOURCE_INFO)),
            self.delete_resource_info)

        btn = self.findChild(QtGui.QPushButton, "btnOpenResource")
        btn.clicked.connect(self.openResource)

        btn = self.findChild(QtGui.QPushButton, "btnSaveResource")
        btn.clicked.connect(self.save_resource)

        btn = self.findChild(QtGui.QPushButton, "btnDeleteResource")
        btn.clicked.connect(self.delete_resource)

        btn = self.findChild(QtGui.QPushButton, "btnTest")
        btn.clicked.connect(self.test)

        btn = self.findChild(QtGui.QPushButton, "btnAddLight")
        btn.clicked.connect(self.add_light)

        # screen
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_SCREEN_INFO)),
            self.set_screen_info)
        self.spinWidth = self.findChild(QtGui.QSpinBox, "spinWidth")
        self.spinHeight = self.findChild(QtGui.QSpinBox, "spinHeight")
        self.checkFullScreen = self.findChild(QtGui.QCheckBox,
                                              "checkFullScreen")

        btn = self.findChild(QtGui.QPushButton, "btnChangeResolution")
        btn.clicked.connect(self.change_resolution)

        # render targets
        self.comboRenderTargets = self.findChild(QtGui.QComboBox,
                                                 "comboRenderTargets")
        self.comboRenderTargets.activated.connect(self.view_rendertarget)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.CLEAR_RENDERTARGET_LIST)),
            self.clear_render_target_list)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_RENDERTARGET_INFO)),
            self.add_render_target)

        # rendering type
        self.comboRenderingType = self.findChild(QtGui.QComboBox,
                                                 "comboRenderingType")
        self.comboRenderingType.currentIndexChanged.connect(
            self.set_rendering_type)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_RENDERING_TYPE_LIST)),
            self.add_rendering_type)

        # anti aliasing
        self.comboAntiAliasing = self.findChild(QtGui.QComboBox,
                                                "comboAntiAliasing")
        self.comboAntiAliasing.currentIndexChanged.connect(
            self.set_anti_aliasing)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_ANTIALIASING_LIST)),
            self.add_anti_aliasing)

        # game backend
        self.comboGameBackend = self.findChild(QtGui.QComboBox,
                                               "comboGameBackend")
        self.comboGameBackend.currentIndexChanged.connect(
            self.change_game_backend)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_GAME_BACKEND_LIST)),
            self.add_game_backend)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_GAME_BACKEND_INDEX)),
            self.set_game_backend_index)

        # Object list
        self.objectList = self.findChild(QtGui.QTreeWidget, "objectListWidget")
        self.object_menu = QMenu()
        self.object_menu.addAction(self.tr("Action"), self.action_object)
        self.object_menu.addAction(self.tr("Remove"), self.delete_object)
        self.objectList.setContextMenuPolicy(Qt.CustomContextMenu)
        self.objectList.customContextMenuRequested.connect(self.openObjectMenu)
        self.objectList.setSelectionMode(
            QtGui.QAbstractItemView.ExtendedSelection)
        self.objectList.setSortingEnabled(True)
        self.objectList.sortItems(0, 0)
        self.objectList.sortItems(1, 0)
        self.objectList.itemClicked.connect(self.select_object)
        self.objectList.itemActivated.connect(self.select_object)
        self.objectList.itemDoubleClicked.connect(self.focus_object)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.DELETE_OBJECT_INFO)),
            self.delete_object_info)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_OBJECT_INFO)),
            self.add_object_info)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.TRANS_OBJECT_ATTRIBUTE)),
            self.fill_object_attribute)
        self.connect(
            self.message_thread,
            QtCore.SIGNAL(get_command_name(COMMAND.CLEAR_OBJECT_LIST)),
            self.clear_object_list)

        btn = self.findChild(QtGui.QPushButton, "btnRemoveObject")
        btn.clicked.connect(self.delete_object)

        # Object attribute tree
        self.attributeTree = self.findChild(QtGui.QTreeWidget, "attributeTree")
        self.attributeTree.setEditTriggers(
            self.attributeTree.NoEditTriggers)  # hook editable event
        self.attributeTree.itemSelectionChanged.connect(self.checkEditable)
        self.attributeTree.itemClicked.connect(self.checkEditable)
        self.attributeTree.itemChanged.connect(self.attribute_changed)

        # wait a UI_RUN message, and send success message
        if self.cmdPipe:
            self.cmdPipe.RecvAndSend(COMMAND.UI_RUN, None, COMMAND.UI_RUN_OK,
                                     None)