26 #include <qapplication.h>
27 #include <qcheckbox.h>
30 #include <qpushbutton.h>
31 #include <qradiobutton.h>
32 #include <qtabwidget.h>
33 #include <qcombobox.h>
35 #include <QVBoxLayout>
36 #include <QHBoxLayout>
40 #include <kfiledialog.h>
41 #include <kicondialog.h>
42 #include <kiconloader.h>
44 #include <kmessagebox.h>
45 #include <kurlrequester.h>
46 #include <kabc/addresseedialog.h>
47 #include <kabc/stdaddressbook.h>
48 #include <kabc/addressee.h>
49 #include <kstandarddirs.h>
51 #include "kabcpersistence.h"
53 #include "kopetecontact.h"
54 #include "kopetegroup.h"
55 #include "kopeteaccount.h"
56 #include "kopeteprotocol.h"
57 #include "addressbooklinkwidget.h"
58 #include "avatardialog.h"
72 :
KDialog(parent), mGroup( group )
74 setCaption( i18n(
"Properties of Group %1", mGroup->displayName()) );
75 setButtons( Ok | Cancel );
77 mainWidget =
new QWidget(
this );
79 ui_mainWidget =
new Ui::KopeteGVIPropsWidget;
80 ui_mainWidget->setupUi( mainWidget );
82 ui_mainWidget->icnbOpen->setIconSize(
QSize(KIconLoader::SizeSmall,KIconLoader::SizeSmall));
83 ui_mainWidget->icnbClosed->setIconSize(
QSize(KIconLoader::SizeSmall,KIconLoader::SizeSmall));
90 ui_mainWidget->tabWidget->addTab( npMainWidget, i18n(
"Custom &Notifications" ) );
92 setMainWidget(mainWidget);
95 ui_mainWidget->edtDisplayName->setText( mGroup->displayName() );
97 ui_mainWidget->chkUseCustomIcons->setChecked( mGroup->useCustomIcon() );
108 connect(
this, SIGNAL(okClicked()),
this, SLOT(slotOkClicked()) );
109 connect( ui_mainWidget->chkUseCustomIcons, SIGNAL(toggled(
bool)),
110 this, SLOT(slotUseCustomIconsToggled(
bool)) );
111 connect( ui_mainWidget->icnbOpen, SIGNAL(iconChanged(
QString)),
112 SLOT(slotIconChanged()) );
113 connect( ui_mainWidget->icnbClosed, SIGNAL(iconChanged(
QString)),
114 SLOT(slotIconChanged()) );
115 slotUseCustomIconsToggled( ui_mainWidget->chkUseCustomIcons->isChecked() );
120 delete ui_mainWidget;
123 void KopeteGVIProps::slotOkClicked()
125 if( ui_mainWidget->edtDisplayName->text() != mGroup->displayName() )
127 mGroup->setDisplayName( ui_mainWidget->edtDisplayName->text() );
130 mGroup->setUseCustomIcon( ui_mainWidget->chkUseCustomIcons->isChecked() );
145 void KopeteGVIProps::slotUseCustomIconsToggled(
bool on)
147 ui_mainWidget->lblOpen->setEnabled( on );
148 ui_mainWidget->icnbOpen->setEnabled( on );
149 ui_mainWidget->lblClosed->setEnabled( on );
150 ui_mainWidget->icnbClosed->setEnabled( on );
153 void KopeteGVIProps::slotIconChanged()
162 :
KDialog(parent), mMetaContact( metaContact )
164 setCaption( i18n(
"Properties of Meta Contact %1", mMetaContact->displayName()) );
165 setButtons( Ok | Cancel );
166 m_countPhotoCapable = 0;
168 mainWidget =
new QWidget(
this );
170 ui_mainWidget =
new Ui::KopeteMetaLVIPropsWidget;
171 ui_mainWidget->setupUi( mainWidget );
173 ui_mainWidget->icnbOffline->setIconSize(
QSize(KIconLoader::SizeSmall,KIconLoader::SizeSmall) );
174 ui_mainWidget->icnbOnline->setIconSize(
QSize(KIconLoader::SizeSmall,KIconLoader::SizeSmall) );
175 ui_mainWidget->icnbAway->setIconSize(
QSize(KIconLoader::SizeSmall,KIconLoader::SizeSmall) );
176 ui_mainWidget->icnbUnknown->setIconSize(
QSize(KIconLoader::SizeSmall,KIconLoader::SizeSmall) );
189 mFromKABC =
new QPushButton( i18n(
"Sync KABC..." ), mNotificationProps->widget() );
197 vbLayout->
addWidget( mNotificationProps->widget() );
199 ui_mainWidget->tabWidget->addTab( npMainWidget, i18n(
"Custom &Notifications" ) );
200 setMainWidget( mainWidget );
202 connect( ui_mainWidget->radioNameKABC, SIGNAL(toggled(
bool)), SLOT(slotEnableAndDisableWidgets()));
203 connect( ui_mainWidget->radioNameContact, SIGNAL(toggled(
bool)), SLOT(slotEnableAndDisableWidgets()));
204 connect( ui_mainWidget->radioNameCustom, SIGNAL(toggled(
bool)), SLOT(slotEnableAndDisableWidgets()));
205 connect( ui_mainWidget->radioPhotoKABC, SIGNAL(toggled(
bool)), SLOT(slotEnableAndDisableWidgets()));
206 connect( ui_mainWidget->radioPhotoContact, SIGNAL(toggled(
bool)), SLOT(slotEnableAndDisableWidgets()));
207 connect( ui_mainWidget->radioPhotoCustom, SIGNAL(toggled(
bool)), SLOT(slotEnableAndDisableWidgets()));
208 connect( ui_mainWidget->cmbAccountPhoto, SIGNAL(activated(
int)), SLOT(slotEnableAndDisableWidgets()));
211 ui_mainWidget->btnClearPhoto->setIcon( KIcon( (
QApplication::layoutDirection() == Qt::RightToLeft) ?
"edit-clear-locationbar-ltr" :
"edit-clear-locationbar-rtl" ) );
212 connect( ui_mainWidget->btnClearPhoto, SIGNAL(clicked()),
this, SLOT(slotClearPhotoClicked()) );
213 connect( ui_mainWidget->widAddresseeLink, SIGNAL(addresseeChanged(KABC::Addressee)), SLOT(slotAddresseeChanged(KABC::Addressee)) );
214 connect( ui_mainWidget->btnChoosePhoto, SIGNAL(clicked()),
this, SLOT(slotSelectPhoto()));
215 ui_mainWidget->chkUseCustomIcons->setChecked( mMetaContact->useCustomIcon() );
217 QString offlineName = mMetaContact->icon( Kopete::ContactListElement::Offline );
221 QString onlineName = mMetaContact->icon( Kopete::ContactListElement::Online );
225 QString awayName = mMetaContact->icon( Kopete::ContactListElement::Away );
229 QString unknownName = mMetaContact->icon( Kopete::ContactListElement::Unknown );
238 ui_mainWidget->widAddresseeLink->setMetaContact( mMetaContact );
240 mAddressBookUid = mMetaContact->kabcId();
244 if ( !mAddressBookUid.
isEmpty() )
246 KABC::AddressBook *ab = Kopete::KABCPersistence::self()->addressBook();
247 KABC::Addressee a = ab->findByUid( mAddressBookUid );
248 ui_mainWidget->widAddresseeLink->setAddressee( a );
252 ui_mainWidget->btnImportKABC->setEnabled(
true );
253 ui_mainWidget->btnExportKABC->setEnabled(
true );
257 mFromKABC->
setEnabled( !( mSound.isIntern() || mSound.url().isEmpty() ) );
261 slotLoadNameSources();
262 slotLoadPhotoSources();
264 connect(
this, SIGNAL(okClicked()),
this, SLOT(slotOkClicked()) );
265 connect( ui_mainWidget->chkUseCustomIcons, SIGNAL(toggled(
bool)),
266 this, SLOT(slotUseCustomIconsToggled(
bool)) );
267 connect( ui_mainWidget->btnImportKABC, SIGNAL(clicked()),
268 this, SLOT(slotImportClicked()) );
269 connect( ui_mainWidget->btnExportKABC, SIGNAL(clicked()),
270 this, SLOT(slotExportClicked()) );
271 connect( mFromKABC, SIGNAL(clicked()),
272 this, SLOT(slotFromKABCClicked()) );
274 slotUseCustomIconsToggled( ui_mainWidget->chkUseCustomIcons->isChecked() );
275 slotEnableAndDisableWidgets();
280 delete ui_mainWidget;
284 void KopeteMetaLVIProps::slotLoadNameSources()
286 Kopete::Contact* trackingName = mMetaContact->displayNameSourceContact();
289 ui_mainWidget->cmbAccountName->clear();
290 for( ; it != cList.
end(); ++it )
295 QIcon acctIcon =
QPixmap((*it)->account()->accountIcon());
296 bool isTrackingName = ((*it) == trackingName);
298 acct = (*it)->customName() +
" <" + (*it)->contactId() +
"> " + i18n(
"(custom name)");
299 acctData = QVariantList() << acctContact <<
QVariant((uint)Kopete::Contact::CustomName);
300 ui_mainWidget->cmbAccountName->addItem( acctIcon, acct, acctData );
301 if (isTrackingName && (*it)->preferredNameType() == Kopete::Contact::CustomName)
302 ui_mainWidget->cmbAccountName->setCurrentIndex( ui_mainWidget->cmbAccountName->count() - 1 );
304 acct = (*it)->nickName() +
" <" + (*it)->contactId() +
"> " + i18n(
"(nick name)");
305 acctData = QVariantList() << acctContact <<
QVariant((uint)Kopete::Contact::NickName);
306 ui_mainWidget->cmbAccountName->addItem( acctIcon, acct, acctData );
307 if (isTrackingName && (*it)->preferredNameType() == Kopete::Contact::NickName)
308 ui_mainWidget->cmbAccountName->setCurrentIndex( ui_mainWidget->cmbAccountName->count() - 1 );
310 acct = (*it)->formattedName() +
" <" + (*it)->contactId() +
"> " + i18n(
"(formatted name)");
311 acctData = QVariantList() << acctContact <<
QVariant((uint)Kopete::Contact::FormattedName);
312 ui_mainWidget->cmbAccountName->addItem( acctIcon, acct, acctData );
313 if (isTrackingName && (*it)->preferredNameType() == Kopete::Contact::FormattedName)
314 ui_mainWidget->cmbAccountName->setCurrentIndex( ui_mainWidget->cmbAccountName->count() - 1 );
316 acct = (*it)->contactId() +
" " + i18n(
"(contact id)");
317 acctData = QVariantList() << acctContact <<
QVariant((uint)Kopete::Contact::ContactId);
318 ui_mainWidget->cmbAccountName->addItem( acctIcon, acct, acctData );
319 if (isTrackingName && (*it)->preferredNameType() == Kopete::Contact::ContactId)
320 ui_mainWidget->cmbAccountName->setCurrentIndex( ui_mainWidget->cmbAccountName->count() - 1 );
323 ui_mainWidget->edtDisplayName->setText( mMetaContact->customDisplayName() );
325 Kopete::MetaContact::PropertySource nameSource = mMetaContact->displayNameSource();
327 ui_mainWidget->radioNameContact->setChecked(nameSource == Kopete::MetaContact::SourceContact);
328 ui_mainWidget->radioNameKABC->setChecked(nameSource == Kopete::MetaContact::SourceKABC);
329 ui_mainWidget->radioNameCustom->setChecked(nameSource == Kopete::MetaContact::SourceCustom);
333 void KopeteMetaLVIProps::slotLoadPhotoSources()
337 m_withPhotoContacts.
clear();
338 Kopete::Contact* trackingPhoto = mMetaContact->photoSourceContact();
339 ui_mainWidget->cmbAccountPhoto->clear();
341 for( ; itp != cList.
end(); ++itp )
343 Kopete::Contact *citem = (*itp);
344 if ( citem->hasProperty( Kopete::Global::Properties::self()->photo().key() ) )
346 QString acct = citem->displayName() +
" <" + citem->contactId() +
'>';
347 QPixmap acctIcon = citem->account()->accountIcon();
348 ui_mainWidget->cmbAccountPhoto->addItem(
QIcon(acctIcon), acct );
351 if( citem == trackingPhoto )
353 ui_mainWidget->cmbAccountPhoto->setCurrentIndex( ui_mainWidget->cmbAccountPhoto->count() - 1 );
355 m_withPhotoContacts.
insert(ui_mainWidget->cmbAccountPhoto->count() - 1 , citem );
359 m_photoPath = mMetaContact->customPhoto().path();
361 Kopete::MetaContact::PropertySource photoSource = mMetaContact->photoSource();
363 ui_mainWidget->radioPhotoContact->setChecked(photoSource == Kopete::MetaContact::SourceContact);
364 ui_mainWidget->radioPhotoKABC->setChecked(photoSource == Kopete::MetaContact::SourceKABC);
365 ui_mainWidget->radioPhotoCustom->setChecked(photoSource == Kopete::MetaContact::SourceCustom);
367 ui_mainWidget->chkSyncPhoto->setChecked(mMetaContact->isPhotoSyncedWithKABC());
370 void KopeteMetaLVIProps::slotSelectPhoto()
372 const QString path = Kopete::UI::AvatarDialog::getAvatar(
this, m_photoPath);
377 slotEnableAndDisableWidgets();
380 void KopeteMetaLVIProps::slotEnableAndDisableWidgets()
382 KABC::AddressBook *ab = Kopete::KABCPersistence::self()->addressBook();
383 KABC::Addressee a = ab->findByUid( mAddressBookUid );
384 bool validLink = ! a.isEmpty();
386 ui_mainWidget->radioNameKABC->setEnabled(validLink);
388 ui_mainWidget->radioPhotoKABC->setEnabled(validLink);
391 if( selectedPhotoSource() == Kopete::MetaContact::SourceKABC || !validLink )
393 ui_mainWidget->chkSyncPhoto->setEnabled(
false);
397 ui_mainWidget->chkSyncPhoto->setEnabled(
true);
400 ui_mainWidget->radioNameContact->setEnabled(mMetaContact->contacts().count());
401 ui_mainWidget->radioPhotoContact->setEnabled(!m_withPhotoContacts.
isEmpty());
403 ui_mainWidget->cmbAccountName->setEnabled(selectedNameSource() == Kopete::MetaContact::SourceContact);
404 ui_mainWidget->edtDisplayName->setEnabled(selectedNameSource() == Kopete::MetaContact::SourceCustom);
406 ui_mainWidget->cmbAccountPhoto->setEnabled(selectedPhotoSource() == Kopete::MetaContact::SourceContact);
407 ui_mainWidget->btnChoosePhoto->setEnabled(selectedPhotoSource() == Kopete::MetaContact::SourceCustom);
409 if ( m_withPhotoContacts.
isEmpty() )
411 ui_mainWidget->cmbAccountPhoto->clear();
412 ui_mainWidget->cmbAccountPhoto->addItem(i18n(
"No Contacts with Photo Support"));
413 ui_mainWidget->cmbAccountPhoto->setEnabled(
false);
417 switch ( selectedPhotoSource() )
419 case Kopete::MetaContact::SourceKABC:
420 photo = Kopete::photoFromKABC(mAddressBookUid);
422 case Kopete::MetaContact::SourceContact:
423 photo = Kopete::photoFromContact(selectedPhotoSourceContact());
425 case Kopete::MetaContact::SourceCustom:
426 photo =
QImage(m_photoPath);
432 ui_mainWidget->photoLabel->setPixmap(
QPixmap() );
435 Kopete::MetaContact::PropertySource KopeteMetaLVIProps::selectedNameSource()
const
437 if ( ui_mainWidget->radioNameKABC->isChecked() )
438 return Kopete::MetaContact::SourceKABC;
439 if ( ui_mainWidget->radioNameContact->isChecked() )
440 return Kopete::MetaContact::SourceContact;
441 if ( ui_mainWidget->radioNameCustom->isChecked() )
442 return Kopete::MetaContact::SourceCustom;
444 return Kopete::MetaContact::SourceCustom;
447 Kopete::MetaContact::PropertySource KopeteMetaLVIProps::selectedPhotoSource()
const
449 if ( ui_mainWidget->radioPhotoKABC->isChecked() )
450 return Kopete::MetaContact::SourceKABC;
451 if ( ui_mainWidget->radioPhotoContact->isChecked() )
452 return Kopete::MetaContact::SourceContact;
453 if ( ui_mainWidget->radioPhotoCustom->isChecked() )
454 return Kopete::MetaContact::SourceCustom;
456 return Kopete::MetaContact::SourceCustom;
459 Kopete::Contact* KopeteMetaLVIProps::selectedNameSourceContact()
const
461 QVariantList data = ui_mainWidget->cmbAccountName->itemData(ui_mainWidget->cmbAccountName->currentIndex()).toList();
463 return static_cast<Kopete::Contact *
>(object);
466 void KopeteMetaLVIProps::setContactsNameTypes()
468 QVariantList data = ui_mainWidget->cmbAccountName->itemData(ui_mainWidget->cmbAccountName->currentIndex()).toList();
470 Kopete::Contact *contact =
static_cast<Kopete::Contact *
>(object);
471 Kopete::Contact::NameType nameType = (Kopete::Contact::NameType)data.at(1).toUInt();
472 Kopete::MetaContact::PropertySource nameSource = selectedNameSource();
476 for( ; it != cList.
end(); ++it )
478 if (nameSource == Kopete::MetaContact::SourceContact && (*it) == contact)
479 contact->setPreferredNameType(nameType);
481 contact->setPreferredNameType(Kopete::Contact::CustomName);
486 Kopete::Contact* KopeteMetaLVIProps::selectedPhotoSourceContact()
const
488 return m_withPhotoContacts.
value( ui_mainWidget->cmbAccountPhoto->currentIndex(), 0 );
491 void KopeteMetaLVIProps::slotOkClicked()
494 mMetaContact->setKabcId( mAddressBookUid );
498 if( ui_mainWidget->edtDisplayName->text() != mMetaContact->customDisplayName() )
499 mMetaContact->setDisplayName( ui_mainWidget->edtDisplayName->text() );
501 mMetaContact->setDisplayNameSource(selectedNameSource());
502 mMetaContact->setDisplayNameSourceContact( selectedNameSourceContact() );
504 setContactsNameTypes();
507 mMetaContact->setPhotoSource(selectedPhotoSource());
508 mMetaContact->setPhotoSourceContact( selectedPhotoSourceContact() );
510 mMetaContact->setPhoto(KUrl(m_photoPath));
511 mMetaContact->setPhotoSyncedWithKABC( ui_mainWidget->chkSyncPhoto->isChecked() );
513 mMetaContact->setUseCustomIcon(
514 ui_mainWidget->chkUseCustomIcons->isChecked() );
540 void KopeteMetaLVIProps::slotUseCustomIconsToggled(
bool on)
542 ui_mainWidget->lblOffline->setEnabled( on );
543 ui_mainWidget->lblOnline->setEnabled( on );
544 ui_mainWidget->lblAway->setEnabled( on );
545 ui_mainWidget->lblUnknown->setEnabled( on );
547 ui_mainWidget->icnbOffline->setEnabled( on );
548 ui_mainWidget->icnbOnline->setEnabled( on );
549 ui_mainWidget->icnbAway->setEnabled( on );
550 ui_mainWidget->icnbUnknown->setEnabled( on );
553 void KopeteMetaLVIProps::slotAddresseeChanged(
const KABC::Addressee & a )
558 mFromKABC->
setEnabled( !( mSound.isIntern() || mSound.url().isEmpty() ) );
559 ui_mainWidget->btnExportKABC->setEnabled(
true );
560 ui_mainWidget->btnImportKABC->setEnabled(
true );
562 mAddressBookUid = a.uid();
566 ui_mainWidget->btnExportKABC->setEnabled(
false );
567 ui_mainWidget->btnImportKABC->setEnabled(
false );
568 mAddressBookUid.
clear();
569 ui_mainWidget->radioNameContact->setChecked(
true );
570 ui_mainWidget->radioPhotoContact->setChecked(
true );
572 slotEnableAndDisableWidgets();
575 void KopeteMetaLVIProps::slotExportClicked()
577 mMetaContact->setKabcId( mAddressBookUid );
580 if ( mExport->
showDialog() == QDialog::Accepted )
584 void KopeteMetaLVIProps::slotImportClicked()
586 mMetaContact->setKabcId( mAddressBookUid );
587 if ( Kopete::KABCPersistence::self()->syncWithKABC( mMetaContact ) )
588 KMessageBox::queuedMessageBox(
this, KMessageBox::Information,
589 i18n(
"No contacts were imported from the address book." ),
590 i18n(
"No Change" ) );
593 void KopeteMetaLVIProps::slotFromKABCClicked()
596 mNotificationProps->
widget()->customSound->setUrl( mSound.url() );
600 void KopeteMetaLVIProps::slotOpenSoundDialog( KUrlRequester *requester )
604 requester->disconnect( SIGNAL(openFileDialog(KUrlRequester*)),
605 this, SLOT(slotOpenSoundDialog(KUrlRequester*)));
607 KFileDialog *fileDialog = requester->fileDialog();
610 filters <<
"audio/x-wav" <<
"audio/mpeg" <<
"application/ogg"
612 fileDialog->setMimeFilter( filters );
616 KGlobal::dirs()->findDirs(
"data",
"kopete/sounds");
617 soundDirs += KGlobal::dirs()->resourceDirs(
"sound" );
622 dir.
setFilter( QDir::Files | QDir::Readable );
624 while ( it != soundDirs.
constEnd() ) {
628 fileDialog->setUrl( soundURL );
636 void KopeteMetaLVIProps::slotClearPhotoClicked()
639 mMetaContact->setPhoto( KUrl() );
641 slotEnableAndDisableWidgets();
644 #include "kopetelviprops.moc"
void exportData()
Export the data to KABC if changed, omitting any duplicates.
Qt::LayoutDirection layoutDirection()
void storeCurrentCustoms()
QPixmap fromImage(const QImage &image, QFlags< Qt::ImageConversionFlag > flags)
int showDialog()
Display the dialog.
KopeteGVIProps(Kopete::Group *group, QWidget *parent)
void setFilter(QFlags< QDir::Filter > filters)
QString number(int n, int base)
virtual void addItem(QLayoutItem *item)
void setObjectName(const QString &name)
void setMargin(int margin)
const QLatin1String MC_OFF("user-offline")
const QLatin1String MC_AW("user-away")
QVariant fromValue(const T &value)
const QLatin1String MC_ON("user-online")
const QLatin1String MC_UNK("metacontact_unknown")
void addStretch(int stretch)
QString fromLatin1(const char *str, int size)
iterator insert(const Key &key, const T &value)
const_iterator constEnd() const
const_iterator constBegin() const
QImage scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode) const
void setPath(const QString &path)
const T value(const Key &key) const