improve GUI for jnigle
This commit is contained in:
parent
12baddbdc3
commit
f5b1c2dca7
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue