Commit 8fd67017 authored by Dan Pascu's avatar Dan Pascu

Added contacts editing panel

parent 4147aca4
This diff is collapsed.
...@@ -15,7 +15,7 @@ from zope.interface import implements ...@@ -15,7 +15,7 @@ from zope.interface import implements
from sipsimple.account import AccountManager, BonjourAccount from sipsimple.account import AccountManager, BonjourAccount
from blink.contacts import Contact, ContactModel, ContactSearchModel from blink.contacts import Contact, ContactGroup, ContactEditorDialog, ContactModel, ContactSearchModel
from blink.resources import Resources from blink.resources import Resources
from blink.util import run_in_gui_thread from blink.util import run_in_gui_thread
...@@ -47,6 +47,8 @@ class MainWindow(base_class, ui_class): ...@@ -47,6 +47,8 @@ class MainWindow(base_class, ui_class):
self.contact_model.load() self.contact_model.load()
self.contact_editor = ContactEditorDialog(self.contact_model, self)
self.contacts_panel.sibling_panel = self.sessions_panel self.contacts_panel.sibling_panel = self.sessions_panel
self.contacts_panel.sibling_name = u'Sessions' self.contacts_panel.sibling_name = u'Sessions'
self.sessions_panel.sibling_panel = self.contacts_panel self.sessions_panel.sibling_panel = self.contacts_panel
...@@ -56,12 +58,16 @@ class MainWindow(base_class, ui_class): ...@@ -56,12 +58,16 @@ class MainWindow(base_class, ui_class):
self.contacts_view.setCurrentWidget(self.contact_list_panel) self.contacts_view.setCurrentWidget(self.contact_list_panel)
self.search_view.setCurrentWidget(self.search_list_panel) self.search_view.setCurrentWidget(self.search_list_panel)
self.switch_view.clicked.connect(self.switch_main_view) self.switch_view_button.clicked.connect(self.switch_main_view)
self.search_box.textChanged.connect(self.search_box_text_changed) self.search_box.textChanged.connect(self.search_box_text_changed)
self.contact_model.itemsAdded.connect(self.contact_model_added_items)
self.contact_model.itemsRemoved.connect(self.contact_model_removed_items)
self.back_to_contacts_button.clicked.connect(self.search_box.clear) # this can be set in designer -Dan
self.back_to_contacts.clicked.connect(self.search_box.clear) # this can be set in designer -Dan self.add_contact_button.clicked.connect(self.add_contact)
self.add_contact.clicked.connect(self.test_add_contact) self.add_search_contact_button.clicked.connect(self.add_contact)
self.identity.activated[int].connect(self.set_identity) self.identity.activated[int].connect(self.set_identity)
...@@ -73,6 +79,19 @@ class MainWindow(base_class, ui_class): ...@@ -73,6 +79,19 @@ class MainWindow(base_class, ui_class):
notification_center.add_observer(self, name="SIPAccountDidActivate") notification_center.add_observer(self, name="SIPAccountDidActivate")
notification_center.add_observer(self, name="SIPAccountDidDeactivate") notification_center.add_observer(self, name="SIPAccountDidDeactivate")
def add_contact(self, clicked):
model = self.contact_model
selected_items = ((index.row(), model.data(index)) for index in self.contact_list.selectionModel().selectedIndexes())
try:
item = (item for row, item in sorted(selected_items) if type(item) in (Contact, ContactGroup)).next()
preferred_group = item if type(item) is ContactGroup else item.group
except StopIteration:
try:
preferred_group = (group for group in model.contact_groups if type(group) is ContactGroup).next()
except StopIteration:
preferred_group = None
self.contact_editor.open_for_add(self.search_box.text(), preferred_group)
def set_user_icon(self, image_file_name): def set_user_icon(self, image_file_name):
pixmap = QPixmap(32, 32) pixmap = QPixmap(32, 32)
pixmap.fill(QColor(Qt.transparent)) pixmap.fill(QColor(Qt.transparent))
...@@ -91,9 +110,9 @@ class MainWindow(base_class, ui_class): ...@@ -91,9 +110,9 @@ class MainWindow(base_class, ui_class):
self.image.setPixmap(pixmap) self.image.setPixmap(pixmap)
def enable_call_buttons(self, enabled): def enable_call_buttons(self, enabled):
self.audio_call.setEnabled(enabled) self.audio_call_button.setEnabled(enabled)
self.im_session.setEnabled(enabled) self.im_session_button.setEnabled(enabled)
self.ds_session.setEnabled(enabled) self.ds_session_button.setEnabled(enabled)
def set_identity(self, index): def set_identity(self, index):
account_manager = AccountManager() account_manager = AccountManager()
...@@ -102,7 +121,7 @@ class MainWindow(base_class, ui_class): ...@@ -102,7 +121,7 @@ class MainWindow(base_class, ui_class):
def search_box_text_changed(self, text): def search_box_text_changed(self, text):
if text: if text:
self.main_view.setCurrentWidget(self.contacts_panel) self.main_view.setCurrentWidget(self.contacts_panel)
self.switch_view.setText(u"Sessions") self.switch_view_button.setText(u"Sessions")
self.enable_call_buttons(True) self.enable_call_buttons(True)
else: else:
selected_items = self.contact_list.selectionModel().selectedIndexes() selected_items = self.contact_list.selectionModel().selectedIndexes()
...@@ -113,6 +132,21 @@ class MainWindow(base_class, ui_class): ...@@ -113,6 +132,21 @@ class MainWindow(base_class, ui_class):
active_widget = self.search_list_panel if self.contact_search_model.rowCount() else self.not_found_panel active_widget = self.search_list_panel if self.contact_search_model.rowCount() else self.not_found_panel
self.search_view.setCurrentWidget(active_widget) self.search_view.setCurrentWidget(active_widget)
def contact_model_added_items(self, items):
if self.search_box.text().isEmpty():
return
active_widget = self.search_list_panel if self.contact_search_model.rowCount() else self.not_found_panel
self.search_view.setCurrentWidget(active_widget)
def contact_model_removed_items(self, items):
if self.search_box.text().isEmpty():
return
if any(type(item) is Contact for item in items) and self.contact_search_model.rowCount() == 0:
self.search_box.clear()
else:
active_widget = self.search_list_panel if self.contact_search_model.rowCount() else self.not_found_panel
self.search_view.setCurrentWidget(active_widget)
def contact_list_selection_changed(self, selected, deselected): def contact_list_selection_changed(self, selected, deselected):
selected_items = self.contact_list.selectionModel().selectedIndexes() selected_items = self.contact_list.selectionModel().selectedIndexes()
self.enable_call_buttons(len(selected_items)==1 and type(self.contact_model.data(selected_items[0])) is Contact) self.enable_call_buttons(len(selected_items)==1 and type(self.contact_model.data(selected_items[0])) is Contact)
...@@ -120,19 +154,7 @@ class MainWindow(base_class, ui_class): ...@@ -120,19 +154,7 @@ class MainWindow(base_class, ui_class):
def switch_main_view(self): def switch_main_view(self):
widget = self.main_view.currentWidget().sibling_panel widget = self.main_view.currentWidget().sibling_panel
self.main_view.setCurrentWidget(widget) self.main_view.setCurrentWidget(widget)
self.switch_view.setText(widget.sibling_name) self.switch_view_button.setText(widget.sibling_name)
def test_add_contact(self):
from blink.contacts import Contact, ContactGroup
import random
no = random.randrange(1, 100)
try:
test_group = (group for group in self.contact_model.contact_groups if group.name=='Test').next()
except StopIteration:
test_group = ContactGroup('Test')
contact = Contact(test_group, 'John Doe %02d' % no, 'user%02d@test.com' % no)
contact.status = random.choice(('online', 'away', 'busy', 'offline'))
self.contact_model.addContact(contact)
@run_in_gui_thread @run_in_gui_thread
def handle_notification(self, notification): def handle_notification(self, notification):
......
# Copyright (c) 2010 AG Projects. See LICENSE for details.
#
import os
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QFileDialog, QLabel, QPixmap
from blink.resources import ApplicationData, Resources
from blink.widgets.util import QtDynamicProperty
class IconSelector(QLabel):
default_icon = QtDynamicProperty('default_icon', unicode)
def __init__(self, parent=None):
super(QLabel, self).__init__(parent)
self.setMinimumSize(36, 36)
self.filename = None
self.default_icon = None
self.last_icon_directory = os.path.expanduser('~')
def _get_filename(self):
return self.__dict__['filename']
def _set_filename(self, filename):
self.__dict__['filename'] = filename
filename = ApplicationData.get(filename) if filename else Resources.get(self.default_icon)
pixmap = QPixmap()
if pixmap.load(filename):
self.setPixmap(pixmap.scaled(32, 32, Qt.KeepAspectRatio, Qt.SmoothTransformation))
else:
self.setPixmap(pixmap)
filename = property(_get_filename, _set_filename)
del _get_filename, _set_filename
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton and self.rect().contains(event.pos()):
filename = unicode(QFileDialog.getOpenFileName(self, u'Select Icon', self.last_icon_directory, u"Images (*.png *.tiff *.jpg *.xmp *.svg)"))
if filename:
self.last_icon_directory = os.path.dirname(filename)
self.filename = filename if os.path.realpath(filename) != os.path.realpath(Resources.get(self.default_icon)) else None
super(IconSelector, self).mouseReleaseEvent(event)
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QPushButton" name="switch_view"> <widget class="QPushButton" name="switch_view_button">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum"> <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch>0</horstretch> <horstretch>0</horstretch>
...@@ -345,7 +345,7 @@ ...@@ -345,7 +345,7 @@
<number>3</number> <number>3</number>
</property> </property>
<item> <item>
<widget class="QPushButton" name="back_to_contacts"> <widget class="QPushButton" name="back_to_contacts_button">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
...@@ -367,7 +367,7 @@ ...@@ -367,7 +367,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="add_search_contact"> <widget class="QPushButton" name="add_search_contact_button">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
...@@ -486,7 +486,7 @@ buttons below.</string> ...@@ -486,7 +486,7 @@ buttons below.</string>
<number>3</number> <number>3</number>
</property> </property>
<item> <item>
<widget class="QToolButton" name="add_contact"> <widget class="QToolButton" name="add_contact_button">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>29</width> <width>29</width>
...@@ -533,7 +533,7 @@ buttons below.</string> ...@@ -533,7 +533,7 @@ buttons below.</string>
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QToolButton" name="audio_call"> <widget class="QToolButton" name="audio_call_button">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>29</width> <width>29</width>
...@@ -559,7 +559,7 @@ buttons below.</string> ...@@ -559,7 +559,7 @@ buttons below.</string>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QToolButton" name="im_session"> <widget class="QToolButton" name="im_session_button">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>29</width> <width>29</width>
...@@ -584,7 +584,7 @@ buttons below.</string> ...@@ -584,7 +584,7 @@ buttons below.</string>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QToolButton" name="ds_session"> <widget class="QToolButton" name="ds_session_button">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>29</width> <width>29</width>
...@@ -625,7 +625,7 @@ buttons below.</string> ...@@ -625,7 +625,7 @@ buttons below.</string>
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QToolButton" name="silent"> <widget class="QToolButton" name="silent_button">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>29</width> <width>29</width>
...@@ -690,7 +690,7 @@ buttons below.</string> ...@@ -690,7 +690,7 @@ buttons below.</string>
<number>3</number> <number>3</number>
</property> </property>
<item> <item>
<widget class="QPushButton" name="hangup_all"> <widget class="QPushButton" name="hangup_all_button">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>0</width> <width>0</width>
...@@ -712,7 +712,7 @@ buttons below.</string> ...@@ -712,7 +712,7 @@ buttons below.</string>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="conference"> <widget class="QPushButton" name="conference_button">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>0</width> <width>0</width>
...@@ -747,7 +747,7 @@ buttons below.</string> ...@@ -747,7 +747,7 @@ buttons below.</string>
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QToolButton" name="mute"> <widget class="QToolButton" name="mute_button">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>29</width> <width>29</width>
......
This diff is collapsed.
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