From a6ced09911527e768e2909f22fa13cf1a5b97dd6 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Thu, 26 Mar 2015 17:01:48 +0100
Subject: [PATCH] New WarningSignWidget to summon when there is a problem in
 python script generation

---
 GUI/coregui/Views/InfoWidgets/InfoToolBar.h   |   6 +-
 .../Views/InfoWidgets/PySampleWidget.cpp      |  66 ++++++++++++++----
 .../Views/InfoWidgets/PySampleWidget.h        |   7 ++
 .../Views/InfoWidgets/WarningSignWidget.cpp   |  42 +++++++++++
 .../Views/InfoWidgets/WarningSignWidget.h     |  41 +++++++++++
 GUI/coregui/Views/SampleView.cpp              |   2 -
 GUI/coregui/coregui.qrc                       |   2 +
 GUI/coregui/images/warning.png                | Bin 0 -> 402 bytes
 GUI/coregui/images/warning@2x.png             | Bin 0 -> 719 bytes
 9 files changed, 147 insertions(+), 19 deletions(-)
 create mode 100644 GUI/coregui/Views/InfoWidgets/WarningSignWidget.cpp
 create mode 100644 GUI/coregui/Views/InfoWidgets/WarningSignWidget.h
 create mode 100644 GUI/coregui/images/warning.png
 create mode 100644 GUI/coregui/images/warning@2x.png

diff --git a/GUI/coregui/Views/InfoWidgets/InfoToolBar.h b/GUI/coregui/Views/InfoWidgets/InfoToolBar.h
index 7c85231605b..b5a187e2e04 100644
--- a/GUI/coregui/Views/InfoWidgets/InfoToolBar.h
+++ b/GUI/coregui/Views/InfoWidgets/InfoToolBar.h
@@ -27,6 +27,9 @@ class BA_CORE_API_ InfoToolBar : public QToolBar
 {
     Q_OBJECT
 
+public:
+    explicit InfoToolBar(QWidget *parent = 0);
+
 signals:
     void expandButtonClicked();
     void closeButtonClicked();
@@ -37,9 +40,6 @@ public slots:
 protected slots:
     void onExpandButtonClicked();
 
-public:
-    explicit InfoToolBar(QWidget *parent = 0);
-
 private:
     QToolButton *m_expandButton;
     QToolButton *m_closeButton;
diff --git a/GUI/coregui/Views/InfoWidgets/PySampleWidget.cpp b/GUI/coregui/Views/InfoWidgets/PySampleWidget.cpp
index 652d553c30d..8fa1f2b0cba 100644
--- a/GUI/coregui/Views/InfoWidgets/PySampleWidget.cpp
+++ b/GUI/coregui/Views/InfoWidgets/PySampleWidget.cpp
@@ -20,6 +20,7 @@
 #include "DomainObjectBuilder.h"
 #include "MultiLayer.h"
 #include "PyGenVisitor.h"
+#include "WarningSignWidget.h"
 #include <QVBoxLayout>
 #include <QTextEdit>
 #include <QFile>
@@ -29,10 +30,14 @@
 #include <QTimer>
 #include <QTextCodec>
 #include <QDebug>
+#include <QPixmap>
+#include <QPainter>
 
 namespace {
 const int timer_interval_msec = 10;
 const int update_every_msec = 20.;
+const int warning_sign_xpos = 52;
+const int warning_sign_ypos = 38;
 
 const QString welcome_message =
 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">"
@@ -55,6 +60,7 @@ PySampleWidget::PySampleWidget(QWidget *parent)
     , m_time_to_update(update_every_msec)
     , m_n_of_sceduled_updates(-1)
     , m_highlighter(0)
+    , m_warningSign(0)
 {
     m_textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
@@ -70,6 +76,7 @@ PySampleWidget::PySampleWidget(QWidget *parent)
 
     m_textEdit->setHtml(welcome_message);
 
+
 }
 
 void PySampleWidget::setSampleModel(SampleModel *sampleModel)
@@ -130,23 +137,13 @@ void PySampleWidget::updateEditor()
 
     const int old_scrollbar_value = m_textEdit->verticalScrollBar()->value();
 
-    m_textEdit->clear();
 
-    QMap<QString, ParameterizedItem *> sampleMap = m_sampleModel->getSampleMap();
-    if(!sampleMap.isEmpty()) {
+    QString code_snippet = generateCodeSnippet();
 
-        DomainObjectBuilder builder;
-        ParameterizedItem *sampleItem = sampleMap.first();
-        boost::scoped_ptr<MultiLayer> multilayer(builder.buildMultiLayer(*sampleItem));
-        //multilayer->printSampleTree();
-
-        PyGenVisitor visitor;
-        VisitSampleTree(*multilayer, visitor);
+    if(!m_warningSign) m_textEdit->clear();
 
-        std::ostringstream result;
-        result << visitor.defineGetSample();
-
-        m_textEdit->setText(QString::fromStdString(result.str()));
+    if(!code_snippet.isEmpty()) {
+        m_textEdit->setText(code_snippet);
     }
 
     m_textEdit->verticalScrollBar()->setValue(old_scrollbar_value);
@@ -202,4 +199,45 @@ void PySampleWidget::onTimerTimeout()
     }
 }
 
+//! adjusts position of warning label on widget move
+void PySampleWidget::resizeEvent(QResizeEvent *event)
+{
+    if(m_warningSign) {
+        m_warningSign->setPosition(event->size().width()-warning_sign_xpos,
+                                   event->size().height()-warning_sign_ypos);
+    }
+}
+
+//! generates string representing code snippet for all multi layers in the model
+QString PySampleWidget::generateCodeSnippet()
+{
+    delete m_warningSign;
+    m_warningSign = 0;
+
+    QString result;
+
+    QMap<QString, ParameterizedItem *> sampleMap = m_sampleModel->getSampleMap();
+    if(!sampleMap.isEmpty()) {
+
+        DomainObjectBuilder builder;
+        PyGenVisitor visitor;
+        ParameterizedItem *sampleItem = sampleMap.first();
+
+        try {
+            boost::scoped_ptr<MultiLayer> multilayer(builder.buildMultiLayer(*sampleItem));
+            VisitSampleTree(*multilayer, visitor);
+            std::ostringstream ostr;
+            ostr << visitor.defineGetSample();
+            result.append(QString::fromStdString(ostr.str()));
+        } catch(const std::exception &ex) {
+            m_warningSign = new WarningSignWidget(this);
+            m_warningSign->setPosition(width()-warning_sign_xpos, height()-warning_sign_ypos);
+            m_warningSign->show();
+
+        }
+    }
+
+    return result;
+}
+
 
diff --git a/GUI/coregui/Views/InfoWidgets/PySampleWidget.h b/GUI/coregui/Views/InfoWidgets/PySampleWidget.h
index 8ce661d3f38..83c6e2f068e 100644
--- a/GUI/coregui/Views/InfoWidgets/PySampleWidget.h
+++ b/GUI/coregui/Views/InfoWidgets/PySampleWidget.h
@@ -25,6 +25,7 @@ class QTextEdit;
 class QModelIndex;
 class QTimer;
 class PythonSyntaxHighlighter;
+class WarningSignWidget;
 
 //! The PySampleWidget displays Python script representing a MultiLayer at the bottom of SampleView
 //! Belongs to InfoWidget
@@ -51,7 +52,12 @@ public slots:
 private slots:
     void onTimerTimeout();
 
+protected:
+    void resizeEvent(QResizeEvent *event);
+
 private:
+    QString generateCodeSnippet();
+
     QTextEdit *m_textEdit;
     SampleModel *m_sampleModel;
     InstrumentModel *m_instrumentModel;
@@ -59,6 +65,7 @@ private:
     int m_time_to_update;
     int m_n_of_sceduled_updates;
     PythonSyntaxHighlighter *m_highlighter;
+    WarningSignWidget *m_warningSign;
 };
 
 #endif
diff --git a/GUI/coregui/Views/InfoWidgets/WarningSignWidget.cpp b/GUI/coregui/Views/InfoWidgets/WarningSignWidget.cpp
new file mode 100644
index 00000000000..e5064c411b4
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/WarningSignWidget.cpp
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      coregui/Views/InfoWidgets/WarningSignWidget.cpp
+//! @brief     Implements class WarningSignWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "WarningSignWidget.h"
+#include <QPainter>
+#include <QRect>
+
+WarningSignWidget::WarningSignWidget(QWidget * parent = 0) : QWidget(parent) {
+    setAttribute(Qt::WA_NoSystemBackground);
+    //setAttribute(Qt::WA_TransparentForMouseEvents);
+    m_pixmap = QPixmap(":/images/warning@2x.png");
+    setToolTip(QString(
+        "Generation of Python Script failed. Code is not complete.\n"
+        "Sometimes it happens if sample on canvas requires further\n"
+        "assembling. Click to see details."
+                   ));
+}
+
+void WarningSignWidget::paintEvent(QPaintEvent *event) {
+    QPainter painter(this);
+    QRect target(m_pixmap.rect());
+    painter.drawPixmap(target, m_pixmap);
+}
+
+//! set geometry of widget around center point
+void WarningSignWidget::setPosition(int x, int y)
+{
+//    setGeometry(x, y, m_pixmap.width(), m_pixmap.height());
+    setGeometry(x, y, m_pixmap.width(), m_pixmap.height());
+}
diff --git a/GUI/coregui/Views/InfoWidgets/WarningSignWidget.h b/GUI/coregui/Views/InfoWidgets/WarningSignWidget.h
new file mode 100644
index 00000000000..d63d7aa4a20
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/WarningSignWidget.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      coregui/Views/InfoWidgets/WarningSignWidget.h
+//! @brief     Defines class WarningSignWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef WARNINGSIGNWIDGET_H
+#define WARNINGSIGNWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+#include <QPixmap>
+#include <QString>
+
+//! The WarningSignWidget is an transparent widget with warning sign pixmap intended to be
+//! overlayed onto other widget at some arbitrary position.
+class WarningSignWidget : public QWidget
+{
+public:
+    WarningSignWidget(QWidget *parent);
+
+    void setPosition(int x, int y);
+
+protected:
+    void paintEvent(QPaintEvent *event);
+
+private:
+    QPixmap m_pixmap;
+    QString m_warning_message;
+};
+
+#endif
diff --git a/GUI/coregui/Views/SampleView.cpp b/GUI/coregui/Views/SampleView.cpp
index 420c6db31ed..f6dfb9ba06b 100644
--- a/GUI/coregui/Views/SampleView.cpp
+++ b/GUI/coregui/Views/SampleView.cpp
@@ -247,11 +247,9 @@ void SampleView::showContextMenu(const QPoint &pnt)
 void SampleView::dockToMinMaxSizes()
 {
     Q_ASSERT(m_dock_info.m_dock);
-    qDebug() << "xxx 2.1";
     m_dock_info.m_dock->setMinimumSize(m_dock_info.m_min_size);
     m_dock_info.m_dock->setMaximumSize(m_dock_info.m_max_size);
     m_dock_info.m_dock = 0;
-    qDebug() << "xxx 2.2";
 }
 
 void SampleView::onDockVisibilityChangeV2(bool status)
diff --git a/GUI/coregui/coregui.qrc b/GUI/coregui/coregui.qrc
index a424ddfa6a7..3be1e459d99 100644
--- a/GUI/coregui/coregui.qrc
+++ b/GUI/coregui/coregui.qrc
@@ -45,5 +45,7 @@
         <file>images/darkarrowdown.png</file>
         <file>images/darkarrowup.png</file>
         <file>images/darkclose.png</file>
+        <file>images/warning@2x.png</file>
+        <file>images/warning.png</file>
     </qresource>
 </RCC>
