Пример #1
0
	def __init__(self):
		"""
		Parse the list of action names in the toolbar list.
		Look up the action for each name in the action list and add it to the toolbar.
		"""
		gtk.Toolbar.__init__(self)
		self.set_style(gtk.TOOLBAR_ICONS)
		for action_name in TOOLBAR_LIST:
			if action_name:	#add a tool item
				action = Actions.get_action_from_name(action_name)
				self.add(action.create_tool_item())
				#this reset of the tooltip property is required (after creating the tool item) for the tooltip to show
				action.set_property('tooltip', action.get_property('tooltip'))
			else: self.add(gtk.SeparatorToolItem())
Пример #2
0
	def update_exec_stop(self):
		"""
		Update the exec and stop buttons.
		Lock and unlock the mutex for race conditions with exec flow graph threads.
		"""
		sensitive = self.get_flow_graph().is_valid() and not self.get_page().get_pid()
		Actions.get_action_from_name(Actions.FLOW_GRAPH_GEN).set_sensitive(sensitive)
		Actions.get_action_from_name(Actions.FLOW_GRAPH_EXEC).set_sensitive(sensitive)
		Actions.get_action_from_name(Actions.FLOW_GRAPH_KILL).set_sensitive(self.get_page().get_pid() != None)
Пример #3
0
	def __init__(self):
		"""
		Parse the list of submenus from the menubar list.
		For each submenu, get a list of action names.
		Look up the action for each name in the action list and add it to the submenu.
		Add the submenu to the menu bar.
		"""
		gtk.MenuBar.__init__(self)
		for main_action,action_names in MENU_BAR_LIST:
			#create the main menu item
			main_menu_item = main_action.create_menu_item()
			self.append(main_menu_item)
			#create the menu
			main_menu = gtk.Menu()
			main_menu_item.set_submenu(main_menu)
			for action_name in action_names:
				if action_name: #append a menu item
					action = Actions.get_action_from_name(action_name)
					main_menu.append(action.create_menu_item())
				else: main_menu.append(gtk.SeparatorMenuItem())
			main_menu.show_all() #this show all is required for the separators to show
