diff --git a/configuredialog.cpp b/configuredialog.cpp index eb28006b5..ebe4bb245 100644 --- a/configuredialog.cpp +++ b/configuredialog.cpp @@ -317,14 +317,14 @@ IdentityPage::IdentityPage( const KComponentData &instance, QWidget *parent, con hlay->setMargin( 0 ); mIdentityList = new IdentityListView( this ); - connect( mIdentityList, SIGNAL(selectionChanged()), + connect( mIdentityList, SIGNAL(itemSelectionChanged()), SLOT(slotIdentitySelectionChanged()) ); - connect( mIdentityList, SIGNAL(itemRenamed(Q3ListViewItem*,const QString&,int)), - SLOT(slotRenameIdentity(Q3ListViewItem*,const QString&,int)) ); - connect( mIdentityList, SIGNAL(doubleClicked(Q3ListViewItem*,const QPoint&,int)), + connect( mIdentityList, SIGNAL(rename(KMail::IdentityListViewItem*, const QString&)), + SLOT(slotRenameIdentity(KMail::IdentityListViewItem*, const QString&)) ); + connect( mIdentityList, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), SLOT(slotModifyIdentity()) ); - connect( mIdentityList, SIGNAL(contextMenu(K3ListView*,Q3ListViewItem*,const QPoint&)), - SLOT(slotContextMenu(K3ListView*,Q3ListViewItem*,const QPoint&)) ); + connect( mIdentityList, SIGNAL(contextMenu(KMail::IdentityListViewItem*, const QPoint&)), + SLOT(slotContextMenu(KMail::IdentityListViewItem*, const QPoint&)) ); // ### connect dragged(...), ... hlay->addWidget( mIdentityList, 1 ); @@ -371,10 +371,12 @@ void IdentityPage::load() mOldNumberOfIdentities = im->shadowIdentities().count(); // Fill the list: mIdentityList->clear(); - Q3ListViewItem * item = 0; + QTreeWidgetItem * item = 0; for ( KPIM::IdentityManager::Iterator it = im->modifyBegin() ; it != im->modifyEnd() ; ++it ) item = new IdentityListViewItem( mIdentityList, item, *it ); - mIdentityList->setSelected( mIdentityList->currentItem(), true ); + if (mIdentityList->currentItem()) { + mIdentityList->currentItem()->setSelected( true ); + } } void IdentityPage::save() { @@ -383,7 +385,7 @@ void IdentityPage::save() { kmkernel->identityManager()->sort(); kmkernel->identityManager()->commit(); - if( mOldNumberOfIdentities < 2 && mIdentityList->childCount() > 1 ) { + if( mOldNumberOfIdentities < 2 && mIdentityList->topLevelItemCount() > 1 ) { // have more than one identity, so better show the combo in the // composer now: KConfigGroup composer( KMKernel::config(), "Composer" ); @@ -392,7 +394,7 @@ void IdentityPage::save() { composer.writeEntry( "headers", showHeaders ); } // and now the reverse - if( mOldNumberOfIdentities > 1 && mIdentityList->childCount() < 2 ) { + if( mOldNumberOfIdentities > 1 && mIdentityList->topLevelItemCount() < 2 ) { // have only one identity, so remove the combo in the composer: KConfigGroup composer( KMKernel::config(), "Composer" ); int showHeaders = composer.readEntry( "headers", HDR_STANDARD ); @@ -435,12 +437,23 @@ void IdentityPage::slotNewIdentity() // Insert into listview: // KPIM::Identity & newIdent = im->modifyIdentityForName( identityName ); - Q3ListViewItem * item = mIdentityList->selectedItem(); - if ( item ) - item = item->itemAbove(); - mIdentityList->setSelected( new IdentityListViewItem( mIdentityList, - /*after*/ item, - newIdent ), true ); + QTreeWidgetItem * item = 0L; + if (mIdentityList->selectedItems().size() > 0) { + item = mIdentityList->selectedItems()[0]; + } + + QTreeWidgetItem * newItem = 0L; + if ( item ) { + newItem = new IdentityListViewItem( mIdentityList, mIdentityList->itemAbove(item), newIdent ); + } else { + newItem = new IdentityListViewItem( mIdentityList, newIdent ); + } + + mIdentityList->selectionModel()->clearSelection(); + if (newItem) { + newItem->setSelected( true ); + } + slotModifyIdentity(); } } @@ -448,8 +461,10 @@ void IdentityPage::slotNewIdentity() void IdentityPage::slotModifyIdentity() { assert( !mIdentityDialog ); - IdentityListViewItem * item = - dynamic_cast( mIdentityList->selectedItem() ); + IdentityListViewItem * item = 0L; + if (mIdentityList->selectedItems().size() > 0) { + item = dynamic_cast( mIdentityList->selectedItems()[0] ); + } if ( !item ) return; mIdentityDialog = new IdentityDialog( this ); @@ -474,8 +489,10 @@ void IdentityPage::slotRemoveIdentity() kFatal( im->shadowIdentities().count() < 2 ) << "Attempted to remove the last identity!" << endl; - IdentityListViewItem * item = - dynamic_cast( mIdentityList->selectedItem() ); + IdentityListViewItem * item = 0L; + if (mIdentityList->selectedItems().size() > 0) { + item = dynamic_cast( mIdentityList->selectedItems()[0] ); + } if ( !item ) return; QString msg = i18n("Do you really want to remove the identity named " @@ -484,7 +501,9 @@ void IdentityPage::slotRemoveIdentity() KGuiItem(i18n("&Remove"),"edit-delete") ) == KMessageBox::Continue ) if ( im->removeIdentity( item->identity().identityName() ) ) { delete item; - mIdentityList->setSelected( mIdentityList->currentItem(), true ); + if (mIdentityList->currentItem()) { + mIdentityList->currentItem()->setSelected( true ); + } refreshList(); } } @@ -492,21 +511,20 @@ void IdentityPage::slotRemoveIdentity() void IdentityPage::slotRenameIdentity() { assert( !mIdentityDialog ); - Q3ListViewItem * item = mIdentityList->selectedItem(); + QTreeWidgetItem * item = 0L; + + if (mIdentityList->selectedItems().size() > 0) { + item = mIdentityList->selectedItems()[0]; + } if ( !item ) return; - mIdentityList->rename( item, 0 ); + mIdentityList->editItem( item ); } -void IdentityPage::slotRenameIdentity( Q3ListViewItem * i, - const QString & s, int col ) { - assert( col == 0 ); - Q_UNUSED( col ); - - IdentityListViewItem * item = dynamic_cast( i ); +void IdentityPage::slotRenameIdentity( KMail::IdentityListViewItem *item , const QString& text ) { if ( !item ) return; - QString newName = s.trimmed(); + QString newName = text.trimmed(); if ( !newName.isEmpty() && !kmkernel->identityManager()->shadowIdentities().contains( newName ) ) { KPIM::Identity & ident = item->identity(); @@ -516,15 +534,12 @@ void IdentityPage::slotRenameIdentity( Q3ListViewItem * i, item->redisplay(); } -void IdentityPage::slotContextMenu( K3ListView *, Q3ListViewItem * i, - const QPoint & pos ) { - IdentityListViewItem * item = dynamic_cast( i ); - +void IdentityPage::slotContextMenu( IdentityListViewItem *item, const QPoint& pos ) { QMenu * menu = new QMenu( this ); menu->addAction( i18n("Add..."), this, SLOT(slotNewIdentity()) ); if ( item ) { menu->addAction( i18n("Modify..."), this, SLOT(slotModifyIdentity()) ); - if ( mIdentityList->childCount() > 1 ) + if ( mIdentityList->topLevelItemCount() > 1 ) menu->addAction( i18n("Remove"), this, SLOT(slotRemoveIdentity()) ); if ( !item->identity().isDefault() ) menu->addAction( i18n("Set as Default"), this, SLOT(slotSetAsDefault()) ); @@ -537,8 +552,10 @@ void IdentityPage::slotContextMenu( K3ListView *, Q3ListViewItem * i, void IdentityPage::slotSetAsDefault() { assert( !mIdentityDialog ); - IdentityListViewItem * item = - dynamic_cast( mIdentityList->selectedItem() ); + IdentityListViewItem * item = 0L; + if (mIdentityList->selectedItems().size() > 0) { + item = dynamic_cast( mIdentityList->selectedItems()[0] ); + } if ( !item ) return; KPIM::IdentityManager * im = kmkernel->identityManager(); @@ -547,21 +564,23 @@ void IdentityPage::slotSetAsDefault() { } void IdentityPage::refreshList() { - for ( Q3ListViewItemIterator it( mIdentityList ) ; it.current() ; ++it ) { - IdentityListViewItem * item = - dynamic_cast(it.current()); - if ( item ) + for (int i = 0; i < mIdentityList->topLevelItemCount(); ++i) { + IdentityListViewItem * item = dynamic_cast( mIdentityList->topLevelItem(i) ); + if (item) { item->redisplay(); + } } emit changed(true); } void IdentityPage::slotIdentitySelectionChanged() { - IdentityListViewItem *item = - dynamic_cast( mIdentityList->selectedItem() ); + IdentityListViewItem *item = 0L; + if (mIdentityList->selectedItems().size() > 0) { + item = dynamic_cast( mIdentityList->selectedItems()[0] ); + } - mRemoveButton->setEnabled( item && mIdentityList->childCount() > 1 ); + mRemoveButton->setEnabled( item && mIdentityList->topLevelItemCount() > 1 ); mModifyButton->setEnabled( item ); mRenameButton->setEnabled( item ); mSetAsDefaultButton->setEnabled( item && !item->identity().isDefault() ); diff --git a/configuredialog_p.h b/configuredialog_p.h index af6903dba..d491f781d 100644 --- a/configuredialog_p.h +++ b/configuredialog_p.h @@ -60,6 +60,7 @@ namespace Kpgp { namespace KMail { class IdentityDialog; class IdentityListView; + class IdentityListViewItem; class AccountComboBox; class FolderRequester; } @@ -303,8 +304,8 @@ private slots: void slotRenameIdentity(); /** connected to @p mIdentityList's renamed() signal. Validates the new name and sets it in the KPIM::IdentityManager */ - void slotRenameIdentity( Q3ListViewItem *, const QString &, int ); - void slotContextMenu( K3ListView*, Q3ListViewItem *, const QPoint & ); + void slotRenameIdentity( KMail::IdentityListViewItem*, const QString& ); + void slotContextMenu( KMail::IdentityListViewItem*, const QPoint& ); void slotSetAsDefault(); void slotIdentitySelectionChanged(); diff --git a/identitylistview.cpp b/identitylistview.cpp index 30e5d6f07..5c2080865 100644 --- a/identitylistview.cpp +++ b/identitylistview.cpp @@ -41,6 +41,7 @@ #include // i18n #include // SmallIcon +#include #include #include @@ -54,19 +55,19 @@ namespace KMail { // IdentityListViewItem::IdentityListViewItem( IdentityListView * parent, const KPIM::Identity & ident ) - : K3ListViewItem( parent ), mUOID( ident.uoid() ) { + : QTreeWidgetItem( parent ), mUOID( ident.uoid() ) { init( ident ); } - IdentityListViewItem::IdentityListViewItem( IdentityListView * parent, Q3ListViewItem * after, const KPIM::Identity & ident ) - : K3ListViewItem( parent, after ), mUOID( ident.uoid() ) { + IdentityListViewItem::IdentityListViewItem( IdentityListView * parent, QTreeWidgetItem * after, const KPIM::Identity & ident ) + : QTreeWidgetItem( parent, after ), mUOID( ident.uoid() ) { init( ident ); } KPIM::Identity & IdentityListViewItem::identity() const { KPIM::IdentityManager * im = kmkernel->identityManager(); assert( im ); - return im->modifyIdentityForUoid( uoid() ); + return im->modifyIdentityForUoid( mUOID ); } void IdentityListViewItem::setIdentity( const KPIM::Identity & ident ) { @@ -97,34 +98,67 @@ namespace KMail { // IdentityListView::IdentityListView( QWidget * parent ) - : K3ListView( parent ) + : QTreeWidget( parent ) { - setFullWidth( true ); setDragEnabled( true ); setAcceptDrops( true ); - setDropVisualizer( true ); - addColumn( i18n("Identity Name") ); - addColumn( i18n("Email Address") ); + setHeaderLabels( QStringList() << i18n("Identity Name") << i18n("Email Address") ); setRootIsDecorated( false ); - setRenameable( 0 ); - setItemsRenameable( true ); - // setShowToolTips( true ); - setItemsMovable( false ); + header()->setMovable( false ); setAllColumnsShowFocus( true ); - setSorting( -1 ); // disabled - setSelectionModeExt( Single ); // ### Extended would be nicer... + setSortingEnabled( false ); // disabled + setSelectionMode( SingleSelection ); // ### Extended would be nicer... + + setContextMenuPolicy( Qt::CustomContextMenu ); + connect( this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(slotCustomContextMenuRequested(const QPoint&)) ); + } + + void IdentityListView::editItem( QTreeWidgetItem *item, int column ) + { + if (column == 0 && item) { + IdentityListViewItem *lvItem = dynamic_cast( item ); + if (lvItem) { + KPIM::Identity& ident = lvItem->identity(); + if (ident.isDefault()) { + lvItem->setText( 0, ident.identityName() ); + } + } + + Qt::ItemFlags oldFlags = item->flags(); + item->setFlags( oldFlags | Qt::ItemIsEditable ); + QTreeWidget::editItem( item, 0 ); + item->setFlags( oldFlags ); + } } - void IdentityListView::rename( Q3ListViewItem * i, int col ) { - if ( col == 0 && isRenameable( col ) ) { - IdentityListViewItem * item = dynamic_cast( i ); - if ( item ) { - KPIM::Identity & ident = item->identity(); - if ( ident.isDefault() ) - item->setText( 0, ident.identityName() ); + void IdentityListView::commitData( QWidget *editor ) + { + kDebug() << "after editing" << endl; + + if (selectedItems().size() > 0) { + IdentityListViewItem *item = dynamic_cast( selectedItems()[0] ); + + QLineEdit *edit = dynamic_cast( editor ); + if (edit) { + QString text = edit->text(); + emit rename( item, text ); + } + } + } + + void IdentityListView::slotCustomContextMenuRequested( const QPoint& pos ) + { + kDebug() << "position: " << pos << endl; + QTreeWidgetItem * item = itemAt( pos ); + kDebug() << "item: " << item << endl; + if (item) { + IdentityListViewItem * lvItem = dynamic_cast( item ); + if (lvItem) { + emit contextMenu( lvItem, viewport()->mapToGlobal(pos) ); } + } else { + emit contextMenu( 0L, viewport()->mapToGlobal(pos) ); } - K3ListView::rename( i, col ); } bool IdentityListView::acceptDrag( QDropEvent * e ) const { diff --git a/identitylistview.h b/identitylistview.h index 33209bc9b..262542887 100644 --- a/identitylistview.h +++ b/identitylistview.h @@ -32,8 +32,9 @@ #ifndef __KMAIL_IDENTITYLIST_H__ #define __KMAIL_IDENTITYLIST_H__ -#include -//Added by qt3to4: +#include +#include +#include #include namespace KPIM { class Identity; } @@ -44,14 +45,14 @@ namespace KMail { class IdentityListView; - /** @short A QListViewItem for use in IdentityListView + /** @short A QWidgetTreeItem for use in IdentityListView @author Marc Mutz **/ - class IdentityListViewItem : public K3ListViewItem { + class IdentityListViewItem : public QTreeWidgetItem { public: IdentityListViewItem( IdentityListView * parent, const KPIM::Identity & ident ); - IdentityListViewItem( IdentityListView * parent, Q3ListViewItem * after, + IdentityListViewItem( IdentityListView * parent, QTreeWidgetItem * after, const KPIM::Identity & ident ); uint uoid() const { return mUOID; } @@ -68,14 +69,24 @@ namespace KMail { /** @short A listview for KPIM::Identity @author Marc Mutz **/ - class IdentityListView : public K3ListView { + class IdentityListView : public QTreeWidget { Q_OBJECT public: IdentityListView( QWidget * parent=0 ); virtual ~IdentityListView() {} + public: + void editItem( QTreeWidgetItem *item, int column = 0 ); + + protected slots: + void commitData( QWidget *editor ); + public slots: - void rename( Q3ListViewItem *, int ); + void slotCustomContextMenuRequested( const QPoint& ); + + signals: + void contextMenu( KMail::IdentityListViewItem*, const QPoint& ); + void rename( KMail::IdentityListViewItem*, const QString& ); protected: bool acceptDrag( QDropEvent * ) const;