Skip to content

Commit

Permalink
statusnotifier: Avoid circular *Proxy <-> *Widget dependency
Browse files Browse the repository at this point in the history
  • Loading branch information
palinek committed Mar 9, 2022
1 parent 465d6cd commit 8a683d5
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 80 deletions.
73 changes: 23 additions & 50 deletions plugin-statusnotifier/statusnotifierproxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@

#include "statusnotifierproxy.h"
#include "statusnotifierwatcher.h"
#include "statusnotifierwidget.h"

#include <QApplication>
#include <QFutureWatcher>
Expand All @@ -36,28 +35,24 @@
Q_GLOBAL_STATIC(StatusNotifierProxy, statusNotifierProxy)

StatusNotifierProxy::StatusNotifierProxy()
: mWatcher(nullptr),
mWidgetCount(0),
mCreatingWatcher(false)
: mWatcher{nullptr},
mUsersCount{0}
{
createWatcher();
}

void StatusNotifierProxy::createWatcher()
{
mCreatingWatcher = true;
QFutureWatcher<StatusNotifierWatcher *> * future_watcher = new QFutureWatcher<StatusNotifierWatcher *>;
connect(future_watcher, &QFutureWatcher<StatusNotifierWatcher *>::finished, this, [this, future_watcher]
{
mWatcher = future_watcher->future().result();
watcherCreated();
mWatcher.reset(future_watcher->future().result());

connect(mWatcher, &StatusNotifierWatcher::StatusNotifierItemRegistered,
this, &StatusNotifierProxy::onStatusNotifierItemRegistered);
connect(mWatcher, &StatusNotifierWatcher::StatusNotifierItemUnregistered,
this, &StatusNotifierProxy::onStatusNotifierItemUnregistered);
connect(mWatcher.get(), &StatusNotifierWatcher::StatusNotifierItemRegistered,
this, &StatusNotifierProxy::StatusNotifierItemRegistered);
connect(mWatcher.get(), &StatusNotifierWatcher::StatusNotifierItemUnregistered,
this, &StatusNotifierProxy::StatusNotifierItemUnregistered);

qDebug() << mWatcher->RegisteredStatusNotifierItems();
qDebug() << "StatusNotifierProxy, services:" << mWatcher->RegisteredStatusNotifierItems();

future_watcher->deleteLater();
});
Expand All @@ -77,53 +72,31 @@ void StatusNotifierProxy::createWatcher()
future_watcher->setFuture(future);
}

void StatusNotifierProxy::watcherCreated()
QStringList StatusNotifierProxy::RegisteredStatusNotifierItems() const
{
mCreatingWatcher = false;
Q_ASSERT(mUsersCount > 0);
return mWatcher ? mWatcher->RegisteredStatusNotifierItems() : QStringList{};
}

StatusNotifierProxy::~StatusNotifierProxy()
StatusNotifierProxy & StatusNotifierProxy::registerLifetimeUsage(QObject * obj)
{
qDebug() << "deleting Proxy";
StatusNotifierProxy & p = *statusNotifierProxy();
p.registerUsage(obj);
return p;
}

StatusNotifierProxy *StatusNotifierProxy::instance()
void StatusNotifierProxy::registerUsage(QObject * obj)
{
return statusNotifierProxy();
}

void StatusNotifierProxy::registerWidget(StatusNotifierWidget *widget)
{
++mWidgetCount;
if (nullptr == mWatcher && mCreatingWatcher == false)
connect(obj, &QObject::destroyed, this, &StatusNotifierProxy::unregisterUsage);
if (mUsersCount <= 0)
createWatcher();
for (auto i = mServices.cbegin(); i != mServices.cend(); ++i)
widget->itemAdded(*i);

connect(this, &StatusNotifierProxy::StatusNotifierItemRegistered,
widget, &StatusNotifierWidget::itemAdded);
connect(this, &StatusNotifierProxy::StatusNotifierItemUnregistered,
widget, &StatusNotifierWidget::itemRemoved);
++mUsersCount;
}

