Some fixes in common/dataforms, new field types...
Now only jid-multi isn't handled.
This commit is contained in:
		
							parent
							
								
									c75bdcb63c
								
							
						
					
					
						commit
						aed92d21b7
					
				
					 4 changed files with 417 additions and 83 deletions
				
			
		|  | @ -28,6 +28,8 @@ | |||
| 
 | ||||
|       <child> | ||||
| 	<widget class="GtkNotebook" id="stages_notebook"> | ||||
| 	  <property name="width_request">400</property> | ||||
| 	  <property name="height_request">400</property> | ||||
| 	  <property name="visible">True</property> | ||||
| 	  <property name="show_tabs">False</property> | ||||
| 	  <property name="show_border">False</property> | ||||
|  | @ -91,10 +93,56 @@ | |||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label264"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <placeholder/> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label265"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkVBox" id="command_list_stage_vbox"> | ||||
| 	      <property name="visible">True</property> | ||||
|  | @ -104,16 +152,16 @@ | |||
| 	      <child> | ||||
| 		<widget class="GtkLabel" id="label253"> | ||||
| 		  <property name="visible">True</property> | ||||
| 		  <property name="label" translatable="yes">Choose command to execute:</property> | ||||
| 		  <property name="label" translatable="yes"><b>Choose command to execute:</b></property> | ||||
| 		  <property name="use_underline">False</property> | ||||
| 		  <property name="use_markup">False</property> | ||||
| 		  <property name="use_markup">True</property> | ||||
| 		  <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 		  <property name="wrap">False</property> | ||||
| 		  <property name="selectable">False</property> | ||||
| 		  <property name="xalign">0.5</property> | ||||
| 		  <property name="xalign">0.20000000298</property> | ||||
| 		  <property name="yalign">0.5</property> | ||||
| 		  <property name="xpad">0</property> | ||||
| 		  <property name="ypad">0</property> | ||||
| 		  <property name="ypad">6</property> | ||||
| 		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 		  <property name="width_chars">-1</property> | ||||
| 		  <property name="single_line_mode">False</property> | ||||
|  | @ -128,6 +176,7 @@ | |||
| 
 | ||||
| 	      <child> | ||||
| 		<widget class="GtkVBox" id="command_list_vbox"> | ||||
| 		  <property name="border_width">12</property> | ||||
| 		  <property name="visible">True</property> | ||||
| 		  <property name="homogeneous">False</property> | ||||
| 		  <property name="spacing">0</property> | ||||
|  | @ -169,7 +218,7 @@ | |||
| 		</widget> | ||||
| 		<packing> | ||||
| 		  <property name="padding">0</property> | ||||
| 		  <property name="expand">True</property> | ||||
| 		  <property name="expand">False</property> | ||||
| 		  <property name="fill">True</property> | ||||
| 		</packing> | ||||
| 	      </child> | ||||
|  | @ -180,10 +229,56 @@ | |||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label266"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <placeholder/> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label267"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkVBox" id="sending_form_stage_vbox"> | ||||
| 	      <property name="visible">True</property> | ||||
|  | @ -193,9 +288,9 @@ | |||
| 	      <child> | ||||
| 		<widget class="GtkLabel" id="instructions_label"> | ||||
| 		  <property name="visible">True</property> | ||||
| 		  <property name="label" translatable="yes">Fill in the form</property> | ||||
| 		  <property name="label" translatable="yes"><b>Fill in the form</b></property> | ||||
| 		  <property name="use_underline">False</property> | ||||
| 		  <property name="use_markup">False</property> | ||||
| 		  <property name="use_markup">True</property> | ||||
| 		  <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 		  <property name="wrap">False</property> | ||||
| 		  <property name="selectable">False</property> | ||||
|  | @ -232,6 +327,7 @@ | |||
| 		  <property name="padding">0</property> | ||||
| 		  <property name="expand">False</property> | ||||
| 		  <property name="fill">False</property> | ||||
| 		  <property name="pack_type">GTK_PACK_END</property> | ||||
| 		</packing> | ||||
| 	      </child> | ||||
| 	    </widget> | ||||
|  | @ -241,10 +337,56 @@ | |||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label268"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <placeholder/> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label269"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkVBox" id="no_commands_stage_vbox"> | ||||
| 	      <property name="visible">True</property> | ||||
|  | @ -310,8 +452,8 @@ | |||
| 		</widget> | ||||
| 		<packing> | ||||
| 		  <property name="padding">0</property> | ||||
| 		  <property name="expand">True</property> | ||||
| 		  <property name="fill">True</property> | ||||
| 		  <property name="expand">False</property> | ||||
| 		  <property name="fill">False</property> | ||||
| 		  <property name="pack_type">GTK_PACK_END</property> | ||||
| 		</packing> | ||||
| 	      </child> | ||||
|  | @ -322,10 +464,56 @@ | |||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label270"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <placeholder/> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label271"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkVBox" id="error_stage_vbox"> | ||||
| 	      <property name="visible">True</property> | ||||
|  | @ -335,9 +523,9 @@ | |||
| 	      <child> | ||||
| 		<widget class="GtkLabel" id="label257"> | ||||
| 		  <property name="visible">True</property> | ||||
| 		  <property name="label" translatable="yes">An error has occured:</property> | ||||
| 		  <property name="label" translatable="yes"><b>An error has occured:</b></property> | ||||
| 		  <property name="use_underline">False</property> | ||||
| 		  <property name="use_markup">False</property> | ||||
| 		  <property name="use_markup">True</property> | ||||
| 		  <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 		  <property name="wrap">False</property> | ||||
| 		  <property name="selectable">False</property> | ||||
|  | @ -388,9 +576,55 @@ | |||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label272"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <placeholder/> | ||||
| 	  </child> | ||||
| 
 | ||||
