Commit 35668cd8 authored by Dan Pascu's avatar Dan Pascu

Rearranged menus in the main window

parent 0ea3a986
...@@ -7,7 +7,7 @@ import os ...@@ -7,7 +7,7 @@ import os
from PyQt4 import uic from PyQt4 import uic
from PyQt4.QtCore import Qt, QEasingCurve, QEvent, QPointF, QPropertyAnimation, QRect, QSettings, QTimer, pyqtSignal from PyQt4.QtCore import Qt, QEasingCurve, QEvent, QPointF, QPropertyAnimation, QRect, QSettings, QTimer, pyqtSignal
from PyQt4.QtGui import QAction, QBrush, QColor, QDesktopServices, QIcon, QLinearGradient, QListView, QMenu, QPainter, QPalette, QPen, QPolygonF, QTextCursor, QTextDocument, QTextEdit from PyQt4.QtGui import QAction, QBrush, QColor, QDesktopServices, QIcon, QLabel, QLinearGradient, QListView, QMenu, QPainter, QPalette, QPen, QPolygonF, QTextCursor, QTextDocument, QTextEdit
from PyQt4.QtWebKit import QWebPage, QWebSettings, QWebView from PyQt4.QtWebKit import QWebPage, QWebSettings, QWebView
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
...@@ -619,6 +619,25 @@ class ChatWidget(base_class, ui_class): ...@@ -619,6 +619,25 @@ class ChatWidget(base_class, ui_class):
del ui_class, base_class del ui_class, base_class
class NoSessionsLabel(QLabel):
def __init__(self, chat_window):
super(NoSessionsLabel, self).__init__(chat_window.session_panel)
self.chat_window = chat_window
font = self.font()
font.setFamily("Sans Serif")
font.setPointSize(20)
self.setFont(font)
self.setAlignment(Qt.AlignCenter)
self.setStyleSheet("""QLabel { border: 1px inset palette(dark); border-radius: 3px; background-color: white; color: #545454; }""")
self.setText("No Sessions")
chat_window.session_panel.installEventFilter(self)
def eventFilter(self, watched, event):
if event.type() == QEvent.Resize:
self.resize(event.size())
return False
ui_class, base_class = uic.loadUiType(Resources.get('chat_window.ui')) ui_class, base_class = uic.loadUiType(Resources.get('chat_window.ui'))
class ChatWindow(base_class, ui_class, ColorHelperMixin): class ChatWindow(base_class, ui_class, ColorHelperMixin):
...@@ -716,6 +735,9 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin): ...@@ -716,6 +735,9 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin):
self.session_list = ChatSessionListView(self) self.session_list = ChatSessionListView(self)
self.session_list.setObjectName('session_list') self.session_list.setObjectName('session_list')
self.no_sessions_label = NoSessionsLabel(self)
self.no_sessions_label.setObjectName('no_sessions_label')
self.slide_direction = self.session_details.RightToLeft # decide if we slide from one direction only -Dan self.slide_direction = self.session_details.RightToLeft # decide if we slide from one direction only -Dan
self.slide_direction = self.session_details.Automatic self.slide_direction = self.session_details.Automatic
self.session_details.animationDuration = 300 self.session_details.animationDuration = 300
...@@ -752,6 +774,9 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin): ...@@ -752,6 +774,9 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin):
self.session_list.hide() self.session_list.hide()
self.new_messages_button.hide() self.new_messages_button.hide()
self.hold_button.hide()
self.record_button.hide()
self.control_button.setEnabled(False)
self.info_label.setForegroundRole(QPalette.Dark) self.info_label.setForegroundRole(QPalette.Dark)
...@@ -1271,6 +1296,7 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin): ...@@ -1271,6 +1296,7 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin):
session.chat_widget = ChatWidget(session, self.tab_widget) session.chat_widget = ChatWidget(session, self.tab_widget)
session.active_panel = self.info_panel session.active_panel = self.info_panel
self.tab_widget.insertTab(position, session.chat_widget, session.name) self.tab_widget.insertTab(position, session.chat_widget, session.name)
self.no_sessions_label.hide()
selection_model = self.session_list.selectionModel() selection_model = self.session_list.selectionModel()
selection_model.select(model.index(position), selection_model.ClearAndSelect) selection_model.select(model.index(position), selection_model.ClearAndSelect)
self.session_list.scrollTo(model.index(position), QListView.EnsureVisible) # or PositionAtCenter self.session_list.scrollTo(model.index(position), QListView.EnsureVisible) # or PositionAtCenter
...@@ -1282,6 +1308,7 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin): ...@@ -1282,6 +1308,7 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin):
session.active_panel = None session.active_panel = None
if not self.session_model.sessions: if not self.session_model.sessions:
self.close() self.close()
self.no_sessions_label.show()
elif not self.session_list.isVisibleTo(self): elif not self.session_list.isVisibleTo(self):
self.session_list.animation.setDirection(QPropertyAnimation.Forward) self.session_list.animation.setDirection(QPropertyAnimation.Forward)
self.session_list.animation.setStartValue(self.session_widget.geometry()) self.session_list.animation.setStartValue(self.session_widget.geometry())
...@@ -1303,17 +1330,11 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin): ...@@ -1303,17 +1330,11 @@ class ChatWindow(base_class, ui_class, ColorHelperMixin):
self.session_details.setCurrentWidget(self.selected_session.active_panel) self.session_details.setCurrentWidget(self.selected_session.active_panel)
self.participants_list.setModel(self.selected_session.participants_model) self.participants_list.setModel(self.selected_session.participants_model)
self.control_button.setEnabled(True) self.control_button.setEnabled(True)
# start animation to show list? -Dan else:
elif self.session_model.sessions:
self.tab_widget.setCurrentWidget(self.dummy_tab) self.tab_widget.setCurrentWidget(self.dummy_tab)
self.session_details.setCurrentWidget(self.info_panel) self.session_details.setCurrentWidget(self.info_panel)
self.participants_list.setModel(None) self.participants_list.setModel(None)
self.control_button.setEnabled(False) self.control_button.setEnabled(False)
# start animation to show list? -Dan
else:
self.session_details.setCurrentWidget(self.info_panel)
self.participants_list.setModel(None)
self.hide()
def _AH_Connect(self): def _AH_Connect(self):
blink_session = self.selected_session.blink_session blink_session = self.selected_session.blink_session
......
...@@ -120,6 +120,9 @@ class MainWindow(base_class, ui_class): ...@@ -120,6 +120,9 @@ class MainWindow(base_class, ui_class):
self.session_list.setModel(self.session_model) self.session_list.setModel(self.session_model)
self.session_list.selectionModel().selectionChanged.connect(self._SH_SessionListSelectionChanged) self.session_list.selectionModel().selectionChanged.connect(self._SH_SessionListSelectionChanged)
# History
self.history_manager = HistoryManager()
# Windows, dialogs and panels # Windows, dialogs and panels
self.about_panel = AboutPanel(self) self.about_panel = AboutPanel(self)
self.conference_dialog = ConferenceDialog(self) self.conference_dialog = ConferenceDialog(self)
...@@ -176,33 +179,31 @@ class MainWindow(base_class, ui_class): ...@@ -176,33 +179,31 @@ class MainWindow(base_class, ui_class):
self.help_action.triggered.connect(partial(QDesktopServices.openUrl, QUrl(u'http://icanblink.com/help-qt.phtml'))) self.help_action.triggered.connect(partial(QDesktopServices.openUrl, QUrl(u'http://icanblink.com/help-qt.phtml')))
self.preferences_action.triggered.connect(self.preferences_window.show) self.preferences_action.triggered.connect(self.preferences_window.show)
self.auto_accept_chat_action.triggered.connect(self._AH_AutoAcceptChatTriggered) self.auto_accept_chat_action.triggered.connect(self._AH_AutoAcceptChatTriggered)
self.answering_machine_action.triggered.connect(self._AH_EnableAnsweringMachineTriggered)
self.release_notes_action.triggered.connect(partial(QDesktopServices.openUrl, QUrl(u'http://icanblink.com/changelog-qt.phtml'))) self.release_notes_action.triggered.connect(partial(QDesktopServices.openUrl, QUrl(u'http://icanblink.com/changelog-qt.phtml')))
self.quit_action.triggered.connect(self._AH_QuitActionTriggered) self.quit_action.triggered.connect(self._AH_QuitActionTriggered)
# Call menu actions # Call menu actions
self.redial_action.triggered.connect(self._AH_RedialActionTriggered) self.redial_action.triggered.connect(self._AH_RedialActionTriggered)
self.join_conference_action.triggered.connect(self.conference_dialog.show) self.join_conference_action.triggered.connect(self.conference_dialog.show)
self.mute_action.triggered.connect(self._SH_MuteButtonClicked) self.history_menu.aboutToShow.connect(self._SH_HistoryMenuAboutToShow)
self.silent_action.triggered.connect(self._SH_SilentButtonClicked) self.history_menu.triggered.connect(self._AH_HistoryMenuTriggered)
# Devices menu actions
self.output_devices_group.triggered.connect(self._AH_AudioOutputDeviceChanged) self.output_devices_group.triggered.connect(self._AH_AudioOutputDeviceChanged)
self.input_devices_group.triggered.connect(self._AH_AudioInputDeviceChanged) self.input_devices_group.triggered.connect(self._AH_AudioInputDeviceChanged)
self.alert_devices_group.triggered.connect(self._AH_AudioAlertDeviceChanged) self.alert_devices_group.triggered.connect(self._AH_AudioAlertDeviceChanged)
self.mute_action.triggered.connect(self._SH_MuteButtonClicked)
# History menu actions self.silent_action.triggered.connect(self._SH_SilentButtonClicked)
self.history_manager = HistoryManager()
self.history_menu.aboutToShow.connect(self._SH_HistoryMenuAboutToShow)
self.history_menu.triggered.connect(self._AH_HistoryMenuTriggered)
# Tools menu actions # Tools menu actions
self.answering_machine_action.triggered.connect(self._AH_EnableAnsweringMachineTriggered)
self.sip_server_settings_action.triggered.connect(self._AH_SIPServerSettings) self.sip_server_settings_action.triggered.connect(self._AH_SIPServerSettings)
self.search_for_people_action.triggered.connect(self._AH_SearchForPeople) self.search_for_people_action.triggered.connect(self._AH_SearchForPeople)
self.history_on_server_action.triggered.connect(self._AH_HistoryOnServer) self.history_on_server_action.triggered.connect(self._AH_HistoryOnServer)
self.buy_pstn_access_action.triggered.connect(self._AH_PurchasePstnAccess) self.buy_pstn_access_action.triggered.connect(self._AH_PurchasePstnAccess)
self.file_transfers_action.triggered.connect(self._AH_FileTransfersActionTriggered)
self.logs_action.triggered.connect(self._AH_LogsActionTriggered) # Window menu actions
self.chat_window_action.triggered.connect(self._AH_ChatWindowActionTriggered)
self.transfers_window_action.triggered.connect(self._AH_TransfersWindowActionTriggered)
self.logs_window_action.triggered.connect(self._AH_LogsWindowActionTriggered)
def setupUi(self): def setupUi(self):
super(MainWindow, self).setupUi(self) super(MainWindow, self).setupUi(self)
...@@ -241,6 +242,11 @@ class MainWindow(base_class, ui_class): ...@@ -241,6 +242,11 @@ class MainWindow(base_class, ui_class):
for dialog in self.pending_watcher_dialogs[:]: for dialog in self.pending_watcher_dialogs[:]:
dialog.close() dialog.close()
def show(self):
super(MainWindow, self).show()
self.raise_()
self.activateWindow()
def set_user_icon(self, icon): def set_user_icon(self, icon):
self.account_state.setIcon(icon or self.default_icon) self.account_state.setIcon(icon or self.default_icon)
...@@ -365,10 +371,14 @@ class MainWindow(base_class, ui_class): ...@@ -365,10 +371,14 @@ class MainWindow(base_class, ui_class):
account = account if account is not BonjourAccount() and account.server.settings_url else None account = account if account is not BonjourAccount() and account.server.settings_url else None
self.server_tools_window.open_buy_pstn_access_page(account) self.server_tools_window.open_buy_pstn_access_page(account)
def _AH_FileTransfersActionTriggered(self, checked): def _AH_ChatWindowActionTriggered(self, checked):
blink = QApplication.instance()
blink.chat_window.show()
def _AH_TransfersWindowActionTriggered(self, checked):
self.filetransfer_window.show() self.filetransfer_window.show()
def _AH_LogsActionTriggered(self, checked): def _AH_LogsWindowActionTriggered(self, checked):
directory = ApplicationData.get('logs') directory = ApplicationData.get('logs')
makedirs(directory) makedirs(directory)
QDesktopServices.openUrl(QUrl.fromLocalFile(directory)) QDesktopServices.openUrl(QUrl.fromLocalFile(directory))
...@@ -655,9 +665,9 @@ class MainWindow(base_class, ui_class): ...@@ -655,9 +665,9 @@ class MainWindow(base_class, ui_class):
self.answering_machine_action.setChecked(settings.answering_machine.enabled) self.answering_machine_action.setChecked(settings.answering_machine.enabled)
self.auto_accept_chat_action.setChecked(settings.chat.auto_accept) self.auto_accept_chat_action.setChecked(settings.chat.auto_accept)
if settings.google_contacts.authorization_token is None: if settings.google_contacts.authorization_token is None:
self.google_contacts_action.setText(u'Enable Google Contacts') self.google_contacts_action.setText(u'Enable &Google Contacts...')
else: else:
self.google_contacts_action.setText(u'Disable Google Contacts') self.google_contacts_action.setText(u'Disable &Google Contacts')
self.google_contacts_action.triggered.connect(self._AH_GoogleContactsActionTriggered) self.google_contacts_action.triggered.connect(self._AH_GoogleContactsActionTriggered)
if not any(account.enabled for account in account_manager.iter_accounts()): if not any(account.enabled for account in account_manager.iter_accounts()):
self.display_name.setEnabled(False) self.display_name.setEnabled(False)
...@@ -722,9 +732,9 @@ class MainWindow(base_class, ui_class): ...@@ -722,9 +732,9 @@ class MainWindow(base_class, ui_class):
if 'google_contacts.authorization_token' in notification.data.modified: if 'google_contacts.authorization_token' in notification.data.modified:
authorization_token = notification.sender.google_contacts.authorization_token authorization_token = notification.sender.google_contacts.authorization_token
if authorization_token is None: if authorization_token is None:
self.google_contacts_action.setText(u'Enable Google Contacts') self.google_contacts_action.setText(u'Enable &Google Contacts...')
else: else:
self.google_contacts_action.setText(u'Disable Google Contacts') self.google_contacts_action.setText(u'Disable &Google Contacts')
if authorization_token is InvalidToken: if authorization_token is InvalidToken:
self.google_contacts_dialog.open_for_incorrect_password() self.google_contacts_dialog.open_for_incorrect_password()
elif notification.sender is blink_settings: elif notification.sender is blink_settings:
......
...@@ -948,6 +948,7 @@ padding: 2px;</string> ...@@ -948,6 +948,7 @@ padding: 2px;</string>
<normaloff>icons/quick-settings.png</normaloff>icons/quick-settings.png</iconset> <normaloff>icons/quick-settings.png</normaloff>icons/quick-settings.png</iconset>
</property> </property>
<addaction name="auto_accept_chat_action"/> <addaction name="auto_accept_chat_action"/>
<addaction name="answering_machine_action"/>
</widget> </widget>
<addaction name="about_action"/> <addaction name="about_action"/>
<addaction name="check_for_updates_action"/> <addaction name="check_for_updates_action"/>
...@@ -961,22 +962,42 @@ padding: 2px;</string> ...@@ -961,22 +962,42 @@ padding: 2px;</string>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="quit_action"/> <addaction name="quit_action"/>
</widget> </widget>
<widget class="QMenu" name="history_menu"> <widget class="QMenu" name="tools_menu">
<property name="title"> <property name="title">
<string>&amp;History</string> <string>&amp;Tools</string>
</property> </property>
<addaction name="sip_server_settings_action"/>
<addaction name="history_on_server_action"/>
<addaction name="search_for_people_action"/>
<addaction name="buy_pstn_access_action"/>
<addaction name="separator"/>
<addaction name="google_contacts_action"/>
</widget> </widget>
<widget class="QMenu" name="devices_menu"> <widget class="QMenu" name="call_menu">
<property name="title"> <property name="title">
<string>&amp;Devices</string> <string>&amp;Call</string>
</property> </property>
<widget class="QMenu" name="voicemail_menu">
<property name="title">
<string>&amp;Voicemail</string>
</property>
</widget>
<widget class="QMenu" name="history_menu">
<property name="title">
<string>&amp;History</string>
</property>
<property name="icon">
<iconset>
<normaloff>icons/clock.svg</normaloff>icons/clock.svg</iconset>
</property>
</widget>
<widget class="QMenu" name="output_device_menu"> <widget class="QMenu" name="output_device_menu">
<property name="title"> <property name="title">
<string>&amp;Output device</string> <string>&amp;Output device</string>
</property> </property>
<property name="icon"> <property name="icon">
<iconset> <iconset>
<normaloff>icons/speaker.png</normaloff>icons/speaker.png</iconset> <normaloff>icons/speaker.svg</normaloff>icons/speaker.svg</iconset>
</property> </property>
</widget> </widget>
<widget class="QMenu" name="input_device_menu"> <widget class="QMenu" name="input_device_menu">
...@@ -985,7 +1006,7 @@ padding: 2px;</string> ...@@ -985,7 +1006,7 @@ padding: 2px;</string>
</property> </property>
<property name="icon"> <property name="icon">
<iconset> <iconset>
<normaloff>icons/mic.png</normaloff>icons/mic.png</iconset> <normaloff>icons/microphone.svg</normaloff>icons/microphone.svg</iconset>
</property> </property>
</widget> </widget>
<widget class="QMenu" name="alert_device_menu"> <widget class="QMenu" name="alert_device_menu">
...@@ -994,49 +1015,33 @@ padding: 2px;</string> ...@@ -994,49 +1015,33 @@ padding: 2px;</string>
</property> </property>
<property name="icon"> <property name="icon">
<iconset> <iconset>
<normaloff>icons/bell.png</normaloff>icons/bell.png</iconset> <normaloff>icons/bell.svg</normaloff>icons/bell.svg</iconset>
</property> </property>
</widget> </widget>
<addaction name="redial_action"/>
<addaction name="join_conference_action"/>
<addaction name="voicemail_menu"/>
<addaction name="history_menu"/>
<addaction name="separator"/>
<addaction name="output_device_menu"/> <addaction name="output_device_menu"/>
<addaction name="input_device_menu"/> <addaction name="input_device_menu"/>
<addaction name="alert_device_menu"/> <addaction name="alert_device_menu"/>
</widget>
<widget class="QMenu" name="tools_menu">
<property name="title">
<string>&amp;Tools</string>
</property>
<addaction name="answering_machine_action"/>
<addaction name="google_contacts_action"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="sip_server_settings_action"/> <addaction name="mute_action"/>
<addaction name="search_for_people_action"/> <addaction name="silent_action"/>
<addaction name="history_on_server_action"/>
<addaction name="buy_pstn_access_action"/>
<addaction name="separator"/>
<addaction name="file_transfers_action"/>
<addaction name="logs_action"/>
</widget> </widget>
<widget class="QMenu" name="call_menu"> <widget class="QMenu" name="window_menu">
<property name="title"> <property name="title">
<string>&amp;Call</string> <string>&amp;Window</string>
</property>
<widget class="QMenu" name="voicemail_menu">
<property name="title">
<string>&amp;Voicemail</string>
</property> </property>
</widget> <addaction name="chat_window_action"/>
<addaction name="redial_action"/> <addaction name="transfers_window_action"/>
<addaction name="join_conference_action"/> <addaction name="logs_window_action"/>
<addaction name="voicemail_menu"/>
<addaction name="separator"/>
<addaction name="mute_action"/>
<addaction name="silent_action"/>
</widget> </widget>
<addaction name="blink_menu"/> <addaction name="blink_menu"/>
<addaction name="call_menu"/> <addaction name="call_menu"/>
<addaction name="devices_menu"/>
<addaction name="history_menu"/>
<addaction name="tools_menu"/> <addaction name="tools_menu"/>
<addaction name="window_menu"/>
</widget> </widget>
<action name="quit_action"> <action name="quit_action">
<property name="icon"> <property name="icon">
...@@ -1077,7 +1082,7 @@ padding: 2px;</string> ...@@ -1077,7 +1082,7 @@ padding: 2px;</string>
<normaloff>icons/configure.png</normaloff>icons/configure.png</iconset> <normaloff>icons/configure.png</normaloff>icons/configure.png</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Preferences...</string> <string>&amp;Preferences</string>
</property> </property>
<property name="shortcut"> <property name="shortcut">
<string>Ctrl+P</string> <string>Ctrl+P</string>
...@@ -1094,7 +1099,7 @@ padding: 2px;</string> ...@@ -1094,7 +1099,7 @@ padding: 2px;</string>
<string>Check for &amp;updates...</string> <string>Check for &amp;updates...</string>
</property> </property>
</action> </action>
<action name="logs_action"> <action name="logs_window_action">
<property name="text"> <property name="text">
<string>&amp;Logs</string> <string>&amp;Logs</string>
</property> </property>
...@@ -1105,9 +1110,9 @@ padding: 2px;</string> ...@@ -1105,9 +1110,9 @@ padding: 2px;</string>
<enum>Qt::ApplicationShortcut</enum> <enum>Qt::ApplicationShortcut</enum>
</property> </property>
</action> </action>
<action name="file_transfers_action"> <action name="transfers_window_action">
<property name="text"> <property name="text">
<string>&amp;File transfers</string> <string>File &amp;Transfers</string>
</property> </property>
<property name="shortcut"> <property name="shortcut">
<string>Ctrl+T</string> <string>Ctrl+T</string>
...@@ -1121,15 +1126,19 @@ padding: 2px;</string> ...@@ -1121,15 +1126,19 @@ padding: 2px;</string>
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="text"> <property name="text">
<string>Enable &amp;Answering Machine</string> <string>Enable &amp;answering machine</string>
</property> </property>
</action> </action>
<action name="sip_server_settings_action"> <action name="sip_server_settings_action">
<property name="text"> <property name="text">
<string>&amp;Settings on SIP server...</string> <string>&amp;Settings on SIP server</string>
</property> </property>
</action> </action>
<action name="redial_action"> <action name="redial_action">
<property name="icon">
<iconset>
<normaloff>icons/retry.svg</normaloff>icons/retry.svg</iconset>
</property>
<property name="text"> <property name="text">
<string>&amp;Redial</string> <string>&amp;Redial</string>
</property> </property>
...@@ -1170,7 +1179,7 @@ padding: 2px;</string> ...@@ -1170,7 +1179,7 @@ padding: 2px;</string>
</action> </action>
<action name="search_for_people_action"> <action name="search_for_people_action">
<property name="text"> <property name="text">
<string>Search for &amp;people...</string> <string>Search for &amp;people</string>
</property> </property>
</action> </action>
<action name="auto_accept_chat_action"> <action name="auto_accept_chat_action">
...@@ -1204,27 +1213,27 @@ padding: 2px;</string> ...@@ -1204,27 +1213,27 @@ padding: 2px;</string>
</action> </action>
<action name="manage_accounts_action"> <action name="manage_accounts_action">
<property name="text"> <property name="text">
<string>&amp;Manage accounts...</string> <string>&amp;Manage accounts</string>
</property> </property>
</action> </action>
<action name="google_contacts_action"> <action name="google_contacts_action">
<property name="text"> <property name="text">
<string>Enable Google Contacts</string> <string>Enable &amp;Google Contacts...</string>
</property> </property>
</action> </action>
<action name="history_on_server_action"> <action name="history_on_server_action">
<property name="text"> <property name="text">
<string>Call history on server...</string> <string>Call &amp;history on server</string>
</property> </property>
</action> </action>
<action name="buy_pstn_access_action"> <action name="buy_pstn_access_action">
<property name="text"> <property name="text">
<string>Buy prepaid credit...</string> <string>Buy prepaid credit</string>
</property> </property>
</action> </action>
<action name="join_conference_action"> <action name="join_conference_action">
<property name="text"> <property name="text">
<string>Join &amp;Conference...</string> <string>&amp;Join Conference...</string>
</property> </property>
<property name="shortcut"> <property name="shortcut">
<string>Ctrl+J</string> <string>Ctrl+J</string>
...@@ -1233,6 +1242,17 @@ padding: 2px;</string> ...@@ -1233,6 +1242,17 @@ padding: 2px;</string>
<enum>Qt::ApplicationShortcut</enum> <enum>Qt::ApplicationShortcut</enum>
</property> </property>
</action> </action>
<action name="chat_window_action">
<property name="text">
<string>&amp;Chat</string>
</property>
<property name="shortcut">
<string>Ctrl+G</string>
</property>
<property name="shortcutContext">
<enum>Qt::ApplicationShortcut</enum>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
id="svg2985"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="bell.svg"
inkscape:export-filename="/home/dan/bell.png"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135">
<defs
id="defs2987" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="53.375"
inkscape:cx="8"
inkscape:cy="8"
inkscape:current-layer="g4054"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1666"
inkscape:window-height="1064"
inkscape:window-x="143"
inkscape:window-y="0"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3002"
empspacing="10"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="0.5px"
spacingy="0.5px" />
</sodipodi:namedview>
<metadata
id="metadata2990">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="g4054"
inkscape:label="Bell"
inkscape:groupmode="layer"
style="display:inline">
<path
id="path4056"
style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
d="M 5.5829856,4.9567763 5.4769584,8.4062854 C 5.4095534,10.599267 2.35,10.294088 2.35,11.515461 c 0,0.649489 0,0.669082 0,0.669082 l 4.7108569,0 0,0.965457 c 0.7551042,0 1.1116888,0 1.866793,0 l 0.029973,-0.965457 4.6923771,0 0,-0.669082 c -4e-6,-1.243419 -3.031825,-0.912321 -3.112859,-3.1091756 L 10.409904,4.9567763 c -0.0045,-0.1221938 -0.136959,-3.1067764 -2.4028561,-3.1067764 -2.2658973,0 -2.4203057,2.9845649 -2.4240623,3.1067764 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ssccccccccssss" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
id="svg2816"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="clock.svg">
<defs
id="defs2818">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 8 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective2824" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="57.25"
inkscape:cx="8"
inkscape:cy="8"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1728"
inkscape:window-height="1126"
inkscape:window-x="81"
inkscape:window-y="3"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid2986"
empspacing="10"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="0.5px"
spacingy="0.5px"
dotted="false" />
<sodipodi:guide
orientation="1,0"
position="8,7.5"
id="guide3774" />
<sodipodi:guide
orientation="0,1"
position="7.5,8"
id="guide3776" />
</sodipodi:namedview>
<metadata
id="metadata2821">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Clock"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:0.99803001000000002;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="path2826"
sodipodi:cx="10.316337"
sodipodi:cy="10.07599"
sodipodi:rx="5.6762376"
sodipodi:ry="6.0141091"
d="m 15.992574,10.07599 a 5.6762376,6.0141091 0 1 1 -11.352475,0 5.6762376,6.0141091 0 1 1 11.352475,0 z"
transform="matrix(1.2984867,0,0,1.2255379,-5.3956069,-4.348526)" />
<path
style="fill:none;stroke:#333333;stroke-width:1.25899994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 7.6295,3.3794999 c 0,0.4994706 0,4.9947059 0,4.9947059 l 2.991,3.4962942"
id="path3808"
inkscape:connector-curvature="0" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
id="svg2985"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="microphone.svg"
inkscape:export-filename="/home/dan/bell.png"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135">
<defs
id="defs2987" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="53.375"
inkscape:cx="8"
inkscape:cy="8"
inkscape:current-layer="g3841"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1430"
inkscape:window-height="1064"
inkscape:window-x="143"
inkscape:window-y="0"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
inkscape:showpageshadow="true"
borderlayer="false"
showborder="true">
<inkscape:grid
type="xygrid"
id="grid3253"
empspacing="10"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="0.5px"
spacingy="0.5px" />
</sodipodi:namedview>
<metadata
id="metadata2990">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="g3841"
inkscape:label="Microphone alt"
style="display:inline">
<rect
style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.70000011;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3843"
width="3.8"
height="8.3000002"
x="6"
y="1.3500057"
rx="1.9"
ry="2.1452653" />
<rect
style="fill:#000000;fill-opacity:1;stroke:none"
id="rect3845"
width="7"
height="1"
x="4.5"
y="14"
ry="0.48333335" />
<rect
style="fill:#000000;fill-opacity:1;stroke:none;display:inline"
id="rect3847"
width="3"
height="1"
x="12"
y="-8.4997644"
ry="0.48333335"
transform="matrix(0,1,-1,0,0,0)" />
<path
sodipodi:nodetypes="csssc"
inkscape:connector-curvature="0"
id="path3849"
d="m 12,7.25 0,0.7803915 C 12,10.229554 10.216,12 8.0000004,12 5.784,12 4,10.229554 4,8.0303915 L 4,7.25"
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="18"
height="18"
id="svg4113"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="retry.svg">
<defs
id="defs4115">
<marker
inkscape:stockid="DiamondSend"
orient="auto"
refY="0"
refX="0"
id="DiamondSend"
style="overflow:visible">
<path
id="path4745"
d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
transform="matrix(0.2,0,0,0.2,-1.2,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="StopS"
orient="auto"
refY="0"
refX="0"
id="StopS"
style="overflow:visible">
<path
id="path4817"
d="M 0,5.65 0,-5.65"
style="fill:none;stroke:#000000;stroke-width:1pt"
transform="scale(0.2,0.2)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="EmptyTriangleOutS"
orient="auto"
refY="0"
refX="0"
id="EmptyTriangleOutS"
style="overflow:visible">
<path
id="path4808"
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
transform="matrix(0.2,0,0,0.2,-0.6,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
inkscape:stockid="InfiniteLineEnd"
id="InfiniteLineEnd"
refX="0"
refY="0"
orient="auto">
<g
id="g4877"
style="fill:#000000">
<circle
id="circle4879"
r="0.80000001"
cy="0"
cx="3"
sodipodi:cx="3"
sodipodi:cy="0"
sodipodi:rx="0.80000001"
sodipodi:ry="0.80000001" />
<circle
id="circle4881"
r="0.80000001"
cy="0"
cx="6.5"
sodipodi:cx="6.5"
sodipodi:cy="0"
sodipodi:rx="0.80000001"
sodipodi:ry="0.80000001" />
<circle
id="circle4883"
r="0.80000001"
cy="0"
cx="10"
sodipodi:cx="10"
sodipodi:cy="0"
sodipodi:rx="0.80000001"
sodipodi:ry="0.80000001" />
</g>
</marker>
<marker
inkscape:stockid="TriangleOutS"
orient="auto"
refY="0"
refX="0"
id="TriangleOutS"
style="overflow:visible">
<path
id="path4790"
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
transform="scale(0.2,0.2)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="TriangleOutM"
orient="auto"
refY="0"
refX="0"
id="TriangleOutM"
style="overflow:visible">
<path
id="path4787"
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
transform="scale(0.4,0.4)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0"
refX="0"
id="Arrow1Send"
style="overflow:visible">
<path
id="path4657"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Mend"
style="overflow:visible">
<path
id="path4651"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
transform="matrix(-0.4,0,0,-0.4,-4,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Lend"
style="overflow:visible">
<path
id="path4663"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible">
<path
id="path4645"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="53.222222"
inkscape:cx="9"
inkscape:cy="9"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="1850"
inkscape:window-height="1168"
inkscape:window-x="2"
inkscape:window-y="0"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
empspacing="10"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingy="0.5px"
spacingx="0.5px"
type="xygrid"
id="grid4121" />
<sodipodi:guide
orientation="0,1"
position="2,17"
id="guide7684" />
</sodipodi:namedview>
<metadata
id="metadata4118">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Retry"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1034.3622)">
<path
sodipodi:type="arc"
style="fill:none;stroke:#222222;stroke-width:1.32112777;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:none"
id="path4128"
sodipodi:cx="7.5"
sodipodi:cy="7.25"
sodipodi:rx="4.5"
sodipodi:ry="4.75"
d="M 11.701112,8.9522477 C 10.810467,11.401358 8.2075543,12.624633 5.8873442,11.684507 3.5671342,10.744382 2.4082429,7.9968629 3.2988881,5.5477523 4.1895333,3.0986416 6.7924457,1.8753675 9.1126558,2.815493 10.075167,3.2054926 10.88162,3.9325346 11.397115,4.8750007"
transform="matrix(1.5555393,0,0,1.4732939,-2.6647636,1032.6808)"
sodipodi:start="0.36651914"
sodipodi:end="5.7595867"
sodipodi:open="true" />
<polyline
style="fill:none;stroke:#222222;stroke-width:4.50022650000000013;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
points="40,7 40,16 31,15.999 "
stroke-miterlimit="10"
id="polyline3087"
transform="matrix(0.44439969,0,0,0.44444445,-1.7763904,1033.2511)" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
id="svg3882"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="speaker.svg">
<defs
id="defs3884" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="53.8125"
inkscape:cx="5.0174216"
inkscape:cy="8"
inkscape:current-layer="layer5"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1664"
inkscape:window-height="1071"
inkscape:window-x="85"
inkscape:window-y="24"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid4398"
empspacing="10"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="0.5px"
spacingy="0.5px" />
</sodipodi:namedview>
<metadata
id="metadata3887">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer5"
inkscape:label="Speaker"
style="display:inline">
<path
style="fill:#545454;fill-opacity:1;stroke:#333333;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 12.5,2 0,12 -5,-3.5 -4,0 0,-5 4,0 z"
id="path6103"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
</g>
</svg>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment