19 #include <KCMultiDialog>
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>
37 class StatusRootAction::Private
40 Private() : group(0), menu(0),
account(0), statusDialog(0),
41 statusSeparator(0), insertBefore(0)
44 Status::StatusGroup *group;
57 :
QObject( menu ), d(new Private())
67 const OnlineStatus &onlineStatus,
QAction *before )
68 :
QObject( menu ), d(new Private())
71 d->insertBefore = before;
83 switch( Kopete::StatusSettings::self()->protocolStatusMenuType() )
85 case Kopete::StatusSettings::EnumProtocolStatusMenuType::StatusesNotFiltered:
88 case Kopete::StatusSettings::EnumProtocolStatusMenuType::StatusesWithSameCategory:
91 case Kopete::StatusSettings::EnumProtocolStatusMenuType::UseParentStatusCategory:
98 new StatusRootAction( parent, statusFilter, account, Kopete::OnlineStatus(), before );
102 OnlineStatusManager *osm = OnlineStatusManager::self();
105 while ( it != statusList.
begin() )
109 if ( (*it).options() & OnlineStatusManager::HideFromMenu )
112 OnlineStatus status = (*it);
119 QByteArray actionName = status.description().toAscii();
120 if ( !( action = account->findChild<
KAction*>( actionName ) ) )
122 if( status.options() & OnlineStatusManager::HasStatusMessage )
133 connect(action, SIGNAL(activated(Kopete::OnlineStatus)) ,
134 account, SLOT(setOnlineStatus(Kopete::OnlineStatus)));
136 action->setObjectName( actionName );
139 if( status.options() & OnlineStatusManager::DisabledIfOffline )
140 action->setEnabled( account->isConnected() );
143 parent->insertAction( before, action );
149 void StatusRootAction::init()
151 Kopete::StatusManager *statusManager = Kopete::StatusManager::self();
152 connect( statusManager, SIGNAL(changed()),
this, SLOT(rootChanged()) );
153 d->group = statusManager->getRootGroup();
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*)) );
160 foreach( Kopete::Status::StatusItem*
child, d->group->childList() )
161 insertChild( d->insertBefore, child );
163 d->statusSeparator = d->menu->insertSeparator( d->insertBefore );
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 );
170 connect( action, SIGNAL(triggered(
bool)),
this, SLOT(editStatuses()) );
171 d->menu->insertAction( d->insertBefore, action );
174 void StatusRootAction::showEditStatusDialog()
176 if ( d->statusDialog ) {
177 d->statusDialog->activateWindow();
181 connect( d->statusDialog, SIGNAL(finished(
int)), SLOT(editStatusDialogFinished(
int)) );
184 d->statusDialog->setStatusMessage( d->account->myself()->statusMessage() );
189 d->statusDialog->exec();
192 void StatusRootAction::editStatusDialogFinished(
int code)
194 if (code == QDialog::Accepted ) {
195 setStatusMessage( d->statusDialog->statusMessage() );
197 d->statusDialog->deleteLater();
200 void StatusRootAction::editStatuses()
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" );
221 return d->onlineStatus.categories();
226 return d->onlineStatus;
236 if ( d->statusDialog )
237 d->statusDialog->setStatusMessage( statusMessage );
240 void StatusRootAction::childInserted(
int i, Kopete::Status::StatusItem* child )
242 Status::StatusItem* before = d->group->child( i + 1 );
244 insertChild( d->childMap.value( before, 0 ),
child );
246 insertChild( 0, child );
249 void StatusRootAction::insertChild(
QAction * before, Status::StatusItem* child )
251 if ( child->isGroup() )
253 Kopete::Status::StatusGroup *group = qobject_cast<Kopete::Status::StatusGroup*>(
child);
254 StatusGroupAction *groupAction =
new StatusGroupAction( group,
this,
this );
255 if ( groupAction->childCount() == 0 )
261 d->childMap.insert( group, groupAction );
262 d->menu->insertAction( before, groupAction );
267 (child->category() & d->onlineStatus.categories()) == 0 )
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 );
277 void StatusRootAction::childRemoved( Kopete::Status::StatusItem* item )
279 QAction *action = d->childMap.value( item );
280 d->menu->removeAction( action );
281 d->childMap.remove( item );
285 void StatusRootAction::rootChanged()
288 while ( it != d->childMap.constEnd() )
290 d->menu->removeAction( it.
value() );
296 Kopete::StatusManager *statusManager = Kopete::StatusManager::self();
297 d->group = statusManager->getRootGroup();
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*)) );
304 foreach( Kopete::Status::StatusItem* child, d->group->childList() )
305 insertChild( d->statusSeparator, child );
308 void StatusRootAction::setStatusMessage(
const Kopete::StatusMessage &statusMessage )
312 d->account->setOnlineStatus( d->account->myself()->onlineStatus(), statusMessage, Kopete::Account::KeepSpecialFlags );
322 Kopete::StatusMessage statusMessage;
323 statusMessage.setTitle( status->title() );
324 statusMessage.setMessage( status->message() );
330 if ( status->category() != 0x00 )
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 );
338 setStatusMessage( statusMessage );
343 d->account->setOnlineStatus( d->onlineStatus, statusMessage, Kopete::Account::KeepSpecialFlags );
348 if ( status->category() != 0x00 )
351 setStatusMessage( statusMessage );
357 #include "kopetestatusrootaction.moc"
QObject * child(const char *objName, const char *inheritsClass, bool recursiveSearch) const
void setCurrentMessage(const Kopete::StatusMessage &statusMessage)
Set current status message.
void changeStatus(uint category, const Kopete::StatusMessage &statusMessage)
Status category and message change request.
int category() const
Returns default category.
static void createAccountStatusActions(Account *account, KActionMenu *parent, QAction *before=0)
insert "setStatus" actions from the given account to the specified actionMenu.
void updateMessage(Kopete::StatusRootAction *statusRootAction)
Update status message for this action.
StatusRootAction(KActionMenu *menu)
StatusRootAction constructor.
StatusRootAction::Filter filter() const
Returns menu filter used for filtering the status actions.
OnlineStatus onlineStatus() const
Returns default online status.
Account * account() const
Get the account this root action was created for.
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void changeMessage(const Kopete::StatusMessage &statusMessage)
Status message change request.
const T value(const Key &key) const