1 | // SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. |
---|---|
2 | // |
3 | // SPDX-License-Identifier: GPL-3.0-or-later |
4 | |
5 | #include "event.h" |
6 | |
7 | #include "private/event_p.h" |
8 | |
9 | #include <QDebug> |
10 | #include <QMutex> |
11 | |
12 | DPF_BEGIN_NAMESPACE |
13 | |
14 | namespace PrivateGlobal |
15 | { |
16 | static QString EVENT_TOPIC_KEY{"EVENT_TOPIC_KEY"}; |
17 | static QString EVENT_DATA_KEY{"EVENT_DATA_KEY"}; |
18 | } |
19 | |
20 | Event::Event() |
21 | : d(new EventPrivate(this)) |
22 | { |
23 | |
24 | } |
25 | |
26 | Event::Event(const QString &topic) |
27 | : d(new EventPrivate(this)) |
28 | { |
29 | setTopic(topic); |
30 | } |
31 | |
32 | Event::Event(const Event &event): |
33 | d(new EventPrivate(this)) |
34 | { |
35 | d->sourceHash = event.d->sourceHash; |
36 | } |
37 | |
38 | Event::~Event() |
39 | { |
40 | delete d; |
41 | } |
42 | |
43 | Event &Event::operator =(const Event &event) |
44 | { |
45 | if (&event != this) { |
46 | d = new EventPrivate(this); |
47 | d->sourceHash = event.d->sourceHash; |
48 | } |
49 | return *this; |
50 | } |
51 | |
52 | /** |
53 | * @brief Event::setTopic |
54 | * 设置事件的主题 |
55 | * @param topic 主题字符串 |
56 | */ |
57 | void Event::setTopic(const QString &topic) |
58 | { |
59 | static QMutex mutex; |
60 | mutex.lock(); |
61 | d->sourceHash[PrivateGlobal::EVENT_TOPIC_KEY] = topic; |
62 | mutex.unlock(); |
63 | } |
64 | |
65 | /** |
66 | * @brief Event::setTopic |
67 | * 获取设置事件的主题 |
68 | * @return 主题字符串 |
69 | */ |
70 | QString Event::topic() const |
71 | { |
72 | return d->sourceHash[PrivateGlobal::EVENT_TOPIC_KEY].toString(); |
73 | } |
74 | |
75 | /** |
76 | * @brief Event::setData 设置关联数据 |
77 | * @param data 任意泛型,需要Qt基本类型的QVariant构造要求, |
78 | * 可以通过QVariant::fromValue接口进行复合类型的构造。 |
79 | */ |
80 | void Event::setData(const QVariant &data) |
81 | { |
82 | d->sourceHash[PrivateGlobal::EVENT_DATA_KEY] = data; |
83 | } |
84 | |
85 | /** |
86 | * @brief Event::data 获取设置的关联数据 |
87 | * @return QVariant任意泛型, |
88 | * 可使用canConvert进行类型匹配后进行类型匹配后转换 |
89 | * 未知类型下直接调用qvariant_cast将导致未定义的行为,引发程序崩溃 |
90 | */ |
91 | QVariant Event::data() const |
92 | { |
93 | return d->sourceHash[PrivateGlobal::EVENT_DATA_KEY]; |
94 | } |
95 | |
96 | /** |
97 | * @brief Event::setProperty 设置其他映射关联数据属性 |
98 | * @param key 索引键值 |
99 | * @param value 关联数据值 |
100 | */ |
101 | void Event::setProperty(const QString &key, const QVariant value) |
102 | { |
103 | d->sourceHash[key] = value; |
104 | } |
105 | |
106 | /** |
107 | * @brief Event::value 获取元素列表中标定的value |
108 | * @param key 标识元素的键值 |
109 | * @return 返回QVariant 复合类型需要自己转换 |
110 | */ |
111 | QVariant Event::property(const QString &key) const |
112 | { |
113 | return d->sourceHash[key]; |
114 | } |
115 | |
116 | QT_BEGIN_NAMESPACE |
117 | Q_CORE_EXPORT QDebug operator <<(QDebug out, const DPF_NAMESPACE::Event &event) |
118 | { |
119 | out << event.d->sourceHash; |
120 | return out; |
121 | } |
122 | QT_END_NAMESPACE |
123 | |
124 | DPF_END_NAMESPACE |
125 | |
126 | |
127 | |
128 | |
129 |