-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsampleTools.html
More file actions
455 lines (446 loc) · 64.2 KB
/
Copy pathsampleTools.html
File metadata and controls
455 lines (446 loc) · 64.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
<!DOCTYPE html>
<html>
<head>
<title>
Sample tools
</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<link href="../../_static/copybutton.css" rel="stylesheet" type="text/css" />
<link href="../../_static/pygments.css" rel="stylesheet" type="text/css" />
<link href="../../_static/tabs.css" rel="stylesheet" type="text/css" />
<link href="../../_static/theme.css" rel="stylesheet" type="text/css" />
<script src="../../_static/documentation_options.js?v=5929fcd5"></script>
<script src="../../_static/doctools.js?v=9a2dae69"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
<script src="../../_static/copybutton.js?v=f281be69"></script>
<script src="../../_static/tabs.js?v=3ee01567"></script>
<script src="../../_static/theme.js" type="text/javascript"></script>
<link href="../../_static/katex/katex.min.css" rel="stylesheet" type="text/css"/>
<script defer src="../../_static/katex/katex.min.js" type="text/javascript"></script>
<script defer src="../../_static/katex/contrib/auto-render.min.js" type="text/javascript" onload="renderMathInElement(document.body);"></script>
</head>
<body ondragstart="return false;" ondrop="return false;">
<section id="sample-tools">
<span id="develop-plugins-sampletools"></span><h1>Sample tools<a class="headerlink" href="#sample-tools" title="Link to this heading">¶</a></h1>
<p>The purpose of this plugin is to extend our <a class="reference internal" href="sample.html#develop-plugins-sample"><span class="std std-ref">Sample</span></a> plugin by making it possible for the user to add two numbers, be it from the command line or through OpenCOR’s <code class="docutils literal notranslate"><span class="pre">Tools</span></code> menu.</p>
<section id="file-structure">
<h2>File structure<a class="headerlink" href="#file-structure" title="Link to this heading">¶</a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>i18n
└─ SampleTools_fr.ts
res
└─ SampleTools_i18n.qrc.in
src
├─ sampletoolsplugin.cpp
├─ sampletoolsplugin.h
└─ sampletoolsplugin.json
CMakeLists.txt
</pre></div>
</div>
</section>
<section id="category">
<h2>Category<a class="headerlink" href="#category" title="Link to this heading">¶</a></h2>
<p>Our plugin is part of the <a class="reference external" href="https://github.com/opencor/opencor/tree/master/src/plugins/sample/">Sample</a> category, which means that its code can be found under <a class="reference external" href="https://github.com/opencor/opencor/tree/master/src/plugins/sample/SampleTools/"><code class="docutils literal notranslate"><span class="pre">[OpenCOR]/src/plugins/sample/SampleTools/</span></code></a>.</p>
</section>
<section id="interfaces">
<h2>Interfaces<a class="headerlink" href="#interfaces" title="Link to this heading">¶</a></h2>
<p>Unlike for the <a class="reference internal" href="sample.html#develop-plugins-sample"><span class="std std-ref">Sample</span></a> plugin, we want our plugin to interact with OpenCOR.
This means that it needs to implement some <a class="reference internal" href="index.html#develop-plugins-index-interfaces"><span class="std std-ref">interfaces</span></a>.</p>
<p>More specifically, we want our plugin to work from the command line, so we need to implement the <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/cliinterface.inl">CLI</a> interface.
We also want our plugin to work through OpenCOR’s <code class="docutils literal notranslate"><span class="pre">Tools</span></code> menu, which involves creating a menu item and making it available to OpenCOR, so that it can add it to its <code class="docutils literal notranslate"><span class="pre">Tools</span></code> menu.
To do these, we need to implement both the <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/guiinterface.inl">GUI</a> and <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/plugininterface.inl">Plugin</a> interfaces.
While we are at it, we might also internationalise our plugin, which means also implementing the <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/i18ninterface.inl">Internationalisation</a> interface.</p>
</section>
<section id="cmake-project">
<h2>CMake project<a class="headerlink" href="#cmake-project" title="Link to this heading">¶</a></h2>
<p>As for the <a class="reference internal" href="sample.html#develop-plugins-sample"><span class="std std-ref">Sample</span></a> plugin, our plugin has a <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/CMakeLists.txt"><code class="docutils literal notranslate"><span class="pre">CMakeLists.txt</span></code></a> file, which contents is:</p>
<div class="highlight-cmake notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="nb">project</span><span class="p">(</span><span class="s">SampleToolsPlugin</span><span class="p">)</span>
<span class="linenos"> 2</span>
<span class="linenos"> 3</span><span class="c"># Add the plugin</span>
<span class="linenos"> 4</span>
<span class="linenos"> 5</span><span class="nb">add_plugin</span><span class="p">(</span><span class="s">SampleTools</span>
<span class="linenos"> 6</span><span class="w"> </span><span class="s">SOURCES</span>
<span class="linenos"> 7</span><span class="w"> </span><span class="s">../../cliinterface.cpp</span>
<span class="linenos"> 8</span><span class="w"> </span><span class="s">../../guiinterface.cpp</span>
<span class="linenos"> 9</span><span class="w"> </span><span class="s">../../i18ninterface.cpp</span>
<span class="linenos">10</span><span class="w"> </span><span class="s">../../plugininfo.cpp</span>
<span class="linenos">11</span><span class="w"> </span><span class="s">../../plugininterface.cpp</span>
<span class="linenos">12</span>
<span class="linenos">13</span><span class="w"> </span><span class="s">src/sampletoolsplugin.cpp</span>
<span class="linenos">14</span><span class="w"> </span><span class="s">PLUGINS</span>
<span class="linenos">15</span><span class="w"> </span><span class="s">Core</span>
<span class="linenos">16</span><span class="w"> </span><span class="s">Sample</span>
<span class="linenos">17</span><span class="p">)</span>
</pre></div>
</div>
<p>The interfaces our plugin implements come with a <code class="docutils literal notranslate"><span class="pre">.cpp</span></code> file, so we reference them (lines 7-9 and 11).
Then, our plugin needs the <a class="reference external" href="https://github.com/opencor/opencor/tree/master/src/plugins/miscellaneous/Core/">Core</a> and <a class="reference external" href="https://github.com/opencor/opencor/tree/master/src/plugins/sample/Sample/">Sample</a> plugins (the latter, to be able to use its <code class="docutils literal notranslate"><span class="pre">add()</span></code> function), so they are referenced (lines 15 and 16) using the <code class="docutils literal notranslate"><span class="pre">PLUGINS</span></code> keyword (line 14).</p>
</section>
<section id="plugin-information">
<h2>Plugin information<a class="headerlink" href="#plugin-information" title="Link to this heading">¶</a></h2>
<p>Our <a class="reference internal" href="index.html#develop-plugins-index-plugininformation"><span class="std std-ref">plugin information</span></a> can be found in <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/src/sampletoolsplugin.cpp"><code class="docutils literal notranslate"><span class="pre">sampletoolsplugin.cpp</span></code></a>, <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/src/sampletoolsplugin.h"><code class="docutils literal notranslate"><span class="pre">sampletoolsplugin.h</span></code></a>, and <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/src/sampletoolsplugin.json"><code class="docutils literal notranslate"><span class="pre">sampletoolsplugin.json</span></code></a>. Starting with <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/src/sampletoolsplugin.h"><code class="docutils literal notranslate"><span class="pre">sampletoolsplugin.h</span></code></a>, its contents is:</p>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos">28</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">"cliinterface.h"</span>
<span class="linenos">29</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">"guiinterface.h"</span>
<span class="linenos">30</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">"i18ninterface.h"</span>
<span class="linenos">31</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">"plugininfo.h"</span>
<span class="linenos">32</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">"plugininterface.h"</span>
<span class="linenos">33</span>
<span class="linenos">34</span><span class="c1">//==============================================================================</span>
<span class="linenos">35</span>
<span class="linenos">36</span><span class="k">namespace</span><span class="w"> </span><span class="nn">OpenCOR</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">37</span><span class="k">namespace</span><span class="w"> </span><span class="nn">SampleTools</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">38</span>
<span class="linenos">39</span><span class="c1">//==============================================================================</span>
<span class="linenos">40</span>
<span class="linenos">41</span><span class="n">PLUGININFO_FUNC</span><span class="w"> </span><span class="nf">SampleToolsPluginInfo</span><span class="p">();</span>
<span class="linenos">42</span>
<span class="linenos">43</span><span class="c1">//==============================================================================</span>
<span class="linenos">44</span>
<span class="linenos">45</span><span class="k">class</span><span class="w"> </span><span class="nc">SampleToolsPlugin</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">QObject</span><span class="p">,</span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">CliInterface</span><span class="p">,</span>
<span class="linenos">46</span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">GuiInterface</span><span class="p">,</span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">I18nInterface</span><span class="p">,</span>
<span class="linenos">47</span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">PluginInterface</span>
<span class="linenos">48</span><span class="p">{</span>
<span class="linenos">49</span><span class="w"> </span><span class="n">Q_OBJECT</span>
<span class="linenos">50</span>
<span class="linenos">51</span><span class="w"> </span><span class="n">Q_PLUGIN_METADATA</span><span class="p">(</span><span class="n">IID</span><span class="w"> </span><span class="s">"OpenCOR.SampleToolsPlugin"</span><span class="w"> </span><span class="kt">FILE</span><span class="w"> </span><span class="s">"sampletoolsplugin.json"</span><span class="p">)</span>
<span class="linenos">52</span>
<span class="linenos">53</span><span class="w"> </span><span class="n">Q_INTERFACES</span><span class="p">(</span><span class="n">OpenCOR</span><span class="o">::</span><span class="n">CliInterface</span><span class="p">)</span>
<span class="linenos">54</span><span class="w"> </span><span class="n">Q_INTERFACES</span><span class="p">(</span><span class="n">OpenCOR</span><span class="o">::</span><span class="n">GuiInterface</span><span class="p">)</span>
<span class="linenos">55</span><span class="w"> </span><span class="n">Q_INTERFACES</span><span class="p">(</span><span class="n">OpenCOR</span><span class="o">::</span><span class="n">I18nInterface</span><span class="p">)</span>
<span class="linenos">56</span><span class="w"> </span><span class="n">Q_INTERFACES</span><span class="p">(</span><span class="n">OpenCOR</span><span class="o">::</span><span class="n">PluginInterface</span><span class="p">)</span>
<span class="linenos">57</span>
<span class="linenos">58</span><span class="k">public</span><span class="o">:</span>
<span class="linenos">59</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">"cliinterface.inl"</span>
<span class="linenos">60</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">"guiinterface.inl"</span>
<span class="linenos">61</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">"i18ninterface.inl"</span>
<span class="linenos">62</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">"plugininterface.inl"</span>
<span class="linenos">63</span>
<span class="linenos">64</span><span class="k">private</span><span class="o">:</span>
<span class="linenos">65</span><span class="w"> </span><span class="n">QAction</span><span class="w"> </span><span class="o">*</span><span class="n">mAddTwoNumbersAction</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">nullptr</span><span class="p">;</span>
<span class="linenos">66</span>
<span class="linenos">67</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">runHelpCommand</span><span class="p">();</span>
<span class="linenos">68</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">runAddCommand</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">QStringList</span><span class="w"> </span><span class="o">&</span><span class="n">pArguments</span><span class="p">);</span>
<span class="linenos">69</span>
<span class="linenos">70</span><span class="k">private</span><span class="w"> </span><span class="n">slots</span><span class="o">:</span>
<span class="linenos">71</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">addTwoNumbers</span><span class="p">();</span>
<span class="linenos">72</span><span class="p">};</span>
<span class="linenos">73</span>
<span class="linenos">74</span><span class="c1">//==============================================================================</span>
<span class="linenos">75</span>
<span class="linenos">76</span><span class="p">}</span><span class="w"> </span><span class="c1">// namespace SampleTools</span>
<span class="linenos">77</span><span class="p">}</span><span class="w"> </span><span class="c1">// namespace OpenCOR</span>
</pre></div>
</div>
<p>As mentioned above, our plugin implements some interfaces, which means that their header file is included (lines 28-30 and 32).
It also means that our plugin class inherits from those interfaces (lines 45-47), as well as makes calls to the <code class="docutils literal notranslate"><span class="pre">Q_INTERFACES()</span></code> macro to let <a class="reference external" href="https://qt.io/">Qt</a> know which interfaces it implements (lines 53-56).
Finally, we include the inline files (lines 59-62) that declare various methods that must be implemented by our plugin (see <a class="reference internal" href="#develop-plugins-sampletools-interfacesimplementation"><span class="std std-ref">below</span></a>).
(The rest of the class definition is specific to our plugin and is discussed <a class="reference internal" href="#develop-plugins-sampletools-pluginspecific"><span class="std std-ref">below</span></a>.)</p>
<p>The C function that is used by OpenCOR to retrieve some <a class="reference internal" href="index.html#develop-plugins-index-basicinformation"><span class="std std-ref">basic information</span></a> about our plugin can be found in <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/src/sampletoolsplugin.cpp"><code class="docutils literal notranslate"><span class="pre">sampletoolsplugin.cpp</span></code></a>:</p>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos">45</span><span class="n">PLUGININFO_FUNC</span><span class="w"> </span><span class="nf">SampleToolsPluginInfo</span><span class="p">()</span>
<span class="linenos">46</span><span class="p">{</span>
<span class="linenos">47</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">Descriptions</span><span class="w"> </span><span class="n">descriptions</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">48</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s">"en"</span><span class="p">,</span><span class="w"> </span><span class="n">QString</span><span class="o">::</span><span class="n">fromUtf8</span><span class="p">(</span><span class="s">"a plugin that provides an addition tool."</span><span class="p">)</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">49</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s">"fr"</span><span class="p">,</span><span class="w"> </span><span class="n">QString</span><span class="o">::</span><span class="n">fromUtf8</span><span class="p">(</span><span class="s">"une extension qui fournit un outil d'addition."</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">50</span><span class="w"> </span><span class="p">};</span>
<span class="linenos">51</span>
<span class="linenos">52</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">PluginInfo</span><span class="p">(</span><span class="n">PluginInfo</span><span class="o">::</span><span class="n">Category</span><span class="o">::</span><span class="n">Sample</span><span class="p">,</span><span class="w"> </span><span class="nb">true</span><span class="p">,</span><span class="w"> </span><span class="nb">true</span><span class="p">,</span>
<span class="linenos">53</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s">"Core"</span><span class="p">,</span><span class="w"> </span><span class="s">"Sample"</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">54</span><span class="w"> </span><span class="n">descriptions</span><span class="p">);</span>
<span class="linenos">55</span><span class="p">}</span>
</pre></div>
</div>
<p>As can be seen, our plugin is selectable by the user and it offers direct <a class="reference external" href="https://en.wikipedia.org/wiki/Command-line_interface">CLI</a> support (line 52).
It also has a direct dependency on the <a class="reference external" href="https://github.com/opencor/opencor/tree/master/src/plugins/miscellaneous/Core/">Core</a> and <a class="reference external" href="https://github.com/opencor/opencor/tree/master/src/plugins/sample/Sample/">Sample</a> plugins (line 53).</p>
</section>
<section id="interfaces-implementation">
<span id="develop-plugins-sampletools-interfacesimplementation"></span><h2>Interfaces implementation<a class="headerlink" href="#interfaces-implementation" title="Link to this heading">¶</a></h2>
<p>The implementation of the interfaces’ various methods can be found in <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/src/sampletoolsplugin.cpp"><code class="docutils literal notranslate"><span class="pre">sampletoolsplugin.cpp</span></code></a>.
The methods are grouped by interface and are ordered alphabetically.</p>
<p>We start with the <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/cliinterface.inl">CLI</a> interface:</p>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos">57</span><span class="c1">//==============================================================================</span>
<span class="linenos">58</span><span class="c1">// CLI interface</span>
<span class="linenos">59</span><span class="c1">//==============================================================================</span>
<span class="linenos">60</span>
<span class="linenos">61</span><span class="kt">bool</span><span class="w"> </span><span class="nf">SampleToolsPlugin::executeCommand</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">QString</span><span class="w"> </span><span class="o">&</span><span class="n">pCommand</span><span class="p">,</span>
<span class="linenos">62</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">QStringList</span><span class="w"> </span><span class="o">&</span><span class="n">pArguments</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">&</span><span class="n">pRes</span><span class="p">)</span>
<span class="linenos">63</span><span class="p">{</span>
<span class="linenos">64</span><span class="w"> </span><span class="n">Q_UNUSED</span><span class="p">(</span><span class="n">pRes</span><span class="p">)</span>
<span class="linenos">65</span>
<span class="linenos">66</span><span class="w"> </span><span class="c1">// Run the given CLI command</span>
<span class="linenos">67</span>
<span class="linenos">68</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">QString</span><span class="w"> </span><span class="n">Help</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"help"</span><span class="p">;</span>
<span class="linenos">69</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">QString</span><span class="w"> </span><span class="n">Add</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"add"</span><span class="p">;</span>
<span class="linenos">70</span>
<span class="linenos">71</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pCommand</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Help</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">72</span><span class="w"> </span><span class="c1">// Display the commands that we support</span>
<span class="linenos">73</span>
<span class="linenos">74</span><span class="w"> </span><span class="n">runHelpCommand</span><span class="p">();</span>
<span class="linenos">75</span>
<span class="linenos">76</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span>
<span class="linenos">77</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">78</span>
<span class="linenos">79</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pCommand</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Add</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">80</span><span class="w"> </span><span class="c1">// Add some numbers</span>
<span class="linenos">81</span>
<span class="linenos">82</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">runAddCommand</span><span class="p">(</span><span class="n">pArguments</span><span class="p">);</span>
<span class="linenos">83</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">84</span>
<span class="linenos">85</span><span class="w"> </span><span class="c1">// Not a CLI command that we support, so show our help and leave</span>
<span class="linenos">86</span>
<span class="linenos">87</span><span class="w"> </span><span class="n">runHelpCommand</span><span class="p">();</span>
<span class="linenos">88</span>
<span class="linenos">89</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="linenos">90</span><span class="p">}</span>
<span class="linenos">91</span>
<span class="linenos">92</span><span class="c1">//==============================================================================</span>
</pre></div>
</div>
<p>As can be seen, our plugin handles both the <code class="docutils literal notranslate"><span class="pre">help</span></code> and <code class="docutils literal notranslate"><span class="pre">add</span></code> commands (lines 71-77 and 79-83, respectively).</p>
<p>Next, we have the <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/guiinterface.inl">GUI</a> interface:</p>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 92</span><span class="c1">//==============================================================================</span>
<span class="linenos"> 93</span><span class="c1">// GUI interface</span>
<span class="linenos"> 94</span><span class="c1">//==============================================================================</span>
<span class="linenos"> 95</span>
<span class="linenos"> 96</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::updateGui</span><span class="p">(</span><span class="n">Plugin</span><span class="w"> </span><span class="o">*</span><span class="n">pViewPlugin</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">QString</span><span class="w"> </span><span class="o">&</span><span class="n">pFileName</span><span class="p">)</span>
<span class="linenos"> 97</span><span class="p">{</span>
<span class="linenos"> 98</span><span class="w"> </span><span class="n">Q_UNUSED</span><span class="p">(</span><span class="n">pViewPlugin</span><span class="p">)</span>
<span class="linenos"> 99</span><span class="w"> </span><span class="n">Q_UNUSED</span><span class="p">(</span><span class="n">pFileName</span><span class="p">)</span>
<span class="linenos">100</span>
<span class="linenos">101</span><span class="w"> </span><span class="c1">// We don't handle this interface...</span>
<span class="linenos">102</span><span class="p">}</span>
<span class="linenos">103</span>
<span class="linenos">104</span><span class="c1">//==============================================================================</span>
<span class="linenos">105</span>
<span class="linenos">106</span><span class="n">Gui</span><span class="o">::</span><span class="n">Menus</span><span class="w"> </span><span class="nf">SampleToolsPlugin::guiMenus</span><span class="p">()</span><span class="w"> </span><span class="k">const</span>
<span class="linenos">107</span><span class="p">{</span>
<span class="linenos">108</span><span class="w"> </span><span class="c1">// We don't handle this interface...</span>
<span class="linenos">109</span>
<span class="linenos">110</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">{};</span>
<span class="linenos">111</span><span class="p">}</span>
<span class="linenos">112</span>
<span class="linenos">113</span><span class="c1">//==============================================================================</span>
<span class="linenos">114</span>
<span class="linenos">115</span><span class="n">Gui</span><span class="o">::</span><span class="n">MenuActions</span><span class="w"> </span><span class="nf">SampleToolsPlugin::guiMenuActions</span><span class="p">()</span><span class="w"> </span><span class="k">const</span>
<span class="linenos">116</span><span class="p">{</span>
<span class="linenos">117</span><span class="w"> </span><span class="c1">// Return our menu actions</span>
<span class="linenos">118</span>
<span class="linenos">119</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">Gui</span><span class="o">::</span><span class="n">MenuActions</span><span class="p">()</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">Gui</span><span class="o">::</span><span class="n">MenuAction</span><span class="p">(</span><span class="n">Gui</span><span class="o">::</span><span class="n">MenuAction</span><span class="o">::</span><span class="n">Type</span><span class="o">::</span><span class="n">Tools</span><span class="p">,</span><span class="w"> </span><span class="n">mAddTwoNumbersAction</span><span class="p">)</span>
<span class="linenos">120</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">Gui</span><span class="o">::</span><span class="n">MenuAction</span><span class="p">(</span><span class="n">Gui</span><span class="o">::</span><span class="n">MenuAction</span><span class="o">::</span><span class="n">Type</span><span class="o">::</span><span class="n">Tools</span><span class="p">,</span><span class="w"> </span><span class="n">Core</span><span class="o">::</span><span class="n">newSeparator</span><span class="p">(</span><span class="n">Core</span><span class="o">::</span><span class="n">mainWindow</span><span class="p">()));</span>
<span class="linenos">121</span><span class="p">}</span>
<span class="linenos">122</span>
<span class="linenos">123</span><span class="c1">//==============================================================================</span>
</pre></div>
</div>
<p>Our plugin does not need to do anything whenever OpenCOR needs to update the <a class="reference external" href="https://en.wikipedia.org/wiki/Graphical_user_interface">GUI</a>, so we do nothing in <code class="docutils literal notranslate"><span class="pre">updateGui()</span></code> (lines 96-102).
Similarly, we do not need to add menus to OpenCOR, so all <code class="docutils literal notranslate"><span class="pre">guiMenus()</span></code> does is return <code class="docutils literal notranslate"><span class="pre">Gui::Menus()</span></code> (lines 106-111).
However, we do want to add a menu action (and a menu separator) to OpenCOR’s <code class="docutils literal notranslate"><span class="pre">Tools</span></code> menu, which we do via <code class="docutils literal notranslate"><span class="pre">guiMenuActions()</span></code> (lines 115-121).
Note that <code class="docutils literal notranslate"><span class="pre">mAddTwoNumbersAction</span></code> is initialised in our implementation of the <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/plugininterface.inl">Plugin</a> interface (see <a class="reference internal" href="#develop-plugins-sampletools-plugininterface"><span class="std std-ref">below</span></a>).</p>
<p>After the <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/guiinterface.inl">GUI</a> interface, we have the <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/i18ninterface.inl">Internationalisation</a> interface:</p>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos">123</span><span class="c1">//==============================================================================</span>
<span class="linenos">124</span><span class="c1">// I18n interface</span>
<span class="linenos">125</span><span class="c1">//==============================================================================</span>
<span class="linenos">126</span>
<span class="linenos">127</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::retranslateUi</span><span class="p">()</span>
<span class="linenos">128</span><span class="p">{</span>
<span class="linenos">129</span><span class="w"> </span><span class="c1">// Retranslate our different Tools actions</span>
<span class="linenos">130</span>
<span class="linenos">131</span><span class="w"> </span><span class="n">retranslateAction</span><span class="p">(</span><span class="n">mAddTwoNumbersAction</span><span class="p">,</span><span class="w"> </span><span class="n">tr</span><span class="p">(</span><span class="s">"Add Two Numbers..."</span><span class="p">),</span><span class="w"> </span><span class="n">tr</span><span class="p">(</span><span class="s">"Add two numbers together"</span><span class="p">));</span>
<span class="linenos">132</span><span class="p">}</span>
<span class="linenos">133</span>
<span class="linenos">134</span><span class="c1">//==============================================================================</span>
</pre></div>
</div>
<p>All that we need to do is (re)translate <code class="docutils literal notranslate"><span class="pre">mAddTwoNumbersAction</span></code> with the actual (French) translations in <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/i18n/SampleTools_fr.ts"><code class="docutils literal notranslate"><span class="pre">SampleTools_fr.ts</span></code></a> (together with some other translations needed <a class="reference internal" href="#develop-plugins-sampletools-pluginspecific"><span class="std std-ref">below</span></a>).</p>
<p id="develop-plugins-sampletools-plugininterface">Finally, we have the <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/plugininterface.inl">Plugin</a> interface:</p>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos">134</span><span class="c1">//==============================================================================</span>
<span class="linenos">135</span><span class="c1">// Plugin interface</span>
<span class="linenos">136</span><span class="c1">//==============================================================================</span>
<span class="linenos">137</span>
<span class="linenos">138</span><span class="kt">bool</span><span class="w"> </span><span class="nf">SampleToolsPlugin::definesPluginInterfaces</span><span class="p">()</span>
<span class="linenos">139</span><span class="p">{</span>
<span class="linenos">140</span><span class="w"> </span><span class="c1">// We don't handle this interface...</span>
<span class="linenos">141</span>
<span class="linenos">142</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="linenos">143</span><span class="p">}</span>
<span class="linenos">144</span>
<span class="linenos">145</span><span class="c1">//==============================================================================</span>
<span class="linenos">146</span>
<span class="linenos">147</span><span class="kt">bool</span><span class="w"> </span><span class="nf">SampleToolsPlugin::pluginInterfacesOk</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">QString</span><span class="w"> </span><span class="o">&</span><span class="n">pFileName</span><span class="p">,</span>
<span class="linenos">148</span><span class="w"> </span><span class="n">QObject</span><span class="w"> </span><span class="o">*</span><span class="n">pInstance</span><span class="p">)</span>
<span class="linenos">149</span><span class="p">{</span>
<span class="linenos">150</span><span class="w"> </span><span class="n">Q_UNUSED</span><span class="p">(</span><span class="n">pFileName</span><span class="p">)</span>
<span class="linenos">151</span><span class="w"> </span><span class="n">Q_UNUSED</span><span class="p">(</span><span class="n">pInstance</span><span class="p">)</span>
<span class="linenos">152</span>
<span class="linenos">153</span><span class="w"> </span><span class="c1">// We don't handle this interface...</span>
<span class="linenos">154</span>
<span class="linenos">155</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="linenos">156</span><span class="p">}</span>
<span class="linenos">157</span>
<span class="linenos">158</span><span class="c1">//==============================================================================</span>
<span class="linenos">159</span>
<span class="linenos">160</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::initializePlugin</span><span class="p">()</span>
<span class="linenos">161</span><span class="p">{</span>
<span class="linenos">162</span><span class="w"> </span><span class="c1">// Create our Add Two Numbers action</span>
<span class="linenos">163</span>
<span class="linenos">164</span><span class="w"> </span><span class="n">mAddTwoNumbersAction</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">QAction</span><span class="p">(</span><span class="n">Core</span><span class="o">::</span><span class="n">mainWindow</span><span class="p">());</span>
<span class="linenos">165</span>
<span class="linenos">166</span><span class="w"> </span><span class="c1">// A connection to handle our Add Two Numbers action</span>
<span class="linenos">167</span>
<span class="linenos">168</span><span class="w"> </span><span class="n">connect</span><span class="p">(</span><span class="n">mAddTwoNumbersAction</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">QAction</span><span class="o">::</span><span class="n">triggered</span><span class="p">,</span>
<span class="linenos">169</span><span class="w"> </span><span class="k">this</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">SampleToolsPlugin</span><span class="o">::</span><span class="n">addTwoNumbers</span><span class="p">);</span>
<span class="linenos">170</span><span class="p">}</span>
<span class="linenos">171</span>
<span class="linenos">172</span><span class="c1">//==============================================================================</span>
<span class="linenos">173</span>
<span class="linenos">174</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::finalizePlugin</span><span class="p">()</span>
<span class="linenos">175</span><span class="p">{</span>
<span class="linenos">176</span><span class="w"> </span><span class="c1">// We don't handle this interface...</span>
<span class="linenos">177</span><span class="p">}</span>
<span class="linenos">178</span>
<span class="linenos">179</span><span class="c1">//==============================================================================</span>
<span class="linenos">180</span>
<span class="linenos">181</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::pluginsInitialized</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">Plugins</span><span class="w"> </span><span class="o">&</span><span class="n">pLoadedPlugins</span><span class="p">)</span>
<span class="linenos">182</span><span class="p">{</span>
<span class="linenos">183</span><span class="w"> </span><span class="n">Q_UNUSED</span><span class="p">(</span><span class="n">pLoadedPlugins</span><span class="p">)</span>
<span class="linenos">184</span>
<span class="linenos">185</span><span class="w"> </span><span class="c1">// We don't handle this interface...</span>
<span class="linenos">186</span><span class="p">}</span>
<span class="linenos">187</span>
<span class="linenos">188</span><span class="c1">//==============================================================================</span>
<span class="linenos">189</span>
<span class="linenos">190</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::loadSettings</span><span class="p">(</span><span class="n">QSettings</span><span class="w"> </span><span class="o">&</span><span class="n">pSettings</span><span class="p">)</span>
<span class="linenos">191</span><span class="p">{</span>
<span class="linenos">192</span><span class="w"> </span><span class="n">Q_UNUSED</span><span class="p">(</span><span class="n">pSettings</span><span class="p">)</span>
<span class="linenos">193</span>
<span class="linenos">194</span><span class="w"> </span><span class="c1">// We don't handle this interface...</span>
<span class="linenos">195</span><span class="p">}</span>
<span class="linenos">196</span>
<span class="linenos">197</span><span class="c1">//==============================================================================</span>
<span class="linenos">198</span>
<span class="linenos">199</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::saveSettings</span><span class="p">(</span><span class="n">QSettings</span><span class="w"> </span><span class="o">&</span><span class="n">pSettings</span><span class="p">)</span><span class="w"> </span><span class="k">const</span>
<span class="linenos">200</span><span class="p">{</span>
<span class="linenos">201</span><span class="w"> </span><span class="n">Q_UNUSED</span><span class="p">(</span><span class="n">pSettings</span><span class="p">)</span>
<span class="linenos">202</span>
<span class="linenos">203</span><span class="w"> </span><span class="c1">// We don't handle this interface...</span>
<span class="linenos">204</span><span class="p">}</span>
<span class="linenos">205</span>
<span class="linenos">206</span><span class="c1">//==============================================================================</span>
<span class="linenos">207</span>
<span class="linenos">208</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::handleUrl</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">QUrl</span><span class="w"> </span><span class="o">&</span><span class="n">pUrl</span><span class="p">)</span>
<span class="linenos">209</span><span class="p">{</span>
<span class="linenos">210</span><span class="w"> </span><span class="n">Q_UNUSED</span><span class="p">(</span><span class="n">pUrl</span><span class="p">)</span>
<span class="linenos">211</span>
<span class="linenos">212</span><span class="w"> </span><span class="c1">// We don't handle this interface...</span>
<span class="linenos">213</span><span class="p">}</span>
<span class="linenos">214</span>
<span class="linenos">215</span><span class="c1">//==============================================================================</span>
</pre></div>
</div>
<p>The only method of interest to our plugin is <code class="docutils literal notranslate"><span class="pre">initializePlugin()</span></code> (lines 160-170), which is where we initialise <code class="docutils literal notranslate"><span class="pre">mAddTwoNumbersAction</span></code>, among other things.
All the other methods (<code class="docutils literal notranslate"><span class="pre">definesPluginInterfaces()</span></code>, <code class="docutils literal notranslate"><span class="pre">pluginInterfacesOk()</span></code>, <code class="docutils literal notranslate"><span class="pre">finalizePlugin()</span></code>, <code class="docutils literal notranslate"><span class="pre">pluginsInitialized()</span></code>, <code class="docutils literal notranslate"><span class="pre">loadSettings()</span></code>, <code class="docutils literal notranslate"><span class="pre">saveSettings()</span></code>, and <code class="docutils literal notranslate"><span class="pre">handleUrl()</span></code>) are left empty.</p>
</section>
<section id="plugin-specific">
<span id="develop-plugins-sampletools-pluginspecific"></span><h2>Plugin specific<a class="headerlink" href="#plugin-specific" title="Link to this heading">¶</a></h2>
<p>Some extra methods are needed to get our plugin to do what it is supposed to be doing.
They are declared in the <code class="docutils literal notranslate"><span class="pre">SampleToolsPlugin</span></code> class in <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/src/sampletoolsplugin.h"><code class="docutils literal notranslate"><span class="pre">sampletoolsplugin.h</span></code></a>:</p>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos">64</span><span class="k">private</span><span class="o">:</span>
<span class="linenos">65</span><span class="w"> </span><span class="n">QAction</span><span class="w"> </span><span class="o">*</span><span class="n">mAddTwoNumbersAction</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">nullptr</span><span class="p">;</span>
<span class="linenos">66</span>
<span class="linenos">67</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">runHelpCommand</span><span class="p">();</span>
<span class="linenos">68</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">runAddCommand</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">QStringList</span><span class="w"> </span><span class="o">&</span><span class="n">pArguments</span><span class="p">);</span>
<span class="linenos">69</span>
<span class="linenos">70</span><span class="k">private</span><span class="w"> </span><span class="n">slots</span><span class="o">:</span>
<span class="linenos">71</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">addTwoNumbers</span><span class="p">();</span>
</pre></div>
</div>
<p>Their implementation can be found in <a class="reference external" href="https://github.com/opencor/opencor/blob/master/src/plugins/sample/SampleTools/src/sampletoolsplugin.cpp"><code class="docutils literal notranslate"><span class="pre">sampletoolsplugin.cpp</span></code></a>:</p>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos">215</span><span class="c1">//==============================================================================</span>
<span class="linenos">216</span><span class="c1">// Plugin specific</span>
<span class="linenos">217</span><span class="c1">//==============================================================================</span>
<span class="linenos">218</span>
<span class="linenos">219</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::runHelpCommand</span><span class="p">()</span>
<span class="linenos">220</span><span class="p">{</span>
<span class="linenos">221</span><span class="w"> </span><span class="c1">// Output the commands we support</span>
<span class="linenos">222</span>
<span class="linenos">223</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Commands supported by the SampleTools plugin:"</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">224</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" * Display the commands supported by the SampleTools plugin:"</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">225</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" help"</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">226</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" * Add two numbers:"</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">227</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" add <nb1> <nb2>"</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">228</span><span class="p">}</span>
<span class="linenos">229</span>
<span class="linenos">230</span><span class="c1">//==============================================================================</span>
<span class="linenos">231</span>
<span class="linenos">232</span><span class="kt">bool</span><span class="w"> </span><span class="nf">SampleToolsPlugin::runAddCommand</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">QStringList</span><span class="w"> </span><span class="o">&</span><span class="n">pArguments</span><span class="p">)</span>
<span class="linenos">233</span><span class="p">{</span>
<span class="linenos">234</span><span class="w"> </span><span class="c1">// Make sure that we have the correct number of arguments</span>
<span class="linenos">235</span>
<span class="linenos">236</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pArguments</span><span class="p">.</span><span class="n">count</span><span class="p">()</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">237</span><span class="w"> </span><span class="n">runHelpCommand</span><span class="p">();</span>
<span class="linenos">238</span>
<span class="linenos">239</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="linenos">240</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">241</span>
<span class="linenos">242</span><span class="w"> </span><span class="c1">// Make sure that the two arguments are valid numbers</span>
<span class="linenos">243</span>
<span class="linenos">244</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">ok</span><span class="p">;</span>
<span class="linenos">245</span>
<span class="linenos">246</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">nb1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pArguments</span><span class="p">.</span><span class="n">first</span><span class="p">().</span><span class="n">toDouble</span><span class="p">(</span><span class="o">&</span><span class="n">ok</span><span class="p">);</span>
<span class="linenos">247</span>
<span class="linenos">248</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">ok</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">249</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Sorry, but "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">qPrintable</span><span class="p">(</span><span class="n">pArguments</span><span class="p">.</span><span class="n">first</span><span class="p">())</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" is not a valid number."</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">250</span>
<span class="linenos">251</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="linenos">252</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">253</span>
<span class="linenos">254</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">nb2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pArguments</span><span class="p">.</span><span class="n">last</span><span class="p">().</span><span class="n">toDouble</span><span class="p">(</span><span class="o">&</span><span class="n">ok</span><span class="p">);</span>
<span class="linenos">255</span>
<span class="linenos">256</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">ok</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">257</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"Sorry, but "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">qPrintable</span><span class="p">(</span><span class="n">pArguments</span><span class="p">.</span><span class="n">last</span><span class="p">())</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" is not a valid number."</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">258</span>
<span class="linenos">259</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="linenos">260</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">261</span>
<span class="linenos">262</span><span class="w"> </span><span class="c1">// Add the two numbers and output the result</span>
<span class="linenos">263</span>
<span class="linenos">264</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">qPrintable</span><span class="p">(</span><span class="n">pArguments</span><span class="p">.</span><span class="n">first</span><span class="p">())</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" + "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">qPrintable</span><span class="p">(</span><span class="n">pArguments</span><span class="p">.</span><span class="n">last</span><span class="p">())</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" = "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">Sample</span><span class="o">::</span><span class="n">add</span><span class="p">(</span><span class="n">nb1</span><span class="p">,</span><span class="w"> </span><span class="n">nb2</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="linenos">265</span>
<span class="linenos">266</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span>
<span class="linenos">267</span><span class="p">}</span>
<span class="linenos">268</span>
<span class="linenos">269</span><span class="c1">//==============================================================================</span>
<span class="linenos">270</span>
<span class="linenos">271</span><span class="kt">void</span><span class="w"> </span><span class="nf">SampleToolsPlugin::addTwoNumbers</span><span class="p">()</span>
<span class="linenos">272</span><span class="p">{</span>
<span class="linenos">273</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">ok</span><span class="p">;</span>
<span class="linenos">274</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">nb1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">QInputDialog</span><span class="o">::</span><span class="n">getDouble</span><span class="p">(</span><span class="n">Core</span><span class="o">::</span><span class="n">mainWindow</span><span class="p">(),</span><span class="w"> </span><span class="n">tr</span><span class="p">(</span><span class="s">"Add Two Numbers"</span><span class="p">),</span><span class="w"> </span><span class="n">tr</span><span class="p">(</span><span class="s">"First number:"</span><span class="p">),</span>
<span class="linenos">275</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">-2147483647</span><span class="p">,</span><span class="w"> </span><span class="mi">2147483647</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">ok</span><span class="p">);</span>
<span class="linenos">276</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">nb2</span><span class="p">;</span>
<span class="linenos">277</span>
<span class="linenos">278</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ok</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">279</span><span class="w"> </span><span class="n">nb2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">QInputDialog</span><span class="o">::</span><span class="n">getDouble</span><span class="p">(</span><span class="n">Core</span><span class="o">::</span><span class="n">mainWindow</span><span class="p">(),</span><span class="w"> </span><span class="n">tr</span><span class="p">(</span><span class="s">"Add Two Numbers"</span><span class="p">),</span><span class="w"> </span><span class="n">tr</span><span class="p">(</span><span class="s">"Second number:"</span><span class="p">),</span>
<span class="linenos">280</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">-2147483647</span><span class="p">,</span><span class="w"> </span><span class="mi">2147483647</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">ok</span><span class="p">);</span>
<span class="linenos">281</span>
<span class="linenos">282</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ok</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">283</span><span class="w"> </span><span class="n">Core</span><span class="o">::</span><span class="n">informationMessageBox</span><span class="p">(</span><span class="n">tr</span><span class="p">(</span><span class="s">"Add Two Numbers"</span><span class="p">),</span>
<span class="linenos">284</span><span class="w"> </span><span class="n">QString</span><span class="o">::</span><span class="n">number</span><span class="p">(</span><span class="n">nb1</span><span class="p">)</span><span class="o">+</span><span class="s">" + "</span><span class="o">+</span><span class="n">QString</span><span class="o">::</span><span class="n">number</span><span class="p">(</span><span class="n">nb2</span><span class="p">)</span><span class="o">+</span><span class="s">" = "</span><span class="o">+</span><span class="n">QString</span><span class="o">::</span><span class="n">number</span><span class="p">(</span><span class="n">Sample</span><span class="o">::</span><span class="n">add</span><span class="p">(</span><span class="n">nb1</span><span class="p">,</span><span class="w"> </span><span class="n">nb2</span><span class="p">)));</span>
<span class="linenos">285</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">286</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">287</span><span class="p">}</span>
<span class="linenos">288</span>
<span class="linenos">289</span><span class="c1">//==============================================================================</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">runHelpCommand()</span></code> (lines 219-228) is the method that is executed whenever our plugin is asked to handle the <code class="docutils literal notranslate"><span class="pre">help</span></code> command.
It provides the user with some information about the commands it supports.
In a similar way, <code class="docutils literal notranslate"><span class="pre">runAddCommand()</span></code> (lines 232-267) is executed whenever our plugin is asked to handle the <code class="docutils literal notranslate"><span class="pre">add</span></code> command.
It checks that two numbers have been passed and, if so, returns their sum to the user.</p>
<p><code class="docutils literal notranslate"><span class="pre">addTwoNumbers()</span></code> (lines 271-287) is a <a class="reference external" href="https://qt.io/">Qt</a> slot that is executed whenever the user selects our menu item (see <code class="docutils literal notranslate"><span class="pre">mAddTwoNumbersAction</span></code>).
Using a <a class="reference external" href="https://en.wikipedia.org/wiki/Graphical_user_interface">GUI</a> approach, it asks the user to provide two numbers and returns their sum, unless the user decides to cancel the action.</p>
</section>
</section>
<script type="text/javascript">
copyright("../../_static");
</script>
</body>
</html>