Пример #4
0
	def handle_states(self, state=''):
		"""
		Handle the state changes in the GUI.
		Handle all of the state changes that arise from the action handler or other gui and
		inputs in the application. The state passed to the handle_states method is a string descriping
		the change. A series of if/elif statements handle the state by greying out action buttons, causing
		changes in the flow graph, saving/opening files... The handle_states method is passed to the
		contructors of many of the classes used in this application enabling them to report any state change.
		@param state a string describing the state change
		"""
		#print state
		##################################################
		# Initalize/Quit
		##################################################
		if state == Actions.APPLICATION_INITIALIZE:
			for action in Actions.get_all_actions(): action.set_sensitive(False) #set all actions disabled
			# enable a select few actions
			for action in (
				Actions.APPLICATION_QUIT, Actions.FLOW_GRAPH_NEW,
				Actions.FLOW_GRAPH_OPEN, Actions.FLOW_GRAPH_SAVE_AS,
				Actions.FLOW_GRAPH_CLOSE, Actions.ABOUT_WINDOW_DISPLAY,
				Actions.FLOW_GRAPH_SCREEN_CAPTURE, Actions.HELP_WINDOW_DISPLAY,
				Actions.COLORS_WINDOW_DISPLAY,
			): Actions.get_action_from_name(action).set_sensitive(True)
			if not self.init_file_paths:
				self.init_file_paths = Preferences.files_open()
			if not self.init_file_paths: self.init_file_paths = ['']
			for file_path in self.init_file_paths:
				if file_path: self.main_window.new_page(file_path) #load pages from file paths
			if Preferences.file_open() in self.init_file_paths:
				self.main_window.new_page(Preferences.file_open(), show=True)
			if not self.get_page():	self.main_window.new_page() #ensure that at least a blank page exists
		elif state == Actions.APPLICATION_QUIT:
			if self.main_window.close_pages():
				gtk.main_quit()
				exit(0)
		##################################################
		# Selections
		##################################################
		elif state == Actions.ELEMENT_SELECT:
			pass #do nothing, update routines below
		elif state == Actions.NOTHING_SELECT:
			self.get_flow_graph().unselect()
		##################################################
		# Enable/Disable
		##################################################
		elif state == Actions.BLOCK_ENABLE:
			if self.get_flow_graph().enable_selected(True):
				self.get_flow_graph().update()
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		elif state == Actions.BLOCK_DISABLE:
			if self.get_flow_graph().enable_selected(False):
				self.get_flow_graph().update()
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		##################################################
		# Cut/Copy/Paste
		##################################################
		elif state == Actions.BLOCK_CUT:
			self.handle_states(Actions.BLOCK_COPY)
			self.handle_states(Actions.ELEMENT_DELETE)
		elif state == Actions.BLOCK_COPY:
			self.clipboard = self.get_flow_graph().copy_to_clipboard()
		elif state == Actions.BLOCK_PASTE:
			if self.clipboard:
				self.get_flow_graph().paste_from_clipboard(self.clipboard)
				self.get_flow_graph().update()
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		##################################################
		# Move/Rotate/Delete/Create
		##################################################
		elif state == Actions.BLOCK_MOVE:
			self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
			self.get_page().set_saved(False)
		elif state == Actions.BLOCK_ROTATE_CCW:
			if self.get_flow_graph().rotate_selected(90):
				self.get_flow_graph().update()
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		elif state == Actions.BLOCK_ROTATE_CW:
			if self.get_flow_graph().rotate_selected(-90):
				self.get_flow_graph().update()
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		elif state == Actions.ELEMENT_DELETE:
			if self.get_flow_graph().remove_selected():
				self.get_flow_graph().update()
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.handle_states(Actions.NOTHING_SELECT)
				self.get_page().set_saved(False)
		elif state == Actions.ELEMENT_CREATE:
			self.get_flow_graph().update()
			self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
			self.handle_states(Actions.NOTHING_SELECT)
			self.get_page().set_saved(False)
		elif state == Actions.BLOCK_INC_TYPE:
			if self.get_flow_graph().type_controller_modify_selected(1):
				self.get_flow_graph().update()
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		elif state == Actions.BLOCK_DEC_TYPE:
			if self.get_flow_graph().type_controller_modify_selected(-1):
				self.get_flow_graph().update()
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		elif state == Actions.PORT_CONTROLLER_INC:
			if self.get_flow_graph().port_controller_modify_selected(1):
				self.get_flow_graph().update()
				self.get_flow_graph().update() #2 times
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		elif state == Actions.PORT_CONTROLLER_DEC:
			if self.get_flow_graph().port_controller_modify_selected(-1):
				self.get_flow_graph().update()
				self.get_flow_graph().update() #2 times
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		##################################################
		# Window stuff
		##################################################
		elif state == Actions.ABOUT_WINDOW_DISPLAY:
			Dialogs.AboutDialog(self.get_flow_graph().get_parent())
		elif state == Actions.HELP_WINDOW_DISPLAY:
			Dialogs.HelpDialog()
		elif state == Actions.COLORS_WINDOW_DISPLAY:
			Dialogs.ColorsDialog(self.get_flow_graph().get_parent())
		##################################################
		# Param Modifications
		##################################################
		elif state == Actions.BLOCK_PARAM_MODIFY:
			selected_block = self.get_flow_graph().get_selected_block()
			if selected_block and ParamsDialog(selected_block).run():
				self.get_flow_graph().update()
				self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
				self.get_page().set_saved(False)
		##################################################
		# Undo/Redo
		##################################################
		elif state == Actions.FLOW_GRAPH_UNDO:
			n = self.get_page().get_state_cache().get_prev_state()
			if n:
				self.get_flow_graph().unselect()
				self.get_flow_graph().import_data(n)
				self.get_flow_graph().update()
				self.get_page().set_saved(False)
		elif state == Actions.FLOW_GRAPH_REDO:
			n = self.get_page().get_state_cache().get_next_state()
			if n:
				self.get_flow_graph().unselect()
				self.get_flow_graph().import_data(n)
				self.get_flow_graph().update()
				self.get_page().set_saved(False)
		##################################################
		# New/Open/Save/Close
		##################################################
		elif state == Actions.FLOW_GRAPH_NEW:
			self.main_window.new_page()
		elif state == Actions.FLOW_GRAPH_OPEN:
			file_paths = OpenFlowGraphFileDialog(self.get_page().get_file_path()).run()
			if file_paths: #open a new page for each file, show only the first
				for i,file_path in enumerate(file_paths):
					self.main_window.new_page(file_path, show=(i==0))
		elif state == Actions.FLOW_GRAPH_CLOSE:
			self.main_window.close_page()
		elif state == Actions.FLOW_GRAPH_SAVE:
			#read-only or undefined file path, do save-as
			if self.get_page().get_read_only() or not self.get_page().get_file_path():
				self.handle_states(Actions.FLOW_GRAPH_SAVE_AS)
			#otherwise try to save
			else:
				try:
					ParseXML.to_file(self.get_flow_graph().export_data(), self.get_page().get_file_path())
					self.get_page().set_saved(True)
				except IOError:
					Messages.send_fail_save(self.get_page().get_file_path())
					self.get_page().set_saved(False)
		elif state == Actions.FLOW_GRAPH_SAVE_AS:
			file_path = SaveFlowGraphFileDialog(self.get_page().get_file_path()).run()
			if file_path is not None:
				self.get_page().set_file_path(file_path)
				self.handle_states(Actions.FLOW_GRAPH_SAVE)
		elif state == Actions.FLOW_GRAPH_SCREEN_CAPTURE:
			file_path = SaveImageFileDialog(self.get_page().get_file_path()).run()
			if file_path is not None:
				pixbuf = self.get_flow_graph().get_drawing_area().get_pixbuf()
				pixbuf.save(file_path, IMAGE_FILE_EXTENSION[1:])
		##################################################
		# Gen/Exec/Stop
		##################################################
		elif state == Actions.FLOW_GRAPH_GEN:
			if not self.get_page().get_pid():
				if not self.get_page().get_saved() or not self.get_page().get_file_path():
					self.handle_states(Actions.FLOW_GRAPH_SAVE) #only save if file path missing or not saved
				if self.get_page().get_saved() and self.get_page().get_file_path():
					generator = self.get_page().get_generator()
					try:
						Messages.send_start_gen(generator.get_file_path())
						generator.write()
					except Exception,e: Messages.send_fail_gen(e)
				else: self.generator = None
		elif state == Actions.FLOW_GRAPH_EXEC:
			if not self.get_page().get_pid():
				self.handle_states(Actions.FLOW_GRAPH_GEN)
				if self.get_page().get_saved() and self.get_page().get_file_path():
					ExecFlowGraphThread(self)
		elif state == Actions.FLOW_GRAPH_KILL:
			if self.get_page().get_pid():
				try: os.kill(self.get_page().get_pid(), signal.SIGKILL)
				except: print "could not kill pid: %s"%self.get_page().get_pid()
		elif state == '': #pass and run the global actions
			pass
		else: print '!!! State "%s" not handled !!!'%state
		##################################################
		# Global Actions for all States
		##################################################
		#update general buttons
		Actions.get_action_from_name(Actions.ELEMENT_DELETE).set_sensitive(bool(self.get_flow_graph().get_selected_elements()))
		Actions.get_action_from_name(Actions.BLOCK_PARAM_MODIFY).set_sensitive(bool(self.get_flow_graph().get_selected_block()))
		Actions.get_action_from_name(Actions.BLOCK_ROTATE_CCW).set_sensitive(bool(self.get_flow_graph().get_selected_blocks()))
		Actions.get_action_from_name(Actions.BLOCK_ROTATE_CW).set_sensitive(bool(self.get_flow_graph().get_selected_blocks()))
		#update cut/copy/paste
		Actions.get_action_from_name(Actions.BLOCK_CUT).set_sensitive(bool(self.get_flow_graph().get_selected_blocks()))
		Actions.get_action_from_name(Actions.BLOCK_COPY).set_sensitive(bool(self.get_flow_graph().get_selected_blocks()))
		Actions.get_action_from_name(Actions.BLOCK_PASTE).set_sensitive(bool(self.clipboard))
		#update enable/disable
		Actions.get_action_from_name(Actions.BLOCK_ENABLE).set_sensitive(bool(self.get_flow_graph().get_selected_blocks()))
		Actions.get_action_from_name(Actions.BLOCK_DISABLE).set_sensitive(bool(self.get_flow_graph().get_selected_blocks()))
		#set the exec and stop buttons
		self.update_exec_stop()
		#saved status
		Actions.get_action_from_name(Actions.FLOW_GRAPH_SAVE).set_sensitive(not self.get_page().get_saved())
		self.main_window.update()
		try: #set the size of the flow graph area (if changed)
			new_size = self.get_flow_graph().get_option('window_size')
			if self.get_flow_graph().get_size() != tuple(new_size):
				self.get_flow_graph().set_size(*new_size)
		except: pass
		#draw the flow graph
		self.get_flow_graph().update_selected()
		self.get_flow_graph().queue_draw()