| 	  <child> | ||||
| 	    <widget class="GtkLabel" id="label273"> | ||||
| 	      <property name="visible">True</property> | ||||
| 	      <property name="label" translatable="yes"></property> | ||||
| 	      <property name="use_underline">False</property> | ||||
| 	      <property name="use_markup">False</property> | ||||
| 	      <property name="justify">GTK_JUSTIFY_LEFT</property> | ||||
| 	      <property name="wrap">False</property> | ||||
| 	      <property name="selectable">False</property> | ||||
| 	      <property name="xalign">0.5</property> | ||||
| 	      <property name="yalign">0.5</property> | ||||
| 	      <property name="xpad">0</property> | ||||
| 	      <property name="ypad">0</property> | ||||
| 	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> | ||||
| 	      <property name="width_chars">-1</property> | ||||
| 	      <property name="single_line_mode">False</property> | ||||
| 	      <property name="angle">0</property> | ||||
| 	    </widget> | ||||
| 	    <packing> | ||||
| 	      <property name="type">tab</property> | ||||
| 	    </packing> | ||||
| 	  </child> | ||||
| 	</widget> | ||||
| 	<packing> | ||||
| 	  <property name="padding">0</property> | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ import gtk | |||
| from common import xmpp, gajim, dataforms | ||||
| 
 | ||||
| import gtkgui_helpers | ||||
| import dialogs | ||||
| import dataforms as dataformwidget | ||||
| 
 | ||||
| class CommandWindow: | ||||
|  | @ -80,18 +81,12 @@ class CommandWindow: | |||
| 		self.xml.signal_autoconnect(self) | ||||
| 		self.window.show_all() | ||||
| 
 | ||||
| 	def on_adhoc_commands_window_destroy(self, window): | ||||
| 		''' The window dissappeared somehow... clean the environment, | ||||
| 		Stop pulsing.''' | ||||
| 		self.remove_pulsing() | ||||
| 
 | ||||
| # these functions are set up by appropriate stageX methods | ||||
| 	def stage_finish(self, *anything): pass | ||||
| 	def stage_cancel_button_clicked(self, *anything): assert False | ||||
| 	def stage_back_button_clicked(self, *anything): assert False | ||||
| 	def stage_forward_button_clicked(self, *anything): assert False | ||||
| 	def stage_execute_button_clicked(self, *anything): assert False | ||||
| 	def stage_adhoc_commands_window_destroy(self, *anything): assert False | ||||
| 	def stage_adhoc_commands_window_delete_event(self, *anything): assert False | ||||
| 	def do_nothing(self, *anything): return False | ||||
| 
 | ||||
