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

kmail/src

  • kde-4.x
  • pim
  • kmail
  • src
kmsystemtray.cpp
Go to the documentation of this file.
1 //
2 /***************************************************************************
3  kmsystemtray.cpp - description
4  ------------------
5  begin : Fri Aug 31 22:38:44 EDT 2001
6  copyright : (C) 2001 by Ryan Breen
7  email : [email protected]
8 
9  Copyright (c) 2010-2019 Montel Laurent <[email protected]>
10  ***************************************************************************/
11 
12 /***************************************************************************
13  * *
14  * This program is free software; you can redistribute it and/or modify *
15  * it under the terms of the GNU General Public License as published by *
16  * the Free Software Foundation; either version 2 of the License, or *
17  * (at your option) any later version. *
18  * *
19  ***************************************************************************/
20 
21 #include "kmsystemtray.h"
22 #include "kmmainwidget.h"
23 #include "unityservicemanager.h"
24 #include "settings/kmailsettings.h"
25 #include "mailcommon/mailutil.h"
26 #include "MailCommon/MailKernel"
27 #include "MailCommon/FolderTreeView"
28 #include <AkonadiCore/NewMailNotifierAttribute>
29 
30 #include <kwindowsystem.h>
31 #include "kmail_debug.h"
32 #include <QMenu>
33 #include <KLocalizedString>
34 #include <QAction>
35 
36 #include "widgets/kactionmenutransport.h"
37 
38 using namespace MailCommon;
39 
51 using namespace KMail;
52 
53 KMSystemTray::KMSystemTray(QObject *parent)
54  : KStatusNotifierItem(parent)
55 {
56  qCDebug(KMAIL_LOG) << "Initting systray";
57  setToolTipTitle(i18n("KMail"));
58  setToolTipIconByName(QStringLiteral("kmail"));
59  setIconByName(QStringLiteral("kmail"));
60 
61  KMMainWidget *mainWidget = kmkernel->getKMMainWidget();
62  if (mainWidget) {
63  QWidget *mainWin = mainWidget->window();
64  if (mainWin) {
65  mDesktopOfMainWin = KWindowInfo(mainWin->winId(), NET::WMDesktop).desktop();
66  }
67  }
68 
69  connect(this, &KMSystemTray::activateRequested, this, &KMSystemTray::slotActivated);
70  connect(contextMenu(), &QMenu::aboutToShow,
71  this, &KMSystemTray::slotContextMenuAboutToShow);
72 }
73 
74 bool KMSystemTray::buildPopupMenu()
75 {
76  KMMainWidget *mainWidget = kmkernel->getKMMainWidget();
77  if (!mainWidget || kmkernel->shuttingDown()) {
78  return false;
79  }
80 
81  if (!contextMenu()) {
82  setContextMenu(new QMenu());
83  }
84 
85  contextMenu()->clear();
86  contextMenu()->setIcon(qApp->windowIcon());
87  contextMenu()->setTitle(i18n("KMail"));
88  QAction *action = nullptr;
89  if ((action = mainWidget->action(QStringLiteral("check_mail")))) {
90  contextMenu()->addAction(action);
91  }
92  if ((action = mainWidget->action(QStringLiteral("check_mail_in")))) {
93  contextMenu()->addAction(action);
94  }
95 
96  mSendQueued = mainWidget->sendQueuedAction();
97  contextMenu()->addAction(mSendQueued);
98  contextMenu()->addAction(mainWidget->sendQueueViaMenu());
99 
100  contextMenu()->addSeparator();
101  if ((action = mainWidget->action(QStringLiteral("new_message")))) {
102  contextMenu()->addAction(action);
103  }
104  if ((action = mainWidget->action(QStringLiteral("kmail_configure_kmail")))) {
105  contextMenu()->addAction(action);
106  }
107  contextMenu()->addSeparator();
108  if ((action = mainWidget->action(QStringLiteral("akonadi_work_offline")))) {
109  contextMenu()->addAction(action);
110  contextMenu()->addSeparator();
111  }
112 
113  if ((action = mainWidget->action(QStringLiteral("file_quit")))) {
114  contextMenu()->addAction(action);
115  }
116  return true;
117 }
118 
119 KMSystemTray::~KMSystemTray()
120 {
121 }
122 
123 void KMSystemTray::initialize(int count)
124 {
125  updateCount(count);
126  updateStatus(count);
127  updateToolTip(count);
128 }
129 
135 void KMSystemTray::updateCount(int count)
136 {
137  if (count == 0) {
138  setIconByName(QStringLiteral("kmail"));
139  } else {
140  setIconByName(QStringLiteral("mail-mark-unread-new"));
141  }
142 }
143 
144 void KMSystemTray::setUnityServiceManager(UnityServiceManager *unityServiceManager)
145 {
146  mUnityServiceManager = unityServiceManager;
147 }
148 
153 void KMSystemTray::slotActivated()
154 {
155  KMMainWidget *mainWidget = kmkernel->getKMMainWidget();
156  if (!mainWidget) {
157  return;
158  }
159 
160  QWidget *mainWin = mainWidget->window();
161  if (!mainWin) {
162  return;
163  }
164 
165  KWindowInfo cur = KWindowInfo(mainWin->winId(), NET::WMDesktop);
166 
167  const int currentDesktop = KWindowSystem::currentDesktop();
168  const bool wasMinimized = cur.isMinimized();
169 
170  if (cur.valid()) {
171  mDesktopOfMainWin = cur.desktop();
172  }
173 
174  if (wasMinimized && (currentDesktop != mDesktopOfMainWin) && (mDesktopOfMainWin == NET::OnAllDesktops)) {
175  KWindowSystem::setOnDesktop(mainWin->winId(), currentDesktop);
176  }
177 
178  if (mDesktopOfMainWin == NET::OnAllDesktops) {
179  KWindowSystem::setOnAllDesktops(mainWin->winId(), true);
180  }
181 
182  KWindowSystem::activateWindow(mainWin->winId());
183 
184  if (wasMinimized) {
185  kmkernel->raise();
186  }
187 }
188 
189 void KMSystemTray::slotContextMenuAboutToShow()
190 {
191  // Rebuild popup menu before show to minimize race condition if
192  // the base KMainWidget is closed.
193  if (!buildPopupMenu()) {
194  return;
195  }
196 
197  if (mNewMessagesPopup != nullptr) {
198  contextMenu()->removeAction(mNewMessagesPopup->menuAction());
199  delete mNewMessagesPopup;
200  mNewMessagesPopup = nullptr;
201  }
202  mHasUnreadMessage = false;
203  mNewMessagesPopup = new QMenu();
204  fillFoldersMenu(mNewMessagesPopup, kmkernel->treeviewModelSelection());
205 
206  connect(mNewMessagesPopup, &QMenu::triggered, this, &KMSystemTray::slotSelectCollection);
207 
208  if (mHasUnreadMessage) {
209  mNewMessagesPopup->setTitle(i18n("New Messages In"));
210  contextMenu()->insertAction(mSendQueued, mNewMessagesPopup->menuAction());
211  }
212 }
213 
214 void KMSystemTray::fillFoldersMenu(QMenu *menu, const QAbstractItemModel *model, const QString &parentName, const QModelIndex &parentIndex)
215 {
216  const int rowCount = model->rowCount(parentIndex);
217  for (int row = 0; row < rowCount; ++row) {
218  const QModelIndex index = model->index(row, 0, parentIndex);
219  const Akonadi::Collection collection = model->data(index, Akonadi::EntityTreeModel::CollectionRole).value<Akonadi::Collection>();
220  qint64 count = 0;
221  if (mUnityServiceManager && !mUnityServiceManager->excludeFolder(collection)) {
222  const Akonadi::CollectionStatistics statistics = collection.statistics();
223  count = qMax(0LL, statistics.unreadCount());
224  if (count > 0) {
225  if (mUnityServiceManager->ignoreNewMailInFolder(collection)) {
226  count = 0;
227  } else {
228  mHasUnreadMessage = true;
229  }
230  }
231  }
232  QString label = parentName.isEmpty() ? QString() : QString(parentName + QLatin1String("->"));
233  label += model->data(index).toString();
234  label.replace(QLatin1Char('&'), QStringLiteral("&&"));
235  if (count > 0) {
236  // insert an item
237  QAction *action = menu->addAction(label);
238  action->setData(collection.id());
239  }
240  if (model->rowCount(index) > 0) {
241  fillFoldersMenu(menu, model, label, index);
242  }
243  }
244 }
245 
246 void KMSystemTray::hideKMail()
247 {
248  KMMainWidget *mainWidget = kmkernel->getKMMainWidget();
249  if (!mainWidget) {
250  return;
251  }
252  QWidget *mainWin = mainWidget->window();
253  Q_ASSERT(mainWin);
254  if (mainWin) {
255  mDesktopOfMainWin = KWindowInfo(mainWin->winId(), NET::WMDesktop).desktop();
256  // iconifying is unnecessary, but it looks cooler
257  KWindowSystem::minimizeWindow(mainWin->winId());
258  mainWin->hide();
259  }
260 }
261 
262 void KMSystemTray::updateToolTip(int count)
263 {
264  setToolTipSubTitle(count == 0 ? i18n("There are no unread messages")
265  : i18np("1 unread message",
266  "%1 unread messages",
267  count));
268 }
269 
270 void KMSystemTray::updateStatus(int count)
271 {
272  if (status() == KStatusNotifierItem::Passive && (count > 0)) {
273  setStatus(KStatusNotifierItem::Active);
274  } else if (status() == KStatusNotifierItem::Active && (count == 0)) {
275  setStatus(KStatusNotifierItem::Passive);
276  }
277 }
278 
279 void KMSystemTray::slotSelectCollection(QAction *act)
280 {
281  const Akonadi::Collection::Id id = act->data().value<Akonadi::Collection::Id>();
282  kmkernel->selectCollectionFromId(id);
283  KMMainWidget *mainWidget = kmkernel->getKMMainWidget();
284  if (!mainWidget) {
285  return;
286  }
287  QWidget *mainWin = mainWidget->window();
288  if (mainWin && !mainWin->isVisible()) {
289  activate();
290  }
291 }
QModelIndex
QWidget
QAbstractItemModel::rowCount
virtual int rowCount(const QModelIndex &parent) const =0
QAbstractItemModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const =0
KMail::KMSystemTray::updateToolTip
void updateToolTip(int count)
Definition: kmsystemtray.cpp:262
kmmainwidget.h
QWidget::window
QWidget * window() const
KMail::KMSystemTray::updateCount
void updateCount(int count)
Update the count of unread messages.
Definition: kmsystemtray.cpp:135
unityservicemanager.h
KMail::KMSystemTray::~KMSystemTray
~KMSystemTray()
destructor
Definition: kmsystemtray.cpp:119
QAction::data
QVariant data() const
QMenu::addAction
void addAction(QAction *action)
QWidget::isVisible
bool isVisible() const
QMenu::triggered
void triggered(QAction *action)
QVariant::value
T value() const
KMMainWidget::sendQueueViaMenu
KActionMenuTransport * sendQueueViaMenu() const
Definition: kmmainwidget.cpp:4367
KMMainWidget::action
QAction * action(const QString &name)
Definition: kmmainwidget.cpp:4347
KMail::KMSystemTray::hideKMail
void hideKMail()
Definition: kmsystemtray.cpp:246
KMMainWidget::sendQueuedAction
QAction * sendQueuedAction() const
Definition: kmmainwidget.cpp:4362
KMail::UnityServiceManager::excludeFolder
Q_REQUIRED_RESULT bool excludeFolder(const Akonadi::Collection &collection) const
Definition: unityservicemanager.cpp:64
QMenu::aboutToShow
void aboutToShow()
kactionmenutransport.h
QObject
QString::isEmpty
bool isEmpty() const
kmsystemtray.h
KMMainWidget
Definition: kmmainwidget.h:97
QAbstractItemModel::data
virtual QVariant data(const QModelIndex &index, int role) const =0
QMenu::setTitle
void setTitle(const QString &title)
QWidget::winId
WId winId() const
QString
QWidget::hide
void hide()
kmkernel
#define kmkernel
Definition: kmkernel.h:21
QAction::setData
void setData(const QVariant &userData)
QMenu
KMail::UnityServiceManager::ignoreNewMailInFolder
Q_REQUIRED_RESULT bool ignoreNewMailInFolder(const Akonadi::Collection &collection)
Definition: unityservicemanager.cpp:205
QLatin1Char
KMail::UnityServiceManager
Definition: unityservicemanager.h:30
KMail::KMSystemTray::updateStatus
void updateStatus(int count)
Definition: kmsystemtray.cpp:270
QString::replace
QString & replace(int position, int n, QChar after)
kmailsettings.h
KMail::KMSystemTray::setUnityServiceManager
void setUnityServiceManager(KMail::UnityServiceManager *unityServiceManager)
Definition: kmsystemtray.cpp:144
QLatin1String
QAction
QAbstractItemModel
KStatusNotifierItem
KMail::KMSystemTray::initialize
void initialize(int count)
Definition: kmsystemtray.cpp:123
QMenu::menuAction
QAction * menuAction() const
QVariant::toString
QString toString() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2019 The KDE developers.
Generated on Thu Dec 5 2019 03:57:54 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kmail/src

Skip menu "kmail/src"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

pim API Reference

Skip menu "pim API Reference"
  • akonadi-calendar-tools
  •   konsolekalendar
  • akregator
  •   src
  • kalarmcal
  •   src
  •     lib
  • kdepim-runtime
  •   agents
  •   src
  • kleopatra
  •   src
  • kmailtransport
  • knotes
  • kontact
  • kontactinterface
  • kpimtextedit
  • ksmtp
  • ktnef
  • libkgapi
  • libkleo
  •   src
  •     src
  •     src

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