less Q3 (remove a lot of unused Q3 headers, port small things)
[kdenetwork.git] / kopete / libkopete / ui / metacontactselectorwidget.cpp
bloba11bbc8cc8083035223ac5a3c0c1c8d1ccb084ab
1 /*
2 MetaContactSelectorWidget
4 Copyright (c) 2005 by Duncan Mac-Vicar Prett <duncan@kde.org>
6 Kopete (c) 2002-2005 by the Kopete developers <kopete-devel@kde.org>
8 *************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 *************************************************************************
18 #include <qcheckbox.h>
19 #include <qlabel.h>
20 #include <qtooltip.h>
21 #include <qimage.h>
22 #include <qpixmap.h>
23 #include <qpainter.h>
24 #include <qlayout.h>
25 //Added by qt3to4:
26 #include <QVBoxLayout>
27 #include <QBoxLayout>
29 #include <kapplication.h>
30 #include <kconfig.h>
31 #include <klocale.h>
32 #include <kiconloader.h>
34 #include <kdeversion.h>
35 #include <kinputdialog.h>
36 #include <kpushbutton.h>
37 #include <kactivelabel.h>
38 #include <kdebug.h>
39 #include <klistview.h>
40 #include <klistviewsearchline.h>
42 #include "kopetelistview.h"
43 #include "kopetelistviewsearchline.h"
44 #include "kopetecontactlist.h"
45 #include "kopetemetacontact.h"
46 #include "metacontactselectorwidget_base.h"
47 #include "metacontactselectorwidget.h"
49 using namespace Kopete::UI::ListView;
51 namespace Kopete
53 namespace UI
56 class MetaContactSelectorWidgetLVI::Private
58 public:
59 Kopete::MetaContact *metaContact;
60 ImageComponent *metaContactPhoto;
61 ImageComponent *metaContactIcon;
62 DisplayNameComponent *nameText;
63 TextComponent *extraText;
64 BoxComponent *contactIconBox;
65 BoxComponent *spacerBox;
66 int photoSize;
67 int contactIconSize;
71 MetaContactSelectorWidgetLVI::MetaContactSelectorWidgetLVI(Kopete::MetaContact *mc, Q3ListView *parent, QObject *owner, const char *name) : Kopete::UI::ListView::Item(parent, owner, name) , d( new Private() )
73 d->metaContact = mc;
74 d->photoSize = 60;
76 connect( d->metaContact, SIGNAL( photoChanged() ),
77 SLOT( slotPhotoChanged() ) );
78 connect( d->metaContact, SIGNAL( displayNameChanged(const QString&, const QString&) ),
79 SLOT( slotDisplayNameChanged() ) );
80 buildVisualComponents();
83 Kopete::MetaContact* MetaContactSelectorWidgetLVI::metaContact()
85 return d->metaContact;
88 void MetaContactSelectorWidgetLVI::slotDisplayNameChanged()
90 if ( d->nameText )
92 d->nameText->setText( d->metaContact->displayName() );
94 // delay the sort if we can
95 if ( ListView::ListView *lv = dynamic_cast<ListView::ListView *>( listView() ) )
96 lv->delayedSort();
97 else
98 listView()->sort();
102 QString MetaContactSelectorWidgetLVI::text ( int /* column */ ) const
104 return d->metaContact->displayName();
107 void MetaContactSelectorWidgetLVI::slotPhotoChanged()
109 QPixmap photoPixmap;
110 QImage photoImg = d->metaContact->photo();
111 if ( !photoImg.isNull() && (photoImg.width() > 0) && (photoImg.height() > 0) )
113 int photoSize = d->photoSize;
115 photoImg = photoImg.smoothScale( photoSize, photoSize, Qt::KeepAspectRatio ) ;
117 // draw a 1 pixel black border
118 photoPixmap = photoImg;
119 QPainter p(&photoPixmap);
120 p.setPen(Qt::black);
121 p.drawLine(0, 0, photoPixmap.width()-1, 0);
122 p.drawLine(0, photoPixmap.height()-1, photoPixmap.width()-1, photoPixmap.height()-1);
123 p.drawLine(0, 0, 0, photoPixmap.height()-1);
124 p.drawLine(photoPixmap.width()-1, 0, photoPixmap.width()-1, photoPixmap.height()-1);
126 else
128 // if no photo use the smilie icon
129 photoPixmap=SmallIcon(d->metaContact->statusIcon(), d->photoSize);
131 d->metaContactPhoto->setPixmap( photoPixmap, false);
134 void MetaContactSelectorWidgetLVI::buildVisualComponents()
136 // empty...
137 while ( component( 0 ) )
138 delete component( 0 );
140 d->nameText = 0L;
141 d->metaContactPhoto = 0L;
142 d->extraText = 0L;
143 d->contactIconSize = 16;
144 d->photoSize = 48;
146 Component *hbox = new BoxComponent( this, BoxComponent::Horizontal );
147 d->spacerBox = new BoxComponent( hbox, BoxComponent::Horizontal );
149 d->contactIconSize = IconSize( KIcon::Small );
150 Component *imageBox = new BoxComponent( hbox, BoxComponent::Vertical );
151 new VSpacerComponent( imageBox );
152 // include borders in size
153 d->metaContactPhoto = new ImageComponent( imageBox, d->photoSize + 2 , d->photoSize + 2 );
154 new VSpacerComponent( imageBox );
155 Component *vbox = new BoxComponent( hbox, BoxComponent::Vertical );
156 d->nameText = new DisplayNameComponent( vbox );
157 d->extraText = new TextComponent( vbox );
159 Component *box = new BoxComponent( vbox, BoxComponent::Horizontal );
160 d->contactIconBox = new BoxComponent( box, BoxComponent::Horizontal );
162 slotUpdateContactBox();
163 slotDisplayNameChanged();
164 slotPhotoChanged();
167 void MetaContactSelectorWidgetLVI::slotUpdateContactBox()
169 QList<Kopete::Contact *> contacts = d->metaContact->contacts();
170 QListIterator<Contact *> it(contacts);
171 while (it.hasNext())
173 Kopete::Contact *c = it.next();
174 new ContactComponent(d->contactIconBox, c, IconSize( KIcon::Small ));
178 class MetaContactSelectorWidget::Private
180 public:
181 MetaContactSelectorWidget_Base *widget;
182 QList<Kopete::MetaContact *> excludedMetaContacts;
186 MetaContactSelectorWidget::MetaContactSelectorWidget( QWidget *parent, const char *name )
187 : QWidget( parent, name ), d( new Private() )
189 QBoxLayout *l = new QVBoxLayout(this);
190 d->widget = new MetaContactSelectorWidget_Base(this);
191 l->addWidget(d->widget);
193 connect( d->widget->metaContactListView, SIGNAL( clicked(Q3ListViewItem * ) ),
194 SIGNAL( metaContactListClicked( Q3ListViewItem * ) ) );
195 connect( d->widget->metaContactListView, SIGNAL( selectionChanged( Q3ListViewItem * ) ),
196 SIGNAL( metaContactListClicked( Q3ListViewItem * ) ) );
197 connect( d->widget->metaContactListView, SIGNAL( spacePressed( Q3ListViewItem * ) ),
198 SIGNAL( metaContactListClicked( Q3ListViewItem * ) ) );
200 connect( Kopete::ContactList::self(), SIGNAL( metaContactAdded( Kopete::MetaContact * ) ), this, SLOT( slotLoadMetaContacts() ) );
202 d->widget->kListViewSearchLine->setListView(d->widget->metaContactListView);
203 d->widget->metaContactListView->setFullWidth( true );
204 d->widget->metaContactListView->header()->hide();
205 d->widget->metaContactListView->setColumnWidthMode(0, Q3ListView::Maximum);
206 slotLoadMetaContacts();
210 MetaContactSelectorWidget::~MetaContactSelectorWidget()
212 disconnect( Kopete::ContactList::self(), SIGNAL( metaContactAdded( Kopete::MetaContact * ) ), this, SLOT( slotLoadMetaContacts() ) );
216 Kopete::MetaContact* MetaContactSelectorWidget::metaContact()
218 MetaContactSelectorWidgetLVI *item = 0L;
219 item = static_cast<MetaContactSelectorWidgetLVI *>( d->widget->metaContactListView->selectedItem() );
221 if ( item )
222 return item->metaContact();
224 return 0L;
227 void MetaContactSelectorWidget::selectMetaContact( Kopete::MetaContact *mc )
229 // iterate trough list view
230 Q3ListViewItemIterator it( d->widget->metaContactListView );
231 while( it.current() )
233 MetaContactSelectorWidgetLVI *item = (MetaContactSelectorWidgetLVI *) it.current();
234 if (!item)
235 continue;
237 if ( mc == item->metaContact() )
239 // select the contact item
240 d->widget->metaContactListView->setSelected( item, true );
241 d->widget->metaContactListView->ensureItemVisible( item );
243 ++it;
247 void MetaContactSelectorWidget::excludeMetaContact( Kopete::MetaContact *mc )
249 if( d->excludedMetaContacts.findIndex(mc) == -1 )
251 d->excludedMetaContacts.append(mc);
253 slotLoadMetaContacts();
256 bool MetaContactSelectorWidget::metaContactSelected()
258 return d->widget->metaContactListView->selectedItem() ? true : false;
261 /** Read in metacontacts from contactlist */
262 void MetaContactSelectorWidget::slotLoadMetaContacts()
264 d->widget->metaContactListView->clear();
266 QList<Kopete::MetaContact *> metaContacts = Kopete::ContactList::self()->metaContacts();
267 QListIterator<Kopete::MetaContact *> it(metaContacts);
268 while ( it.hasNext() )
270 Kopete::MetaContact *mc = it.next();
271 if( !mc->isTemporary() && mc != metaContact() )
272 if( !mc->isTemporary() && (d->excludedMetaContacts.findIndex(mc) == -1) )
274 new MetaContactSelectorWidgetLVI(mc, d->widget->metaContactListView);
278 d->widget->metaContactListView->sort();
281 void MetaContactSelectorWidget::setLabelMessage( const QString &msg )
283 d->widget->lblHeader->setText(msg);
286 } // namespace UI
287 } // namespace Kopete
289 #include "metacontactselectorwidget.moc"
291 // vim: set noet ts=4 sts=4 sw=4: