+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="et" xmlns="http://www.w3.org/1999/xhtml" xml:lang="et">
+
+ <head>
+ <meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
+ <title>eVaf Tutorial - 10 - GUI Module</title>
+ <meta name="Author" content="Enar Väikene" />
+ <meta name="description" content="eVaf Tutorial" />
+ <meta name="keywords" content="evaf c++ application development framework tutorial password generator" />
+ <link rel="StyleSheet" href="evaf.css" type="text/css" media="all" />
+ <link rel="StyleSheet" href="highlight.css" type="text/css" media="all" />
+ </head>
+
+ <body>
+
+ <h1>eVaf Tutorial</h1>
+
+ <h2>10 - GUI Module</h2>
+
+ <p>Create the <tt>gui.cpp</tt> file in the <tt>src/apps/PswGen/GUI</tt> directory:</p>
+
+ <pre class="hl"><span class="hl com">/**</span>
+<span class="hl com"> * @file PswGen/GUI/gui.cpp</span>
+<span class="hl com"> */</span>
+
+<span class="hl ppc">#include</span> <span class="hl pps">"gui.h"</span><span class="hl ppc"></span>
+
+<span class="hl ppc">#include <QtGui></span></pre>
+
+ <p>Copy version information files from the <tt>Storage</tt> module:</p>
+
+ <pre>evaf/src/apps/PswGen/GUI $ <code>cp ../Storage/version.{h,rc} .</code></pre>
+
+ <p>Modify the <tt>version.h</tt> file:</p>
+
+ <pre class="hl"><span class="hl com">/**</span>
+<span class="hl com"> * @file PswGen/GUI/version.h</span>
+<span class="hl com"> */</span>
+
+<span class="hl ppc">#ifndef __PSWGEN_GUI_VERSION_H</span>
+<span class="hl ppc"># define __PSWGEN_GUI_VERSION_H</span>
+
+<span class="hl ppc">#include <version_rc.h></span>
+
+<span class="hl com">/**</span>
+<span class="hl com"> * Module/library version number in the form major,minor,release,build</span>
+<span class="hl com"> */</span>
+<span class="hl ppc">#define VER_FILE_VERSION 0,1,1,1</span>
+
+<span class="hl com">/**</span>
+<span class="hl com"> * Module/library version number in the string format (shall end with \0)</span>
+<span class="hl com"> */</span>
+<span class="hl ppc">#define VER_FILE_VERSION_STR</span> <span class="hl pps">"0.1.1.2\0"</span><span class="hl ppc"></span>
+
+<span class="hl com">/**</span>
+<span class="hl com"> * Module/library name (shall end with \0)</span>
+<span class="hl com"> */</span>
+<span class="hl ppc">#define VER_MODULE_NAME_STR</span> <span class="hl pps">"PswGui\0"</span><span class="hl ppc"></span>
+
+<span class="hl com">/**</span>
+<span class="hl com"> * Module type (see version_rc.h for all the types)</span>
+<span class="hl com"> */</span>
+<span class="hl ppc">#define VER_MODULE_TYPE MT_GENERIC</span>
+
+<span class="hl com">/**</span>
+<span class="hl com"> * Module type in the string format (see version_rc for all the types)</span>
+<span class="hl com"> */</span>
+<span class="hl ppc">#define VER_MODULE_TYPE_STR MT_GENERIC</span>
+
+<span class="hl com">/**</span>
+<span class="hl com"> * Original file name for windows (shall end with \0)</span>
+<span class="hl com"> */</span>
+<span class="hl ppc">#define VER_ORIGINAL_FILE_NAME_STR</span> <span class="hl pps">"PswGui.dll\0"</span><span class="hl ppc"></span>
+
+<span class="hl com">/**</span>
+<span class="hl com"> * Description of the module/library (shall end with \0)</span>
+<span class="hl com"> */</span>
+<span class="hl ppc">#define VER_FILE_DESCRIPTION_STR</span> <span class="hl pps">"User interface for the PswGen application.\0"</span><span class="hl ppc"></span>
+
+<span class="hl ppc">#endif</span> <span class="hl slc">// version.h</span><span class="hl ppc"></span></pre>
+
+ <p>Include the <tt>version.h</tt> header file in the <tt>gui.cpp</tt> file and export version information:</p>
+
+ <pre class="hl"><span class="hl ppc">#include</span> <span class="hl pps">"version.h"</span><span class="hl ppc"></span>
+<span class="hl kwd">VER_EXPORT_VERSION_INFO</span><span class="hl opt">()</span></pre>
+
+ <p>Use the <tt>Q_EXPORT_PLUGIN2()</tt> macro to make it a Qt plugin:</p>
+
+ <pre class="hl"><span class="hl kwd">Q_EXPORT_PLUGIN2</span><span class="hl opt">(</span>VER_MODULE_NAME_STR<span class="hl opt">,</span> eVaf<span class="hl opt">::</span>PswGen<span class="hl opt">::</span>GUI<span class="hl opt">::</span>Module<span class="hl opt">)</span></pre>
+
+ <p>The main job of setting up the user interface is done in the <tt>init()</tt> function and our constructor and destructor are
+ very simple:</p>
+
+ <pre class="hl">Module<span class="hl opt">::</span><span class="hl kwd">Module</span><span class="hl opt">()</span>
+ <span class="hl opt">:</span> Plugins<span class="hl opt">::</span><span class="hl kwd">iPlugin</span><span class="hl opt">()</span>
+ <span class="hl opt">,</span> <span class="hl kwd">mReady</span><span class="hl opt">(</span><span class="hl kwa">false</span><span class="hl opt">)</span>
+ <span class="hl opt">,</span> <span class="hl kwd">mGenerator</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">)</span>
+ <span class="hl opt">,</span> <span class="hl kwd">mStorage</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">)</span>
+<span class="hl opt">{</span>
+ <span class="hl kwd">setObjectName</span><span class="hl opt">(</span><span class="hl kwd">QString</span><span class="hl opt">(</span><span class="hl str">"%1.%2"</span><span class="hl opt">).</span><span class="hl kwd">arg</span><span class="hl opt">(</span>VER_MODULE_NAME_STR<span class="hl opt">).</span><span class="hl kwd">arg</span><span class="hl opt">(</span>__FUNCTION__<span class="hl opt">));</span>
+
+ <span class="hl kwd">EVAF_INFO</span><span class="hl opt">(</span><span class="hl str">"%s created"</span><span class="hl opt">,</span> <span class="hl kwd">qPrintable</span><span class="hl opt">(</span><span class="hl kwd">objectName</span><span class="hl opt">()));</span>
+<span class="hl opt">}</span>
+
+Module<span class="hl opt">::~</span><span class="hl kwd">Module</span><span class="hl opt">()</span>
+<span class="hl opt">{</span>
+ <span class="hl kwd">EVAF_INFO</span><span class="hl opt">(</span><span class="hl str">"%s destroyed"</span><span class="hl opt">,</span> <span class="hl kwd">qPrintable</span><span class="hl opt">(</span><span class="hl kwd">objectName</span><span class="hl opt">()));</span>
+<span class="hl opt">}</span></pre>
+
+ <p>The <tt>init()</tt> function:</p>
+
+ <ol>
+ <li>Queries and stores interfaces implemented in other modules. The <tt>iGenerator</tt> interface must be implemented;
+ the <tt>iStorage</tt> interface is optional and we can work without it.</li>
+ <li>Gets the main window interface <tt>iSdiWindow</tt>.</li>
+ <li>Creates the layout for the main window widget and adds our widgets to the layout.</li>
+ <li>Connects signals on widgets to slots in this class.</li>
+ <li>Uses actions <tt>QAction</tt> to add keyboard shortcuts -- <tt>Enter</tt> key generates a password and <tt>Esc</tt> key
+ quits the application.</li>
+ <li>Sets the <tt>mReady</tt> flag to true when all this is done.</li>
+ </ol>
+
+ <pre class="hl"><span class="hl kwb">bool</span> Module<span class="hl opt">::</span><span class="hl kwd">init</span><span class="hl opt">(</span>QString <span class="hl kwb">const</span> <span class="hl opt">&</span> args<span class="hl opt">)</span>
+<span class="hl opt">{</span>
+ <span class="hl kwd">Q_UNUSED</span><span class="hl opt">(</span>args<span class="hl opt">);</span>
+
+ <span class="hl slc">// Get the iGenerator interface</span>
+ <span class="hl kwd">EVAF_TEST_X</span><span class="hl opt">((</span>mGenerator <span class="hl opt">=</span> evafQueryInterface<span class="hl opt"><</span>PswGen<span class="hl opt">::</span>iGenerator<span class="hl opt">>(</span><span class="hl str">"iGenerator"</span><span class="hl opt">)),</span> <span class="hl str">"No iGenerator interface"</span><span class="hl opt">);</span>
+
+ <span class="hl slc">// Get the iStorage interface (can be null)</span>
+ mStorage <span class="hl opt">=</span> evafQueryInterface<span class="hl opt"><</span>PswGen<span class="hl opt">::</span>iStorage<span class="hl opt">>(</span><span class="hl str">"iStorage"</span><span class="hl opt">);</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(!</span>mStorage<span class="hl opt">)</span>
+ <span class="hl kwd">EVAF_WARNING</span><span class="hl opt">(</span><span class="hl str">"No iStorage interface"</span><span class="hl opt">);</span>
+
+ <span class="hl slc">// Get the main window interface and fill it with widgets</span>
+ SdiWindow<span class="hl opt">::</span>iSdiWindow <span class="hl opt">*</span> win <span class="hl opt">=</span> evafQueryInterface<span class="hl opt"><</span>SdiWindow<span class="hl opt">::</span>iSdiWindow<span class="hl opt">>(</span><span class="hl str">"iSdiWindow"</span><span class="hl opt">);</span>
+ <span class="hl kwd">EVAF_TEST_X</span><span class="hl opt">(</span>win<span class="hl opt">,</span> <span class="hl str">"No iSdiWindow interface"</span><span class="hl opt">);</span>
+
+ QVBoxLayout <span class="hl opt">*</span> v <span class="hl opt">=</span> <span class="hl kwa">new</span> QVBoxLayout<span class="hl opt">;</span>
+ win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">()-></span><span class="hl kwd">setLayout</span><span class="hl opt">(</span>v<span class="hl opt">);</span>
+
+ QGridLayout <span class="hl opt">*</span> g <span class="hl opt">=</span> <span class="hl kwa">new</span> QGridLayout<span class="hl opt">;</span>
+ v<span class="hl opt">-></span><span class="hl kwd">addLayout</span><span class="hl opt">(</span>g<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">setColumnStretch</span><span class="hl opt">(</span><span class="hl num">2</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">);</span>
+
+ QLabel <span class="hl opt">*</span> l <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QLabel</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"Master &password:"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setAlignment</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>AlignRight<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>l<span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
+
+ wMasterPassword <span class="hl opt">=</span> <span class="hl kwa">new</span> QLineEdit<span class="hl opt">;</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setBuddy</span><span class="hl opt">(</span>wMasterPassword<span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>wMasterPassword<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString<span class="hl opt">)),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString<span class="hl opt">)));</span>
+ wMasterPassword<span class="hl opt">-></span><span class="hl kwd">setEchoMode</span><span class="hl opt">(</span>QLineEdit<span class="hl opt">::</span>Password<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wMasterPassword<span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">);</span>
+
+ l <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QLabel</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"Web site or application &name:"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setAlignment</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>AlignRight<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>l<span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
+
+ wName <span class="hl opt">=</span> <span class="hl kwa">new</span> QLineEdit<span class="hl opt">;</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setBuddy</span><span class="hl opt">(</span>wName<span class="hl opt">);</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>mStorage<span class="hl opt">) {</span>
+ QCompleter <span class="hl opt">*</span> completer <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QCompleter</span><span class="hl opt">(</span>wName<span class="hl opt">);</span>
+ completer<span class="hl opt">-></span><span class="hl kwd">setModel</span><span class="hl opt">(</span>mStorage<span class="hl opt">-></span><span class="hl kwd">autoCompletionModel</span><span class="hl opt">());</span>
+ completer<span class="hl opt">-></span><span class="hl kwd">setCompletionMode</span><span class="hl opt">(</span>QCompleter<span class="hl opt">::</span>InlineCompletion<span class="hl opt">);</span>
+ wName<span class="hl opt">-></span><span class="hl kwd">setCompleter</span><span class="hl opt">(</span>completer<span class="hl opt">);</span>
+ <span class="hl opt">}</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>wName<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString<span class="hl opt">)),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString<span class="hl opt">)));</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wName<span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">);</span>
+ win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">()-></span><span class="hl kwd">setFocusProxy</span><span class="hl opt">(</span>wName<span class="hl opt">);</span>
+
+ l <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QLabel</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"&Length of the password:"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setAlignment</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>AlignRight<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>l<span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
+
+ wLength <span class="hl opt">=</span> <span class="hl kwa">new</span> QSpinBox<span class="hl opt">;</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setBuddy</span><span class="hl opt">(</span>wLength<span class="hl opt">);</span>
+ wLength<span class="hl opt">-></span><span class="hl kwd">setRange</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,</span> mGenerator<span class="hl opt">-></span><span class="hl kwd">maxLength</span><span class="hl opt">());</span>
+ wLength<span class="hl opt">-></span><span class="hl kwd">setValue</span><span class="hl opt">(</span>DefaultPasswordLength<span class="hl opt">);</span>
+ wLength<span class="hl opt">-></span><span class="hl kwd">setSpecialValueText</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"Maximum"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wLength<span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">);</span>
+
+ l <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QLabel</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"Password:"</span><span class="hl opt">));</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setAlignment</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>AlignRight<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>l<span class="hl opt">,</span> <span class="hl num">3</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
+
+ wPassword <span class="hl opt">=</span> <span class="hl kwa">new</span> QLineEdit<span class="hl opt">;</span>
+ wPassword<span class="hl opt">-></span><span class="hl kwd">setReadOnly</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wPassword<span class="hl opt">,</span> <span class="hl num">3</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">);</span>
+
+ v<span class="hl opt">-></span><span class="hl kwd">addStretch</span><span class="hl opt">();</span>
+
+ QHBoxLayout <span class="hl opt">*</span> h <span class="hl opt">=</span> <span class="hl kwa">new</span> QHBoxLayout<span class="hl opt">;</span>
+ h<span class="hl opt">-></span><span class="hl kwd">addStretch</span><span class="hl opt">();</span>
+ v<span class="hl opt">-></span><span class="hl kwd">addLayout</span><span class="hl opt">(</span>h<span class="hl opt">);</span>
+
+ wGenerate <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QPushButton</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"&Generate"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ wGenerate<span class="hl opt">-></span><span class="hl kwd">setDisabled</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ wGenerate<span class="hl opt">-></span><span class="hl kwd">setDefault</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>wGenerate<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">clicked</span><span class="hl opt">()),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">generateClicked</span><span class="hl opt">()));</span>
+ h<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wGenerate<span class="hl opt">);</span>
+
+ wCopy <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QPushButton</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"&Copy to Clipboard"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ wCopy<span class="hl opt">-></span><span class="hl kwd">setDisabled</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>wCopy<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">clicked</span><span class="hl opt">()),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">copyClicked</span><span class="hl opt">()));</span>
+ h<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wCopy<span class="hl opt">);</span>
+
+ QAction <span class="hl opt">*</span> a <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QAction</span><span class="hl opt">(</span>win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">());</span>
+ a<span class="hl opt">-></span><span class="hl kwd">setShortcut</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>Key_Return<span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>a<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">triggered</span><span class="hl opt">()),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">generateClicked</span><span class="hl opt">()));</span>
+ win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">()-></span><span class="hl kwd">addAction</span><span class="hl opt">(</span>a<span class="hl opt">);</span>
+
+ a <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QAction</span><span class="hl opt">(</span>win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">());</span>
+ a<span class="hl opt">-></span><span class="hl kwd">setShortcut</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>Key_Escape<span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>a<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">triggered</span><span class="hl opt">()),</span> qApp<span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">quit</span><span class="hl opt">()));</span>
+ win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">()-></span><span class="hl kwd">addAction</span><span class="hl opt">(</span>a<span class="hl opt">);</span>
+
+ mReady <span class="hl opt">=</span> <span class="hl kwa">true</span><span class="hl opt">;</span>
+
+ <span class="hl kwd">EVAF_INFO</span><span class="hl opt">(</span><span class="hl str">"%s initialized"</span><span class="hl opt">,</span> <span class="hl kwd">qPrintable</span><span class="hl opt">(</span><span class="hl kwd">objectName</span><span class="hl opt">()));</span>
+
+ <span class="hl kwa">return true</span><span class="hl opt">;</span>
+<span class="hl opt">}</span></pre>
+
+ <p>The <tt>done()</tt> function simply sets the <tt>mReady</tt> flag back to <tt>false</tt>:</p>
+
+ <pre class="hl"><span class="hl kwb">void</span> Module<span class="hl opt">::</span><span class="hl kwd">done</span><span class="hl opt">()</span>
+<span class="hl opt">{</span>
+ mReady <span class="hl opt">=</span> <span class="hl kwa">false</span><span class="hl opt">;</span>
+
+ <span class="hl kwd">EVAF_INFO</span><span class="hl opt">(</span><span class="hl str">"%s finalized"</span><span class="hl opt">,</span> <span class="hl kwd">qPrintable</span><span class="hl opt">(</span><span class="hl kwd">objectName</span><span class="hl opt">()));</span>
+<span class="hl opt">}</span></pre>
+
+ <p>The <tt>Generate</tt> push button is disabled by default. We connected <tt>textChanged()</tt> signals to the <tt>textChanged()</tt> slot, where we enable the <tt>Generate</tt> push button if master password and name fields are not empty.</p>
+
+ <p>We can also query for stored passwords and update fields on the window with data from the storage. The <tt>iStorage::query()</tt>
+ method can return an empty shared data pointer and we have to check for it before using fields in the shared data object.</p>
+
+ <pre class="hl"><span class="hl kwb">void</span> Module<span class="hl opt">::</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString <span class="hl kwb">const</span> <span class="hl opt">&)</span>
+<span class="hl opt">{</span>
+ wGenerate<span class="hl opt">-></span><span class="hl kwd">setDisabled</span><span class="hl opt">(</span>wMasterPassword<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">() ||</span> wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">());</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(!</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">() &&</span> mStorage<span class="hl opt">) {</span>
+ QExplicitlySharedDataPointer<span class="hl opt"><</span>PswGen<span class="hl opt">::</span>Storage<span class="hl opt">::</span>Data<span class="hl opt">></span> data <span class="hl opt">=</span> mStorage<span class="hl opt">-></span><span class="hl kwd">query</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">());</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>data<span class="hl opt">)</span>
+ wLength<span class="hl opt">-></span><span class="hl kwd">setValue</span><span class="hl opt">(</span>data<span class="hl opt">-></span><span class="hl kwd">length</span><span class="hl opt">());</span>
+ <span class="hl opt">}</span>
+<span class="hl opt">}</span></pre>
+
+ <p>The <tt>generateClicked()</tt> slot is connected to the <tt>Generate</tt> push button and also to the <tt>Enter</tt> key
+ action. The push button is disabled if master password or name fields are empty, but not the <tt>Enter</tt> key action and
+ we need to check for it once more.</p>
+
+ <p>Then we generate the password using the <tt>iGenerator::generatePassword()</tt> method and show it on the window. We also
+ enable the <tt>Copy to Clipboard</tt> push button.</p>
+
+ <p>If we have the <tt>iStorage</tt>, we either store the new data record or update an existing one in the storage.</p>
+
+ <pre class="hl"><span class="hl kwb">void</span> Module<span class="hl opt">::</span><span class="hl kwd">generateClicked</span><span class="hl opt">()</span>
+<span class="hl opt">{</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>wMasterPassword<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">() ||</span> wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">())</span>
+ <span class="hl kwa">return</span><span class="hl opt">;</span>
+ wPassword<span class="hl opt">-></span><span class="hl kwd">setText</span><span class="hl opt">(</span>mGenerator<span class="hl opt">-></span><span class="hl kwd">generatePassword</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">(),</span> wMasterPassword<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">(),</span> wLength<span class="hl opt">-></span><span class="hl kwd">value</span><span class="hl opt">()));</span>
+ wCopy<span class="hl opt">-></span><span class="hl kwd">setEnabled</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>mStorage<span class="hl opt">) {</span>
+ QExplicitlySharedDataPointer<span class="hl opt"><</span>PswGen<span class="hl opt">::</span>Storage<span class="hl opt">::</span>Data<span class="hl opt">></span> data <span class="hl opt">=</span> mStorage<span class="hl opt">-></span><span class="hl kwd">query</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">());</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(!</span>data<span class="hl opt">)</span>
+ data <span class="hl opt">=</span> <span class="hl kwa">new</span> Storage<span class="hl opt">::</span><span class="hl kwd">Data</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">(),</span> wLength<span class="hl opt">-></span><span class="hl kwd">value</span><span class="hl opt">());</span>
+ <span class="hl kwa">else</span>
+ data<span class="hl opt">-></span><span class="hl kwd">setLength</span><span class="hl opt">(</span>wLength<span class="hl opt">-></span><span class="hl kwd">value</span><span class="hl opt">());</span>
+ mStorage<span class="hl opt">-></span><span class="hl kwd">save</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">(),</span> data<span class="hl opt">);</span>
+ <span class="hl opt">}</span>
+<span class="hl opt">}</span></pre>
+
+ <p>The final method in our module is the <tt>copyClicked()</tt> slot, which simply copies anything from the generated password
+ field to the clipboard:</p>
+
+ <pre class="hl"><span class="hl kwb">void</span> Module<span class="hl opt">::</span><span class="hl kwd">copyClicked</span><span class="hl opt">()</span>
+<span class="hl opt">{</span>
+ QClipboard <span class="hl opt">*</span> clipboard <span class="hl opt">=</span> QApplication<span class="hl opt">::</span><span class="hl kwd">clipboard</span><span class="hl opt">();</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>clipboard<span class="hl opt">)</span>
+ clipboard<span class="hl opt">-></span><span class="hl kwd">setText</span><span class="hl opt">(</span>wPassword<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">());</span>
+<span class="hl opt">}</span></pre>
+
+ <p>Here is the final <tt>gui.cpp</tt> file:</p>
+
+ <pre class="hl"><span class="hl com">/**</span>
+<span class="hl com"> * @file PswGen/GUI/gui.cpp</span>
+<span class="hl com"> */</span>
+
+<span class="hl ppc">#include</span> <span class="hl pps">"gui.h"</span><span class="hl ppc"></span>
+<span class="hl ppc">#include</span> <span class="hl pps">"version.h"</span><span class="hl ppc"></span>
+
+<span class="hl ppc">#include</span> <span class="hl pps">"Generator/iGenerator"</span><span class="hl ppc"></span>
+<span class="hl ppc">#include</span> <span class="hl pps">"Storage/iStorage"</span><span class="hl ppc"></span>
+
+<span class="hl ppc">#include <Common/Globals></span>
+<span class="hl ppc">#include <Common/iLogger></span>
+<span class="hl ppc">#include <Common/iRegistry></span>
+<span class="hl ppc">#include <SdiWindow/iSdiWindow></span>
+
+<span class="hl ppc">#include <QtGui></span>
+
+<span class="hl kwd">VER_EXPORT_VERSION_INFO</span><span class="hl opt">()</span>
+<span class="hl kwd">Q_EXPORT_PLUGIN2</span><span class="hl opt">(</span>VER_MODULE_NAME_STR<span class="hl opt">,</span> eVaf<span class="hl opt">::</span>PswGen<span class="hl opt">::</span>GUI<span class="hl opt">::</span>Module<span class="hl opt">)</span>
+
+<span class="hl kwa">using namespace</span> eVaf<span class="hl opt">;</span>
+<span class="hl kwa">using namespace</span> eVaf<span class="hl opt">::</span>PswGen<span class="hl opt">::</span>GUI<span class="hl opt">;</span>
+
+<span class="hl kwb">int const</span> Module<span class="hl opt">::</span>DefaultPasswordLength <span class="hl opt">=</span> <span class="hl num">16</span><span class="hl opt">;</span>
+
+Module<span class="hl opt">::</span><span class="hl kwd">Module</span><span class="hl opt">()</span>
+ <span class="hl opt">:</span> Plugins<span class="hl opt">::</span><span class="hl kwd">iPlugin</span><span class="hl opt">()</span>
+ <span class="hl opt">,</span> <span class="hl kwd">mReady</span><span class="hl opt">(</span><span class="hl kwa">false</span><span class="hl opt">)</span>
+ <span class="hl opt">,</span> <span class="hl kwd">mGenerator</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">)</span>
+ <span class="hl opt">,</span> <span class="hl kwd">mStorage</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">)</span>
+<span class="hl opt">{</span>
+ <span class="hl kwd">setObjectName</span><span class="hl opt">(</span><span class="hl kwd">QString</span><span class="hl opt">(</span><span class="hl str">"%1.%2"</span><span class="hl opt">).</span><span class="hl kwd">arg</span><span class="hl opt">(</span>VER_MODULE_NAME_STR<span class="hl opt">).</span><span class="hl kwd">arg</span><span class="hl opt">(</span>__FUNCTION__<span class="hl opt">));</span>
+
+ <span class="hl kwd">EVAF_INFO</span><span class="hl opt">(</span><span class="hl str">"%s created"</span><span class="hl opt">,</span> <span class="hl kwd">qPrintable</span><span class="hl opt">(</span><span class="hl kwd">objectName</span><span class="hl opt">()));</span>
+<span class="hl opt">}</span>
+
+Module<span class="hl opt">::~</span><span class="hl kwd">Module</span><span class="hl opt">()</span>
+<span class="hl opt">{</span>
+ <span class="hl kwd">EVAF_INFO</span><span class="hl opt">(</span><span class="hl str">"%s destroyed"</span><span class="hl opt">,</span> <span class="hl kwd">qPrintable</span><span class="hl opt">(</span><span class="hl kwd">objectName</span><span class="hl opt">()));</span>
+<span class="hl opt">}</span>
+
+<span class="hl kwb">bool</span> Module<span class="hl opt">::</span><span class="hl kwd">init</span><span class="hl opt">(</span>QString <span class="hl kwb">const</span> <span class="hl opt">&</span> args<span class="hl opt">)</span>
+<span class="hl opt">{</span>
+ <span class="hl kwd">Q_UNUSED</span><span class="hl opt">(</span>args<span class="hl opt">);</span>
+
+ <span class="hl slc">// Get the iGenerator interface</span>
+ <span class="hl kwd">EVAF_TEST_X</span><span class="hl opt">((</span>mGenerator <span class="hl opt">=</span> evafQueryInterface<span class="hl opt"><</span>PswGen<span class="hl opt">::</span>iGenerator<span class="hl opt">>(</span><span class="hl str">"iGenerator"</span><span class="hl opt">)),</span> <span class="hl str">"No iGenerator interface"</span><span class="hl opt">);</span>
+
+ <span class="hl slc">// Get the iStorage interface (can be null)</span>
+ mStorage <span class="hl opt">=</span> evafQueryInterface<span class="hl opt"><</span>PswGen<span class="hl opt">::</span>iStorage<span class="hl opt">>(</span><span class="hl str">"iStorage"</span><span class="hl opt">);</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(!</span>mStorage<span class="hl opt">)</span>
+ <span class="hl kwd">EVAF_WARNING</span><span class="hl opt">(</span><span class="hl str">"No iStorage interface"</span><span class="hl opt">);</span>
+
+ <span class="hl slc">// Get the main window interface and fill it with the widgets</span>
+ SdiWindow<span class="hl opt">::</span>iSdiWindow <span class="hl opt">*</span> win <span class="hl opt">=</span> evafQueryInterface<span class="hl opt"><</span>SdiWindow<span class="hl opt">::</span>iSdiWindow<span class="hl opt">>(</span><span class="hl str">"iSdiWindow"</span><span class="hl opt">);</span>
+ <span class="hl kwd">EVAF_TEST_X</span><span class="hl opt">(</span>win<span class="hl opt">,</span> <span class="hl str">"No iSdiWindow interface"</span><span class="hl opt">);</span>
+
+ QVBoxLayout <span class="hl opt">*</span> v <span class="hl opt">=</span> <span class="hl kwa">new</span> QVBoxLayout<span class="hl opt">;</span>
+ win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">()-></span><span class="hl kwd">setLayout</span><span class="hl opt">(</span>v<span class="hl opt">);</span>
+
+ QGridLayout <span class="hl opt">*</span> g <span class="hl opt">=</span> <span class="hl kwa">new</span> QGridLayout<span class="hl opt">;</span>
+ v<span class="hl opt">-></span><span class="hl kwd">addLayout</span><span class="hl opt">(</span>g<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">setColumnStretch</span><span class="hl opt">(</span><span class="hl num">2</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">);</span>
+
+ QLabel <span class="hl opt">*</span> l <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QLabel</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"Master &password:"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setAlignment</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>AlignRight<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>l<span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
+
+ wMasterPassword <span class="hl opt">=</span> <span class="hl kwa">new</span> QLineEdit<span class="hl opt">;</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setBuddy</span><span class="hl opt">(</span>wMasterPassword<span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>wMasterPassword<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString<span class="hl opt">)),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString<span class="hl opt">)));</span>
+ wMasterPassword<span class="hl opt">-></span><span class="hl kwd">setEchoMode</span><span class="hl opt">(</span>QLineEdit<span class="hl opt">::</span>Password<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wMasterPassword<span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">);</span>
+
+ l <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QLabel</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"Web site or application &name:"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setAlignment</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>AlignRight<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>l<span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
+
+ wName <span class="hl opt">=</span> <span class="hl kwa">new</span> QLineEdit<span class="hl opt">;</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setBuddy</span><span class="hl opt">(</span>wName<span class="hl opt">);</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>mStorage<span class="hl opt">) {</span>
+ QCompleter <span class="hl opt">*</span> completer <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QCompleter</span><span class="hl opt">(</span>wName<span class="hl opt">);</span>
+ completer<span class="hl opt">-></span><span class="hl kwd">setModel</span><span class="hl opt">(</span>mStorage<span class="hl opt">-></span><span class="hl kwd">autoCompletionModel</span><span class="hl opt">());</span>
+ completer<span class="hl opt">-></span><span class="hl kwd">setCompletionMode</span><span class="hl opt">(</span>QCompleter<span class="hl opt">::</span>InlineCompletion<span class="hl opt">);</span>
+ wName<span class="hl opt">-></span><span class="hl kwd">setCompleter</span><span class="hl opt">(</span>completer<span class="hl opt">);</span>
+ <span class="hl opt">}</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>wName<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString<span class="hl opt">)),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString<span class="hl opt">)));</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wName<span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">);</span>
+ win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">()-></span><span class="hl kwd">setFocusProxy</span><span class="hl opt">(</span>wName<span class="hl opt">);</span>
+
+ l <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QLabel</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"&Length of the password:"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setAlignment</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>AlignRight<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>l<span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
+
+ wLength <span class="hl opt">=</span> <span class="hl kwa">new</span> QSpinBox<span class="hl opt">;</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setBuddy</span><span class="hl opt">(</span>wLength<span class="hl opt">);</span>
+ wLength<span class="hl opt">-></span><span class="hl kwd">setRange</span><span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">,</span> mGenerator<span class="hl opt">-></span><span class="hl kwd">maxLength</span><span class="hl opt">());</span>
+ wLength<span class="hl opt">-></span><span class="hl kwd">setValue</span><span class="hl opt">(</span>DefaultPasswordLength<span class="hl opt">);</span>
+ wLength<span class="hl opt">-></span><span class="hl kwd">setSpecialValueText</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"Maximum"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wLength<span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">);</span>
+
+ l <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QLabel</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"Password:"</span><span class="hl opt">));</span>
+ l<span class="hl opt">-></span><span class="hl kwd">setAlignment</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>AlignRight<span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>l<span class="hl opt">,</span> <span class="hl num">3</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
+
+ wPassword <span class="hl opt">=</span> <span class="hl kwa">new</span> QLineEdit<span class="hl opt">;</span>
+ wPassword<span class="hl opt">-></span><span class="hl kwd">setReadOnly</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ g<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wPassword<span class="hl opt">,</span> <span class="hl num">3</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">2</span><span class="hl opt">);</span>
+
+ v<span class="hl opt">-></span><span class="hl kwd">addStretch</span><span class="hl opt">();</span>
+
+ QHBoxLayout <span class="hl opt">*</span> h <span class="hl opt">=</span> <span class="hl kwa">new</span> QHBoxLayout<span class="hl opt">;</span>
+ h<span class="hl opt">-></span><span class="hl kwd">addStretch</span><span class="hl opt">();</span>
+ v<span class="hl opt">-></span><span class="hl kwd">addLayout</span><span class="hl opt">(</span>h<span class="hl opt">);</span>
+
+ wGenerate <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QPushButton</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"&Generate"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ wGenerate<span class="hl opt">-></span><span class="hl kwd">setDisabled</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ wGenerate<span class="hl opt">-></span><span class="hl kwd">setDefault</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>wGenerate<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">clicked</span><span class="hl opt">()),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">generateClicked</span><span class="hl opt">()));</span>
+ h<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wGenerate<span class="hl opt">);</span>
+
+ wCopy <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QPushButton</span><span class="hl opt">(</span><span class="hl kwd">tr</span><span class="hl opt">(</span><span class="hl str">"&Copy to Clipboard"</span><span class="hl opt">,</span> VER_MODULE_NAME_STR<span class="hl opt">));</span>
+ wCopy<span class="hl opt">-></span><span class="hl kwd">setDisabled</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>wCopy<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">clicked</span><span class="hl opt">()),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">copyClicked</span><span class="hl opt">()));</span>
+ h<span class="hl opt">-></span><span class="hl kwd">addWidget</span><span class="hl opt">(</span>wCopy<span class="hl opt">);</span>
+
+ QAction <span class="hl opt">*</span> a <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QAction</span><span class="hl opt">(</span>win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">());</span>
+ a<span class="hl opt">-></span><span class="hl kwd">setShortcut</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>Key_Return<span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>a<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">triggered</span><span class="hl opt">()),</span> <span class="hl kwa">this</span><span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">generateClicked</span><span class="hl opt">()));</span>
+ win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">()-></span><span class="hl kwd">addAction</span><span class="hl opt">(</span>a<span class="hl opt">);</span>
+
+ a <span class="hl opt">=</span> <span class="hl kwa">new</span> <span class="hl kwd">QAction</span><span class="hl opt">(</span>win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">());</span>
+ a<span class="hl opt">-></span><span class="hl kwd">setShortcut</span><span class="hl opt">(</span>Qt<span class="hl opt">::</span>Key_Escape<span class="hl opt">);</span>
+ <span class="hl kwd">connect</span><span class="hl opt">(</span>a<span class="hl opt">,</span> <span class="hl kwd">SIGNAL</span><span class="hl opt">(</span><span class="hl kwd">triggered</span><span class="hl opt">()),</span> qApp<span class="hl opt">,</span> <span class="hl kwd">SLOT</span><span class="hl opt">(</span><span class="hl kwd">quit</span><span class="hl opt">()));</span>
+ win<span class="hl opt">-></span><span class="hl kwd">widget</span><span class="hl opt">()-></span><span class="hl kwd">addAction</span><span class="hl opt">(</span>a<span class="hl opt">);</span>
+
+ mReady <span class="hl opt">=</span> <span class="hl kwa">true</span><span class="hl opt">;</span>
+
+ <span class="hl kwd">EVAF_INFO</span><span class="hl opt">(</span><span class="hl str">"%s initialized"</span><span class="hl opt">,</span> <span class="hl kwd">qPrintable</span><span class="hl opt">(</span><span class="hl kwd">objectName</span><span class="hl opt">()));</span>
+
+ <span class="hl kwa">return true</span><span class="hl opt">;</span>
+<span class="hl opt">}</span>
+
+<span class="hl kwb">void</span> Module<span class="hl opt">::</span><span class="hl kwd">done</span><span class="hl opt">()</span>
+<span class="hl opt">{</span>
+ mReady <span class="hl opt">=</span> <span class="hl kwa">false</span><span class="hl opt">;</span>
+
+ <span class="hl kwd">EVAF_INFO</span><span class="hl opt">(</span><span class="hl str">"%s finalized"</span><span class="hl opt">,</span> <span class="hl kwd">qPrintable</span><span class="hl opt">(</span><span class="hl kwd">objectName</span><span class="hl opt">()));</span>
+<span class="hl opt">}</span>
+
+<span class="hl kwb">void</span> Module<span class="hl opt">::</span><span class="hl kwd">textChanged</span><span class="hl opt">(</span>QString <span class="hl kwb">const</span> <span class="hl opt">&)</span>
+<span class="hl opt">{</span>
+ wGenerate<span class="hl opt">-></span><span class="hl kwd">setDisabled</span><span class="hl opt">(</span>wMasterPassword<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">() ||</span> wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">());</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(!</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">() &&</span> mStorage<span class="hl opt">) {</span>
+ QExplicitlySharedDataPointer<span class="hl opt"><</span>PswGen<span class="hl opt">::</span>Storage<span class="hl opt">::</span>Data<span class="hl opt">></span> data <span class="hl opt">=</span> mStorage<span class="hl opt">-></span><span class="hl kwd">query</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">());</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>data<span class="hl opt">)</span>
+ wLength<span class="hl opt">-></span><span class="hl kwd">setValue</span><span class="hl opt">(</span>data<span class="hl opt">-></span><span class="hl kwd">length</span><span class="hl opt">());</span>
+ <span class="hl opt">}</span>
+<span class="hl opt">}</span>
+
+<span class="hl kwb">void</span> Module<span class="hl opt">::</span><span class="hl kwd">generateClicked</span><span class="hl opt">()</span>
+<span class="hl opt">{</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>wMasterPassword<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">() ||</span> wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">().</span><span class="hl kwd">isEmpty</span><span class="hl opt">())</span>
+ <span class="hl kwa">return</span><span class="hl opt">;</span>
+ wPassword<span class="hl opt">-></span><span class="hl kwd">setText</span><span class="hl opt">(</span>mGenerator<span class="hl opt">-></span><span class="hl kwd">generatePassword</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">(),</span> wMasterPassword<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">(),</span> wLength<span class="hl opt">-></span><span class="hl kwd">value</span><span class="hl opt">()));</span>
+ wCopy<span class="hl opt">-></span><span class="hl kwd">setEnabled</span><span class="hl opt">(</span><span class="hl kwa">true</span><span class="hl opt">);</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>mStorage<span class="hl opt">) {</span>
+ QExplicitlySharedDataPointer<span class="hl opt"><</span>PswGen<span class="hl opt">::</span>Storage<span class="hl opt">::</span>Data<span class="hl opt">></span> data <span class="hl opt">=</span> mStorage<span class="hl opt">-></span><span class="hl kwd">query</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">());</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(!</span>data<span class="hl opt">)</span>
+ data <span class="hl opt">=</span> <span class="hl kwa">new</span> Storage<span class="hl opt">::</span><span class="hl kwd">Data</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">(),</span> wLength<span class="hl opt">-></span><span class="hl kwd">value</span><span class="hl opt">());</span>
+ <span class="hl kwa">else</span>
+ data<span class="hl opt">-></span><span class="hl kwd">setLength</span><span class="hl opt">(</span>wLength<span class="hl opt">-></span><span class="hl kwd">value</span><span class="hl opt">());</span>
+ mStorage<span class="hl opt">-></span><span class="hl kwd">save</span><span class="hl opt">(</span>wName<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">(),</span> data<span class="hl opt">);</span>
+ <span class="hl opt">}</span>
+<span class="hl opt">}</span>
+
+<span class="hl kwb">void</span> Module<span class="hl opt">::</span><span class="hl kwd">copyClicked</span><span class="hl opt">()</span>
+<span class="hl opt">{</span>
+ QClipboard <span class="hl opt">*</span> clipboard <span class="hl opt">=</span> QApplication<span class="hl opt">::</span><span class="hl kwd">clipboard</span><span class="hl opt">();</span>
+ <span class="hl kwa">if</span> <span class="hl opt">(</span>clipboard<span class="hl opt">)</span>
+ clipboard<span class="hl opt">-></span><span class="hl kwd">setText</span><span class="hl opt">(</span>wPassword<span class="hl opt">-></span><span class="hl kwd">text</span><span class="hl opt">());</span>
+<span class="hl opt">}</span></pre>
+
+ <p>Build the <a href="pswgen11.html">PswGen application</a>.</p>
+
+ </body>
+</html>