Commit 2eea8df1 authored by Dan Pascu's avatar Dan Pascu

Use API level 2 for QVariant for better python integration

parent 4a4c1cf7
...@@ -13,7 +13,8 @@ import sys ...@@ -13,7 +13,8 @@ import sys
import sip import sip
import cjson import cjson
sip.setapi('QString', 2) sip.setapi('QString', 2)
sip.setapi('QVariant', 2)
from PyQt4.QtGui import QApplication from PyQt4.QtGui import QApplication
from application import log from application import log
......
...@@ -13,7 +13,7 @@ import urllib2 ...@@ -13,7 +13,7 @@ import urllib2
from collections import defaultdict from collections import defaultdict
from PyQt4 import uic from PyQt4 import uic
from PyQt4.QtCore import Qt, QAbstractListModel, QModelIndex, QUrl, QVariant from PyQt4.QtCore import Qt, QAbstractListModel, QModelIndex, QUrl
from PyQt4.QtGui import QAction, QButtonGroup, QComboBox, QIcon, QMenu, QMovie, QPalette, QPixmap, QSortFilterProxyModel, QStyledItemDelegate from PyQt4.QtGui import QAction, QButtonGroup, QComboBox, QIcon, QMenu, QMovie, QPalette, QPixmap, QSortFilterProxyModel, QStyledItemDelegate
from PyQt4.QtNetwork import QNetworkAccessManager from PyQt4.QtNetwork import QNetworkAccessManager
from PyQt4.QtWebKit import QWebView from PyQt4.QtWebKit import QWebView
...@@ -173,7 +173,7 @@ class ActiveAccountModel(QSortFilterProxyModel): ...@@ -173,7 +173,7 @@ class ActiveAccountModel(QSortFilterProxyModel):
class AccountDelegate(QStyledItemDelegate): class AccountDelegate(QStyledItemDelegate):
def paint(self, painter, option, index): def paint(self, painter, option, index):
account_info = index.data(Qt.UserRole).toPyObject() account_info = index.data(Qt.UserRole)
if account_info.registration_state == 'succeeded': if account_info.registration_state == 'succeeded':
option.palette.setColor(QPalette.Text, Qt.black) option.palette.setColor(QPalette.Text, Qt.black)
else: else:
...@@ -202,7 +202,7 @@ class AccountSelector(QComboBox): ...@@ -202,7 +202,7 @@ class AccountSelector(QComboBox):
def _SH_DataChanged(self, topLeft, bottomRight): def _SH_DataChanged(self, topLeft, bottomRight):
index = self.currentIndex() index = self.currentIndex()
if topLeft.row() <= index <= bottomRight.row(): if topLeft.row() <= index <= bottomRight.row():
account_info = self.itemData(index).toPyObject() account_info = self.itemData(index)
palette = self.palette() palette = self.palette()
if account_info.registration_state == 'succeeded': if account_info.registration_state == 'succeeded':
palette.setColor(QPalette.Text, Qt.black) palette.setColor(QPalette.Text, Qt.black)
...@@ -213,7 +213,7 @@ class AccountSelector(QComboBox): ...@@ -213,7 +213,7 @@ class AccountSelector(QComboBox):
def _SH_SelectionChanged(self, index): def _SH_SelectionChanged(self, index):
if index == -1: if index == -1:
return return
account_info = self.itemData(index).toPyObject() account_info = self.itemData(index)
palette = self.palette() palette = self.palette()
if account_info.registration_state == 'succeeded': if account_info.registration_state == 'succeeded':
palette.setColor(QPalette.Text, Qt.black) palette.setColor(QPalette.Text, Qt.black)
...@@ -639,7 +639,7 @@ class ServerToolsWindow(base_class, ui_class): ...@@ -639,7 +639,7 @@ class ServerToolsWindow(base_class, ui_class):
def _SH_AccountButtonMenuTriggered(self, action): def _SH_AccountButtonMenuTriggered(self, action):
view = self.tab_widget.currentWidget() view = self.tab_widget.currentWidget()
account = action.data().toPyObject() account = action.data()
self.account_label.setText(account.id) self.account_label.setText(account.id)
self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id) self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id)
view.load_account_page(account, tab=view.tab, task=view.task) view.load_account_page(account, tab=view.tab, task=view.task)
...@@ -686,16 +686,16 @@ class ServerToolsWindow(base_class, ui_class): ...@@ -686,16 +686,16 @@ class ServerToolsWindow(base_class, ui_class):
menu = self.account_button.menu() menu = self.account_button.menu()
menu.clear() menu.clear()
for row in xrange(self.model.rowCount()): for row in xrange(self.model.rowCount()):
account_info = self.model.data(self.model.index(row, 0), Qt.UserRole).toPyObject() account_info = self.model.data(self.model.index(row, 0), Qt.UserRole)
action = QAction(account_info.name, self) action = QAction(account_info.name, self)
action.setData(QVariant(account_info.account)) action.setData(account_info.account)
menu.addAction(action) menu.addAction(action)
def open_settings_page(self, account): def open_settings_page(self, account):
view = self.tab_widget.currentWidget() view = self.tab_widget.currentWidget()
account = account or view.account account = account or view.account
if account is None or account.server.settings_url is None: if account is None or account.server.settings_url is None:
account = self.account_button.menu().actions()[0].data().toPyObject() account = self.account_button.menu().actions()[0].data()
self.account_label.setText(account.id) self.account_label.setText(account.id)
self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id) self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id)
view.load_account_page(account, tab='settings') view.load_account_page(account, tab='settings')
...@@ -705,7 +705,7 @@ class ServerToolsWindow(base_class, ui_class): ...@@ -705,7 +705,7 @@ class ServerToolsWindow(base_class, ui_class):
view = self.tab_widget.currentWidget() view = self.tab_widget.currentWidget()
account = account or view.account account = account or view.account
if account is None or account.server.settings_url is None: if account is None or account.server.settings_url is None:
account = self.account_button.menu().actions()[0].data().toPyObject() account = self.account_button.menu().actions()[0].data()
self.account_label.setText(account.id) self.account_label.setText(account.id)
self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id) self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id)
view.load_account_page(account, tab='contacts', task='directory') view.load_account_page(account, tab='contacts', task='directory')
...@@ -715,7 +715,7 @@ class ServerToolsWindow(base_class, ui_class): ...@@ -715,7 +715,7 @@ class ServerToolsWindow(base_class, ui_class):
view = self.tab_widget.currentWidget() view = self.tab_widget.currentWidget()
account = account or view.account account = account or view.account
if account is None or account.server.settings_url is None: if account is None or account.server.settings_url is None:
account = self.account_button.menu().actions()[0].data().toPyObject() account = self.account_button.menu().actions()[0].data()
self.account_label.setText(account.id) self.account_label.setText(account.id)
self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id) self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id)
view.load_account_page(account, tab='calls') view.load_account_page(account, tab='calls')
...@@ -725,7 +725,7 @@ class ServerToolsWindow(base_class, ui_class): ...@@ -725,7 +725,7 @@ class ServerToolsWindow(base_class, ui_class):
view = self.tab_widget.currentWidget() view = self.tab_widget.currentWidget()
account = account or view.account account = account or view.account
if account is None or account.server.settings_url is None: if account is None or account.server.settings_url is None:
account = self.account_button.menu().actions()[0].data().toPyObject() account = self.account_button.menu().actions()[0].data()
self.account_label.setText(account.id) self.account_label.setText(account.id)
self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id) self.tab_widget.setTabText(self.tab_widget.currentIndex(), account.id)
view.load_account_page(account, tab='payments') view.load_account_page(account, tab='payments')
......
...@@ -1359,10 +1359,6 @@ class ContactSearchModel(QSortFilterProxyModel): ...@@ -1359,10 +1359,6 @@ class ContactSearchModel(QSortFilterProxyModel):
else: else:
return QSortFilterProxyModel.flags(self, index) | Qt.ItemIsDropEnabled return QSortFilterProxyModel.flags(self, index) | Qt.ItemIsDropEnabled
def data(self, index, role=Qt.DisplayRole):
data = super(ContactSearchModel, self).data(index, role)
return data.toPyObject() if role==Qt.DisplayRole else data
def filterAcceptsRow(self, source_row, source_parent): def filterAcceptsRow(self, source_row, source_parent):
source_model = self.sourceModel() source_model = self.sourceModel()
source_index = source_model.index(source_row, 0, source_parent) source_index = source_model.index(source_row, 0, source_parent)
...@@ -1998,9 +1994,9 @@ class ContactEditorGroupModel(QSortFilterProxyModel): ...@@ -1998,9 +1994,9 @@ class ContactEditorGroupModel(QSortFilterProxyModel):
def data(self, index, role=Qt.DisplayRole): def data(self, index, role=Qt.DisplayRole):
if role in (Qt.DisplayRole, Qt.EditRole): if role in (Qt.DisplayRole, Qt.EditRole):
return super(ContactEditorGroupModel, self).data(index, Qt.DisplayRole).toPyObject().name return super(ContactEditorGroupModel, self).data(index, Qt.DisplayRole).name
elif role == Qt.UserRole: elif role == Qt.UserRole:
return super(ContactEditorGroupModel, self).data(index, Qt.DisplayRole).toPyObject() return super(ContactEditorGroupModel, self).data(index, Qt.DisplayRole)
else: else:
return super(ContactEditorGroupModel, self).data(index, role) return super(ContactEditorGroupModel, self).data(index, role)
...@@ -2030,7 +2026,7 @@ class ContactEditorDialog(base_class, ui_class): ...@@ -2030,7 +2026,7 @@ class ContactEditorDialog(base_class, ui_class):
self.display_name_editor.setText(u'') self.display_name_editor.setText(u'')
self.sip_aliases_editor.setText(u'') self.sip_aliases_editor.setText(u'')
for index in xrange(self.group.count()): for index in xrange(self.group.count()):
if self.group.itemData(index).toPyObject() is target_group: if self.group.itemData(index) is target_group:
break break
else: else:
index = 0 index = 0
...@@ -2047,7 +2043,7 @@ class ContactEditorDialog(base_class, ui_class): ...@@ -2047,7 +2043,7 @@ class ContactEditorDialog(base_class, ui_class):
self.display_name_editor.setText(contact.name) self.display_name_editor.setText(contact.name)
self.sip_aliases_editor.setText(u'; '.join(contact.sip_aliases)) self.sip_aliases_editor.setText(u'; '.join(contact.sip_aliases))
for index in xrange(self.group.count()): for index in xrange(self.group.count()):
if self.group.itemData(index).toPyObject() is contact.group: if self.group.itemData(index) is contact.group:
break break
else: else:
index = 0 index = 0
...@@ -2078,11 +2074,11 @@ class ContactEditorDialog(base_class, ui_class): ...@@ -2078,11 +2074,11 @@ class ContactEditorDialog(base_class, ui_class):
# user edited the group name. first look if we already have a group with that name # user edited the group name. first look if we already have a group with that name
index = self.group.findText(group_name) index = self.group.findText(group_name)
if index >= 0: if index >= 0:
group = self.group.itemData(index).toPyObject() group = self.group.itemData(index)
else: else:
group = ContactGroup(group_name) group = ContactGroup(group_name)
else: else:
group = self.group.itemData(group_index).toPyObject() group = self.group.itemData(group_index)
if self.edited_contact is None: if self.edited_contact is None:
contact = Contact(group, name, uri, image=image) contact = Contact(group, name, uri, image=image)
contact.preferred_media = preferred_media contact.preferred_media = preferred_media
......
This diff is collapsed.
...@@ -9,7 +9,7 @@ import os ...@@ -9,7 +9,7 @@ import os
import urlparse import urlparse
from PyQt4 import uic from PyQt4 import uic
from PyQt4.QtCore import Qt, QRegExp, QVariant from PyQt4.QtCore import Qt, QRegExp
from PyQt4.QtGui import QActionGroup, QButtonGroup, QFileDialog, QListView, QListWidgetItem, QMessageBox, QRegExpValidator, QSpinBox, QStyle, QStyleOptionComboBox, QValidator from PyQt4.QtGui import QActionGroup, QButtonGroup, QFileDialog, QListView, QListWidgetItem, QMessageBox, QRegExpValidator, QSpinBox, QStyle, QStyleOptionComboBox, QValidator
from application import log from application import log
...@@ -305,10 +305,10 @@ class PreferencesWindow(base_class, ui_class): ...@@ -305,10 +305,10 @@ class PreferencesWindow(base_class, ui_class):
for index in xrange(self.idd_prefix_button.count()): for index in xrange(self.idd_prefix_button.count()):
text = self.idd_prefix_button.itemText(index) text = self.idd_prefix_button.itemText(index)
self.idd_prefix_button.setItemData(index, QVariant(None if text == "+" else text)) self.idd_prefix_button.setItemData(index, None if text == "+" else text)
for index in xrange(self.prefix_button.count()): for index in xrange(self.prefix_button.count()):
text = self.prefix_button.itemText(index) text = self.prefix_button.itemText(index)
self.prefix_button.setItemData(index, QVariant(None if text == "None" else text)) self.prefix_button.setItemData(index, None if text == "None" else text)
self.voicemail_uri_editor.setValidator(SIPAddressValidator(self)) self.voicemail_uri_editor.setValidator(SIPAddressValidator(self))
self.xcap_root_editor.setValidator(XCAPRootValidator(self)) self.xcap_root_editor.setValidator(XCAPRootValidator(self))
...@@ -455,31 +455,31 @@ class PreferencesWindow(base_class, ui_class): ...@@ -455,31 +455,31 @@ class PreferencesWindow(base_class, ui_class):
class Separator: pass class Separator: pass
self.audio_input_device_button.clear() self.audio_input_device_button.clear()
self.audio_input_device_button.addItem(u'System Default', QVariant('system_default')) self.audio_input_device_button.addItem(u'System Default', 'system_default')
self.audio_input_device_button.insertSeparator(1) self.audio_input_device_button.insertSeparator(1)
self.audio_input_device_button.setItemData(1, QVariant(Separator)) # prevent the separator from being selectable self.audio_input_device_button.setItemData(1, Separator) # prevent the separator from being selectable
for device in SIPApplication.engine.input_devices: for device in SIPApplication.engine.input_devices:
self.audio_input_device_button.addItem(device, QVariant(device)) self.audio_input_device_button.addItem(device, device)
self.audio_input_device_button.addItem(u'None', QVariant(None)) self.audio_input_device_button.addItem(u'None', None)
self.audio_input_device_button.setCurrentIndex(self.audio_input_device_button.findData(QVariant(settings.audio.input_device))) self.audio_input_device_button.setCurrentIndex(self.audio_input_device_button.findData(settings.audio.input_device))
self.audio_output_device_button.clear() self.audio_output_device_button.clear()
self.audio_output_device_button.addItem(u'System Default', QVariant('system_default')) self.audio_output_device_button.addItem(u'System Default', 'system_default')
self.audio_output_device_button.insertSeparator(1) self.audio_output_device_button.insertSeparator(1)
self.audio_output_device_button.setItemData(1, QVariant(Separator)) # prevent the separator from being selectable self.audio_output_device_button.setItemData(1, Separator) # prevent the separator from being selectable
for device in SIPApplication.engine.output_devices: for device in SIPApplication.engine.output_devices:
self.audio_output_device_button.addItem(device, QVariant(device)) self.audio_output_device_button.addItem(device, device)
self.audio_output_device_button.addItem(u'None', QVariant(None)) self.audio_output_device_button.addItem(u'None', None)
self.audio_output_device_button.setCurrentIndex(self.audio_output_device_button.findData(QVariant(settings.audio.output_device))) self.audio_output_device_button.setCurrentIndex(self.audio_output_device_button.findData(settings.audio.output_device))
self.audio_alert_device_button.clear() self.audio_alert_device_button.clear()
self.audio_alert_device_button.addItem(u'System Default', QVariant('system_default')) self.audio_alert_device_button.addItem(u'System Default', 'system_default')
self.audio_alert_device_button.insertSeparator(1) self.audio_alert_device_button.insertSeparator(1)
self.audio_alert_device_button.setItemData(1, QVariant(Separator)) # prevent the separator from being selectable self.audio_alert_device_button.setItemData(1, Separator) # prevent the separator from being selectable
for device in SIPApplication.engine.output_devices: for device in SIPApplication.engine.output_devices:
self.audio_alert_device_button.addItem(device, QVariant(device)) self.audio_alert_device_button.addItem(device, device)
self.audio_alert_device_button.addItem(u'None', QVariant(None)) self.audio_alert_device_button.addItem(u'None', None)
self.audio_alert_device_button.setCurrentIndex(self.audio_alert_device_button.findData(QVariant(settings.audio.alert_device))) self.audio_alert_device_button.setCurrentIndex(self.audio_alert_device_button.findData(settings.audio.alert_device))
def load_settings(self): def load_settings(self):
"""Load settings from configuration into the UI controls""" """Load settings from configuration into the UI controls"""
...@@ -492,7 +492,7 @@ class PreferencesWindow(base_class, ui_class): ...@@ -492,7 +492,7 @@ class PreferencesWindow(base_class, ui_class):
self.enable_echo_cancelling_button.setChecked(settings.audio.tail_length != 0) self.enable_echo_cancelling_button.setChecked(settings.audio.tail_length != 0)
self.audio_sample_rate_button.clear() self.audio_sample_rate_button.clear()
for rate in SIPSimpleSettings.audio.sample_rate.type.valid_values: for rate in SIPSimpleSettings.audio.sample_rate.type.valid_values:
self.audio_sample_rate_button.addItem(str(rate), QVariant(rate)) self.audio_sample_rate_button.addItem(str(rate), rate)
self.audio_sample_rate_button.setCurrentIndex(self.audio_sample_rate_button.findText(str(settings.audio.sample_rate))) self.audio_sample_rate_button.setCurrentIndex(self.audio_sample_rate_button.findText(str(settings.audio.sample_rate)))
# Audio codecs # Audio codecs
...@@ -1002,19 +1002,19 @@ class PreferencesWindow(base_class, ui_class): ...@@ -1002,19 +1002,19 @@ class PreferencesWindow(base_class, ui_class):
# Audio devices signal handlers # Audio devices signal handlers
def _SH_AudioAlertDeviceButtonActivated(self, index): def _SH_AudioAlertDeviceButtonActivated(self, index):
device = self.audio_alert_device_button.itemData(index).toPyObject() device = self.audio_alert_device_button.itemData(index)
settings = SIPSimpleSettings() settings = SIPSimpleSettings()
settings.audio.alert_device = device settings.audio.alert_device = device
settings.save() settings.save()
def _SH_AudioInputDeviceButtonActivated(self, index): def _SH_AudioInputDeviceButtonActivated(self, index):
device = self.audio_input_device_button.itemData(index).toPyObject() device = self.audio_input_device_button.itemData(index)
settings = SIPSimpleSettings() settings = SIPSimpleSettings()
settings.audio.input_device = device settings.audio.input_device = device
settings.save() settings.save()
def _SH_AudioOutputDeviceButtonActivated(self, index): def _SH_AudioOutputDeviceButtonActivated(self, index):
device = self.audio_output_device_button.itemData(index).toPyObject() device = self.audio_output_device_button.itemData(index)
settings = SIPSimpleSettings() settings = SIPSimpleSettings()
settings.audio.output_device = device settings.audio.output_device = device
settings.save() settings.save()
...@@ -1289,11 +1289,11 @@ class PreferencesWindow(base_class, ui_class): ...@@ -1289,11 +1289,11 @@ class PreferencesWindow(base_class, ui_class):
if 'audio.silent' in notification.data.modified: if 'audio.silent' in notification.data.modified:
self.silence_alerts_button.setChecked(settings.audio.silent) self.silence_alerts_button.setChecked(settings.audio.silent)
if 'audio.alert_device' in notification.data.modified: if 'audio.alert_device' in notification.data.modified:
self.audio_alert_device_button.setCurrentIndex(self.audio_alert_device_button.findData(QVariant(settings.audio.alert_device))) self.audio_alert_device_button.setCurrentIndex(self.audio_alert_device_button.findData(settings.audio.alert_device))
if 'audio.input_device' in notification.data.modified: if 'audio.input_device' in notification.data.modified:
self.audio_input_device_button.setCurrentIndex(self.audio_input_device_button.findData(QVariant(settings.audio.input_device))) self.audio_input_device_button.setCurrentIndex(self.audio_input_device_button.findData(settings.audio.input_device))
if 'audio.output_device' in notification.data.modified: if 'audio.output_device' in notification.data.modified:
self.audio_output_device_button.setCurrentIndex(self.audio_output_device_button.findData(QVariant(settings.audio.output_device))) self.audio_output_device_button.setCurrentIndex(self.audio_output_device_button.findData(settings.audio.output_device))
if 'answering_machine.enabled' in notification.data.modified: if 'answering_machine.enabled' in notification.data.modified:
self.enable_answering_machine_button.setChecked(settings.answering_machine.enabled) self.enable_answering_machine_button.setChecked(settings.answering_machine.enabled)
if 'chat.auto_accept' in notification.data.modified: if 'chat.auto_accept' in notification.data.modified:
......
...@@ -1284,9 +1284,9 @@ class SessionListView(QListView): ...@@ -1284,9 +1284,9 @@ class SessionListView(QListView):
current_index = selection_model.currentIndex() current_index = selection_model.currentIndex()
if current_index.isValid(): if current_index.isValid():
step = 1 if event.key() == Qt.Key_Down else -1 step = 1 if event.key() == Qt.Key_Down else -1
conference = current_index.data().toPyObject().conference conference = current_index.data().conference
new_index = current_index.sibling(current_index.row()+step, current_index.column()) new_index = current_index.sibling(current_index.row()+step, current_index.column())
while conference is not None and new_index.isValid() and new_index.data().toPyObject().conference is conference: while conference is not None and new_index.isValid() and new_index.data().conference is conference:
new_index = new_index.sibling(new_index.row()+step, new_index.column()) new_index = new_index.sibling(new_index.row()+step, new_index.column())
if new_index.isValid(): if new_index.isValid():
selection_model.select(new_index, selection_model.ClearAndSelect) selection_model.select(new_index, selection_model.ClearAndSelect)
......
...@@ -4,18 +4,18 @@ ...@@ -4,18 +4,18 @@
__all__ = ['QtDynamicProperty'] __all__ = ['QtDynamicProperty']
from PyQt4.QtCore import QVariant
class QtDynamicProperty(object): class QtDynamicProperty(object):
def __init__(self, name, type=unicode): def __init__(self, name, type=unicode):
self.name = name self.name = name
self.type = type self.type = type
def __get__(self, obj, objtype): def __get__(self, obj, objtype):
value = self if obj is None else obj.property(self.name).toPyObject() if obj is None:
return value if value in (self, None) else self.type(value) return self
return obj.property(self.name)
def __set__(self, obj, value): def __set__(self, obj, value):
obj.setProperty(self.name, QVariant(value if value is None else self.type(value))) if value is not None and not isinstance(value, self.type):
value = self.type(value)
obj.setProperty(self.name, value)
def __delete__(self, obj): def __delete__(self, obj):
raise AttributeError("attribute cannot be deleted") raise AttributeError("attribute cannot be deleted")
......
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