X-Git-Url: https://vaikene.ee/gitweb/gitweb.cgi?p=evaf;a=blobdiff_plain;f=www%2Fpswgen09.html;fp=www%2Fpswgen09.html;h=7f05aba9a097b3d39ab4e0c2a8c42fc43bb51601;hp=0000000000000000000000000000000000000000;hb=30c0930d760d6338dba3982e01125b10f84c47b2;hpb=9ff1850fa199fa072e51a2c8ef6de45d256721f0 diff --git a/www/pswgen09.html b/www/pswgen09.html new file mode 100644 index 0000000..7f05aba --- /dev/null +++ b/www/pswgen09.html @@ -0,0 +1,217 @@ + + + + + + eVaf Tutorial - 09 - GUI Module + + + + + + + + + +

eVaf Tutorial

+ +

09 - GUI Module

+ +

The Graphical User Interface (GUI) module implements the main window of the application. It uses previously + created Generator and Storage modules to generate and store passwords.

+ +

We start by creating the gui.h file in the src/apps/PswGen/GUI directory:

+ +
/**
+ * @file PswGen/GUI/gui.h
+ */
+
+#ifndef __PSWGEN_GUI_GUI_H
+#  define __PSWGEN_GUI_GUI_H
+
+#endif // gui.h
+ +

Include the Plugins/iPlugin header file as this is going to be a plugin and also QObject and + QString as these are almost always needed:

+ +
#include <Plugins/iPlugin>
+#include <QObject>
+#include <QString>
+ +

We use the eVaf::PswGen::GUI namespace for this module:

+ +
namespace eVaf {
+namespace PswGen {
+namespace GUI {
+
+} // namespace eVaf::PswGen::GUI
+} // namespace eVaf::PswGen
+} // namespace eVaf
+ +

The module itself can be implemented as one single class derived from the Plugins::iPlugin parent class:

+ +
class Module : public Plugins::iPlugin
+{
+    Q_OBJECT
+
+public:
+
+    Module();
+
+    virtual ~Module();
+
+};
+ +

Implement pure virtual methods derived from the parent class. The main GUI window is created in the init() method + and the module can only be ready when the initialization is completed. We use the mReady flag to indicate this.

+ +
    virtual bool init(const QString & args);
+
+    virtual void done();
+
+    virtual bool isReady() const { return mReady; }
+
+private:
+
+    bool mReady;
+ +

In the private members section we store interfaces from previously written modules:

+ +
+    eVaf::PswGen::iGenerator * mGenerator;
+
+    eVaf::PswGen::iStorage * mStorage;
+ +

Since these are not known yet, we also need to add forward declarations. These go into the eVaf::PswGen namespace + at the beginning of the file:

+ +
+namespace eVaf {
+namespace PswGen {
+    struct iGenerator;
+    struct iStorage;
+ +

The main window needs couple of widgets on it:

+ + + +
+    /// Widgets on the screen
+    QLineEdit * wMasterPassword;
+    QLineEdit * wName;
+    QSpinBox * wLength;
+    QLineEdit * wPassword;
+    QPushButton * wGenerate;
+    QPushButton * wCopy;
+ +

Add slots for push buttons:

+ +
private slots:
+
+    /// 'Generate' button clicked
+    void generateClicked();
+
+    /// 'Copy' button clicked
+    void copyClicked();
+ +

The private keyword is ignored by the Qt meta-object compiler, but it is a good practice to have it here + as an indicator, that these slots are private and should not be used outside of the class.

+ +

The Generate push button should be enabled only when the master password and name are given. Add another + slot that will be connected to the textChanged() signal from these widgets:

+ +
+    /// Master password or name changed
+    void textChanged(QString const &);
+ +

And here is the final gui.h file:

+ +
/**
+ * @file PswGen/GUI/gui.h
+ */
+#ifndef __PSWGEN_GUI_GUI_H
+#  define __PSWGEN_GUI_GUI_H
+
+#include <Plugins/iPlugin>
+
+#include <QObject>
+#include <QString>
+
+class QLineEdit;
+class QSpinBox;
+class QPushButton;
+
+namespace eVaf {
+namespace PswGen {
+    struct iGenerator;
+    struct iStorage;
+namespace GUI {
+
+/// Graphical User Interface for the PswGen application.
+class Module : public Plugins::iPlugin
+{
+    Q_OBJECT
+
+public:
+
+    Module();
+
+    virtual ~Module();
+
+    virtual bool init(const QString & args);
+
+    virtual void done();
+
+    virtual bool isReady() const { return mReady; }
+
+private slots:
+
+    /// Master password or name changed
+    void textChanged(QString const &);
+
+    /// 'Generate' button clicked
+    void generateClicked();
+
+    /// 'Copy' button clicked
+    void copyClicked();
+
+private: // Members
+
+    static int const DefaultPasswordLength;
+
+    /// Flag indicating that the module is ready
+    bool mReady;
+
+    /// The iGenerator interface
+    eVaf::PswGen::iGenerator * mGenerator;
+
+    /// The iStorage interface (can be null)
+    eVaf::PswGen::iStorage * mStorage;
+
+    /// Widgets on the screen
+    QLineEdit * wMasterPassword;
+    QLineEdit * wName;
+    QSpinBox * wLength;
+    QLineEdit * wPassword;
+    QPushButton * wGenerate;
+    QPushButton * wCopy;
+};
+
+} // namespace eVaf::PswGen::GUI
+} // namespace eVaf::PswGen
+} // namespace eVaf
+
+#endif // gui.h
+
+ +

Continue implementing the GUI Module.

+ + +