[kde-doc-english] [kdepimlibs] akonadi/contact: Improve appearance and operation of the IM address dialogue.
Jonathan Marten
jjm at keelhaul.me.uk
Wed Jan 4 11:27:43 UTC 2012
Git commit 3c31df07e12ef288e4b5f7484a2ccf52701da533 by Jonathan Marten.
Committed on 04/01/2012 at 12:20.
Pushed by marten into branch 'master'.
Improve appearance and operation of the IM address dialogue.
Instead of editing in place with an item edit delegate, use a
separate add/edit dialogue for the protocol and address. The
item delegate is only used for showing the standard address
in bold.
Open the item editor dialogue on a double click, so those users
who are accustomed to the double click to change will not be
surprised.
Eliminates the confusion when a user clicks on "Add" and then
thinks "but I didn't ask for AIM, how do I change it?".
BUG:244799
REVIEW:103620
GUI:
M +1 -0 akonadi/contact/CMakeLists.txt
M +4 -52 akonadi/contact/editor/im/imdelegate.cpp
M +0 -2 akonadi/contact/editor/im/imdelegate.h
M +53 -17 akonadi/contact/editor/im/imeditordialog.cpp
M +2 -0 akonadi/contact/editor/im/imeditordialog.h
A +84 -0 akonadi/contact/editor/im/imitemdialog.cpp [License: BSD]
C +13 -20 akonadi/contact/editor/im/imitemdialog.h [from: akonadi/contact/editor/im/imeditordialog.h - 062% similarity] [License: UNKNOWN] *
The files marked with a * at the end have a non valid license. Please read: http://techbase.kde.org/Policies/Licensing_Policy and use the headers which are listed at that page.
http://commits.kde.org/kdepimlibs/3c31df07e12ef288e4b5f7484a2ccf52701da533
diff --git a/akonadi/contact/CMakeLists.txt b/akonadi/contact/CMakeLists.txt
index 505031e..ae996c0 100644
--- a/akonadi/contact/CMakeLists.txt
+++ b/akonadi/contact/CMakeLists.txt
@@ -74,6 +74,7 @@ set(akonadicontact_editor_SRCS
editor/im/imeditordialog.cpp
editor/im/immodel.cpp
editor/im/improtocols.cpp
+ editor/im/imitemdialog.cpp
editor/imagewidget.cpp
editor/imeditwidget.cpp
editor/kdatepickerpopup.cpp
diff --git a/akonadi/contact/editor/im/imdelegate.cpp b/akonadi/contact/editor/im/imdelegate.cpp
index 5683022..c3c4fe8 100644
--- a/akonadi/contact/editor/im/imdelegate.cpp
+++ b/akonadi/contact/editor/im/imdelegate.cpp
@@ -22,11 +22,6 @@
#include "imdelegate.h"
#include "immodel.h"
-#include "improtocols.h"
-
-#include <kcombobox.h>
-#include <kicon.h>
-#include <klocale.h>
IMDelegate::IMDelegate( QObject *parent )
: QStyledItemDelegate( parent )
@@ -39,59 +34,16 @@ IMDelegate::~IMDelegate()
QWidget* IMDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &item, const QModelIndex &index ) const
{
- if ( index.column() == 0 ) {
- KComboBox *comboBox = new KComboBox( parent );
- comboBox->setFrame( false );
- comboBox->setAutoFillBackground( true );
-
- const QStringList protocols = IMProtocols::self()->protocols();
- foreach ( const QString &protocol, protocols ) {
- comboBox->addItem( KIcon( IMProtocols::self()->icon( protocol ) ),
- IMProtocols::self()->name( protocol ),
- protocol );
- }
-
- return comboBox;
- } else {
- return QStyledItemDelegate::createEditor( parent, item, index );
- }
-}
-
-void IMDelegate::setEditorData( QWidget *editor, const QModelIndex &index ) const
-{
- if ( index.column() == 0 ) {
- KComboBox *comboBox = qobject_cast<KComboBox*>( editor );
- if ( !comboBox )
- return;
-
- const QString protocol = index.data( IMModel::ProtocolRole ).toString();
- comboBox->setCurrentIndex( comboBox->findData( protocol ) );
- } else {
- QStyledItemDelegate::setEditorData( editor, index );
- }
-}
-
-void IMDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
-{
- if ( index.column() == 0 ) {
- KComboBox *comboBox = qobject_cast<KComboBox*>( editor );
- if ( !comboBox )
- return;
-
- model->setData( index, comboBox->itemData( comboBox->currentIndex() ), IMModel::ProtocolRole );
- } else {
- QStyledItemDelegate::setModelData( editor, model, index );
- }
+ return 0;
}
void IMDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
+ QStyleOptionViewItem newOption( option );
if ( index.data( IMModel::IsPreferredRole ).toBool() ) {
- QStyleOptionViewItem newOption( option );
newOption.font.setBold( true );
+ }
- QStyledItemDelegate::paint( painter, newOption, index );
- } else
- QStyledItemDelegate::paint( painter, option, index );
+ QStyledItemDelegate::paint( painter, newOption, index );
}
diff --git a/akonadi/contact/editor/im/imdelegate.h b/akonadi/contact/editor/im/imdelegate.h
index 9337d9c..34419c8 100644
--- a/akonadi/contact/editor/im/imdelegate.h
+++ b/akonadi/contact/editor/im/imdelegate.h
@@ -32,8 +32,6 @@ class IMDelegate : public QStyledItemDelegate
virtual QWidget* createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const;
- virtual void setEditorData( QWidget *editor, const QModelIndex &index ) const;
- virtual void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const;
virtual void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const;
};
diff --git a/akonadi/contact/editor/im/imeditordialog.cpp b/akonadi/contact/editor/im/imeditordialog.cpp
index 75ca579..443582d 100644
--- a/akonadi/contact/editor/im/imeditordialog.cpp
+++ b/akonadi/contact/editor/im/imeditordialog.cpp
@@ -23,6 +23,7 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
#include "imeditordialog.h"
#include "imdelegate.h"
+#include "imitemdialog.h"
#include <QtCore/QStringList>
#include <QtGui/QGridLayout>
@@ -44,25 +45,26 @@ IMEditorDialog::IMEditorDialog( QWidget *parent )
QGridLayout *layout = new QGridLayout( widget );
- mAddButton = new QPushButton( i18n( "Add" ) );
+ mAddButton = new QPushButton( i18n( "Add..." ) );
+ mEditButton = new QPushButton( i18n( "Edit..." ) );
mRemoveButton = new QPushButton( i18n( "Remove" ) );
mStandardButton = new QPushButton( i18n( "Set as Standard" ) );
mView = new QTreeView;
mView->setRootIsDecorated( false );
- layout->addWidget( mView, 0, 0, 4, 1 );
+ layout->addWidget( mView, 0, 0, 5, 1 );
layout->addWidget( mAddButton, 0, 1 );
- layout->addWidget( mRemoveButton, 1, 1 );
- layout->addWidget( mStandardButton, 2, 1 );
+ layout->addWidget( mEditButton, 1, 1 );
+ layout->addWidget( mRemoveButton, 2, 1 );
+ layout->addWidget( mStandardButton, 3, 1 );
+ layout->setRowStretch( 4, 1 );
connect( mAddButton, SIGNAL(clicked()), SLOT(slotAdd()) );
+ connect( mEditButton, SIGNAL(clicked()), SLOT(slotEdit()) );
connect( mRemoveButton, SIGNAL(clicked()), SLOT(slotRemove()) );
connect( mStandardButton, SIGNAL(clicked()), SLOT(slotSetStandard()) );
- mRemoveButton->setEnabled( false );
- mStandardButton->setEnabled( false );
-
mModel = new IMModel( this );
mView->setModel( mModel );
@@ -70,6 +72,9 @@ IMEditorDialog::IMEditorDialog( QWidget *parent )
connect( mView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
this, SLOT(slotUpdateButtons()) );
+ connect( mView, SIGNAL(doubleClicked(QModelIndex)),
+ this, SLOT(slotEdit()) );
+ slotUpdateButtons();
}
void IMEditorDialog::setAddresses( const IMAddress::List &addresses )
@@ -84,34 +89,62 @@ IMAddress::List IMEditorDialog::addresses() const
void IMEditorDialog::slotAdd()
{
- mModel->insertRow( mModel->rowCount() );
+ IMItemDialog d( this );
+ d.setCaption( i18nc( "@window:title", "Add IM Address" ) );
+ if ( d.exec() ) {
+ IMAddress newAddress = d.address();
+ int addedRow = mModel->rowCount();
+ mModel->insertRow( addedRow );
+
+ mModel->setData( mModel->index( addedRow, 0 ), newAddress.protocol(), IMModel::ProtocolRole );
+ mModel->setData( mModel->index( addedRow, 1 ), newAddress.name(), Qt::EditRole );
+ }
+}
+
+void IMEditorDialog::slotEdit()
+{
+ const int currentRow = mView->currentIndex().row();
+ if (currentRow<0)
+ return;
+
+ IMItemDialog d( this );
+ d.setCaption( i18nc( "@window:title", "Edit IM Address" ) );
+ d.setAddress( mModel->addresses().at( currentRow ));
+
+ if ( d.exec() ) {
+ IMAddress editedAddress = d.address();
+ mModel->setData( mModel->index( currentRow, 0 ), editedAddress.protocol(), IMModel::ProtocolRole );
+ mModel->setData( mModel->index( currentRow, 1 ), editedAddress.name(), Qt::EditRole );
+ }
}
void IMEditorDialog::slotRemove()
{
- const QModelIndex currentIndex = mView->currentIndex();
- if ( !currentIndex.isValid() )
+ const int currentRow = mView->currentIndex().row();
+ if (currentRow<0)
return;
if ( KMessageBox::warningContinueCancel( this,
- i18nc( "Instant messaging", "Do you really want to delete the selected address?" ),
- i18n( "Confirm Delete" ), KStandardGuiItem::del() ) != KMessageBox::Continue ) {
+ i18nc( "Instant messaging", "Do you really want to delete the selected <resource>%1</resource> address?",
+ mModel->data( mModel->index( currentRow, 0 ), Qt::DisplayRole ).toString() ),
+ i18nc( "@window:title", "Confirm Delete" ),
+ KStandardGuiItem::del() ) != KMessageBox::Continue ) {
return;
}
- mModel->removeRow( currentIndex.row() );
+ mModel->removeRow( currentRow );
}
void IMEditorDialog::slotSetStandard()
{
- const QModelIndex currentIndex = mView->currentIndex();
- if ( !currentIndex.isValid() )
+ const int currentRow = mView->currentIndex().row();
+ if ( currentRow < 0 )
return;
// set current index as preferred and all other as non-preferred
for ( int i = 0; i < mModel->rowCount(); ++i ) {
const QModelIndex index = mModel->index( i, 0 );
- mModel->setData( index, (index.row() == currentIndex.row()), IMModel::IsPreferredRole );
+ mModel->setData( index, (index.row() == currentRow), IMModel::IsPreferredRole );
}
}
@@ -120,7 +153,10 @@ void IMEditorDialog::slotUpdateButtons()
const QModelIndex currentIndex = mView->currentIndex();
mRemoveButton->setEnabled( currentIndex.isValid() );
- mStandardButton->setEnabled( currentIndex.isValid() );
+ mEditButton->setEnabled( currentIndex.isValid() );
+
+ mStandardButton->setEnabled( currentIndex.isValid() &&
+ !mModel->data( currentIndex, IMModel::IsPreferredRole ).toBool() );
}
#include "imeditordialog.moc"
diff --git a/akonadi/contact/editor/im/imeditordialog.h b/akonadi/contact/editor/im/imeditordialog.h
index 8bf69ea..c665e11 100644
--- a/akonadi/contact/editor/im/imeditordialog.h
+++ b/akonadi/contact/editor/im/imeditordialog.h
@@ -43,6 +43,7 @@ class IMEditorDialog : public KDialog
private Q_SLOTS:
void slotAdd();
+ void slotEdit();
void slotRemove();
void slotSetStandard();
void slotUpdateButtons();
@@ -50,6 +51,7 @@ class IMEditorDialog : public KDialog
private:
QTreeView *mView;
QPushButton *mAddButton;
+ QPushButton *mEditButton;
QPushButton *mRemoveButton;
QPushButton *mStandardButton;
diff --git a/akonadi/contact/editor/im/imitemdialog.cpp b/akonadi/contact/editor/im/imitemdialog.cpp
new file mode 100644
index 0000000..b8541c6
--- /dev/null
+++ b/akonadi/contact/editor/im/imitemdialog.cpp
@@ -0,0 +1,84 @@
+/*
+IM address item editor widget for KDE PIM
+
+Copyright 2012 Jonathan Marten <jjm at keelhaul.me.uk>
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) version 3, or any
+later version accepted by the membership of KDE e.V. (or its
+successor approved by the membership of KDE e.V.), which shall
+act as a proxy defined in Section 6 of version 3 of the license.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "imitemdialog.h"
+
+#include "immodel.h"
+#include "improtocols.h"
+
+#include <QtGui/QComboBox>
+#include <QtGui/QFormLayout>
+
+#include <klineedit.h>
+#include <klocale.h>
+
+IMItemDialog::IMItemDialog( QWidget *parent )
+ : KDialog( parent )
+{
+ setButtons( Ok | Cancel );
+ setDefaultButton( Ok );
+
+ QWidget *widget = new QWidget( this );
+ setMainWidget( widget );
+
+ QFormLayout *layout = new QFormLayout( widget );
+
+ mProtocolCombo = new QComboBox;
+ mProtocolCombo->addItem( i18nc( "@item:inlistbox", "Select..." ) );
+ layout->addRow( i18nc( "@label:listbox", "Protocol:" ), mProtocolCombo );
+
+ const QStringList protocols = IMProtocols::self()->protocols();
+ foreach ( const QString &protocol, protocols ) {
+ mProtocolCombo->addItem( KIcon( IMProtocols::self()->icon( protocol ) ),
+ IMProtocols::self()->name( protocol ),
+ protocol );
+ }
+
+ mNameEdit = new KLineEdit;
+ layout->addRow( i18nc( "@label:textbox", "Address:" ), mNameEdit );
+
+ connect( mProtocolCombo, SIGNAL(currentIndexChanged(int)), SLOT(slotUpdateButtons()) );
+ connect( mNameEdit, SIGNAL(textChanged(const QString &)), SLOT(slotUpdateButtons()) );
+
+ slotUpdateButtons();
+}
+
+void IMItemDialog::setAddress( const IMAddress &address )
+{
+ mProtocolCombo->setCurrentIndex( IMProtocols::self()->protocols().indexOf( address.protocol()) + 1 );
+ mNameEdit->setText( address.name() );
+ slotUpdateButtons();
+}
+
+IMAddress IMItemDialog::address() const
+{
+ return IMAddress( mProtocolCombo->itemData( mProtocolCombo->currentIndex() ).toString(),
+ mNameEdit->text(), false );
+}
+
+
+void IMItemDialog::slotUpdateButtons()
+{
+ enableButtonOk( mProtocolCombo->currentIndex()>0 && !mNameEdit->text().isEmpty() );
+}
+
+#include "imitemdialog.moc"
diff --git a/akonadi/contact/editor/im/imeditordialog.h b/akonadi/contact/editor/im/imitemdialog.h
similarity index 62%
copy from akonadi/contact/editor/im/imeditordialog.h
copy to akonadi/contact/editor/im/imitemdialog.h
index 8bf69ea..7d9dcda 100644
--- a/akonadi/contact/editor/im/imeditordialog.h
+++ b/akonadi/contact/editor/im/imitemdialog.h
@@ -1,7 +1,7 @@
/*
-IM address editor widget for KDE PIM
+IM address item editor widget for KDE PIM
-Copyright 2004,2010 Will Stephenson <wstephenson at kde.org>
+Copyright 2012 Jonathan Marten <jjm at keelhaul.me.uk>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -20,40 +20,33 @@ You should have received a copy of the GNU Lesser General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef IMEDITORDIALOG_H
-#define IMEDITORDIALOG_H
+#ifndef IMITEMDIALOG_H
+#define IMITEMDIALOG_H
#include <kdialog.h>
#include "immodel.h"
-class QPushButton;
-class QTreeView;
+class QComboBox;
+class KLineEdit;
-class IMEditorDialog : public KDialog
+class IMItemDialog : public KDialog
{
Q_OBJECT
public:
- IMEditorDialog( QWidget *parent );
- ~IMEditorDialog() {}
+ IMItemDialog( QWidget *parent );
+ ~IMItemDialog() {}
- void setAddresses( const IMAddress::List &addresses );
- IMAddress::List addresses() const;
+ void setAddress(const IMAddress &address);
+ IMAddress address() const;
private Q_SLOTS:
- void slotAdd();
- void slotRemove();
- void slotSetStandard();
void slotUpdateButtons();
private:
- QTreeView *mView;
- QPushButton *mAddButton;
- QPushButton *mRemoveButton;
- QPushButton *mStandardButton;
-
- IMModel *mModel;
+ QComboBox *mProtocolCombo;
+ KLineEdit *mNameEdit;
};
#endif
More information about the kde-doc-english
mailing list