make hint really work with qobjects
This commit is contained in:
parent
f2459a4ae8
commit
6cc6f08317
|
@ -17,6 +17,7 @@
|
|||
along with SnoreNotify. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "hint.h"
|
||||
#include "log.h"
|
||||
|
||||
using namespace Snore;
|
||||
|
||||
|
@ -49,13 +50,21 @@ bool Hint::contains(const QString &key) const
|
|||
|
||||
void Hint::setPrivateValue(const void *owner, const QString &key, const QVariant &value)
|
||||
{
|
||||
m_privateData.insert(QPair<const void*,QString>(owner,key.toLower()), value);
|
||||
m_privateData.insert(QPair<quintptr,QString>((quintptr)owner,key.toLower()), value);
|
||||
}
|
||||
|
||||
void Hint::setPrivateValue(const void *owner, const QString &key, QObject *value)
|
||||
{
|
||||
m_privateData.insert(QPair<quintptr,QString>((quintptr)owner,key.toLower()), qVariantFromValue(value));
|
||||
value->setProperty("hint_key",key);
|
||||
value->setProperty("hint_owner",(quintptr)owner);
|
||||
connect(value, SIGNAL(destroyed()), this, SLOT(slotValueDestroyed()));
|
||||
}
|
||||
|
||||
|
||||
QVariant Hint::privateValue(const void *owner, const QString &k, const QVariant &defaultValue) const
|
||||
{
|
||||
QPair<const void*,QString> key(owner,k.toLower());
|
||||
QPair<quintptr,QString> key((quintptr)owner, k.toLower());
|
||||
if(m_privateData.contains(key))
|
||||
{
|
||||
return m_privateData.value(key);
|
||||
|
@ -69,7 +78,23 @@ QVariant Hint::privateValue(const void *owner, const QString &k, const QVariant
|
|||
|
||||
bool Hint::containsPrivateValue(const void *owner, const QString &key) const
|
||||
{
|
||||
return m_privateData.contains(QPair<const void*,QString>(owner,key.toLower()));
|
||||
return m_privateData.contains(QPair<quintptr,QString>((quintptr)owner,key.toLower()));
|
||||
}
|
||||
|
||||
void Hint::slotValueDestroyed()
|
||||
{
|
||||
QObject * o = sender();
|
||||
snoreDebug( SNORE_DEBUG ) << o << o->property("hint_key");
|
||||
QString key = o->property("hint_key").toString();
|
||||
if(!o->property("hint_owner").isNull())
|
||||
{
|
||||
m_privateData.take(QPair<quintptr,QString>(o->property("hint_owner").value<quintptr>(),key));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_data.take(key);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QDebug operator<<( QDebug debug, const Snore::Hint &hint )
|
||||
|
@ -83,7 +108,7 @@ QDebug operator<<( QDebug debug, const Snore::Hint &hint )
|
|||
}
|
||||
debug << "(" << it.key() << ", " << it.value();
|
||||
}
|
||||
for(QHash< QPair<const void*, QString>, QVariant>::const_iterator it = hint.m_privateData.constBegin();it != hint.m_privateData.constEnd();++it)
|
||||
for(QHash< QPair<quintptr, QString>, QVariant>::const_iterator it = hint.m_privateData.constBegin();it != hint.m_privateData.constEnd();++it)
|
||||
{
|
||||
if(it != hint.m_privateData.constBegin())
|
||||
{
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
namespace Snore
|
||||
{
|
||||
class Hint;
|
||||
class Hint;
|
||||
}
|
||||
|
||||
SNORE_EXPORT QDebug operator<< ( QDebug, const Snore::Hint &);
|
||||
|
@ -39,8 +39,9 @@ namespace Snore
|
|||
* The keys are case insensitive.
|
||||
*/
|
||||
|
||||
class SNORE_EXPORT Hint
|
||||
class SNORE_EXPORT Hint : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Hint();
|
||||
|
||||
|
@ -51,6 +52,13 @@ public:
|
|||
*/
|
||||
void setValue(const QString &key, const QVariant &value);
|
||||
|
||||
/**
|
||||
* Sets the value for the key
|
||||
* @param key the key
|
||||
* @param value the value
|
||||
*/
|
||||
void setValue(const QString &key, QObject *value);
|
||||
|
||||
/**
|
||||
* The associated value of the key if present, returns the default value otherwise.
|
||||
* @param key the key
|
||||
|
@ -73,6 +81,14 @@ public:
|
|||
*/
|
||||
void setPrivateValue(const void *owner, const QString &key, const QVariant &value);
|
||||
|
||||
/**
|
||||
* Sets the value for the key depending on the owner
|
||||
* @param owner the owner
|
||||
* @param key the key
|
||||
* @param value the value
|
||||
*/
|
||||
void setPrivateValue(const void *owner, const QString &key, QObject *value);
|
||||
|
||||
/**
|
||||
* The associated value of the key if present, returns the default value otherwise.
|
||||
* @param owner the owner
|
||||
|
@ -88,49 +104,18 @@ public:
|
|||
* @return whether the key is set
|
||||
*/
|
||||
bool containsPrivateValue(const void *owner, const QString & key ) const;
|
||||
private slots:
|
||||
void slotValueDestroyed();
|
||||
|
||||
private:
|
||||
QVariantHash m_data;
|
||||
QHash<QPair<const void*,QString>, QVariant> m_privateData;
|
||||
QHash<QPair<quintptr,QString>, QVariant> m_privateData;
|
||||
|
||||
friend SNORE_EXPORT QDebug (::operator<<) ( QDebug, const Snore::Hint &);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
|
||||
/**
|
||||
* Helper function to easyly stor pointers to QObjects in a QVariant
|
||||
*/
|
||||
template<typename Type>
|
||||
inline Type myQVariantCast(const QVariant &dat)
|
||||
{
|
||||
return qvariant_cast<Type>(dat);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to easyly stor pointers to QObjects in a QVariant
|
||||
*/
|
||||
template<typename Type>
|
||||
inline QVariant myQVariantFromValue(const Type &dat)
|
||||
{
|
||||
return qVariantFromValue(dat);
|
||||
}
|
||||
#else
|
||||
template<typename Type>
|
||||
inline Type myQVariantCast(const QVariant &dat)
|
||||
{
|
||||
return qobject_cast<Type>(qvariant_cast<QObject*>(dat));
|
||||
}
|
||||
|
||||
template<typename Type>
|
||||
inline QVariant myQVariantFromValue(const Type &dat)
|
||||
{
|
||||
return qVariantFromValue(qobject_cast<QObject*>(dat));
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ SnoreLog::~SnoreLog()
|
|||
if(debugLvl() >= m_lvl)
|
||||
{
|
||||
std::cout << m_msg.toUtf8().constData() << std::endl;
|
||||
std::cout.flush();
|
||||
}
|
||||
m_logg << m_msg.toUtf8().constData() << std::endl;
|
||||
}
|
||||
|
|
|
@ -138,13 +138,13 @@ void Parser::parse(Notification &sNotification,const QString &msg,QTcpSocket* cl
|
|||
}
|
||||
sNotification = Notification(app,alert,title,text,icon,timeout);
|
||||
sNotification.data()->setSource(snarl);
|
||||
sNotification.hints().setPrivateValue(snarl, "clientSocket", myQVariantFromValue(client));
|
||||
sNotification.hints().setPrivateValue(snarl, "clientSocket", client);
|
||||
break;
|
||||
}
|
||||
case ADD_CLASS:
|
||||
if(alertName.isEmpty())
|
||||
{
|
||||
snoreDebug( SNORE_DEBUG )<<"Error registering alert with empty name";
|
||||
snoreDebug( SNORE_DEBUG ) << "Error registering alert with empty name";
|
||||
break;
|
||||
}
|
||||
alert = Alert(alertName, icon);
|
||||
|
|
|
@ -50,7 +50,7 @@ bool SnarlNetworkFrontend::initialize(SnoreCore *snore){
|
|||
else
|
||||
{
|
||||
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(handleConnection()));
|
||||
std::cout<<"The Snarl Network Protokoll is developed for Snarl <http://www.fullphat.net/>"<<std::endl;
|
||||
std::cout << "The Snarl Network Protokoll is developed for Snarl <http://www.fullphat.net/>" << std::endl;
|
||||
}
|
||||
return SnoreFrontend::initialize(snore);
|
||||
}
|
||||
|
@ -129,7 +129,7 @@ void SnarlNetworkFrontend::handleMessages()
|
|||
|
||||
void SnarlNetworkFrontend::callback(Notification &sn, const QString msg)
|
||||
{
|
||||
QTcpSocket *client = myQVariantCast<QTcpSocket*>(sn.hints().privateValue(this, "clientSocket"));
|
||||
QTcpSocket *client = (QTcpSocket*)qvariant_cast<void*>(sn.hints().privateValue(this, "clientSocket"));
|
||||
if(client && !msg.isEmpty())
|
||||
{
|
||||
write(client, QString("%1%2\r\n").arg(msg, QString::number(sn.id())));
|
||||
|
|
|
@ -47,6 +47,8 @@ void TrayIcon::initConextMenu(SnoreCore *snore)
|
|||
m_trayMenu->addSeparator();
|
||||
m_trayMenu->addAction("Test Notification", this, SLOT(slotTestNotification()));
|
||||
m_trayMenu->addSeparator();
|
||||
m_backendActions = new QActionGroup(m_trayMenu);
|
||||
m_backendActions->setExclusive(true);
|
||||
foreach(const QString &back,m_snore->notificationBackends())
|
||||
{
|
||||
QAction *b = m_trayMenu->addAction(back, this, SLOT(setPrimaryBackend()));
|
||||
|
@ -55,7 +57,7 @@ void TrayIcon::initConextMenu(SnoreCore *snore)
|
|||
{
|
||||
b->setChecked(true);
|
||||
}
|
||||
m_backendActions.append(b);
|
||||
m_backendActions->addAction(b);
|
||||
}
|
||||
m_trayMenu->addSeparator();
|
||||
m_trayMenu->addAction("Exit",qApp,SLOT(quit()));
|
||||
|
@ -78,12 +80,14 @@ void TrayIcon::setPrimaryBackend(){
|
|||
QAction *a = qobject_cast<QAction*>(sender());
|
||||
m_snore->setPrimaryNotificationBackend(a->text());
|
||||
|
||||
foreach(QAction *action,m_backendActions)
|
||||
foreach (QAction *action, m_backendActions->actions())
|
||||
{
|
||||
action->setChecked(false);
|
||||
if(action->text() == m_snore->primaryNotificationBackend())
|
||||
{
|
||||
action->setChecked(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
a->setChecked(true);
|
||||
|
||||
}
|
||||
|
||||
void TrayIcon::slotTestNotification()
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#define TRAYICON_H
|
||||
|
||||
#include <QtCore>
|
||||
#include <QAction>
|
||||
#include "core/snore.h"
|
||||
|
||||
|
||||
|
@ -36,7 +37,7 @@ public:
|
|||
private:
|
||||
class QSystemTrayIcon *m_trayIcon;
|
||||
class QMenu *m_trayMenu;
|
||||
class QList<class QAction*> m_backendActions;
|
||||
QActionGroup *m_backendActions;
|
||||
Snore::SnoreCore *m_snore;
|
||||
Snore::Application m_app;
|
||||
Snore::Alert m_alert;
|
||||
|
|
Loading…
Reference in New Issue