|  | @ -109,11 +104,15 @@ class CommandWindow: | |||
| 		return self.stage_execute_button_clicked(*anything) | ||||
| 
 | ||||
| 	def on_adhoc_commands_window_destroy(self, *anything): | ||||
| 		return self.stage_adhoc_commands_window_destroy(*anything) | ||||
| 		# do all actions that are needed to remove this object from memory... | ||||
| 		self.remove_pulsing() | ||||
| 
 | ||||
| 	def on_adhoc_commands_window_delete_event(self, *anything): | ||||
| 		return self.stage_adhoc_commands_window_delete_event(self, *anything) | ||||
| 
 | ||||
| 	def __del__(self): | ||||
| 		print "Object has been deleted." | ||||
| 
 | ||||
| # stage 1: waiting for command list | ||||
| 	def stage1(self): | ||||
| 		'''Prepare the first stage. Request command list, | ||||
|  | @ -141,7 +140,6 @@ class CommandWindow: | |||
| 		self.stage_finish = self.stage1_finish | ||||
| 		self.stage_cancel_button_clicked = self.stage1_cancel_button_clicked | ||||
| 		self.stage_adhoc_commands_window_delete_event = self.stage1_adhoc_commands_window_delete_event | ||||
| 		self.stage_adhoc_commands_window_destroy = self.do_nothing | ||||
| 
 | ||||
| 	def stage1_finish(self): | ||||
| 		self.remove_pulsing() | ||||
|  | @ -183,13 +181,12 @@ class CommandWindow: | |||
| 			if first_radio is None: | ||||
| 				first_radio = radio | ||||
| 				self.commandnode = commandnode | ||||
| 			self.command_list_vbox.pack_end(radio, expand=False) | ||||
| 			self.command_list_vbox.pack_start(radio, expand=False) | ||||
| 		self.command_list_vbox.show_all() | ||||
| 
 | ||||
| 		self.stage_finish = self.stage2_finish | ||||
| 		self.stage_cancel_button_clicked = self.stage2_cancel_button_clicked | ||||
| 		self.stage_forward_button_clicked = self.stage2_forward_button_clicked | ||||
| 		self.stage_adhoc_commands_window_destroy = self.do_nothing | ||||
| 		self.stage_adhoc_commands_window_delete_event = self.do_nothing | ||||
| 
 | ||||
| 	def stage2_finish(self): | ||||
|  | @ -234,14 +231,29 @@ class CommandWindow: | |||
| 		self.stage_back_button_clicked = self.stage3_back_button_clicked | ||||
| 		self.stage_forward_button_clicked = self.stage3_forward_button_clicked | ||||
| 		self.stage_execute_button_clicked = self.stage3_execute_button_clicked | ||||
| 		self.stage_adhoc_commands_window_destroy = self.do_nothing | ||||
| 		self.stage_adhoc_commands_window_delete_event = self.do_nothing | ||||
| 		self.stage_adhoc_commands_window_delete_event = self.stage3_cancel_button_clicked | ||||
| 
 | ||||
| 	def stage3_finish(self): | ||||
| 		pass | ||||
| 
 | ||||
| 	def stage3_cancel_button_clicked(self, widget): | ||||
| 		pass | ||||
| 	def stage3_cancel_button_clicked(self, widget, *anything): | ||||
| 		''' We are in the middle of executing command. Ask user if he really want to cancel | ||||
| 		the process, then... cancel it. ''' | ||||
| 		# this works also as a handler for window_delete_event, so we have to return appropriate | ||||
| 		# values | ||||
| 		# TODO: translate it | ||||
| 		dialog = dialogs.HigDialog(self.window, gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL, | ||||
| 			gtk.BUTTONS_YES_NO, 'Cancel confirmation', | ||||
| 			'You are in process of executing command. Do you really want to cancel it?') | ||||
| 		dialog.popup() | ||||
| 		if dialog.get_response()==gtk.RESPONSE_YES: | ||||
| 			self.send_cancel() | ||||
| 			if widget==self.window: | ||||
| 				return False | ||||
| 			else: | ||||
| 				self.window.destroy() | ||||
| 			return False | ||||
| 		return True | ||||
| 
 | ||||
| 	def stage3_back_button_clicked(self, widget): | ||||
| 		self.stage3_submit_form('prev') | ||||
|  | @ -256,6 +268,12 @@ class CommandWindow: | |||
| 		self.data_form_widget.set_sensitive(False) | ||||
| 		if self.data_form_widget.get_data_form() is None: | ||||
| 			self.data_form_widget.hide() | ||||
| 
 | ||||
| 		self.cancel_button.set_sensitive(True) | ||||
| 		self.back_button.set_sensitive(False) | ||||
| 		self.forward_button.set_sensitive(False) | ||||
| 		self.execute_button.set_sensitive(False) | ||||
| 
 | ||||
| 		self.sending_form_progressbar.show() | ||||
| 		self.setup_pulsing(self.sending_form_progressbar) | ||||
| 		self.send_command(action) | ||||
|  | @ -272,19 +290,26 @@ class CommandWindow: | |||
| 		self.dataform = dataforms.DataForm(node=command.getTag('x')) | ||||
| 
 | ||||
| 		self.data_form_widget.set_sensitive(True) | ||||
| 		self.data_form_widget.set_data_form(self.dataform) | ||||
| 		try: | ||||
| 			self.data_form_widget.data_form=self.dataform | ||||
| 		except dataforms.BadDataFormNode: | ||||
| 			# TODO: translate | ||||
| 			self.stage5('Service sent malformed data', senderror=True) | ||||
| 		self.data_form_widget.show() | ||||
| 
 | ||||
| 		action = command.getTag('action') | ||||
| 		if action is None: | ||||
| 			# no action tag? that's last stage... | ||||
| 			self.cancel_button.set_sensitive(False) | ||||
| 			# no action tag? check if that's last stage... | ||||
| 			if command.getAttr('status')=='completed': | ||||
| 				self.cancel_button.set_sensitive(False) | ||||
| 			else: | ||||
| 				self.cancel_button.set_sensitive(True) | ||||
| 			self.back_button.set_sensitive(False) | ||||
| 			self.forward_button.set_sensitive(False) | ||||
| 			self.execute_button.set_sensitive(True) | ||||
| 		else: | ||||
| 			# actions, actions, actions... | ||||
| 			self.cancel_button.set_sensitive(False) | ||||
| 			self.cancel_button.set_sensitive(True) | ||||
| 			self.back_button.set_sensitive(action.getTag('prev') is not None) | ||||
| 			self.forward_button.set_sensitive(action.getTag('next') is not None) | ||||
| 			self.execute_button.set_sensitive(True) | ||||
|  | @ -306,7 +331,6 @@ class CommandWindow: | |||
| 
 | ||||
| 		self.stage_finish = self.do_nothing | ||||
| 		self.stage_cancel_button_clicked = self.stage4_cancel_button_clicked | ||||
| 		self.stage_adhoc_commands_window_destroy = self.do_nothing | ||||
| 		self.stage_adhoc_commands_window_delete_event = self.do_nothing | ||||
| 
 | ||||
| 	def stage4_cancel_button_clicked(self, widget): | ||||
|  | @ -316,12 +340,13 @@ class CommandWindow: | |||
| 		self.stage1() | ||||
| 
 | ||||
| # stage 5: an error has occured | ||||
| 	def stage5(self, error): | ||||
| 	def stage5(self, error, senderror=False): | ||||
| 		'''Display the error message. Wait for user to close the window''' | ||||
| 		# TODO: sending error to responder | ||||
| 		# close old stage | ||||
| 		self.stage_finish() | ||||
| 
 | ||||
| 		assert isinstance(error, unicode) | ||||
| 		assert isinstance(error, basestring) | ||||
| 
 | ||||
| 		self.stages_notebook.set_current_page( | ||||
| 			self.stages_notebook.page_num( | ||||
|  | @ -336,7 +361,6 @@ class CommandWindow: | |||
| 
 | ||||
| 		self.stage_finish = self.do_nothing | ||||
| 		self.stage_cancel_button_clicked = self.stage5_cancel_button_clicked | ||||
| 		self.stage_adhoc_commands_window_destroy = self.do_nothing | ||||
| 		self.stage_adhoc_commands_window_delete_event = self.do_nothing | ||||
| 
 | ||||
| 	def stage5_cancel_button_clicked(self, widget): | ||||
|  | @ -419,3 +443,18 @@ class CommandWindow: | |||
| 		print stanza | ||||
| 
 | ||||
| 		self.account.connection.SendAndCallForResponse(stanza, callback) | ||||
| 
 | ||||
| 	def send_cancel(self): | ||||
| 		'''Send the command with action='cancel'. ''' | ||||
| 		assert self.commandnode is not None | ||||
| 		assert self.sessionid is not None | ||||
| 
 | ||||
| 		stanza = xmpp.Iq(typ='set', to=self.jid) | ||||
| 		stanza.addChild('command', attrs={ | ||||
| 				'xmlns':xmpp.NS_COMMANDS, | ||||
| 				'node':self.commandnode, | ||||
| 				'sessionid':self.sessionid, | ||||
| 				'action':'cancel' | ||||
| 			}) | ||||
| 
 | ||||
| 		self.account.connection.send(stanza) | ||||
|  |  | |||
|  | @ -78,9 +78,14 @@ class DataForm(xmpp.Node, object): | |||
| 
 | ||||
| 		if tofill is not None: | ||||
| 			self._mode = tofill.mode | ||||
| 			self.fields = tofill.fields | ||||
| 			self.fields = (field for field in tofill.fields if field.type!='fixed') | ||||
| 			self.records = tofill.records | ||||
| 			self.type = 'submit' | ||||
| 			for field in self.iter_fields(): | ||||
| 				field.required=False | ||||
| 				del field.label | ||||
| 				del field.options | ||||
| 				del field.description | ||||
| 		elif node is not None: | ||||
| 			# if there is <reported/> element, the form contains multiple records | ||||
| 			if self.getTag('reported') is not None: | ||||
|  | @ -138,7 +143,7 @@ class DataForm(xmpp.Node, object): | |||
| 		return self.getTagData('title') | ||||
| 
 | ||||
| 	def set_title(self, title): | ||||
| 		self.setTagData('title') | ||||
| 		self.setTagData('title', title) | ||||
| 
 | ||||
| 	def del_title(self): | ||||
| 		try: | ||||
|  | @ -283,11 +288,16 @@ class DataForm(xmpp.Node, object): | |||
| 		raise KeyError, "This form does not contain %r field." % var | ||||
| 
 | ||||
| class DataField(xmpp.Node, object): | ||||
| 	def __init__(self, typ='text-single', desc=None, required=None, value=None, options=None, node=None): | ||||
| 	def __init__(self, typ=None,var=None, value=None, label=None, desc=None, | ||||
| 		required=None, options=None, node=None): | ||||
| 
 | ||||
| 		assert typ in ('boolean', 'fixed', 'hidden', 'jid-multi', 'jid-single', 'list-multi', | ||||
| 			'list-single', 'text-multi', 'text-private', 'text-single', None) | ||||
| 			'list-single', 'text-multi', 'text-private', 'text-single',None) | ||||
| 		 | ||||
| 		xmpp.Node.__init__(self, 'field', node=node) | ||||
| 		if typ is not None: self.type = typ | ||||
| 		if var is not None: self.var = var | ||||
| 		if label is not None: self.label = label | ||||
| 		if desc is not None: self.description = desc | ||||
| 		if required is not None: self.required = required | ||||
| 		if value is not None: self.value = value | ||||
|  | @ -309,7 +319,10 @@ class DataField(xmpp.Node, object): | |||
| 		if typ!='text-single': | ||||
| 			self.setAttr('type', typ) | ||||
| 		else: | ||||
| 			self.delAttr('type') | ||||
| 			try: | ||||
| 				self.delAttr('type') | ||||
| 			except KeyError: | ||||
| 				pass | ||||
| 
 | ||||
| 	type = property(get_type, set_type, None, | ||||
| 		""" Field type. One of: 'boolean', 'fixed', 'hidden', 'jid-multi', 'jid-single', | ||||
|  | @ -383,8 +396,8 @@ class DataField(xmpp.Node, object): | |||
| 
 | ||||
| 		elif self.type in ('jid-multi', 'list-multi'): | ||||
| 			return [value.getData() for value in self.getTags('value')] | ||||
| 		 | ||||
| 		elif self.type in ('hidden', 'jid-single', 'list-single', 'text-single', 'text-private'): | ||||
| 
 | ||||
| 		elif self.type in ('hidden', 'jid-single', 'list-single', 'text-single', 'text-private') or True: | ||||
| 			return self.getTagData('value') | ||||
| 
 | ||||
| 	def set_value(self, value): | ||||
|  | @ -399,8 +412,8 @@ class DataField(xmpp.Node, object): | |||
| 
 | ||||
| 		elif self.type in ('jid-multi', 'list-multi'): | ||||
| 			del_multiple_tag_value(self, 'value') | ||||
| 			for item in self.value: | ||||
| 				self.addChild('value', None, (item,)) | ||||
| 			for item in value: | ||||
| 				self.addChild('value', {}, (item,)) | ||||
| 
 | ||||
| 		elif self.type in ('hidden', 'jid-single', 'list-single', 'text-single', 'text-private'): | ||||
| 			self.setTagData('value', value) | ||||
|  | @ -417,6 +430,7 @@ class DataField(xmpp.Node, object): | |||
| 		for element in self.getChildren(): | ||||
| 			if not isinstance(element, xmpp.Node): continue | ||||
| 			if not element.getName()=='option': continue | ||||
| 			if element.getTag('value') is None: raise BadDataFormNode | ||||
| 			yield element.getAttr('label'), element.getTag('value').getData() | ||||
| 
 | ||||
| 	def get_options(self): | ||||
|  | @ -432,10 +446,10 @@ class DataField(xmpp.Node, object): | |||
| 			assert option[0] is None or isinstance(option[0], unicode) | ||||
| 			assert isinstance(option[1], unicode) | ||||
| 			if option[0] is None: | ||||
| 				attr=None | ||||
| 				attr={} | ||||
| 			else: | ||||
| 				attr={'label': option[0].encode('utf-8')} | ||||
| 			self.addChild('option', attr, (option[1].encode('utf-8'),)) | ||||
| 			self.addChild('option', attr, (xmpp.Node('value', {}, (option[1].encode('utf-8'),)),)) | ||||
| 
 | ||||
| 	def del_options(self): | ||||
| 		del_multiple_tag_value(self, 'option') | ||||
|  |  | |||
							
								
								
									
										125
									
								
								src/dataforms.py
									
										
									
									
									
								
							
							
						
						
									
										125
									
								
								src/dataforms.py
									
										
									
									
									
								
							|  | @ -52,7 +52,7 @@ class DataFormWidget(gtk.Alignment, object): | |||
| 		else: | ||||
| 			self.form = self.__class__.MultipleForm(dataform) | ||||
| 		self.form.show() | ||||
| 		self.container.pack_end(self.form) | ||||
| 		self.container.pack_end(self.form, expand=True, fill=True) | ||||
| 
 | ||||
| 	def get_data_form(self): | ||||
| 		""" Data form displayed in the widget or None if no form. """ | ||||
|  | @ -81,38 +81,38 @@ class DataFormWidget(gtk.Alignment, object): | |||
| 		""" Treat 'us' as one widget. """ | ||||
| 		self.show_all() | ||||
| 
 | ||||
| 	def filled_data_form(self): | ||||
| 		""" Generates form that contains values filled by user. """ | ||||
| 		assert isinstance(self._data_form, dataforms.DataForm) | ||||
| 
 | ||||
| 		form = xmpp.Node('x', {'xmlns':xmpp.NS_DATA, 'type':'submit'}) | ||||
| 
 | ||||
| 
 | ||||
| 		for field in self._data_form.kids: | ||||
| 			if not isinstance(field, xmpp.DataField): continue | ||||
| 			 | ||||
| 			ftype = field.getType() | ||||
| 			if ftype not in ('boolean', 'fixed', 'hidden', 'jid-multi', | ||||
| 				'jid-single', 'list-multi', 'list-single', | ||||
| 				'text-multi', 'text-private', 'text-single'): | ||||
| 				ftype = 'text-single' | ||||
| 
 | ||||
| 			if ftype in ('fixed',): | ||||
| 				continue | ||||
| 
 | ||||
| 			newfield = xmpp.Node('field', {'var': field.getVar()}) | ||||
| 
 | ||||
| 			if ftype in ('jid-multi', 'list-multi', 'text-multi'): | ||||
| 				for value in field.getValues(): | ||||
| 					newvalue = xmpp.Node('value', {}, [value]) | ||||
| 					newfield.addChild(node=newvalue) | ||||
| 			else: | ||||
| 				newvalue = xmpp.Node('value', {}, [field.getValue()]) | ||||
| 				newfield.addChild(node=newvalue) | ||||
| 
 | ||||
| 			form.addChild(node=newfield) | ||||
| 
 | ||||
| 		return form | ||||
| #?	def filled_data_form(self): | ||||
| #?		""" Generates form that contains values filled by user. """ | ||||
| #?		assert isinstance(self._data_form, dataforms.DataForm) | ||||
| #? | ||||
| #?		form = xmpp.Node('x', {'xmlns':xmpp.NS_DATA, 'type':'submit'}) | ||||
| #? | ||||
| #? | ||||
| #?		for field in self._data_form.kids: | ||||
| #?			if not isinstance(field, xmpp.DataField): continue | ||||
| #?			 | ||||
| #?			ftype = field.getType() | ||||
| #?			if ftype not in ('boolean', 'fixed', 'hidden', 'jid-multi', | ||||
| #?				'jid-single', 'list-multi', 'list-single', | ||||
| #?				'text-multi', 'text-private', 'text-single'): | ||||
| #?				ftype = 'text-single' | ||||
| #? | ||||
| #?			if ftype in ('fixed',): | ||||
| #?				continue | ||||
| #? | ||||
| #?			newfield = xmpp.Node('field', {'var': field.getVar()}) | ||||
| #? | ||||
| #?			if ftype in ('jid-multi', 'list-multi', 'text-multi'): | ||||
| #?				for value in field.getValues(): | ||||
| #?					newvalue = xmpp.Node('value', {}, [value]) | ||||
| #?					newfield.addChild(node=newvalue) | ||||
| #?			else: | ||||
| #?				newvalue = xmpp.Node('value', {}, [field.getValue()]) | ||||
| #?				newfield.addChild(node=newvalue) | ||||
| #? | ||||
| #?			form.addChild(node=newfield) | ||||
| #? | ||||
| #?		return form | ||||
| 
 | ||||
| # "private" methods | ||||
| 
 | ||||
|  | @ -164,8 +164,7 @@ class DataFormWidget(gtk.Alignment, object): | |||
| 					widget.set_line_wrap(True) | ||||
| 					self.attach(widget, leftattach, rightattach, linecounter, linecounter+1) | ||||
| 
 | ||||
| 				elif field.type in ('jid-multi', 'jid-single', 'list-multi', 'text-multi', | ||||
| 					'text-private'): | ||||
| 				elif field.type in ('jid-multi'): | ||||
| 					widget = gtk.Label(field.type) | ||||
| 
 | ||||
| 				elif field.type == 'list-single': | ||||
|  | @ -176,7 +175,7 @@ class DataFormWidget(gtk.Alignment, object): | |||
| 					# TODO: We cannot deactivate them all... | ||||
| 					widget = gtk.VBox() | ||||
| 					first_radio = None | ||||
| 					for label, value in field.iter_options(): | ||||
| 					for value, label in field.iter_options(): | ||||
| 						radio = gtk.RadioButton(first_radio, label=label) | ||||
| 						radio.connect('toggled', self.on_list_single_radiobutton_toggled, | ||||
| 							field, value) | ||||
|  | @ -188,6 +187,41 @@ class DataFormWidget(gtk.Alignment, object): | |||
| 							radio.set_active(True) | ||||
| 						widget.pack_start(radio, expand=False) | ||||
| 
 | ||||
| 				elif field.type == 'list-multi': | ||||
| 					# TODO: When more than few choices, make a list | ||||
| 					widget = gtk.VBox() | ||||
| 					for value, label in field.iter_options(): | ||||
| 						check = gtk.CheckButton(label, use_underline=False) | ||||
| 						check.set_active(value in field.value) | ||||
| 						check.connect('toggled', self.on_list_multi_checkbutton_toggled, | ||||
| 							field, value) | ||||
| 						widget.pack_start(check, expand=False) | ||||
| 
 | ||||
| 				elif field.type == 'jid-single': | ||||
| 					widget = gtk.Entry() | ||||
| 					widget.connect('changed', self.on_text_single_entry_changed, field) | ||||
| 					if field.value is None: | ||||
| 						field.value = u'' | ||||
| 					widget.set_text(field.value) | ||||
| 
 | ||||
| 				elif field.type == 'text-private': | ||||
| 					widget = gtk.Entry() | ||||
| 					widget.connect('changed', self.on_text_single_entry_changed, field) | ||||
| 					widget.set_visibility(False) | ||||
| 					if field.value is None: | ||||
| 						field.value = u'' | ||||
| 					widget.set_text(field.value) | ||||
| 
 | ||||
| 				elif field.type == 'text-multi': | ||||
| 					# TODO: bigger text view | ||||
| 					widget = gtk.TextView() | ||||
| 					widget.set_wrap_mode(gtk.WRAP_WORD) | ||||
| 					widget.get_buffer().connect('changed', self.on_text_multi_textbuffer_changed, | ||||
| 						field) | ||||
| 					if field.value is None: | ||||
| 						field.value = u'' | ||||
| 					widget.get_buffer().set_text(field.value) | ||||
| 
 | ||||
| 				else:# field.type == 'text-single' or field.type is nonstandard: | ||||
| 					# JEP says that if we don't understand some type, we | ||||
| 					# should handle it as text-single | ||||
|  | @ -199,7 +233,7 @@ class DataFormWidget(gtk.Alignment, object): | |||
| 
 | ||||
| 				if commonlabel and field.label is not None: | ||||
| 					label = gtk.Label(field.label) | ||||
| 					label.set_justify(gtk.JUSTIFY_RIGHT) | ||||
| 					label.set_alignment(1.0, 0.5) | ||||
| 					self.attach(label, 0, 1, linecounter, linecounter+1) | ||||
| 
 | ||||
| 				if commonwidget: | ||||
|  | @ -208,8 +242,10 @@ class DataFormWidget(gtk.Alignment, object): | |||
| 				widget.show_all() | ||||
| 
 | ||||
| 				if commondesc and field.description is not None: | ||||
| 					# TODO: with smaller font | ||||
| 					label = gtk.Label(field.description) | ||||
| 					label = gtk.Label() | ||||
| 					label.set_markup('<small>'+\ | ||||
| 						gtkgui_helpers.escape_for_pango_markup(field.description)+\ | ||||
| 						'</small>') | ||||
| 					label.set_line_wrap(True) | ||||
| 					self.attach(label, 2, 3, linecounter, linecounter+1) | ||||
| 
 | ||||
|  | @ -227,9 +263,20 @@ class DataFormWidget(gtk.Alignment, object): | |||
| 		def on_list_single_radiobutton_toggled(self, widget, field, value): | ||||
| 			field.value = value | ||||
| 
 | ||||
| 		def on_list_multi_checkbutton_toggled(self, widget, field, value): | ||||
| 			if widget.get_active() and value not in field.value: | ||||
| 				field.value.append(value) | ||||
| 			elif not widget.get_active() and value in field.value: | ||||
| 				field.value.remove(value) | ||||
| 
 | ||||
| 		def on_text_single_entry_changed(self, widget, field): | ||||
| 			field.value = widget.get_text() | ||||
| 
 | ||||
| 		def on_text_multi_textbuffer_changed(self, widget, field): | ||||
| 			field.value = widget.get_text( | ||||
| 				widget.get_start_iter(), | ||||
| 				widget.get_end_iter()) | ||||
| 
 | ||||
| 	class MultipleForm(gtk.Alignment, object): | ||||
| 		def __init__(self, dataform): | ||||
| 			assert dataform.mode==dataforms.DATAFORM_MULTIPLE | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue