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