view ui/mainwindow.h @ 754:27043d74dc90

(Issue25) Align header contents in their own column. We now also stretch column 3 so that the contents are aligned with the descriptive labels without a space in between. Sadly this causes the quit button to be resized to it's minimum instead of sharing the space with the installation button as the installation button is so large that it squeezes the push button.
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 07 Jul 2014 12:38:33 +0200
parents a467204a35f5
children 4efd6378c001
line wrap: on
line source
/* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU GPL (v>=2)
 * and comes with ABSOLUTELY NO WARRANTY!
 * See LICENSE.txt for details.
 */
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

/**
 * @file mainwindow.h
 * @brief Main UI controller
 */

#include <QSystemTrayIcon>
#include <QMainWindow>
#include <QSettings>
#include <QMenuBar>
#include <QListWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QLabel>
#include <QCheckBox>
#include <QScrollArea>

#include "downloader.h"
#include "certificatelist.h"
#include "certificatelistwidget.h"
#include "textoverlaybutton.h"
class QMenu;
class QAction;
class QTimer;
class QPushButton;


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    /**@brief create a new Main Window object
     *
     * In tray mode this window is not shown and only shows
     * notification messages if there is some actionable state
     * reached. If tray mode is true it also exits after
     * an update check.
     *
     * @param[in] trayMode set the tray mode
     * */
    MainWindow(bool trayMode);

    void setMessage(const QString message) {mCurMessage = message;}
    QString getMessage() {return mCurMessage;}

    enum CurrentState {
        BeforeDownload,
        NewListAvailable,
        NewSoftwareAvailable,
        DownloadingSW,
        TransferError,
        NothingChanged
    };
    CurrentState getState() {return mCurState;}
    void setState(CurrentState state) {mCurState = state;}

private slots:
    void showMessage();
    void iconActivated(QSystemTrayIcon::ActivationReason reason);
    void checkUpdates(bool downloadSW = false);
    void handleNewList(const QString& fileName, const QDateTime& modDate);
    void handleNewSW(const QString& fileName, const QDateTime& modDate);
    void downloaderError(const QString &message, SSLConnection::ErrorCode error);
    /** @brief Trigger the appropiate action depending on the state */
    void messageClicked();
    void installerError(const QString& errMsg);
    void installerSuccess();
    void installCerts();
    void toggleInManual(bool state, const Certificate &cert);
    void removeFromManual(bool state, const Certificate &cert);

    void togglePages(int button);
    void toggleUpdatesNew();
    void toggleUpdatesRemove();
    void toggleUpdatesManual();

    /** Reflect change list states in the UI
     *
     * This slot should be called each time the contents or selection
     * state of one of the certificate lists change to update the
     * UI elements accordingly.
     *
     * @param[in] selected unused. */
    void listChanged(int selected);

    /** @brief check for running software that needs to close before installing
     *
     * This function calls installCerts if no software is running otherwise
     * it informs the user about the software that still needs to be closed.
     */
    void checkAndInstallCerts();

    /** @brief get the last modified date on the download server for
     * the current version.
     *
     * After the initial installation this function can be used to
     * determine the DateTime that corresponds to the currently installed
     * version on the download server.
     *
     * Calls setLastModifiedSWDate on success. Otherwise downloaderError
     * is triggered. */
    void getLastModForCurrentVersion();

    /** @brief set the last modified software date/time
     *
     * The last modifiedSWDate is the corresponding last modified
     * timestamp from the download server vor the currently installed version.
     */
    void setLastModifiedSWDate(const QDateTime &date);

    /** @brief saves the currently unselected certificates
     *
     * This creates / updates a qsettings section that
     * [unselected] that contains the certificates that
     * were unselected previously.
     *
     * Unselected are certificates that are unchecked
     * in the certListWidget
     *
     * Returns false on error.
     */
    bool saveUnselectedCertificates(QStringList unselected);

    /** @brief loads previously unselected certificates from settings
     *
     * The certificates are strored in the list mPreviouslyUnselected.
     *
     * On error mPreviouslyUnselected is empty after this call.
     */
    void loadUnselectedCertificates();

    /** @brief log / store a successful downloader run
     *
     * A downloader run is successful if the finished signal
     * is emited and the state is not TransferError
     */
    void updateCheckSuccess();

