Merge lp:~nick-dedekind/qmenumodel/qdbusactiongroup-variant-conversion into lp:qmenumodel

Proposed by Nick Dedekind
Status: Needs review
Proposed branch: lp:~nick-dedekind/qmenumodel/qdbusactiongroup-variant-conversion
Merge into: lp:qmenumodel
Diff against target: 298 lines (+167/-13)
7 files modified
libqmenumodel/src/qdbusactiongroup.cpp (+29/-2)
libqmenumodel/src/qstateaction.cpp (+2/-4)
tests/client/actiongrouptest.cpp (+96/-0)
tests/client/script_actiongrouptest.py (+2/-2)
tests/script/dbusmenuscript.cpp (+16/-0)
tests/script/dbusmenuscript.h (+1/-0)
tests/script/menuscript.py (+21/-5)
To merge this branch: bzr merge lp:~nick-dedekind/qmenumodel/qdbusactiongroup-variant-conversion
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Lars Karlitski Pending
Review via email: mp+211908@code.launchpad.net

Commit message

Action updateState/activate uses parameter types to determine correct variant conversion.

Description of the change

Action updateState/activate uses parameter types to determine correct variant conversion.
Added tests for implicit type conversion.

To post a comment you must log in.
104. By Nick Dedekind

Action updateState/activate uses parameter types to determine corect variant conversion

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)

Unmerged revisions

104. By Nick Dedekind

