Hi
Today I've simplified the avatar selector dialog a bit.
Screenshot at:
http://people.mandriva.com/~boiko/kopete/avatars/kopete_avatar_dialog.png
Please review the changes.
Cheers
--
Gustavo Pichorim Boiko
Index: libkopete/ui/avatardialog.cpp
===================================================================
--- libkopete/ui/avatardialog.cpp (revisão 736213)
+++ libkopete/ui/avatardialog.cpp (cópia de trabalho)
@@ -46,6 +46,7 @@
AvatarDialog::AvatarDialog(QWidget *parent)
: KDialog(parent), d(new Private)
{
+ showButtonSeparator(true);
setCaption( i18n("Select an avatar") );
setButtons( KDialog::Ok | KDialog::Cancel );
Index: libkopete/ui/avatarselectorwidget.ui
===================================================================
--- libkopete/ui/avatarselectorwidget.ui (revisão 736213)
+++ libkopete/ui/avatarselectorwidget.ui (cópia de trabalho)
@@ -5,225 +5,86 @@
<rect>
<x>0</x>
<y>0</y>
- <width>423</width>
- <height>363</height>
+ <width>478</width>
+ <height>331</height>
</rect>
</property>
+ <property name="minimumSize" >
+ <size>
+ <width>400</width>
+ <height>300</height>
+ </size>
+ </property>
<layout class="QGridLayout" >
- <property name="leftMargin" >
- <number>0</number>
- </property>
- <property name="topMargin" >
- <number>0</number>
- </property>
- <property name="rightMargin" >
- <number>0</number>
- </property>
- <property name="bottomMargin" >
- <number>0</number>
- </property>
- <item row="0" column="0" >
- <widget class="QTabWidget" name="tabAvatar" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="MinimumExpanding" hsizetype="Expanding" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
+ <item row="0" column="0" colspan="3" >
+ <widget class="QListWidget" name="listUserAvatar" >
+ <property name="showDropIndicator" stdset="0" >
+ <bool>false</bool>
</property>
- <property name="currentIndex" >
- <number>0</number>
+ <property name="dragDropMode" >
+ <enum>QAbstractItemView::NoDragDrop</enum>
</property>
- <widget class="QWidget" name="tabUser" >
- <attribute name="title" >
- <string>User</string>
- </attribute>
- <layout class="QGridLayout" >
- <property name="leftMargin" >
- <number>9</number>
- </property>
- <property name="topMargin" >
- <number>9</number>
- </property>
- <property name="rightMargin" >
- <number>9</number>
- </property>
- <property name="bottomMargin" >
- <number>9</number>
- </property>
- <property name="horizontalSpacing" >
- <number>6</number>
- </property>
- <property name="verticalSpacing" >
- <number>6</number>
- </property>
- <item row="0" column="0" >
- <widget class="QListWidget" name="listUserAvatar" >
- <property name="alternatingRowColors" >
- <bool>true</bool>
- </property>
- <property name="iconSize" >
- <size>
- <width>64</width>
- <height>64</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="tabContacts" >
- <attribute name="title" >
- <string>Contacts</string>
- </attribute>
- <layout class="QGridLayout" >
- <property name="leftMargin" >
- <number>9</number>
- </property>
- <property name="topMargin" >
- <number>9</number>
- </property>
- <property name="rightMargin" >
- <number>9</number>
- </property>
- <property name="bottomMargin" >
- <number>9</number>
- </property>
- <property name="horizontalSpacing" >
- <number>6</number>
- </property>
- <property name="verticalSpacing" >
- <number>6</number>
- </property>
- <item row="0" column="0" >
- <widget class="QListWidget" name="listUserContact" >
- <property name="alternatingRowColors" >
- <bool>true</bool>
- </property>
- <property name="iconSize" >
- <size>
- <width>64</width>
- <height>64</height>
- </size>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
+ <property name="alternatingRowColors" >
+ <bool>false</bool>
+ </property>
+ <property name="selectionBehavior" >
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="iconSize" >
+ <size>
+ <width>96</width>
+ <height>96</height>
+ </size>
+ </property>
+ <property name="textElideMode" >
+ <enum>Qt::ElideNone</enum>
+ </property>
+ <property name="movement" >
+ <enum>QListView::Static</enum>
+ </property>
+ <property name="resizeMode" >
+ <enum>QListView::Adjust</enum>
+ </property>
+ <property name="layoutMode" >
+ <enum>QListView::Batched</enum>
+ </property>
+ <property name="viewMode" >
+ <enum>QListView::IconMode</enum>
+ </property>
+ <property name="uniformItemSizes" >
+ <bool>true</bool>
+ </property>
</widget>
</item>
- <item row="0" column="1" >
- <layout class="QVBoxLayout" >
- <item>
- <widget class="QGroupBox" name="groupBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="title" >
- <string>Current avatar</string>
- </property>
- <layout class="QGridLayout" >
- <property name="leftMargin" >
- <number>9</number>
- </property>
- <property name="topMargin" >
- <number>9</number>
- </property>
- <property name="rightMargin" >
- <number>9</number>
- </property>
- <property name="bottomMargin" >
- <number>9</number>
- </property>
- <property name="horizontalSpacing" >
- <number>6</number>
- </property>
- <property name="verticalSpacing" >
- <number>6</number>
- </property>
- <item row="0" column="0" >
- <widget class="QLabel" name="labelAvatarImage" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
- <size>
- <width>96</width>
- <height>96</height>
- </size>
- </property>
- <property name="maximumSize" >
- <size>
- <width>96</width>
- <height>96</height>
- </size>
- </property>
- <property name="baseSize" >
- <size>
- <width>96</width>
- <height>96</height>
- </size>
- </property>
- <property name="autoFillBackground" >
- <bool>true</bool>
- </property>
- <property name="frameShape" >
- <enum>QFrame::Box</enum>
- </property>
- <property name="scaledContents" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="buttonAddAvatar" >
- <property name="text" >
- <string>Add Avatar...</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="buttonRemoveAvatar" >
- <property name="text" >
- <string>Remove Avatar</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer>
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" >
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
+ <item row="1" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>131</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
</item>
- <item row="1" column="0" colspan="2" >
- <widget class="KTitleWidget" native="1" name="labelErrorMessage" />
+ <item row="1" column="0" >
+ <widget class="QPushButton" name="buttonAddAvatar" >
+ <property name="text" >
+ <string>Add Avatar...</string>
+ </property>
+ </widget>
</item>
+ <item row="1" column="1" >
+ <widget class="QPushButton" name="buttonRemoveAvatar" >
+ <property name="text" >
+ <string>Remove Avatar</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
- <customwidgets>
- <customwidget>
- <class>KTitleWidget</class>
- <extends>QWidget</extends>
- <header>ktitlewidget.h</header>
- </customwidget>
- </customwidgets>
<resources/>
<connections/>
</ui>
Index: libkopete/ui/avatarselectorwidget.cpp
===================================================================
--- libkopete/ui/avatarselectorwidget.cpp (revisão 736213)
+++ libkopete/ui/avatarselectorwidget.cpp (cópia de trabalho)
@@ -3,7 +3,8 @@
/*
avatarselectorwidget.cpp - Widget to manage and select user avatar
- Copyright (c) 2007 by Michaël Larouche <[EMAIL PROTECTED]>
+ Copyright (c) 2007 by Michaël Larouche <[EMAIL PROTECTED]>
+ Copyright (c) 2007 Gustavo Pichorim Boiko <[EMAIL PROTECTED]>
Kopete (c) 2002-2007 by the Kopete developers <[email protected]>
@@ -19,9 +20,10 @@
#include "avatarselectorwidget.h"
// Qt includes
-#include <QtGui/QListWidget>
-#include <QtGui/QListWidgetItem>
-#include <QtGui/QIcon>
+#include <QListWidget>
+#include <QListWidgetItem>
+#include <QIcon>
+#include <QPainter>
// KDE includes
#include <kdebug.h>
@@ -47,8 +49,32 @@
void setAvatarEntry(Kopete::AvatarManager::AvatarEntry entry)
{
m_entry = entry;
- setText( entry.name );
- setIcon( QIcon(entry.path) );
+
+ QSize s(96,96);
+
+ if (listWidget())
+ s = listWidget()->iconSize();
+
+ QPixmap pix;
+ if (entry.path.isEmpty())
+ {
+ // draw a fake image telling there is no avatar
+ pix = QPixmap(s);
+ QPainter p(&pix);
+ p.fillRect(pix.rect(), Qt::white);
+ p.drawText(pix.rect(), Qt::TextWordWrap | Qt::AlignCenter, i18n("No Avatar"));
+ }
+ else
+ {
+ pix = QPixmap(entry.path).scaled(s);
+ }
+
+ // draw a border around the avatar
+ QPainter p(&pix);
+ p.setBrush(Qt::NoBrush);
+ p.drawRect(0,0,pix.width()-1,pix.height()-1);
+
+ setIcon(pix);
}
Kopete::AvatarManager::AvatarEntry avatarEntry() const
@@ -78,36 +104,34 @@
: QWidget(parent), d(new Private)
{
d->mainWidget.setupUi(this);
- d->mainWidget.labelErrorMessage->setPixmap(KTitleWidget::ErrorMessage);
- d->mainWidget.labelErrorMessage->setHidden(true);
+ // use icons on buttons
+ d->mainWidget.buttonAddAvatar->setIcon( KIcon("edit-add") );
+ d->mainWidget.buttonRemoveAvatar->setIcon( KIcon("edit-delete") );
+
// Connect signals/slots
connect(d->mainWidget.buttonAddAvatar, SIGNAL(clicked()), this, SLOT(buttonAddAvatarClicked()));
connect(d->mainWidget.buttonRemoveAvatar, SIGNAL(clicked()), this, SLOT(buttonRemoveAvatarClicked()));
- connect(d->mainWidget.tabAvatar, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int)));
- connect(d->mainWidget.listUserAvatar, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(listSelectionChanged(QListWidgetItem*)));
- connect(d->mainWidget.listUserContact, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(listSelectionChanged(QListWidgetItem*)));
+ connect(d->mainWidget.listUserAvatar, SIGNAL(itemClicked(QListWidgetItem*)),
+ this, SLOT(listSelectionChanged(QListWidgetItem*)));
+ connect(Kopete::AvatarManager::self(), SIGNAL(avatarAdded(Kopete::AvatarManager::AvatarEntry)),
+ this, SLOT(avatarAdded(Kopete::AvatarManager::AvatarEntry)));
+ connect(Kopete::AvatarManager::self(), SIGNAL(avatarRemoved(Kopete::AvatarManager::AvatarEntry)),
+ this, SLOT(avatarRemoved(Kopete::AvatarManager::AvatarEntry)));
- connect(Kopete::AvatarManager::self(), SIGNAL(avatarAdded(Kopete::AvatarManager::AvatarEntry)), this, SLOT(avatarAdded(Kopete::AvatarManager::AvatarEntry)));
- connect(Kopete::AvatarManager::self(), SIGNAL(avatarRemoved(Kopete::AvatarManager::AvatarEntry)), this, SLOT(avatarRemoved(Kopete::AvatarManager::AvatarEntry)));
-
-
- // Add a No Avatar option
+ // Add a "No Avatar" option
Kopete::AvatarManager::AvatarEntry empty;
empty.name = i18n("No Avatar");
empty.contact = 0;
empty.category = Kopete::AvatarManager::User;
d->addItem(empty);
- // List avatars in lists
+ // List avatars of User category
Kopete::AvatarQueryJob *queryJob = new Kopete::AvatarQueryJob(this);
connect(queryJob, SIGNAL(result(KJob*)), this, SLOT(queryJobFinished(KJob*)));
- queryJob->setQueryFilter( Kopete::AvatarManager::All );
+ queryJob->setQueryFilter( Kopete::AvatarManager::User );
queryJob->start();
-
- // select the User tab by default
- d->mainWidget.tabAvatar->setCurrentWidget( d->mainWidget.tabUser );
}
AvatarSelectorWidget::~AvatarSelectorWidget()
@@ -156,10 +180,7 @@
{
// TODO: Download image
if( !imageUrl.isLocalFile() )
- {
- d->mainWidget.labelErrorMessage->setText( i18n("You can only add avatar from local file.") );
return;
- }
// Crop the image
QImage avatar = KPixmapRegionSelectorDialog::getSelectedImage( QPixmap(imageUrl.path()), 96, 96, this );
@@ -175,7 +196,8 @@
Kopete::AvatarManager::AvatarEntry addedEntry = Kopete::AvatarManager::self()->add( newEntry );
if( addedEntry.path.isEmpty() )
{
- d->mainWidget.labelErrorMessage->setText( i18n("Kopete cannot add this new avatar because it could not save the avatar image in user directory.") );
+ //TODO add a real error message
+ //d->mainWidget.labelErrorMessage->setText( i18n("Kopete cannot add this new avatar because it could not save the avatar image in user directory.") );
return;
}
@@ -186,11 +208,7 @@
AvatarSelectorWidgetItem *item = dynamic_cast<AvatarSelectorWidgetItem*>( foundItems.first() );
if ( !item )
return;
-
item->setSelected( true );
- // show the User tab
- d->mainWidget.tabAvatar->setCurrentWidget(d->mainWidget.tabUser);
- listSelectionChanged( item );
}
@@ -209,7 +227,6 @@
{
if( !Kopete::AvatarManager::self()->remove( selectedItem->avatarEntry() ) )
{
- d->mainWidget.labelErrorMessage->setText( i18n("Kopete cannot remove selected avatar.") );
kDebug(14010) << "Removing of avatar failed for unknown reason.";
}
}
@@ -229,7 +246,8 @@
}
else
{
- d->mainWidget.labelErrorMessage->setText( queryJob->errorText() );
+ //TODO add a real error message
+ //d->mainWidget.labelErrorMessage->setText( queryJob->errorText() );
}
}
@@ -264,60 +282,18 @@
void AvatarSelectorWidget::listSelectionChanged(QListWidgetItem *item)
{
- if( item )
- {
- d->mainWidget.labelAvatarImage->setPixmap( item->icon().pixmap(96, 96) );
- d->selectedItem = item;
- }
- else
- {
- d->selectedItem = 0;
- }
-
- // I know sender() is evil
- // Disable Remove Avatar button when selecting an item in listUserContact.
- // I don't know anyone who will want to remove avatar received from contacts.
- if( sender() == d->mainWidget.listUserContact )
- {
- d->mainWidget.buttonRemoveAvatar->setEnabled(false);
- }
- else
- {
- d->mainWidget.buttonRemoveAvatar->setEnabled(true);
- }
+ d->selectedItem = item;
}
-void AvatarSelectorWidget::currentTabChanged(int index)
-{
-
- // only enable the Remove button when the User tab is selected
- if (index == d->mainWidget.tabAvatar->indexOf(d->mainWidget.tabUser))
- d->mainWidget.buttonRemoveAvatar->setEnabled(true);
- else
- d->mainWidget.buttonRemoveAvatar->setEnabled(false);
-
-}
-
-
void AvatarSelectorWidget::Private::addItem(Kopete::AvatarManager::AvatarEntry entry)
{
kDebug(14010) << "Entry(" << entry.name << "): " << entry.category;
- QListWidget *listWidget = 0;
- if( entry.category & Kopete::AvatarManager::User )
- {
- listWidget = mainWidget.listUserAvatar;
- }
- else if( entry.category & Kopete::AvatarManager::Contact )
- {
- listWidget = mainWidget.listUserContact;
- }
- else
- {
- return;
- }
+ // only use User avatars
+ if( !(entry.category & Kopete::AvatarManager::User) )
+ return;
- AvatarSelectorWidgetItem *item = new AvatarSelectorWidgetItem(listWidget);
+ AvatarSelectorWidgetItem *item = new AvatarSelectorWidgetItem(mainWidget.listUserAvatar);
item->setAvatarEntry(entry);
if (entry.path == currentAvatar)
item->setSelected(true);
Index: libkopete/ui/avatarselectorwidget.h
===================================================================
--- libkopete/ui/avatarselectorwidget.h (revisão 736213)
+++ libkopete/ui/avatarselectorwidget.h (cópia de trabalho)
@@ -2,6 +2,7 @@
avatarselectorwidget.h - Widget to manage and select user avatar
Copyright (c) 2007 by Michaël Larouche <[EMAIL PROTECTED]>
+ 2007 Gustavo Pichorim Boiko <[EMAIL PROTECTED]>
Kopete (c) 2002-2007 by the Kopete developers <[email protected]>
@@ -70,12 +71,7 @@
* This is used to select the avatar in the avatar list
*/
void setCurrentAvatar(const QString &path);
-Q_SIGNALS:
- /**
- * User has selected another avatar in the list.
- */
- void avatarChanged();
-
+
private Q_SLOTS:
/**
* @internal
@@ -116,13 +112,6 @@
*/
void listSelectionChanged(QListWidgetItem *item);
- /**
- * @internal
- * The current tab has changed
- * @param index the index of the selected tab
- */
- void currentTabChanged(int index);
-
private:
Q_DISABLE_COPY(AvatarSelectorWidget)
_______________________________________________
kopete-devel mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kopete-devel