• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

kopete/kopete

  • sources
  • kde-4.14
  • kdenetwork
  • kopete
  • kopete
  • statusmenu
kopetestatusrootaction.cpp
Go to the documentation of this file.
1 /*
2  kopetestatusrootaction.cpp - Kopete Status Root Action
3 
4  Copyright (c) 2008 by Roman Jarosz <kedgedev@centrum.cz>
5  Kopete (c) 2008 by the Kopete developers <kopete-devel@kde.org>
6 
7  *************************************************************************
8  * *
9  * This library is free software; you can redistribute it and/or *
10  * modify it under the terms of the GNU Lesser General Public *
11  * License as published by the Free Software Foundation; either *
12  * version 2 of the License, or (at your option) any later version. *
13  * *
14  *************************************************************************
15 */
16 #include "kopetestatusrootaction.h"
17 
18 #include <KMenu>
19 #include <KCMultiDialog>
20 
21 #include <kopeteonlinestatusmanager.h>
22 #include <kopeteaccount.h>
23 #include <kopetecontact.h>
24 #include <kopeteuiglobal.h>
25 #include <kopetestatusmanager.h>
26 #include <kopetestatusitems.h>
27 #include <kopetestatussettings.h>
28 
29 #include "kopetestatusgroupaction.h"
30 #include "kopetestatusaction.h"
31 #include "kopeteonlinestatusaction.h"
32 #include "kopetestatuseditaction.h"
33 
34 
35 namespace Kopete {
36 
37 class StatusRootAction::Private
38 {
39 public:
40  Private() : group(0), menu(0), account(0), statusDialog(0),
41  statusSeparator(0), insertBefore(0)
42  {}
43 
44  Status::StatusGroup *group;
45  KActionMenu* menu;
46  Filter filter;
47  QMap<Status::StatusItem *, QAction* > childMap;
48 
49  OnlineStatus onlineStatus;
50  Account *account;
51  QPointer<Kopete::UI::StatusEditDialog> statusDialog;
52  QAction *statusSeparator;
53  QAction *insertBefore;
54 };
55 
56 StatusRootAction::StatusRootAction( KActionMenu* menu )
57  : QObject( menu ), d(new Private())
58 {
59  d->menu = menu;
60  d->filter = UseCategory;
61  d->account = 0;
62 
63  init();
64 }
65 
66 StatusRootAction::StatusRootAction( KActionMenu* menu, Filter filter, Account *account,
67  const OnlineStatus &onlineStatus, QAction *before )
68  : QObject( menu ), d(new Private())
69 {
70  d->menu = menu;
71  d->insertBefore = before;
72  d->filter = filter;
73 
74  d->onlineStatus = onlineStatus;
75  d->account = account;
76 
77  init();
78 }
79 
80 void StatusRootAction::createAccountStatusActions( Account *account , KActionMenu *parent, QAction * before )
81 {
82  Kopete::StatusRootAction::Filter statusFilter = Kopete::StatusRootAction::UseCategory;
83  switch( Kopete::StatusSettings::self()->protocolStatusMenuType() )
84  {
85  case Kopete::StatusSettings::EnumProtocolStatusMenuType::StatusesNotFiltered:
86  statusFilter = Kopete::StatusRootAction::UseCategory;
87  break;
88  case Kopete::StatusSettings::EnumProtocolStatusMenuType::StatusesWithSameCategory:
89  statusFilter = Kopete::StatusRootAction::UseStatusAndCategory;
90  break;
91  case Kopete::StatusSettings::EnumProtocolStatusMenuType::UseParentStatusCategory:
92  statusFilter = Kopete::StatusRootAction::UseStatus;
93  break;
94  };
95 
96  if ( statusFilter == Kopete::StatusRootAction::UseCategory )
97  {
98  new StatusRootAction( parent, statusFilter, account, Kopete::OnlineStatus(), before );
99  }
100  else
101  {
102  OnlineStatusManager *osm = OnlineStatusManager::self();
103  QList< OnlineStatus > statusList = osm->registeredStatusList( account->protocol() );
104  QList< OnlineStatus >::Iterator it = statusList.end();
105  while ( it != statusList.begin() )
106  {
107  --it;
108 
109  if ( (*it).options() & OnlineStatusManager::HideFromMenu )
110  continue;
111 
112  OnlineStatus status = (*it);
113  KAction *action;
114 
115  // Any existing actions owned by the account are reused by recovering them
116  // from the parent's child list.
117  // The description of the onlinestatus is used as the qobject name
118  // This is safe as long as OnlineStatus are immutable
119  QByteArray actionName = status.description().toAscii();
120  if ( !( action = account->findChild<KAction*>( actionName ) ) )
121  {
122  if( status.options() & OnlineStatusManager::HasStatusMessage )
123  {
124  KActionMenu *actionMenu = new KActionMenu( KIcon(status.iconFor(account)), status.caption(), 0 );
125  action = actionMenu;
126 
127  // Will be automatically deleted when the actionMenu is deleted.
128  new StatusRootAction( actionMenu, statusFilter, account, status );
129  }
130  else
131  {
132  action = new OnlineStatusAction( status, status.caption(), status.iconFor(account), account );
133  connect(action, SIGNAL(activated(Kopete::OnlineStatus)) ,
134  account, SLOT(setOnlineStatus(Kopete::OnlineStatus)));
135  }
136  action->setObjectName( actionName ); // for the lookup by name above
137  }
138 
139  if( status.options() & OnlineStatusManager::DisabledIfOffline )
140  action->setEnabled( account->isConnected() );
141 
142  if(parent)
143  parent->insertAction( before, action );
144 
145  }
146  }
147 }
148 
149 void StatusRootAction::init()
150 {
151  Kopete::StatusManager *statusManager = Kopete::StatusManager::self();
152  connect( statusManager, SIGNAL(changed()), this, SLOT(rootChanged()) );
153  d->group = statusManager->getRootGroup();
154 
155  connect( d->group, SIGNAL(childRemoved(Kopete::Status::StatusItem*)),
156  this, SLOT(childRemoved(Kopete::Status::StatusItem*)) );
157  connect( d->group, SIGNAL(childInserted(int,Kopete::Status::StatusItem*)),
158  this, SLOT(childInserted(int,Kopete::Status::StatusItem*)) );
159 
160  foreach( Kopete::Status::StatusItem* child, d->group->childList() )
161  insertChild( d->insertBefore, child );
162 
163  d->statusSeparator = d->menu->insertSeparator( d->insertBefore );
164 
165  QAction *statusAction = new QAction( i18n( "Edit Message..." ), this );
166  connect (statusAction, SIGNAL(triggered(bool)), this, SLOT(showEditStatusDialog()) );
167  d->menu->insertAction( d->insertBefore, statusAction );
168 
169  QAction *action = new QAction( i18n("Edit Statuses..."), this );
170  connect( action, SIGNAL(triggered(bool)), this, SLOT(editStatuses()) );
171  d->menu->insertAction( d->insertBefore, action );
172 }
173 
174 void StatusRootAction::showEditStatusDialog()
175 {
176  if ( d->statusDialog ) {
177  d->statusDialog->activateWindow();
178  return;
179  }
180  d->statusDialog = new Kopete::UI::StatusEditDialog( Kopete::UI::Global::mainWidget() );
181  connect( d->statusDialog, SIGNAL(finished(int)), SLOT(editStatusDialogFinished(int)) );
182 
183  if ( d->account ) {
184  d->statusDialog->setStatusMessage( d->account->myself()->statusMessage() );
185  } else {
186  emit updateMessage( this );
187  }
188 
189  d->statusDialog->exec();
190 }
191 
192 void StatusRootAction::editStatusDialogFinished(int code)
193 {
194  if (code == QDialog::Accepted ) {
195  setStatusMessage( d->statusDialog->statusMessage() );
196  }
197  d->statusDialog->deleteLater();
198 }
199 
200 void StatusRootAction::editStatuses()
201 {
202  KCMultiDialog *kcm = new KCMultiDialog( Kopete::UI::Global::mainWidget() );
203  kcm->setFaceType( KCMultiDialog::Plain );
204  kcm->setPlainCaption( i18n( "Configure Statuses" ) );
205  kcm->addModule( "kopete_statusconfig" );
206  kcm->exec();
207 }
208 
209 StatusRootAction::~StatusRootAction()
210 {
211  delete d;
212 }
213 
214 StatusRootAction::Filter StatusRootAction::filter() const
215 {
216  return d->filter;
217 }
218 
219 int StatusRootAction::category() const
220 {
221  return d->onlineStatus.categories();
222 }
223 
224 OnlineStatus StatusRootAction::onlineStatus() const
225 {
226  return d->onlineStatus;
227 }
228 
229 Account *StatusRootAction::account() const
230 {
231  return d->account;
232 }
233 
234 void StatusRootAction::setCurrentMessage( const Kopete::StatusMessage &statusMessage )
235 {
236  if ( d->statusDialog )
237  d->statusDialog->setStatusMessage( statusMessage );
238 }
239 
240 void StatusRootAction::childInserted( int i, Kopete::Status::StatusItem* child )
241 {
242  Status::StatusItem* before = d->group->child( i + 1 );
243  if ( before )
244  insertChild( d->childMap.value( before, 0 ), child );
245  else
246  insertChild( 0, child );
247 }
248 
249 void StatusRootAction::insertChild( QAction * before, Status::StatusItem* child )
250 {
251  if ( child->isGroup() )
252  {
253  Kopete::Status::StatusGroup *group = qobject_cast<Kopete::Status::StatusGroup*>(child);
254  StatusGroupAction *groupAction = new StatusGroupAction( group, this, this );
255  if ( groupAction->childCount() == 0 )
256  {
257  delete groupAction;
258  return;
259  }
260 
261  d->childMap.insert( group, groupAction );
262  d->menu->insertAction( before, groupAction );
263  }
264  else
265  {
266  if ( d->filter == UseStatusAndCategory && child->category() != 0 &&
267  (child->category() & d->onlineStatus.categories()) == 0 )
268  return;
269 
270  Kopete::Status::Status* status = qobject_cast<Kopete::Status::Status*>(child);
271  StatusAction *action = new StatusAction( status, this, this );
272  d->childMap.insert( status, action );
273  d->menu->insertAction( before, action );
274  }
275 }
276 
277 void StatusRootAction::childRemoved( Kopete::Status::StatusItem* item )
278 {
279  QAction *action = d->childMap.value( item );
280  d->menu->removeAction( action );
281  d->childMap.remove( item );
282  delete action;
283 }
284 
285 void StatusRootAction::rootChanged()
286 {
287  QMap<Status::StatusItem*, QAction* >::const_iterator it = d->childMap.constBegin();
288  while ( it != d->childMap.constEnd() )
289  {
290  d->menu->removeAction( it.value() );
291  delete it.value();
292  ++it;
293  }
294  d->childMap.clear();
295 
296  Kopete::StatusManager *statusManager = Kopete::StatusManager::self();
297  d->group = statusManager->getRootGroup();
298 
299  connect( d->group, SIGNAL(childRemoved(Kopete::Status::StatusItem*)),
300  this, SLOT(childRemoved(Kopete::Status::StatusItem*)) );
301  connect( d->group, SIGNAL(childInserted(int,Kopete::Status::StatusItem*)),
302  this, SLOT(childInserted(int,Kopete::Status::StatusItem*)) );
303 
304  foreach( Kopete::Status::StatusItem* child, d->group->childList() )
305  insertChild( d->statusSeparator, child );
306 }
307 
308 void StatusRootAction::setStatusMessage( const Kopete::StatusMessage &statusMessage )
309 {
310  if ( d->account )
311  { // Set status for this account only
312  d->account->setOnlineStatus( d->account->myself()->onlineStatus(), statusMessage, Kopete::Account::KeepSpecialFlags );
313  }
314  else
315  { // Set global status
316  emit changeMessage( statusMessage );
317  }
318 }
319 
320 void StatusRootAction::changeStatus( const Kopete::Status::Status* status )
321 {
322  Kopete::StatusMessage statusMessage;
323  statusMessage.setTitle( status->title() );
324  statusMessage.setMessage( status->message() );
325 
326  if ( d->account )
327  { // Set status for this account only
328  if ( d->filter == UseCategory )
329  {
330  if ( status->category() != 0x00 )
331  {
332  OnlineStatusManager *osm = OnlineStatusManager::self();
333  Kopete::OnlineStatus oStatus = osm->onlineStatus( d->account->protocol(), status->category() );
334  d->account->setOnlineStatus( oStatus, statusMessage, Kopete::Account::KeepSpecialFlags );
335  }
336  else
337  {
338  setStatusMessage( statusMessage );
339  }
340  }
341  else
342  {
343  d->account->setOnlineStatus( d->onlineStatus, statusMessage, Kopete::Account::KeepSpecialFlags );
344  }
345  }
346  else
347  { // Set global status
348  if ( status->category() != 0x00 )
349  emit changeStatus( status->category(), statusMessage );
350  else
351  setStatusMessage( statusMessage );
352  }
353 }
354 
355 }
356 
357 #include "kopetestatusrootaction.moc"
QObject::child
QObject * child(const char *objName, const char *inheritsClass, bool recursiveSearch) const
QByteArray
kopetestatuseditaction.h
QMap< Status::StatusItem *, QAction * >
QPointer< Kopete::UI::StatusEditDialog >
Kopete::StatusRootAction::Filter
Filter
Definition: kopetestatusrootaction.h:47
Kopete::UI::StatusEditDialog
Definition: kopetestatuseditaction.h:108
Kopete::OnlineStatusAction
Definition: kopeteonlinestatusaction.h:30
Kopete::StatusRootAction::UseStatusAndCategory
Definition: kopetestatusrootaction.h:47
Kopete::StatusRootAction::setCurrentMessage
void setCurrentMessage(const Kopete::StatusMessage &statusMessage)
Set current status message.
Definition: kopetestatusrootaction.cpp:234
Kopete::StatusRootAction::changeStatus
void changeStatus(uint category, const Kopete::StatusMessage &statusMessage)
Status category and message change request.
kopetestatusrootaction.h
QObject
Kopete::StatusRootAction::category
int category() const
Returns default category.
Definition: kopetestatusrootaction.cpp:219
Kopete::StatusRootAction::createAccountStatusActions
static void createAccountStatusActions(Account *account, KActionMenu *parent, QAction *before=0)
insert "setStatus" actions from the given account to the specified actionMenu.
Definition: kopetestatusrootaction.cpp:80
Kopete::StatusRootAction::UseStatus
Definition: kopetestatusrootaction.h:47
QList
Kopete::StatusRootAction::updateMessage
void updateMessage(Kopete::StatusRootAction *statusRootAction)
Update status message for this action.
kopetestatusaction.h
Kopete::StatusRootAction::StatusRootAction
StatusRootAction(KActionMenu *menu)
StatusRootAction constructor.
Definition: kopetestatusrootaction.cpp:56
QList::end
iterator end()
KActionMenu
QAction
KAction
Kopete::StatusRootAction::UseCategory
Definition: kopetestatusrootaction.h:47
Kopete::StatusRootAction::filter
StatusRootAction::Filter filter() const
Returns menu filter used for filtering the status actions.
Definition: kopetestatusrootaction.cpp:214
kopeteonlinestatusaction.h
Kopete::StatusRootAction::onlineStatus
OnlineStatus onlineStatus() const
Returns default online status.
Definition: kopetestatusrootaction.cpp:224
Kopete::StatusRootAction::account
Account * account() const
Get the account this root action was created for.
Definition: kopetestatusrootaction.cpp:229
Kopete::StatusRootAction::~StatusRootAction
~StatusRootAction()
Definition: kopetestatusrootaction.cpp:209
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Kopete::StatusRootAction::changeMessage
void changeMessage(const Kopete::StatusMessage &statusMessage)
Status message change request.
QList::begin
iterator begin()
kopetestatusgroupaction.h
QMap::value
const T value(const Key &key) const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:29:08 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kopete/kopete

Skip menu "kopete/kopete"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal