15.1.961. tablet_qt/widgets/basewidget.h

/*
    Copyright (C) 2012, University of Cambridge, Department of Psychiatry.
    Created by Rudolf Cardinal (rnc1001@cam.ac.uk).

    This file is part of CamCOPS.

    CamCOPS is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    CamCOPS is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with CamCOPS. If not, see <https://www.gnu.org/licenses/>.
*/

/*
    OPTIONAL LGPL: Alternatively, this file may be used under the terms of the
    GNU Lesser General Public License version 3 as published by the Free
    Software Foundation. You should have received a copy of the GNU Lesser
    General Public License along with CamCOPS. If not, see
    <https://www.gnu.org/licenses/>.
*/

#pragma once

#include <QWidget>
#include "common/gui_defines.h"  // IWYU pragma: keep


class BaseWidget : public QWidget
{
    // Generic base widget class for CamCOPS. It has two functions, one
    // superseded and #defined out.
    //
    // (1) If GUI_USE_RESIZE_FOR_HEIGHT is defined, this is a widget that knows
    // that its layout implements a height-for-width function and deals with it
    // properly, adjusting the widget's height to the layout (and its
    // contents).
    //
    // - SPECIFICALLY: IT WILL REDUCE ITS HEIGHT (TO FIT THE CONTENTS) AS THE
    //   LAYOUT SPREADS OUT CHILD WIDGETS TO THE RIGHT (in a way that a plain
    //   QWidget won't).
    //
    // - ... and will also set a correct MINIMUM HEIGHT as the width shrinks.
    //
    // - Use this when you want to put a FlowLayout in (e.g. see QuMCQ).
    //
    // - You might also use this when you want a widget containing a layout
    //   containing a LabelWordWrapWide object, or similar (e.g. see
    //   ClickableLabelWordWrapWide -- though that has to re-implement, not
    //   inherit, for Qt inheritance reasons).
    //
    // However, this system is INFERIOR to using a proper layout; see
    // BoxLayoutHfw and its children, for example. We have therefore moved AWAY
    // from GUI_USE_RESIZE_FOR_HEIGHT; see gui_defines.h.
    //
    // (2) This also enables our widgets to support stylesheets; see below.

    Q_OBJECT

public:
    BaseWidget(QWidget* parent = nullptr);
    virtual ~BaseWidget() override;

#ifdef GUI_USE_RESIZE_FOR_HEIGHT
    virtual void resizeEvent(QResizeEvent* event) override;
#endif

    // IF WE WANT CLASSES DERIVED FROM QWidget TO SUPPORT STYLE SHEETS,
    // as we do, we must also support this:
    virtual void paintEvent(QPaintEvent* event) override;
};