Hi, As I mentioned last week, here is a patch to turn Kopete status editor menu into a dialog.
Since the patch is quite large, here is a birds-eye view of what it does: - Change StatusEditWidget to use a KDialogButtonBox for its buttons - Move more control from StatusEditAction - Introduce a StatusEditDialog class, which users StatusEditWidget in a way similar to StatusEditAction, but adds a "Cancel" button to the KDialogButtonBox - Modifies StatusRootAction to use StatusEditDialog instead of StatusEditAction The patch is against KDE 4.4.0, but should apply to trunk I guess. I followed Markus advice and haven't touched the strings yet, as I plan to get this patch into Kubuntu 10.04. When committed to trunk, I'll adjust the "Change Message" menu item to "Change Message...". What do you think of it? Aurélien
diff --git a/kopete/kopete/statusmenu/kopetestatuseditaction.cpp b/kopete/kopete/statusmenu/kopetestatuseditaction.cpp index 8467376..b420061 100644 --- a/kopete/kopete/statusmenu/kopetestatuseditaction.cpp +++ b/kopete/kopete/statusmenu/kopetestatuseditaction.cpp @@ -29,41 +29,73 @@ namespace Kopete namespace UI { -class StatusEditWidget : public QWidget +StatusEditWidget::StatusEditWidget( QWidget *parent ) +: QWidget( parent ) +, ui( new Ui::KopeteStatusEditWidget ) { -public: - StatusEditWidget( QWidget *parent = 0 ) : QWidget( parent ) - { - ui.setupUi( this ); + ui->setupUi( this ); - ui.statusTitle->setClearButtonShown( true ); - ui.setButton->setGuiItem( KStandardGuiItem::Ok ); - ui.clearButton->setGuiItem( KGuiItem( i18n( "C&lear" ), "edit-clear" ) ); + ui->statusTitle->setClearButtonShown( true ); + ui->buttonBox->addButton( KGuiItem( i18n( "C&lear" ), "edit-clear" ), QDialogButtonBox::DestructiveRole, this, SLOT(clearClicked()) ); - setFocusPolicy( Qt::StrongFocus ); - setFocusProxy( ui.statusTitle ); - } + setFocusPolicy( Qt::StrongFocus ); + setFocusProxy( ui->statusTitle ); + + connect( ui->buttonBox, SIGNAL(accepted()), this, SLOT(changeClicked()) ); +} + +StatusEditWidget::~StatusEditWidget() +{ + delete ui; +} -protected: - // Prevents menu closing on widget click - virtual void mouseReleaseEvent( QMouseEvent * ) {} +KDialogButtonBox *StatusEditWidget::buttonBox() const +{ + return ui->buttonBox; +} + +Kopete::StatusMessage StatusEditWidget::statusMessage() const +{ + Kopete::StatusMessage statusMessage; + statusMessage.setTitle( ui->statusTitle->text() ); + statusMessage.setMessage( ui->statusMessage->toPlainText() ); + return statusMessage; +} + +void StatusEditWidget::setStatusMessage( const Kopete::StatusMessage& statusMessage ) +{ + ui->statusTitle->setText( statusMessage.title() ); + ui->statusMessage->setPlainText( statusMessage.message() ); +} + +void StatusEditWidget::changeClicked() +{ + emit statusChanged( statusMessage() ); +} + +void StatusEditWidget::clearClicked() +{ + setStatusMessage( Kopete::StatusMessage() ); + emit statusChanged( statusMessage() ); +} - virtual void keyPressEvent( QKeyEvent* event ) +// FIXME: This should probably be in the action, implemented as an event-filter +// Prevents menu closing on widget click +void StatusEditWidget::mouseReleaseEvent( QMouseEvent * ) +{} + +void StatusEditWidget::keyPressEvent( QKeyEvent* event ) +{ + // Change status on enter key press + if ( event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter ) { - // Change status on enter key press - if ( event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter ) - { - ui.setButton->click(); - event->accept(); - return; - } - - QWidget::keyPressEvent( event ); + changeClicked(); + event->accept(); + return; } -public: - Ui::KopeteStatusEditWidget ui; -}; + QWidget::keyPressEvent( event ); +} StatusEditAction::StatusEditAction( QObject *parent ) : QWidgetAction( parent ) @@ -71,34 +103,18 @@ StatusEditAction::StatusEditAction( QObject *parent ) mStatusEditWidget = new StatusEditWidget(); setDefaultWidget( mStatusEditWidget ); - connect( mStatusEditWidget->ui.setButton, SIGNAL(clicked()), this, SLOT(changeClicked()) ); - connect( mStatusEditWidget->ui.clearButton, SIGNAL(clicked()), this, SLOT(clearClicked()) ); + connect(mStatusEditWidget, SIGNAL( statusChanged( const Kopete::StatusMessage& ) ), SLOT( hideMenu() ) ); + connect(mStatusEditWidget, SIGNAL( statusChanged( const Kopete::StatusMessage& ) ), SIGNAL( statusChanged( const Kopete::StatusMessage& ) ) ); } Kopete::StatusMessage StatusEditAction::statusMessage() const { - Kopete::StatusMessage statusMessage; - statusMessage.setTitle( mStatusEditWidget->ui.statusTitle->text() ); - statusMessage.setMessage( mStatusEditWidget->ui.statusMessage->toPlainText() ); - return statusMessage; + return mStatusEditWidget->statusMessage(); } void StatusEditAction::setStatusMessage( const Kopete::StatusMessage& statusMessage ) { - mStatusEditWidget->ui.statusTitle->setText( statusMessage.title() ); - mStatusEditWidget->ui.statusMessage->setPlainText( statusMessage.message() ); -} - -void StatusEditAction::changeClicked() -{ - emit statusChanged( statusMessage() ); - hideMenu(); -} - -void StatusEditAction::clearClicked() -{ - emit statusChanged( Kopete::StatusMessage() ); - hideMenu(); + mStatusEditWidget->setStatusMessage( statusMessage ); } void StatusEditAction::hideMenu() @@ -113,6 +129,33 @@ void StatusEditAction::hideMenu() } } +StatusEditDialog::StatusEditDialog( QWidget *parent ) +: KDialog(parent) +, mStatusEditWidget( new StatusEditWidget ) +{ + setMainWidget( mStatusEditWidget ); + setCaption( i18n("Change Message") ); + + // We use the buttonbox from the edit widget + setButtons(KDialog::None); + KDialogButtonBox *buttonBox = mStatusEditWidget->buttonBox(); + buttonBox->setStandardButtons( buttonBox->standardButtons() | QDialogButtonBox::Cancel ); + connect(buttonBox, SIGNAL( rejected() ), SLOT( reject() ) ); + + connect(mStatusEditWidget, SIGNAL( statusChanged( const Kopete::StatusMessage& ) ), SLOT( accept() ) ); +} + +Kopete::StatusMessage StatusEditDialog::statusMessage() const +{ + return mStatusEditWidget->statusMessage(); +} + +void StatusEditDialog::setStatusMessage( const Kopete::StatusMessage& statusMessage ) +{ + mStatusEditWidget->setStatusMessage( statusMessage ); +} + + } } diff --git a/kopete/kopete/statusmenu/kopetestatuseditaction.h b/kopete/kopete/statusmenu/kopetestatuseditaction.h index 8253164..54bd3af 100644 --- a/kopete/kopete/statusmenu/kopetestatuseditaction.h +++ b/kopete/kopete/statusmenu/kopetestatuseditaction.h @@ -18,15 +18,59 @@ #include <QtGui/QWidgetAction> +#include <KDialog> + #include "kopete_export.h" +class KDialogButtonBox; + +namespace Ui { + class KopeteStatusEditWidget; +} + namespace Kopete { class StatusMessage; namespace UI { - class StatusEditWidget; + + class StatusEditWidget : public QWidget + { + Q_OBJECT + public: + StatusEditWidget( QWidget *parent = 0 ); + ~StatusEditWidget(); + + KDialogButtonBox *buttonBox() const; + + /** + * Returns Kopete::StatusMessage + **/ + Kopete::StatusMessage statusMessage() const; + + /** + * Set status message to @p statusMessage + **/ + void setStatusMessage( const Kopete::StatusMessage& statusMessage ); + + Q_SIGNALS: + /** + * This signal emitted after status message was changed + **/ + void statusChanged( const Kopete::StatusMessage& statusMessage ); + + protected: + virtual void mouseReleaseEvent( QMouseEvent * ); + virtual void keyPressEvent( QKeyEvent* event ); + + private Q_SLOTS: + void changeClicked(); + void clearClicked(); + + private: + Ui::KopeteStatusEditWidget* ui; + }; class KOPETE_STATUSMENU_EXPORT StatusEditAction: public QWidgetAction { @@ -55,15 +99,30 @@ namespace Kopete void statusChanged( const Kopete::StatusMessage& statusMessage ); private Q_SLOTS: - void changeClicked(); - void clearClicked(); - - private: void hideMenu(); + private: StatusEditWidget *mStatusEditWidget; }; + class StatusEditDialog : public KDialog + { + public: + StatusEditDialog( QWidget *parent = 0 ); + + /** + * Returns Kopete::StatusMessage + **/ + Kopete::StatusMessage statusMessage() const; + + /** + * Set status message to @p statusMessage + **/ + void setStatusMessage( const Kopete::StatusMessage& statusMessage ); + + private: + StatusEditWidget *mStatusEditWidget; + }; } } diff --git a/kopete/kopete/statusmenu/kopetestatuseditwidget_base.ui b/kopete/kopete/statusmenu/kopetestatuseditwidget_base.ui index 868c8ad..2e8c891 100644 --- a/kopete/kopete/statusmenu/kopetestatuseditwidget_base.ui +++ b/kopete/kopete/statusmenu/kopetestatuseditwidget_base.ui @@ -1,7 +1,8 @@ -<ui version="4.0" > +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> <class>KopeteStatusEditWidget</class> - <widget class="QWidget" name="KopeteStatusEditWidget" > - <property name="geometry" > + <widget class="QWidget" name="KopeteStatusEditWidget"> + <property name="geometry"> <rect> <x>0</x> <y>0</y> @@ -9,86 +10,59 @@ <height>228</height> </rect> </property> - <layout class="QVBoxLayout" > + <layout class="QVBoxLayout"> <item> - <widget class="QLabel" name="label" > - <property name="text" > + <widget class="QLabel" name="label"> + <property name="text"> <string>Title:</string> </property> - <property name="buddy" > + <property name="buddy"> <cstring>statusTitle</cstring> </property> </widget> </item> <item> - <widget class="KLineEdit" name="statusTitle" /> + <widget class="KLineEdit" name="statusTitle"/> </item> <item> - <widget class="QLabel" name="label_3" > - <property name="text" > + <widget class="QLabel" name="label_3"> + <property name="text"> <string>Message:</string> </property> - <property name="buddy" > + <property name="buddy"> <cstring>statusMessage</cstring> </property> </widget> </item> <item> - <widget class="QTextEdit" name="statusMessage" /> + <widget class="QTextEdit" name="statusMessage"/> </item> <item> - <widget class="Line" name="line" > - <property name="orientation" > + <widget class="Line" name="line"> + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> - <layout class="QHBoxLayout" > - <item> - <spacer> - <property name="orientation" > - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" > - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="KPushButton" name="setButton" > - <property name="text" > - <string>Set</string> - </property> - <property name="default" > - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="KPushButton" name="clearButton" > - <property name="text" > - <string>Clear</string> - </property> - </widget> - </item> - </layout> + <widget class="KDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Ok</set> + </property> + </widget> </item> </layout> </widget> <customwidgets> <customwidget> - <class>KPushButton</class> - <extends>QPushButton</extends> - <header location="global" >kpushbutton.h</header> + <class>KDialogButtonBox</class> + <extends>QDialogButtonBox</extends> + <header>kdialogbuttonbox.h</header> </customwidget> <customwidget> <class>KLineEdit</class> <extends>QLineEdit</extends> - <header location="global" >klineedit.h</header> + <header>klineedit.h</header> </customwidget> </customwidgets> <resources/> diff --git a/kopete/kopete/statusmenu/kopetestatusrootaction.cpp b/kopete/kopete/statusmenu/kopetestatusrootaction.cpp index 663a843..fd31cb2 100644 --- a/kopete/kopete/statusmenu/kopetestatusrootaction.cpp +++ b/kopete/kopete/statusmenu/kopetestatusrootaction.cpp @@ -37,7 +37,7 @@ namespace Kopete { class StatusRootAction::Private { public: - Private() : group(0), menu(0), account(0), statusAction(0), + Private() : group(0), menu(0), account(0), statusDialog(0), statusSeparator(0), insertBefore(0) {} @@ -48,7 +48,7 @@ public: OnlineStatus onlineStatus; Account *account; - Kopete::UI::StatusEditAction* statusAction; + QPointer<Kopete::UI::StatusEditDialog> statusDialog; QAction *statusSeparator; QAction *insertBefore; }; @@ -161,29 +161,40 @@ void StatusRootAction::init() insertChild( d->insertBefore, child ); d->statusSeparator = d->menu->insertSeparator( d->insertBefore ); - addToolsActions(); + + QAction *statusAction = new QAction( i18n( "Change Message" ), this ); + connect (statusAction, SIGNAL(triggered( bool )), this, SLOT(showEditStatusDialog()) ); + d->menu->insertAction( d->insertBefore, statusAction ); + + QAction *action = new QAction( i18n("Edit Statuses..."), this ); + connect( action, SIGNAL(triggered( bool )), this, SLOT(editStatuses()) ); + d->menu->insertAction( d->insertBefore, action ); } -void StatusRootAction::addToolsActions() +void StatusRootAction::showEditStatusDialog() { - if ( d->statusAction ) + if ( d->statusDialog ) { + d->statusDialog->activateWindow(); return; + } + d->statusDialog = new Kopete::UI::StatusEditDialog( Kopete::UI::Global::mainWidget() ); + connect( d->statusDialog, SIGNAL(finished(int)), SLOT(editStatusDialogFinished(int)) ); - KActionMenu *messageMenu = new KActionMenu( i18n( "Change Message" ), this ); - - d->statusAction = new Kopete::UI::StatusEditAction( this ); - - connect( d->statusAction, SIGNAL(statusChanged(const Kopete::StatusMessage&)), - this, SLOT(setStatusMessage(const Kopete::StatusMessage&)) ); - - connect( messageMenu->menu(), SIGNAL(aboutToShow()), this, SLOT(messageMenuAboutToShow()) ); + if ( d->account ) { + d->statusDialog->setStatusMessage( d->account->myself()->statusMessage() ); + } else { + emit updateMessage( this ); + } - messageMenu->addAction( d->statusAction ); - d->menu->insertAction( d->insertBefore, messageMenu ); + d->statusDialog->exec(); +} - QAction *action = new QAction( i18n("Edit Statuses..."), this ); - connect( action, SIGNAL(triggered( bool )), this, SLOT(editStatuses()) ); - d->menu->insertAction( d->insertBefore, action ); +void StatusRootAction::editStatusDialogFinished(int code) +{ + if (code == QDialog::Accepted ) { + setStatusMessage( d->statusDialog->statusMessage() ); + } + d->statusDialog->deleteLater(); } void StatusRootAction::editStatuses() @@ -222,8 +233,8 @@ Account *StatusRootAction::account() const void StatusRootAction::setCurrentMessage( const Kopete::StatusMessage &statusMessage ) { - if ( d->statusAction ) - d->statusAction->setStatusMessage( statusMessage ); + if ( d->statusDialog ) + d->statusDialog->setStatusMessage( statusMessage ); } void StatusRootAction::childInserted( int i, Kopete::Status::StatusItem* child ) @@ -294,14 +305,6 @@ void StatusRootAction::rootChanged() insertChild( d->statusSeparator, child ); } -void StatusRootAction::messageMenuAboutToShow() -{ - if ( d->account ) // Set status for this account only - d->statusAction->setStatusMessage( d->account->myself()->statusMessage() ); - else - emit updateMessage( this ); -} - void StatusRootAction::setStatusMessage( const Kopete::StatusMessage &statusMessage ) { if ( d->account ) diff --git a/kopete/kopete/statusmenu/kopetestatusrootaction.h b/kopete/kopete/statusmenu/kopetestatusrootaction.h index 835b5cb..3ebd07b 100644 --- a/kopete/kopete/statusmenu/kopetestatusrootaction.h +++ b/kopete/kopete/statusmenu/kopetestatusrootaction.h @@ -151,13 +151,13 @@ private Q_SLOTS: void childInserted( int i, Kopete::Status::StatusItem* child ); void childRemoved( Kopete::Status::StatusItem* child ); - void messageMenuAboutToShow(); void setStatusMessage( const Kopete::StatusMessage &statusMessage ); void editStatuses(); + void showEditStatusDialog(); + void editStatusDialogFinished(int); private: void init(); - void addToolsActions(); void insertChild( QAction * before, Status::StatusItem* child ); class Private;
_______________________________________________ kopete-devel mailing list kopete-devel@kde.org https://mail.kde.org/mailman/listinfo/kopete-devel