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

Reply via email to