def exit(self, *args): logger.info("Bye") self.save_config() self.root.quit() self.appCmdQueue.put(COMMAND.CLOSE_APP) sys.exit()
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)
def closeEvent(self, event): # let the window close logger.info("Bye") event.accept() self.exit()
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()
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)