protected:
    virtual void closeEvent(QCloseEvent *event);

protected slots:
    /** @brief cleanup and close the main window
     *
     * Perform a clean exit (saving state etc.) and close
     * the application */
    virtual void closeApp();

    /* @brief Execute the file fileName to install the softwareupdate.
     *
     * Once the installer process is started this function terminates
     * the application. */
    void installNewSW(const QString& fileName, const QDateTime& modDate);

signals:
    /** @brief emits the changecount as a string when it changes */
    void changesChanged(const QString& cnt);

private:
    /** @brief the combined number of changes made in all lists */
    int changeCount();

    /** @brief use this to set the change count */
    void setChangeCount(int cnt);

    /** @brief check the integrity of available certificate lists.
     *
     * Note: Do not use this as a local trust check as this only works on
     * FileNames where the underlying files can change. This
     * is just meant to check if the downloaded data was somehow
     * removed or corrupted. It also initializes mListToInstall
     * and mInstalledList.
     */
    void verifyListData();

    /** @brief check the integrity of available software updates.
     *
     * Note: Do not use this as a local trust check as this only works on
     * FileNames where the underlying files can change. This
     * is just meant to check if the downloaded data was somehow
     * removed or corrupted.
     */
    void verifySWData();

    void createTrayIcon();
    void createActions();
    void loadCertificateList();

    /** @brief UI setup */
    void setupGUI();

    /** @brief create and set up the info widget (accessible via button panel) */
    QWidget *createInfoWidget();
    /** @brief create and set up the updates widget (accessible via button panel) */
    QWidget *createUpdatesWidget();
    /** @brief create and set up the certifcates to install widget
     * (accessible via button panel) */
    QWidget *createInstallWidget();
    /** @brief create and set up the certifcates to remove widget
     * (accessible via button panel) */
    QWidget *createRemoveWidget();

    /* Are we running in tray mode ?*/
    const bool mTrayMode;
    /* The message currently shown at intervals */
    QString mCurMessage;
    QString mInstalledSWVersion;
    QString mInstalledListVersion;

    QSettings mSettings;

    QSystemTrayIcon *mTrayIcon;
    QTimer *mMessageTimer;
    QMenu *mTrayMenu;
    QAction *mCheckUpdates;
    QAction *mQuitAction;
    CurrentState mCurState;
    QMenuBar *mMenuBar;
    QPushButton *mQuitButton;

    /* The current list that should be installed */
    CertificateList mListToInstall;
    /* The last list that we installed */
    CertificateList mInstalledList;
    /* Previously made "unselect" choices in the form of
     * base64lines with I:/R: prefix */
    QStringList mPreviouslyUnselected;

    QLabel *mCurrentListDate;
    QLabel *mNewListDate;

    QButtonGroup *mButtonGroup;
    QWidget *mUpdatesWidget;
    QWidget *mInstallWidget;
    QWidget *mRemoveWidget;
    QWidget *mInfoWidget;

    QLabel *mUpdatesHeader;
    QLabel *mLastCertUpdate;
    QLabel *mLastCertUpdateContents;
    QLabel *mSoftwareVersionLabel;
    QLabel *mSoftwareVersionContents;
    QLabel *mLastUpdateCheck;
    QLabel *mLastUpdateCheckContents;
    QLabel *mUpdatesNewCertificates;
    QLabel *mUpdatesRemoveCertificates;
    QLabel *mUpdatesManualCertificates;
    QLabel *mUpdatesTip;

    /* These are a bit of a pattern break, they should
     * be accessed over the according page widgets.
     *
     * They are initialized in the create*widget functions.*/
    CertificateListWidget *mUpdatesNew;
    CertificateListWidget *mUpdatesRemove;
    CertificateListWidget *mUpdatesManual;
    CertificateListWidget *mInstallList;
    CertificateListWidget *mRemoveList;

    QPushButton *mUpdatesDetailsNew;
    QPushButton *mUpdatesDetailsRemove;
    QPushButton *mUpdatesDetailsManual;

    QPushButton *mInstallButton;
    int mChangeCount;
};

#endif // MAINWINDOW_H

http://wald.intevation.org/projects/trustbridge/