Action updateState/activate uses parameter types to determine corect variant conversion

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'libqmenumodel/src/qdbusactiongroup.cpp'
--- libqmenumodel/src/qdbusactiongroup.cpp 2013-08-09 08:01:43 +0000
+++ libqmenumodel/src/qdbusactiongroup.cpp 2014-03-20 11:46:21 +0000
@@ -213,14 +213,41 @@
213void QDBusActionGroup::updateActionState(const QString &name, const QVariant &state)213void QDBusActionGroup::updateActionState(const QString &name, const QVariant &state)
214{214{
215 if (m_actionGroup != NULL) {215 if (m_actionGroup != NULL) {
216 g_action_group_change_action_state(m_actionGroup, name.toUtf8().data(), Converter::toGVariant(state));216 GVariant* action_state;
217 QByteArray nameBytes = name.toUtf8();
218
219 action_state = g_action_group_get_action_state(m_actionGroup, nameBytes.data());
220 if (action_state) {
221 g_action_group_change_action_state(m_actionGroup,
222 nameBytes.data(),
223 Converter::toGVariantWithSchema(state, g_variant_get_type_string(action_state)));
224
225 g_variant_unref(action_state);
226 } else {
227 g_action_group_change_action_state(m_actionGroup, nameBytes.data(), Converter::toGVariant(state));
228 }
217 }229 }
218}230}
219231
220void QDBusActionGroup::activateAction(const QString &name, const QVariant &parameter)232void QDBusActionGroup::activateAction(const QString &name, const QVariant &parameter)
221{233{
222 if (m_actionGroup != NULL) {234 if (m_actionGroup != NULL) {
223 g_action_group_activate_action(m_actionGroup, name.toUtf8().data(), Converter::toGVariant(parameter));235 const GVariantType* parameter_type;
236 QByteArray nameBytes = name.toUtf8();
237
238 parameter_type = g_action_group_get_action_parameter_type(m_actionGroup, nameBytes.data());
239 if (parameter_type) {
240 gchar* parameter_type_string;
241 parameter_type_string = g_variant_type_dup_string(parameter_type);
242
243 g_action_group_activate_action(m_actionGroup,
244 nameBytes.data(),
245 Converter::toGVariantWithSchema(parameter, parameter_type_string));
246
247 g_free(parameter_type_string);
248 } else {
249 g_action_group_activate_action(m_actionGroup, nameBytes.data(), Converter::toGVariant(parameter));
250 }
224 }251 }
225}252}
226253
227254
=== modified file 'libqmenumodel/src/qstateaction.cpp'
--- libqmenumodel/src/qstateaction.cpp 2014-02-28 12:10:02 +0000
+++ libqmenumodel/src/qstateaction.cpp 2014-03-20 11:46:21 +0000
@@ -93,9 +93,7 @@
93*/93*/
94void QStateAction::updateState(const QVariant &state)94void QStateAction::updateState(const QVariant &state)
95{95{
96 QVariant v = state;96 m_group->updateActionState(m_name, state);
97 if (v.convert(m_state.type()))
98 m_group->updateActionState(m_name, v);
99}97}
10098
101/*!99/*!
@@ -126,7 +124,7 @@
126void QStateAction::setState(const QVariant &state)124void QStateAction::setState(const QVariant &state)
127{125{
128 QVariant v = state;126 QVariant v = state;
129 if (!m_state.isValid() || (v.convert(m_state.type()) && v != m_state)) {127 if ((m_state.isValid() != state.isValid()) || (v.convert(m_state.type()) && v != m_state)) {
130 m_state = v;128 m_state = v;
131 Q_EMIT stateChanged(m_state);129 Q_EMIT stateChanged(m_state);
132 }130 }
133131
=== modified file 'tests/client/actiongrouptest.cpp'
--- tests/client/actiongrouptest.cpp 2012-11-23 13:22:04 +0000
+++ tests/client/actiongrouptest.cpp 2014-03-20 11:46:21 +0000
@@ -154,6 +154,101 @@
154 }154 }
155155
156 /*156 /*
157 * Test if Action::trigger active the action over DBus
158 * using incorrect type (variant should be converted)
159 */
160 void testActiveActionIncorrectType()
161 {
162 // start model
163 m_model.start();
164 m_actionGroup.start();
165
166 // Make menu available
167 m_script.publishMenu();
168 m_script.walk(2);
169
170 // Get Action
171 QVariant action = m_model.data(m_model.index(1, 0), QMenuModel::Action);
172 QVERIFY(action.isValid());
173 QStateAction *act = m_actionGroup.action(action.toString());
174 QVERIFY(act);
175
176 // test action name
177 QCOMPARE(act->property("name").toString(), QString("Menu1Act"));
178
179 act->activate(QVariant(42.0));
180 // wait for dbus propagation
181 QTest::qWait(500);
182
183 QPair<QString, QVariant> result = m_script.popActivatedAction();
184 QCOMPARE(result.first, QString("Menu1Act"));
185 QCOMPARE(result.second.toString(), QString("42"));
186 }
187
188 /*
189 * Test updating state over DBus
190 */
191 void testUpdateActionState()
192 {
193 // start model
194 m_model.start();
195 m_actionGroup.start();
196
197 // Make menu available
198 m_script.publishMenu();
199 m_script.walk(2);
200
201 // Get Action
202 QVariant action = m_model.data(m_model.index(1, 0), QMenuModel::Action);
203 QVERIFY(action.isValid());
204 QStateAction *act = m_actionGroup.action(action.toString());
205 QVERIFY(act);
206
207 // test action name
208 QCOMPARE(act->property("name").toString(), QString("Menu1Act"));
209
210 act->updateState(QVariant("Testing1"));
211 // wait for dbus propagation
212 QTest::qWait(500);
213
214 QPair<QString, QVariant> result = m_script.popActionStateChange();
215 QCOMPARE(result.first, QString("Menu1Act"));
216 QCOMPARE(result.second.toString(), QString("Testing1"));
217 }
218
219 /*
220 * Test updating state over DBus
221 * using incorrect type (variant should be converted)
222 */
223 void testUpdateActionStateIncorrectType()
224 {
225 // start model
226 m_model.start();
227 m_actionGroup.start();
228
229 // Make menu available
230 m_script.publishMenu();
231 m_script.walk(2);
232
233 // Get Action
234 QVariant action = m_model.data(m_model.index(1, 0), QMenuModel::Action);
235 QVERIFY(action.isValid());
236 QStateAction *act = m_actionGroup.action(action.toString());
237 QVERIFY(act);
238
239 // test action name
240 QCOMPARE(act->property("name").toString(), QString("Menu1Act"));
241
242 act->updateState(QVariant(22));
243 // wait for dbus propagation
244 QTest::qWait(500);
245
246 QPair<QString, QVariant> result = m_script.popActionStateChange();
247 QCOMPARE(result.first, QString("Menu1Act"));
248 QCOMPARE(result.second.toString(), QString("22"));
249 }
250
251 /*
157 * Test if Action became invalid after desappear from DBus252 * Test if Action became invalid after desappear from DBus
158 */253 */
159 void testRemoveAction()254 void testRemoveAction()
@@ -201,6 +296,7 @@
201296
202 // Action appear297 // Action appear
203 QVERIFY(act->isValid());298 QVERIFY(act->isValid());
299 QVERIFY(act->state().isValid());
204 }300 }
205};301};
206302
207303
=== modified file 'tests/client/script_actiongrouptest.py'
--- tests/client/script_actiongrouptest.py 2013-01-31 04:22:06 +0000
+++ tests/client/script_actiongrouptest.py 2014-03-20 11:46:21 +0000
@@ -19,8 +19,8 @@
19from gi._gi import variant_type_from_string19from gi._gi import variant_type_from_string
2020
21al = ActionList(MENU_OBJECT_PATH)21al = ActionList(MENU_OBJECT_PATH)
22al.appendItem("Menu0", "Menu0Act", actionStateType=variant_type_from_string('s'))22al.appendItem("Menu0", "Menu0Act", actionStateType=variant_type_from_string('s'), actionState=GLib.Variant('s', 'Menu0State'))
23al.appendItem("Menu1", "Menu1Act", actionStateType=variant_type_from_string('s'))23al.appendItem("Menu1", "Menu1Act", actionStateType=variant_type_from_string('s'), actionState=GLib.Variant('s', 'Menu0State'))
24al.removeItem("1", "Menu1Act")24al.removeItem("1", "Menu1Act")
2525
26t = Script.create(al)26t = Script.create(al)
2727
=== modified file 'tests/script/dbusmenuscript.cpp'
--- tests/script/dbusmenuscript.cpp 2012-11-23 13:22:04 +0000
+++ tests/script/dbusmenuscript.cpp 2014-03-20 11:46:21 +0000
@@ -109,3 +109,19 @@
109 return qMakePair(QString(), QVariant());109 return qMakePair(QString(), QVariant());
110}110}
111111
112QPair<QString, QVariant> DBusMenuScript::popActionStateChange()
113{
114 if (m_script) {
115 QDBusMessage reply = m_script->call("popActionStateChange");
116 if (reply.arguments().count() > 0) {
117 QVariant value;
118 QString name = reply.arguments()[0].toString();
119 if (reply.arguments().count() > 1) {
120 value = reply.arguments()[1];
121 }
122 return qMakePair(name, value);
123 }
124 }
125
126 return qMakePair(QString(), QVariant());
127}
112128
=== modified file 'tests/script/dbusmenuscript.h'
--- tests/script/dbusmenuscript.h 2012-11-23 13:22:04 +0000
+++ tests/script/dbusmenuscript.h 2014-03-20 11:46:21 +0000
@@ -48,6 +48,7 @@
48 void unpublishMenu();48 void unpublishMenu();
4949
50 QPair<QString, QVariant> popActivatedAction();50 QPair<QString, QVariant> popActivatedAction();
51 QPair<QString, QVariant> popActionStateChange();
5152
52private:53private:
53 QDBusInterface *m_script;54 QDBusInterface *m_script;
5455
=== modified file 'tests/script/menuscript.py'
--- tests/script/menuscript.py 2013-01-31 04:22:06 +0000
+++ tests/script/menuscript.py 2014-03-20 11:46:21 +0000
@@ -74,6 +74,11 @@
74 def popActivatedAction(self):74 def popActivatedAction(self):
75 return self._list._activatedActions.pop(0)75 return self._list._activatedActions.pop(0)
7676
77 @dbus.service.method(dbus_interface=INTERFACE_NAME,
78 in_signature='', out_signature='ss')
79 def popActionStateChange(self):
80 return self._list._actionStateChanges.pop(0)
81
77 @staticmethod82 @staticmethod
78 def create(aList):83 def create(aList):
79 global bus84 global bus
@@ -110,9 +115,15 @@
110 parent.append_item(item)115 parent.append_item(item)
111116
112 # Action117 # Action
113 act = Gio.SimpleAction.new(self._kargs['actionName'], self._kargs['actionStateType'])118 if self._kargs['actionState'] == None:
114 act.connect('activate', self._list._onActionActivated)119 act = Gio.SimpleAction.new(self._kargs['actionName'], self._kargs['actionStateType'])
115 self._list._rootAction.insert(act)120 act.connect('activate', self._list._onActionActivated)
121 self._list._rootAction.insert(act)
122 else:
123 act = Gio.SimpleAction.new_stateful(self._kargs['actionName'], self._kargs['actionStateType'], self._kargs['actionState'])
124 act.connect('activate', self._list._onActionActivated)
125 act.connect('change-state', self._list._onActionStateChanged)
126 self._list._rootAction.insert(act)
116127
117 elif self._kargs['link'] == 'section':128 elif self._kargs['link'] == 'section':
118 section = Gio.Menu()129 section = Gio.Menu()
@@ -150,15 +161,17 @@
150 self._root = None161 self._root = None
151 self._rootAction = None162 self._rootAction = None
152 self._activatedActions = []163 self._activatedActions = []
164 self._actionStateChanges = []
153165
154 def appendItem(self, label, actionName, link=None, parentId=None, properties=None, actionStateType=None):166 def appendItem(self, label, actionName, link=None, parentId=None, properties=None, actionStateType=None, actionState=None):
155 self._actions.append(Action(self, 'append',167 self._actions.append(Action(self, 'append',
156 parentId=parentId,168 parentId=parentId,
157 label=label,169 label=label,
158 actionName=actionName,170 actionName=actionName,
159 link=link,171 link=link,
160 properties=properties,172 properties=properties,
161 actionStateType=actionStateType))173 actionStateType=actionStateType,
174 actionState=actionState))
162175
163 def removeItem(self, menuId, actionName=None):176 def removeItem(self, menuId, actionName=None):
164 self._actions.append(Action(self, 'remove',177 self._actions.append(Action(self, 'remove',
@@ -229,3 +242,6 @@
229242
230 def _onActionActivated(self, action, parameter):243 def _onActionActivated(self, action, parameter):
231 self._activatedActions.append((action.get_name(), parameter.get_string()))244 self._activatedActions.append((action.get_name(), parameter.get_string()))
245
246 def _onActionStateChanged(self, action, value):
247 self._actionStateChanges.append((action.get_name(), value.get_string()))

Subscribers

People subscribed via source and target branches