improve GUI for jnigle

This commit is contained in:
Yann Leboulanger 2009-09-17 22:21:06 +02:00
parent 12baddbdc3
commit f5b1c2dca7
3 changed files with 100 additions and 49 deletions

View File

@ -332,6 +332,48 @@
<property name="position">4</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="start_audio_button">
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="no_show_all">True</property>
<property name="tooltip" translatable="yes">Start audio session</property>
<property name="relief">none</property>
<signal name="activate" handler="on_start_audio_button_activate"/>
<child>
<widget class="GtkImage" id="start_audio_image">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
<property name="icon-size">1</property>
</widget>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">5</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="stop_audio_button">
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="no_show_all">True</property>
<property name="tooltip" translatable="yes">Stop audio session</property>
<property name="relief">none</property>
<signal name="activate" handler="on_stop_audio_button_activate"/>
<child>
<widget class="GtkImage" id="stop_audio_image">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
<property name="icon-size">1</property>
</widget>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">6</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="convert_to_gc_button">
<property name="visible">True</property>
@ -352,7 +394,7 @@
</widget>
<packing>
<property name="expand">False</property>
<property name="position">5</property>
<property name="position">7</property>
</packing>
</child>
<child>
@ -375,7 +417,7 @@
</widget>
<packing>
<property name="expand">False</property>
<property name="position">6</property>
<property name="position">8</property>
</packing>
</child>
<child>
@ -398,7 +440,7 @@
</widget>
<packing>
<property name="expand">False</property>
<property name="position">7</property>
<property name="position">9</property>
</packing>
</child>
<child>
@ -408,7 +450,7 @@
</widget>
<packing>
<property name="expand">False</property>
<property name="position">8</property>
<property name="position">10</property>
</packing>
</child>
<child>
@ -431,7 +473,7 @@
</widget>
<packing>
<property name="expand">False</property>
<property name="position">9</property>
<property name="position">11</property>
</packing>
</child>
<child>
@ -443,7 +485,7 @@
</child>
</widget>
<packing>
<property name="position">10</property>
<property name="position">12</property>
</packing>
</child>
<child>
@ -490,7 +532,7 @@
</widget>
<packing>
<property name="expand">False</property>
<property name="position">11</property>
<property name="position">13</property>
</packing>
</child>
</widget>

View File

