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 *************************************************************************
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. *
15 *************************************************************************
18 #include <qcheckbox.h>
26 #include <QVBoxLayout>
29 #include <kapplication.h>
32 #include <kiconloader.h>
34 #include <kdeversion.h>
35 #include <kinputdialog.h>
36 #include <kpushbutton.h>
37 #include <kactivelabel.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
;
56 class MetaContactSelectorWidgetLVI::Private
59 Kopete::MetaContact
*metaContact
;
60 ImageComponent
*metaContactPhoto
;
61 ImageComponent
*metaContactIcon
;
62 DisplayNameComponent
*nameText
;
63 TextComponent
*extraText
;
64 BoxComponent
*contactIconBox
;
65 BoxComponent
*spacerBox
;
71 MetaContactSelectorWidgetLVI::MetaContactSelectorWidgetLVI(Kopete::MetaContact
*mc
, Q3ListView
*parent
, QObject
*owner
, const char *name
) : Kopete::UI::ListView::Item(parent
, owner
, name
) , d( new Private() )
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()
92 d
->nameText
->setText( d
->metaContact
->displayName() );
94 // delay the sort if we can
95 if ( ListView::ListView
*lv
= dynamic_cast<ListView::ListView
*>( listView() ) )
102 QString
MetaContactSelectorWidgetLVI::text ( int /* column */ ) const
104 return d
->metaContact
->displayName();
107 void MetaContactSelectorWidgetLVI::slotPhotoChanged()
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
);
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);
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()
137 while ( component( 0 ) )
138 delete component( 0 );
141 d
->metaContactPhoto
= 0L;
143 d
->contactIconSize
= 16;
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();
167 void MetaContactSelectorWidgetLVI::slotUpdateContactBox()
169 QList
<Kopete::Contact
*> contacts
= d
->metaContact
->contacts();
170 QListIterator
<Contact
*> it(contacts
);
173 Kopete::Contact
*c
= it
.next();
174 new ContactComponent(d
->contactIconBox
, c
, IconSize( KIcon::Small
));
178 class MetaContactSelectorWidget::Private
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() );
222 return item
->metaContact();
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();
237 if ( mc
== item
->metaContact() )
239 // select the contact item
240 d
->widget
->metaContactListView
->setSelected( item
, true );
241 d
->widget
->metaContactListView
->ensureItemVisible( item
);
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
);
287 } // namespace Kopete
289 #include "metacontactselectorwidget.moc"
291 // vim: set noet ts=4 sts=4 sw=4: