25 #include "mailcommon/mailutil.h"
26 #include "MailCommon/MailKernel"
27 #include "MailCommon/FolderTreeView"
28 #include <AkonadiCore/NewMailNotifierAttribute>
30 #include <kwindowsystem.h>
31 #include "kmail_debug.h"
33 #include <KLocalizedString>
38 using namespace MailCommon;
51 using namespace KMail;
53 KMSystemTray::KMSystemTray(
QObject *parent)
56 qCDebug(KMAIL_LOG) <<
"Initting systray";
57 setToolTipTitle(i18n(
"KMail"));
58 setToolTipIconByName(QStringLiteral(
"kmail"));
59 setIconByName(QStringLiteral(
"kmail"));
65 mDesktopOfMainWin = KWindowInfo(mainWin->
winId(), NET::WMDesktop).desktop();
69 connect(
this, &KMSystemTray::activateRequested,
this, &KMSystemTray::slotActivated);
71 this, &KMSystemTray::slotContextMenuAboutToShow);
74 bool KMSystemTray::buildPopupMenu()
77 if (!mainWidget ||
kmkernel->shuttingDown()) {
82 setContextMenu(
new QMenu());
85 contextMenu()->clear();
86 contextMenu()->setIcon(qApp->windowIcon());
87 contextMenu()->setTitle(i18n(
"KMail"));
89 if ((action = mainWidget->
action(QStringLiteral(
"check_mail")))) {
90 contextMenu()->addAction(action);
92 if ((action = mainWidget->
action(QStringLiteral(
"check_mail_in")))) {
93 contextMenu()->addAction(action);
97 contextMenu()->addAction(mSendQueued);
100 contextMenu()->addSeparator();
101 if ((action = mainWidget->
action(QStringLiteral(
"new_message")))) {
102 contextMenu()->addAction(action);
104 if ((action = mainWidget->
action(QStringLiteral(
"kmail_configure_kmail")))) {
105 contextMenu()->addAction(action);
107 contextMenu()->addSeparator();
108 if ((action = mainWidget->
action(QStringLiteral(
"akonadi_work_offline")))) {
109 contextMenu()->addAction(action);
110 contextMenu()->addSeparator();
113 if ((action = mainWidget->
action(QStringLiteral(
"file_quit")))) {
114 contextMenu()->addAction(action);
138 setIconByName(QStringLiteral(
"kmail"));
140 setIconByName(QStringLiteral(
"mail-mark-unread-new"));
146 mUnityServiceManager = unityServiceManager;
153 void KMSystemTray::slotActivated()
165 KWindowInfo cur = KWindowInfo(mainWin->
winId(), NET::WMDesktop);
167 const int currentDesktop = KWindowSystem::currentDesktop();
168 const bool wasMinimized = cur.isMinimized();
171 mDesktopOfMainWin = cur.desktop();
174 if (wasMinimized && (currentDesktop != mDesktopOfMainWin) && (mDesktopOfMainWin == NET::OnAllDesktops)) {
175 KWindowSystem::setOnDesktop(mainWin->
winId(), currentDesktop);
178 if (mDesktopOfMainWin == NET::OnAllDesktops) {
179 KWindowSystem::setOnAllDesktops(mainWin->
winId(),
true);
182 KWindowSystem::activateWindow(mainWin->
winId());
189 void KMSystemTray::slotContextMenuAboutToShow()
193 if (!buildPopupMenu()) {
197 if (mNewMessagesPopup !=
nullptr) {
198 contextMenu()->removeAction(mNewMessagesPopup->
menuAction());
199 delete mNewMessagesPopup;
200 mNewMessagesPopup =
nullptr;
202 mHasUnreadMessage =
false;
203 mNewMessagesPopup =
new QMenu();
204 fillFoldersMenu(mNewMessagesPopup,
kmkernel->treeviewModelSelection());
206 connect(mNewMessagesPopup, &
QMenu::triggered,
this, &KMSystemTray::slotSelectCollection);
208 if (mHasUnreadMessage) {
209 mNewMessagesPopup->
setTitle(i18n(
"New Messages In"));
210 contextMenu()->insertAction(mSendQueued, mNewMessagesPopup->
menuAction());
216 const int rowCount = model->
rowCount(parentIndex);
217 for (
int row = 0; row < rowCount; ++row) {
219 const Akonadi::Collection collection = model->
data(index, Akonadi::EntityTreeModel::CollectionRole).
value<Akonadi::Collection>();
221 if (mUnityServiceManager && !mUnityServiceManager->
excludeFolder(collection)) {
222 const Akonadi::CollectionStatistics statistics = collection.statistics();
223 count = qMax(0LL, statistics.unreadCount());
228 mHasUnreadMessage =
true;
238 action->
setData(collection.id());
241 fillFoldersMenu(menu, model, label, index);
255 mDesktopOfMainWin = KWindowInfo(mainWin->
winId(), NET::WMDesktop).desktop();
257 KWindowSystem::minimizeWindow(mainWin->
winId());
264 setToolTipSubTitle(count == 0 ? i18n(
"There are no unread messages")
265 : i18np(
"1 unread message",
266 "%1 unread messages",
272 if (status() == KStatusNotifierItem::Passive && (count > 0)) {
273 setStatus(KStatusNotifierItem::Active);
274 }
else if (status() == KStatusNotifierItem::Active && (count == 0)) {
275 setStatus(KStatusNotifierItem::Passive);
279 void KMSystemTray::slotSelectCollection(
QAction *act)
281 const Akonadi::Collection::Id
id = act->
data().
value<Akonadi::Collection::Id>();
282 kmkernel->selectCollectionFromId(
id);
virtual int rowCount(const QModelIndex &parent) const =0
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const =0
void updateToolTip(int count)
void updateCount(int count)
Update the count of unread messages.
~KMSystemTray()
destructor
KActionMenuTransport * sendQueueViaMenu() const
QAction * action(const QString &name)
QAction * sendQueuedAction() const
Q_REQUIRED_RESULT bool excludeFolder(const Akonadi::Collection &collection) const
virtual QVariant data(const QModelIndex &index, int role) const =0
void setData(const QVariant &userData)
Q_REQUIRED_RESULT bool ignoreNewMailInFolder(const Akonadi::Collection &collection)
void updateStatus(int count)
QString & replace(int position, int n, QChar after)
void setUnityServiceManager(KMail::UnityServiceManager *unityServiceManager)
void initialize(int count)