@ -1161,6 +1161,16 @@ class ChatControl(ChatControlBase):
self._on_add_to_roster_menuitem_activate)
self.handlers[id_] = self._add_to_roster_button
self._start_audio_button = self.xml.get_widget('start_audio_button')
id_ = self._start_audio_button.connect('clicked',
self.on_start_audio_button_activate)
self.handlers[id_] = self._start_audio_button
self._stop_audio_button = self.xml.get_widget('stop_audio_button')
id_ = self._stop_audio_button.connect('clicked',
self.on_stop_audio_button_activate)
self.handlers[id_] = self._stop_audio_button
self._send_file_button = self.xml.get_widget('send_file_button')
# add a special img for send file button
path_to_upload_img = os.path.join(gajim.DATA_DIR, 'pixmaps', 'upload.png')
@ -1203,22 +1213,22 @@ class ChatControl(ChatControlBase):
img.set_from_pixbuf(gtkgui_helpers.load_icon(
'muc_active').get_pixbuf())
self.update_toolbar()
self._mood_image = self.xml.get_widget('mood_image')
self._activity_image = self.xml.get_widget('activity_image')
self._tune_image = self.xml.get_widget('tune_image')
self._audio_image = self.xml.get_widget('audio_image')
self.update_mood()
self.update_activity()
self.update_tune()
if gajim.capscache.is_supported(contact, NS_JINGLE_RTP_AUDIO):
self.set_audio_state('available')
else:
self.set_audio_state('not_available')
self.audio_sid = None
self.update_toolbar()
self._mood_image = self.xml.get_widget('mood_image')
self._activity_image = self.xml.get_widget('activity_image')
self._tune_image = self.xml.get_widget('tune_image')
self.update_mood()
self.update_activity()
self.update_tune()
# keep timeout id and window obj for possible big avatar
# it is on enter-notify and leave-notify so no need to be
@ -1318,6 +1328,20 @@ class ChatControl(ChatControlBase):
else:
self._add_to_roster_button.hide()
# Audio buttons
if self.audio_state == self.AUDIO_STATE_NOT_AVAILABLE:
self._start_audio_button.show()
self._start_audio_button.set_sensitive(False)
self._stop_audio_button.hide()
elif self.audio_state in (self.AUDIO_STATE_AVAILABLE,
self.AUDIO_STATE_ERROR):
self._start_audio_button.show()
self._start_audio_button.set_sensitive(True)
self._stop_audio_button.hide()
else:
self._start_audio_button.hide()
self._stop_audio_button.show()
# Send file
if gajim.capscache.is_supported(self.contact, NS_FILE) and \
self.contact.resource:
@ -1451,11 +1475,10 @@ class ChatControl(ChatControlBase):
self._tune_image.hide()
def update_audio(self):
if self.audio_state == self.AUDIO_STATE_NOT_AVAILABLE:
if self.audio_state in (self.AUDIO_STATE_NOT_AVAILABLE,
self.AUDIO_STATE_AVAILABLE):
self._audio_image.hide()
return
elif self.audio_state == self.AUDIO_STATE_AVAILABLE:
self._audio_image.set_from_stock(gtk.STOCK_APPLY, 1)
elif self.audio_state == self.AUDIO_STATE_CONNECTING:
self._audio_image.set_from_stock(gtk.STOCK_CONVERT, 1)
elif self.audio_state == self.AUDIO_STATE_CONNECTION_RECEIVED:
@ -1465,12 +1488,14 @@ class ChatControl(ChatControlBase):
elif self.audio_state == self.AUDIO_STATE_ERROR:
self._audio_image.set_from_stock(gtk.STOCK_DIALOG_WARNING, 1)
self._audio_image.show()
self.update_toolbar()
def set_audio_state(self, state, sid=None, reason=None):
str = 'Audio state : %s' % state
if reason:
str += ', reason: %s' % reason
self.print_conversation(str, 'info')
if state in ('connecting', 'connected', 'stop'):
str = _('Audio state : %s') % state
if reason:
str += ', ' + _('reason: %s') % reason
self.print_conversation(str, 'info')
if state == 'not_available':
self.audio_state = self.AUDIO_STATE_NOT_AVAILABLE
self.audio_sid = None
@ -1485,6 +1510,9 @@ class ChatControl(ChatControlBase):
self.audio_sid = sid
elif state == 'connected':
self.audio_state = self.AUDIO_STATE_CONNECTED
elif state == 'stop':
self.audio_state = self.AUDIO_STATE_AVAILABLE
self.audio_sid = None
elif state == 'error':
self.audio_state = self.AUDIO_STATE_ERROR
self.update_audio()
@ -1689,17 +1717,16 @@ class ChatControl(ChatControlBase):
banner_name_label.set_markup(label_text)
banner_name_tooltip.set_tip(banner_name_label, label_tooltip)
def _on_start_voip_menuitem_activate(self, *things):
def on_start_audio_button_activate(self, *things):
sid = gajim.connections[self.account].startVoIP(self.contact.get_full_jid(
))
self.set_audio_state('connecting', sid)
def _on_stop_voip_menuitem_activate(self, *things):
def on_stop_audio_button_activate(self, *things):
session = gajim.connections[self.account].getJingleSession(
self.contact.get_full_jid(), self.audio_sid)
if session:
session.end_session()
self.set_audio_state('available')
def _toggle_gpg(self):
if not self.gpg_is_active and not self.contact.keyID:
@ -2163,8 +2190,6 @@ class ChatControl(ChatControlBase):
add_to_roster_menuitem = xml.get_widget('add_to_roster_menuitem')
history_menuitem = xml.get_widget('history_menuitem')
toggle_gpg_menuitem = xml.get_widget('toggle_gpg_menuitem')
start_voip_menuitem = xml.get_widget('start_voip_menuitem')
stop_voip_menuitem = xml.get_widget('stop_voip_menuitem')
toggle_e2e_menuitem = xml.get_widget('toggle_e2e_menuitem')
send_file_menuitem = xml.get_widget('send_file_menuitem')
information_menuitem = xml.get_widget('information_menuitem')
@ -2234,17 +2259,6 @@ class ChatControl(ChatControlBase):
else:
send_file_menuitem.set_sensitive(False)
# check if it's possible to start jingle sessions
if self.audio_state == self.AUDIO_STATE_NOT_AVAILABLE:
start_voip_menuitem.show()
start_voip_menuitem.set_sensitive(False)
elif self.audio_state in (self.AUDIO_STATE_AVAILABLE,
self.AUDIO_STATE_ERROR):
start_voip_menuitem.show()
start_voip_menuitem.set_sensitive(True)
else:
stop_voip_menuitem.show()
# check if it's possible to convert to groupchat
if gajim.capscache.is_supported(contact, NS_MUC):
convert_to_gc_menuitem.set_sensitive(True)
@ -2264,12 +2278,6 @@ class ChatControl(ChatControlBase):
id_ = toggle_gpg_menuitem.connect('activate',
self._on_toggle_gpg_menuitem_activate)
self.handlers[id_] = toggle_gpg_menuitem
id = start_voip_menuitem.connect('activate',
self._on_start_voip_menuitem_activate)
self.handlers[id] = start_voip_menuitem
id = stop_voip_menuitem.connect('activate',
self._on_stop_voip_menuitem_activate)
self.handlers[id] = stop_voip_menuitem
id_ = toggle_e2e_menuitem.connect('activate',
self._on_toggle_e2e_menuitem_activate)
self.handlers[id_] = toggle_e2e_menuitem

View File

@ -2079,7 +2079,8 @@ class Interface:
is_modal = False, ok_handler = on_ok)
def handle_event_jingle_incoming(self, account, data):
# ('JINGLE_INCOMING', account, peer jid, sid, tuple-of-contents==(type, data...))
# ('JINGLE_INCOMING', account, peer jid, sid, tuple-of-contents==(type,
# data...))
# TODO: conditional blocking if peer is not in roster
# unpack data
@ -2134,15 +2135,15 @@ class Interface:
ctrl.set_audio_state('connected', sid)
def handle_event_jingle_disconnected(self, account, data):
# ('JINGLE_DISCONNECTED', account, (peerjid, sid))
peerjid, sid = data
# ('JINGLE_DISCONNECTED', account, (peerjid, sid, reason))
peerjid, sid, reason = data
jid = gajim.get_jid_without_resource(peerjid)
resource = gajim.get_resource_from_jid(peerjid)
ctrl = self.msg_win_mgr.get_control(peerjid, account)
if not ctrl:
ctrl = self.msg_win_mgr.get_control(jid, account)
if ctrl:
ctrl.set_audio_state('available', sid)
ctrl.set_audio_state('stop', sid=sid, reason=reason)
def handle_event_jingle_error(self, account, data):
# ('JINGLE_ERROR', account, (peerjid, sid, reason))