void StatusNotifierProxy::unregisterWidget(StatusNotifierWidget */*widget*/)
void StatusNotifierProxy::unregisterUsage()
{
--mWidgetCount;
if (mWidgetCount == 0) {
mWatcher->deleteLater();
mWatcher = nullptr;
mServices.clear();
--mUsersCount;
if (mUsersCount <= 0) {
mWatcher.reset();
}
}

void StatusNotifierProxy::onStatusNotifierItemRegistered(const QString &service)
{
mServices.append(service);
emit StatusNotifierItemRegistered(service);
}

void StatusNotifierProxy::onStatusNotifierItemUnregistered(const QString &service)
{
mServices.removeAll(service);
emit StatusNotifierItemUnregistered(service);
}
27 changes: 10 additions & 17 deletions plugin-statusnotifier/statusnotifierproxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,11 @@
*
* END_COMMON_COPYRIGHT_HEADER */

#ifndef STATUSNOTIFIERPROXY_H
#define STATUSNOTIFIERPROXY_H

#pragma once

#include <QObject>
#include <QStringList>
#include <memory>

class StatusNotifierWidget;
class StatusNotifierWatcher;
Expand All @@ -39,25 +38,19 @@ class StatusNotifierProxy : public QObject

public:
StatusNotifierProxy();
~StatusNotifierProxy();
static StatusNotifierProxy *instance();

void onStatusNotifierItemRegistered(const QString &service);
void onStatusNotifierItemUnregistered(const QString &service);
void registerWidget(StatusNotifierWidget *widget);
void unregisterWidget(StatusNotifierWidget *widget);
~StatusNotifierProxy() = default;
QStringList RegisteredStatusNotifierItems() const;
static StatusNotifierProxy & registerLifetimeUsage(QObject * obj);

private:
QStringList mServices;
StatusNotifierWatcher *mWatcher;
int mWidgetCount;
bool mCreatingWatcher;
std::unique_ptr<StatusNotifierWatcher> mWatcher;
int mUsersCount;

void createWatcher();
void watcherCreated();
void registerUsage(QObject * obj);
void unregisterUsage();

signals:
void StatusNotifierItemRegistered(const QString &service);
void StatusNotifierItemUnregistered(const QString &service);
};

#endif //STATUSNOTIFIERPROXY_H
13 changes: 7 additions & 6 deletions plugin-statusnotifier/statusnotifierwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
StatusNotifierWidget::StatusNotifierWidget(ILXQtPanelPlugin *plugin, QWidget *parent) :
QWidget(parent),
mPlugin(plugin),
mProxy(StatusNotifierProxy::instance()),
mAttentionPeriod(5),
mForceVisible(false)
{
Expand Down Expand Up @@ -80,13 +79,15 @@ StatusNotifierWidget::StatusNotifierWidget(ILXQtPanelPlugin *plugin, QWidget *pa
}
});

mProxy->registerWidget(this);
realign();
}

StatusNotifierWidget::~StatusNotifierWidget()
{
mProxy->unregisterWidget(this);
StatusNotifierProxy & proxy = StatusNotifierProxy::registerLifetimeUsage(this);
connect(&proxy, &StatusNotifierProxy::StatusNotifierItemRegistered,
this, &StatusNotifierWidget::itemAdded);
connect(&proxy, &StatusNotifierProxy::StatusNotifierItemUnregistered,
this, &StatusNotifierWidget::itemRemoved);
for (const auto & service: proxy.RegisteredStatusNotifierItems())
itemAdded(service);
}

void StatusNotifierWidget::leaveEvent(QEvent * /*event*/)
Expand Down
9 changes: 2 additions & 7 deletions plugin-statusnotifier/statusnotifierwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@
*
* END_COMMON_COPYRIGHT_HEADER */

#ifndef STATUSNOTIFIERWIDGET_H
#define STATUSNOTIFIERWIDGET_H
#pragma once

#include <QDir>
#include <QTimer>

#include <LXQt/GridLayout>
Expand All @@ -44,7 +42,7 @@ class StatusNotifierWidget : public QWidget

public:
StatusNotifierWidget(ILXQtPanelPlugin *plugin, QWidget *parent = nullptr);
~StatusNotifierWidget();
~StatusNotifierWidget() = default;

void settingsChanged();
QStringList itemTitles() const;
Expand All @@ -63,7 +61,6 @@ public slots:

private:
ILXQtPanelPlugin *mPlugin;
StatusNotifierProxy *mProxy;

QTimer mHideTimer;

Expand All @@ -76,5 +73,3 @@ public slots:
int mAttentionPeriod;
bool mForceVisible;
};

#endif // STATUSNOTIFIERWIDGET_H

0 comments on commit 8a683d5

Please sign in to comment.