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"
62 const QLatin1String
MC_OFF(
"user-offline" );
63 const QLatin1String
MC_ON(
"user-online" );
64 const QLatin1String
MC_AW(
"user-away" );
65 const QLatin1String
MC_UNK(
"metacontact_unknown" );
72 :
KDialog(parent), mGroup( group )
74 setCaption( i18n(
"Properties of Group %1", mGroup->displayName()) );
75 setButtons( Ok | Cancel );
77 mainWidget =
new QWidget(
this );
78 mainWidget->setObjectName(
"mainWidget" );
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));
84 QPair<QString,QString> context=qMakePair( QString::fromLatin1(
"group") , QString::number(mGroup->groupId() ) );
88 QVBoxLayout* vbLayout =
new QVBoxLayout( npMainWidget );
89 vbLayout->addWidget( mNotificationProps->
widget() );
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 );
169 mainWidget->setObjectName(
"mainWidget" );
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) );
178 QPair<QString,QString> context=qMakePair( QString::fromLatin1(
"contact"), mMetaContact->metaContactId().toString() );
182 QBoxLayout * vb =
static_cast<QVBoxLayout*
>( mNotificationProps->widget()->layout() );
184 QHBoxLayout* hb =
new QHBoxLayout();
187 hb->setObjectName(
"soundFromKABClayout" );
189 mFromKABC =
new QPushButton( i18n(
"Sync KABC..." ), mNotificationProps->widget() );
190 mFromKABC->setObjectName( QLatin1String(
"getSoundFromKABC") );
191 hb->addWidget( mFromKABC );
196 QVBoxLayout* vbLayout =
new QVBoxLayout( npMainWidget );
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 );
218 if(offlineName.isEmpty())
221 QString onlineName = mMetaContact->icon( Kopete::ContactListElement::Online );
222 if(onlineName.isEmpty())
225 QString awayName = mMetaContact->icon( Kopete::ContactListElement::Away );
226 if(awayName.isEmpty())
229 QString unknownName = mMetaContact->icon( Kopete::ContactListElement::Unknown );
230 if(unknownName.isEmpty())
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();
287 QList<Kopete::Contact*> cList = mMetaContact->contacts();
288 QList<Kopete::Contact*>::iterator it = cList.begin();
289 ui_mainWidget->cmbAccountName->clear();
290 for( ; it != cList.end(); ++it )
292 QString acct = (*it)->property( Kopete::Global::Properties::self()->nickName() ).value().toString() +
" <" + (*it)->contactId() +
'>';
293 QPixmap acctIcon = (*it)->account()->accountIcon();
294 ui_mainWidget->cmbAccountName->addItem( QIcon(acctIcon), acct );
297 if( (*it) == trackingName )
299 ui_mainWidget->cmbAccountName->setCurrentIndex( ui_mainWidget->cmbAccountName->count() - 1 );
303 ui_mainWidget->edtDisplayName->setText( mMetaContact->customDisplayName() );
305 Kopete::MetaContact::PropertySource nameSource = mMetaContact->displayNameSource();
307 ui_mainWidget->radioNameContact->setChecked(nameSource == Kopete::MetaContact::SourceContact);
308 ui_mainWidget->radioNameKABC->setChecked(nameSource == Kopete::MetaContact::SourceKABC);
309 ui_mainWidget->radioNameCustom->setChecked(nameSource == Kopete::MetaContact::SourceCustom);
313 void KopeteMetaLVIProps::slotLoadPhotoSources()
316 QList<Kopete::Contact*> cList = mMetaContact->contacts();
317 m_withPhotoContacts.clear();
318 Kopete::Contact* trackingPhoto = mMetaContact->photoSourceContact();
319 ui_mainWidget->cmbAccountPhoto->clear();
320 QList<Kopete::Contact*>::iterator itp = cList.begin();
321 for( ; itp != cList.end(); ++itp )
323 Kopete::Contact *citem = (*itp);
324 if ( citem->hasProperty( Kopete::Global::Properties::self()->photo().key() ) )
326 QString acct = citem->property( Kopete::Global::Properties::self()->nickName() ).value().toString() +
" <" + citem->contactId() +
'>';
327 QPixmap acctIcon = citem->account()->accountIcon();
328 ui_mainWidget->cmbAccountPhoto->addItem( QIcon(acctIcon), acct );
331 if( citem == trackingPhoto )
333 ui_mainWidget->cmbAccountPhoto->setCurrentIndex( ui_mainWidget->cmbAccountPhoto->count() - 1 );
335 m_withPhotoContacts.insert(ui_mainWidget->cmbAccountPhoto->count() - 1 , citem );
339 m_photoPath = mMetaContact->customPhoto().path();
341 Kopete::MetaContact::PropertySource photoSource = mMetaContact->photoSource();
343 ui_mainWidget->radioPhotoContact->setChecked(photoSource == Kopete::MetaContact::SourceContact);
344 ui_mainWidget->radioPhotoKABC->setChecked(photoSource == Kopete::MetaContact::SourceKABC);
345 ui_mainWidget->radioPhotoCustom->setChecked(photoSource == Kopete::MetaContact::SourceCustom);
347 ui_mainWidget->chkSyncPhoto->setChecked(mMetaContact->isPhotoSyncedWithKABC());
350 void KopeteMetaLVIProps::slotSelectPhoto()
352 const QString path = Kopete::UI::AvatarDialog::getAvatar(
this, m_photoPath);
357 slotEnableAndDisableWidgets();
360 void KopeteMetaLVIProps::slotEnableAndDisableWidgets()
362 KABC::AddressBook *ab = Kopete::KABCPersistence::self()->addressBook();
363 KABC::Addressee a = ab->findByUid( mAddressBookUid );
364 bool validLink = ! a.isEmpty();
366 ui_mainWidget->radioNameKABC->setEnabled(validLink);
368 ui_mainWidget->radioPhotoKABC->setEnabled(validLink);
371 if( selectedPhotoSource() == Kopete::MetaContact::SourceKABC || !validLink )
373 ui_mainWidget->chkSyncPhoto->setEnabled(
false);
377 ui_mainWidget->chkSyncPhoto->setEnabled(
true);
380 ui_mainWidget->radioNameContact->setEnabled(mMetaContact->contacts().count());
381 ui_mainWidget->radioPhotoContact->setEnabled(!m_withPhotoContacts.isEmpty());
383 ui_mainWidget->cmbAccountName->setEnabled(selectedNameSource() == Kopete::MetaContact::SourceContact);
384 ui_mainWidget->edtDisplayName->setEnabled(selectedNameSource() == Kopete::MetaContact::SourceCustom);
386 ui_mainWidget->cmbAccountPhoto->setEnabled(selectedPhotoSource() == Kopete::MetaContact::SourceContact);
387 ui_mainWidget->btnChoosePhoto->setEnabled(selectedPhotoSource() == Kopete::MetaContact::SourceCustom);
389 if ( m_withPhotoContacts.isEmpty() )
391 ui_mainWidget->cmbAccountPhoto->clear();
392 ui_mainWidget->cmbAccountPhoto->addItem(i18n(
"No Contacts with Photo Support"));
393 ui_mainWidget->cmbAccountPhoto->setEnabled(
false);
397 switch ( selectedPhotoSource() )
399 case Kopete::MetaContact::SourceKABC:
400 photo = Kopete::photoFromKABC(mAddressBookUid);
402 case Kopete::MetaContact::SourceContact:
403 photo = Kopete::photoFromContact(selectedPhotoSourceContact());
405 case Kopete::MetaContact::SourceCustom:
406 photo = QImage(m_photoPath);
409 if( !photo.isNull() )
410 ui_mainWidget->photoLabel->setPixmap(QPixmap::fromImage(photo.scaled(96, 96)));
412 ui_mainWidget->photoLabel->setPixmap( QPixmap() );
415 Kopete::MetaContact::PropertySource KopeteMetaLVIProps::selectedNameSource()
const
417 if ( ui_mainWidget->radioNameKABC->isChecked() )
418 return Kopete::MetaContact::SourceKABC;
419 if ( ui_mainWidget->radioNameContact->isChecked() )
420 return Kopete::MetaContact::SourceContact;
421 if ( ui_mainWidget->radioNameCustom->isChecked() )
422 return Kopete::MetaContact::SourceCustom;
424 return Kopete::MetaContact::SourceCustom;
427 Kopete::MetaContact::PropertySource KopeteMetaLVIProps::selectedPhotoSource()
const
429 if ( ui_mainWidget->radioPhotoKABC->isChecked() )
430 return Kopete::MetaContact::SourceKABC;
431 if ( ui_mainWidget->radioPhotoContact->isChecked() )
432 return Kopete::MetaContact::SourceContact;
433 if ( ui_mainWidget->radioPhotoCustom->isChecked() )
434 return Kopete::MetaContact::SourceCustom;
436 return Kopete::MetaContact::SourceCustom;
439 Kopete::Contact* KopeteMetaLVIProps::selectedNameSourceContact()
const
441 return mMetaContact->contacts().value( ui_mainWidget->cmbAccountName->currentIndex(), 0 );
444 Kopete::Contact* KopeteMetaLVIProps::selectedPhotoSourceContact()
const
446 return m_withPhotoContacts.value( ui_mainWidget->cmbAccountPhoto->currentIndex(), 0 );
449 void KopeteMetaLVIProps::slotOkClicked()
452 mMetaContact->setKabcId( mAddressBookUid );
456 if( ui_mainWidget->edtDisplayName->text() != mMetaContact->customDisplayName() )
457 mMetaContact->setDisplayName( ui_mainWidget->edtDisplayName->text() );
459 mMetaContact->setDisplayNameSource(selectedNameSource());
460 mMetaContact->setDisplayNameSourceContact( selectedNameSourceContact() );
463 mMetaContact->setPhotoSource(selectedPhotoSource());
464 mMetaContact->setPhotoSourceContact( selectedPhotoSourceContact() );
465 if ( !m_photoPath.isEmpty())
466 mMetaContact->setPhoto(KUrl(m_photoPath));
467 mMetaContact->setPhotoSyncedWithKABC( ui_mainWidget->chkSyncPhoto->isChecked() );
469 mMetaContact->setUseCustomIcon(
470 ui_mainWidget->chkUseCustomIcons->isChecked() );
496 void KopeteMetaLVIProps::slotUseCustomIconsToggled(
bool on)
498 ui_mainWidget->lblOffline->setEnabled( on );
499 ui_mainWidget->lblOnline->setEnabled( on );
500 ui_mainWidget->lblAway->setEnabled( on );
501 ui_mainWidget->lblUnknown->setEnabled( on );
503 ui_mainWidget->icnbOffline->setEnabled( on );
504 ui_mainWidget->icnbOnline->setEnabled( on );
505 ui_mainWidget->icnbAway->setEnabled( on );
506 ui_mainWidget->icnbUnknown->setEnabled( on );
509 void KopeteMetaLVIProps::slotAddresseeChanged(
const KABC::Addressee & a )
514 mFromKABC->setEnabled( !( mSound.isIntern() || mSound.url().isEmpty() ) );
515 ui_mainWidget->btnExportKABC->setEnabled(
true );
516 ui_mainWidget->btnImportKABC->setEnabled(
true );
518 mAddressBookUid = a.uid();
522 ui_mainWidget->btnExportKABC->setEnabled(
false );
523 ui_mainWidget->btnImportKABC->setEnabled(
false );
524 mAddressBookUid.clear();
525 ui_mainWidget->radioNameContact->setChecked(
true );
526 ui_mainWidget->radioPhotoContact->setChecked(
true );
528 slotEnableAndDisableWidgets();
531 void KopeteMetaLVIProps::slotExportClicked()
533 mMetaContact->setKabcId( mAddressBookUid );
536 if ( mExport->
showDialog() == QDialog::Accepted )
540 void KopeteMetaLVIProps::slotImportClicked()
542 mMetaContact->setKabcId( mAddressBookUid );
543 if ( Kopete::KABCPersistence::self()->syncWithKABC( mMetaContact ) )
544 KMessageBox::queuedMessageBox(
this, KMessageBox::Information,
545 i18n(
"No contacts were imported from the address book." ),
546 i18n(
"No Change" ) );
549 void KopeteMetaLVIProps::slotFromKABCClicked()
552 mNotificationProps->
widget()->customSound->setUrl( mSound.url() );
556 void KopeteMetaLVIProps::slotOpenSoundDialog( KUrlRequester *requester )
560 requester->disconnect( SIGNAL(openFileDialog(KUrlRequester*)),
561 this, SLOT(slotOpenSoundDialog(KUrlRequester*)));
563 KFileDialog *fileDialog = requester->fileDialog();
566 filters <<
"audio/x-wav" <<
"audio/mpeg" <<
"application/ogg"
568 fileDialog->setMimeFilter( filters );
571 QStringList soundDirs =
572 KGlobal::dirs()->findDirs(
"data",
"kopete/sounds");
573 soundDirs += KGlobal::dirs()->resourceDirs(
"sound" );
575 if ( !soundDirs.isEmpty() ) {
578 dir.setFilter( QDir::Files | QDir::Readable );
579 QStringList::ConstIterator it = soundDirs.constBegin();
580 while ( it != soundDirs.constEnd() ) {
582 if ( dir.isReadable() && dir.count() > 2 ) {
583 soundURL.setPath( *it );
584 fileDialog->setUrl( soundURL );
592 void KopeteMetaLVIProps::slotClearPhotoClicked()
595 mMetaContact->setPhoto( KUrl() );
597 slotEnableAndDisableWidgets();
600 #include "kopetelviprops.moc"
const QLatin1String MC_AW("user-away")
void exportData()
Export the data to KABC if changed, omitting any duplicates.
void storeCurrentCustoms()
int showDialog()
Display the dialog.
KopeteGVIProps(Kopete::Group *group, QWidget *parent)
const QLatin1String MC_ON("user-online")
const QLatin1String MC_OFF("user-offline")
const QLatin1String MC_UNK("metacontact_unknown")