BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
WarningSign.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/InfoWidgets/WarningSign.cpp
6 //! @brief Implements class WarningSign
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
16 #include "Base/Utils/Assert.h"
18 #include <QAbstractScrollArea>
19 #include <QEvent>
20 #include <QScrollBar>
21 #include <QTimer>
22 
23 namespace {
24 const int xpos_offset = 40;
25 const int ypos_offset = 40;
26 } // namespace
27 
28 WarningSign::WarningSign(QWidget* parent)
29  : QObject(parent)
30  , m_warning_header("Houston, we have a problem.")
31  , m_warningWidget(0)
32  , m_area(nullptr)
33  , m_clear_just_had_happened(false)
34 {
35  setArea(parent);
36 }
37 
38 //! Clears warning message;
39 
41 {
42  delete m_warningWidget;
43  m_warningWidget = 0;
44  m_warning_message.clear();
45 
47  QTimer::singleShot(10, this, [=]() { m_clear_just_had_happened = false; });
48 }
49 
50 void WarningSign::setWarningHeader(const QString& warningHeader)
51 {
52  m_warning_header = warningHeader;
53 }
54 
55 //! Shows warning sign on the screen. If clear of previous warning sign had happened just
56 //! few msec ago, make a small delay, to stress its reapearance.
57 
58 void WarningSign::setWarningMessage(const QString& warningMessage)
59 {
60  ASSERT(m_area);
61 
64  QTimer::singleShot(50, this, [=]() { setWarningMessage(warningMessage); });
65  } else {
66 
67  m_warning_message = warningMessage;
68 
69  if (!m_warningWidget)
71 
74  m_warningWidget->show();
75  }
76 }
77 
78 void WarningSign::setArea(QWidget* area)
79 {
80  m_area = area;
81  m_area->installEventFilter(this);
82 }
83 
85 {
86  return (m_warningWidget == nullptr ? false : true);
87 }
88 
89 bool WarningSign::eventFilter(QObject* obj, QEvent* event)
90 {
91  if (event->type() == QEvent::Resize)
93 
94  return QObject::eventFilter(obj, event);
95 }
96 
98 {
99  if (!m_warningWidget || !m_area)
100  return;
101 
102  QPoint pos = positionForWarningSign();
103  m_warningWidget->setPosition(pos.x(), pos.y());
104 }
105 
107 {
108  ASSERT(m_area);
109 
110  int x = m_area->width() - xpos_offset;
111  int y = m_area->height() - ypos_offset;
112 
113  if (QAbstractScrollArea* scrollArea = dynamic_cast<QAbstractScrollArea*>(m_area)) {
114 
115  if (QScrollBar* horizontal = scrollArea->horizontalScrollBar()) {
116  if (horizontal->isVisible())
117  y -= horizontal->height();
118  }
119 
120  if (QScrollBar* vertical = scrollArea->verticalScrollBar()) {
121  if (vertical->isVisible())
122  x -= vertical->width();
123  }
124  }
125 
126  return QPoint(x, y);
127 }
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:31
Defines class WarningSignWidget.
Defines class WarningSign.
The WarningSignWidget is an transparent widget with warning sign pixmap intended to be overlayed onto...
void setWarningMessage(const QString &message)
void setPosition(int x, int y)
set geometry of widget around center point
QString m_warning_message
Definition: WarningSign.h:47
QWidget * m_area
Definition: WarningSign.h:49
WarningSign(QWidget *parent)
Definition: WarningSign.cpp:28
WarningSignWidget * m_warningWidget
Definition: WarningSign.h:48
void setWarningHeader(const QString &warningHeader)
Definition: WarningSign.cpp:50
QPoint positionForWarningSign() const
void setArea(QWidget *area)
Definition: WarningSign.cpp:78
void clear()
Clears warning message;.
Definition: WarningSign.cpp:40
bool eventFilter(QObject *obj, QEvent *event)
Definition: WarningSign.cpp:89
void setWarningMessage(const QString &warningMessage)
Shows warning sign on the screen.
Definition: WarningSign.cpp:58
void updateLabelGeometry()
Definition: WarningSign.cpp:97
bool m_clear_just_had_happened
Definition: WarningSign.h:50
QString m_warning_header
Definition: WarningSign.h:46
bool isShown() const
Definition: WarningSign.cpp:84