diff --git a/GUI/coregui/images/warning.png b/GUI/coregui/images/warning.png
new file mode 100644
index 0000000000000000000000000000000000000000..74e67dbae89bab0af8001e2182fbb60316d57171
GIT binary patch
literal 402
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QU<L+;`2jv5uK)l4XJBA3HfC^e
zVDPkM@HS=ev}E-#W%0CN_O@X4v*qwKV-B+82zKBMw&x6X;0&_k46tQS3lNQV<13Dq
z^|xVb&QuSyWe;)ST-<E6VS=-#IdhO5TZ$iVS&Tq=j9_P$(Cjjy{d2s}tO&WaIp)cp
zq;F?4f1c0$b3X0Q#lpX*qyC;t_;<wU-)X0R7X$xYPx!w}@c(}4|A$ropV0q*#xl)+
z@q7jb2I-O@zhDMNRvu9$L+9|^rb#n59KG@E!{;wwzJC4o?f2j4^EdMu7#P|;T^vIs
zBv}tSW*s&VU^sBGN;TI&&G-NRLk^k#tjASf@i?d{FoZU+{Cc;?fk8CTp=qQ1wVzE4
zqT8cIJZAj;Q8eeX%Yv)5+sxiy6_{~bLigAWwMi@7;}gFg|NT|$%$j{s(R+(F-TZc5
zZdJwe(zOP^Pi&ocerwT}l}{flGyeHo^IT>>gM=`{0sB?U<QDxhX3Jz?U|{fc^>bP0
Hl+XkKhd8AN

literal 0
HcmV?d00001

diff --git a/GUI/coregui/images/warning@2x.png b/GUI/coregui/images/warning@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b362e6c5554f3e8c2adb215295664877dc300dc6
GIT binary patch
literal 719
zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tGr2>3HT>t<79~#Qw;J^@S
z$>46u;A_m_Wy$7c%Hm<h>}kR5X~E=W&g5y%;%UL`WzOtr&g^B*;t6ITL@ZeRtl9i*
z*n;fXLmaqb-1%cY_*4A&(gH*aBBcu>Wy)fO>r#~K(^NWhBzg*TdW&>t)tJt%mYH2=
zx}wu|WtZLB4*6|U-S$sYI<nC3!kVy)i<K^|4ZpiB?%wveC+n4-?@xKLKjr<g%n!%2
zzU@~0b|&}N`GP+eGX7l5`g5`H&!wC{m-7Bx%Kv*N`tRBJzvq(vUP$}5U*q3l!+*!D
z{+)9Ach>9Qg}{H8BmZ5C|93t0|4#n@yG8!*ll*@`?*Ad>|3@_bAJ_eV(&+zbv;SwU
z|6g$Uf649t&5-}Mqly}8zA`W{h?WHT1v4<Sa0<!k+6AU&R`x8|a{T(!4?q4&i+mJf
zU|{t3ba4!^INdtYw&<{efLo&AhF^>uU)8kA9Qs~1_fjoayrQdB|J{ns3X9KJO!^}#
zlp)XkqOnT2Vy5ytW~spUOc}cG7~NK7lriM&T6Zva!N)F-pJ~Dl!p96H?l7&np2Cxv
zZ_dzC$dM?)c%AWiqk>yy#dfX*ez^&JxtDgZRpfil_g}tQ?e$--2Cbh8<~dFNT>qJ0
z$P}J&NGalrXS`W9Y0{rG<r_=H(nTF^_w^sx$=rVYhTge^jV@}RcnVCmSTtv?^sh^p
zrfI-$_w}k|h<9+D)qF+sS*wgIqPh-#joJR-Uh9t%wyQy!8!|S<9C*c(=Dl)zte#BY
zap$`7ZT_2$HKv`}d@z1VtLC`{5lT6?KK%_2V#{p~nd7)|N>=loE!#YfN~U-}x$<`T
z6KA9Tyi<W?Y)PJP)~Zz&vK3wX{WRNj`tCdY7go)UXnFlTZ{31>PsGj27CDy6ri(H#
PFfe$!`njxgN@xNA!7M%`

literal 0
HcmV?d00001

-- 
GitLab