1 // Copyright (C) 2016-2021 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (EDF R&D)
21 #include "YDFXGUIPortsSelector.hxx"
22 #include "YDFXGUIPortsValidator.hxx"
24 #include "YACSEvalPort.hxx"
25 #include "YACSEvalSeqAny.hxx"
31 #include <QHeaderView>
32 #include <QVBoxLayout>
33 #include <QHBoxLayout>
34 #include <QPaintEvent>
35 #include <QApplication>
37 #include <QPainterPath>
44 #define _USE_MATH_DEFINES
50 const int MyWidgetPainter::SZ_OF_PEN_RECT=2;
51 const int MyWidgetPainter::PADLOCK_X=130;
52 const int MyWidgetPainter::PADLOCK_Y=206;
53 const int MyWidgetPainter::DICE_X=225;
54 const int MyWidgetPainter::DICE_Y=225;
55 const int HoverLabel::PT_SZ_ON_HOVER=8;
56 const int OutputLabel::PEN_SZ_CIRCLED=5;
58 void MyWidgetPainter::drawPadlock(QWidget *wid) const
60 static const int STRT_BASEY=86,H_CHORD=18;
61 const float RATIO(float(PADLOCK_Y)/float(PADLOCK_X));
62 QPainter painter(wid);
63 int width(wid->width()),height(wid->height());
64 if(float(height)>RATIO*float(width))
65 painter.setViewport(0,int(height-RATIO*float(width))/2,width,width*RATIO);
67 painter.setViewport((float(width)-height/RATIO)/2,0,height/RATIO,height);//width-height/RATIO
68 painter.setRenderHint(QPainter::Antialiasing,true);
69 painter.setWindow(0,-STRT_BASEY,PADLOCK_X,PADLOCK_Y);
70 painter.setPen(QPen(Qt::black,SZ_OF_PEN_RECT,Qt::SolidLine,Qt::SquareCap));
72 float radius=PADLOCK_X*PADLOCK_X/(8*H_CHORD)+H_CHORD/2;
73 float startAngle=acos(PADLOCK_X/(2.*radius))/M_PI*180*16;
74 float spanAngle=2*asin(PADLOCK_X/(2*radius))/M_PI*180*16;
77 QColor darkYellow(194,170,99),brightYellow(255,250,219),zeYellow(255,212,80);
78 QBrush brush(painter.brush());
79 QLinearGradient grad(0,0,PADLOCK_X,0);
80 grad.setColorAt(0.,darkYellow);
81 grad.setColorAt(0.8,brightYellow);
82 grad.setColorAt(1.,zeYellow);
83 painter.setBrush(grad);
84 //painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);// SourceOver by default
85 painter.drawRect(QRect(SZ_OF_PEN_RECT,SZ_OF_PEN_RECT,PADLOCK_X-2*SZ_OF_PEN_RECT,PADLOCK_Y-STRT_BASEY-2*SZ_OF_PEN_RECT));
87 painter.setBrush(brush);
88 painter.drawRect(QRect(0+SZ_OF_PEN_RECT/2,0+SZ_OF_PEN_RECT/2,PADLOCK_X-SZ_OF_PEN_RECT,PADLOCK_Y-STRT_BASEY-SZ_OF_PEN_RECT));
90 t.translate(0,-(STRT_BASEY+H_CHORD)) ; t.rotate(180) ; t.translate(-PADLOCK_X,-STRT_BASEY-2*H_CHORD);
91 painter.setWorldTransform(t);
92 painter.drawChord(QRect(-(radius-PADLOCK_X/2),0,2*radius,2*radius),180*16-startAngle,-spanAngle);
93 painter.setWorldTransform(t2);
95 painter.drawLine(6,0,6,-24); painter.drawLine(25,0,25,-24);
96 //painter.drawLine(103,0,103,-24); painter.drawLine(122,0,122,-24);
97 const int r1(39),r2(58);//78==103-25 116==122-6
98 const int center[2]={64,-24};
99 float p1x=cos((180.-_angle)/180.*M_PI)*r1+center[0];
100 float p1y=-sin((180.-_angle)/180.*M_PI)*r1+center[1];
101 float p2x=cos((180.-_angle)/180.*M_PI)*r2+center[0];
102 float p2y=-sin((180.-_angle)/180.*M_PI)*r2+center[1];
103 painter.drawArc(QRect(25,-63,2*r1,2*r1),180*16,-_angle*16);
104 painter.drawArc(QRect(6,-82,2*r2,2*r2),180*16,-_angle*16);
105 painter.drawLine(p1x,p1y,p2x,p2y);
108 void MyWidgetPainter::drawDice(QWidget *wid) const
110 QPainter painter(wid);
111 int width(wid->width()),height(wid->height());
113 painter.setViewport(0,(height-width)/2,width,width);
115 painter.setViewport((width-height)/2,0,height,height);
116 painter.setRenderHint(QPainter::Antialiasing,true);
117 painter.setWindow(0,0,DICE_X,DICE_Y);
118 const QPoint face0[4]={QPoint(22,35),QPoint(113,110),QPoint(90,224),QPoint(0,148)};
119 const QPoint face1[4]={QPoint(113,110),QPoint(224,73),QPoint(196,185),QPoint(90,224)};
120 const QPoint face2[4]={QPoint(22,35),QPoint(113,110),QPoint(224,73),QPoint(126,0)};
121 QLinearGradient grad(0,0,PADLOCK_X,0);
122 QColor red0(154,18,20),red1(87,11,13),red2(205,25,24);
123 painter.setBrush(QBrush(red0)); painter.drawPolygon(face0,4);
124 painter.setBrush(QBrush(red1)); painter.drawPolygon(face1,4);
125 painter.setBrush(QBrush(red2)); painter.drawPolygon(face2,4);
127 QColor grey(209,209,209);
128 painter.setBrush(grey);
130 const int NB_POINTS=14;
131 const float refs[NB_POINTS*2]={50,29,76,48,104,70,112,10,140,29,168,50,
132 33,57,53,114,72,171,21,127,87,103,
133 109,192,148,145,186,102
135 const int angles[NB_POINTS]={12,12,12,12,12,12,72,72,72,72,72,-47,-47,-47};
136 for(int i=0;i<NB_POINTS;i++)
139 float angle(angles[i]);
140 float angler(-angle/180*M_PI);
141 float refX(refs[2*i]),refY(refs[2*i+1]);
142 t.rotate(angle) ; t.translate((cos(angler)*refX-sin(angler)*refY),(sin(angler)*refX+cos(angler)*refY));
143 painter.setWorldTransform(t);
144 painter.drawEllipse(0,0,32,16);
148 void MyWidgetPainter::changeAngle()
150 const int resolution(5);
151 _angle=(((_angle-120)+resolution)%60)+120;
154 void MyWidgetPainter::paintDataCommonPart(QPaintEvent *event, const QString& text)
156 int width0(getWidget()->width()),height0(getWidget()->height());
157 QRect refRect(0,0,width0,height0);
158 QPainter painter(getWidget());
159 //const QRect& refRect(event->rect());//getWidget()->frameGeometry()
160 QRect refRect2(refRect);//event->rect());
161 painter.setPen(QPen(Qt::red,SZ_OF_PEN_RECT,Qt::SolidLine,Qt::RoundCap));
162 refRect2.translate(SZ_OF_PEN_RECT,SZ_OF_PEN_RECT);
163 refRect2.setWidth(refRect2.width()-2*SZ_OF_PEN_RECT);;
164 refRect2.setHeight(refRect2.height()-2*SZ_OF_PEN_RECT);
165 painter.drawRect(refRect2);
166 painter.setPen(QPen(Qt::black,10,Qt::SolidLine,Qt::RoundCap));
167 QRect rect(painter.boundingRect(refRect,Qt::AlignTop,text));//Qt::AlignCenter
168 const QFont& ft(getWidget()->font());
170 painter.drawText(QPoint(refRect.x()+SZ_OF_PEN_RECT+refRect2.width()/2-rect.width()/2,
171 refRect.y()+refRect.height()/2+rect.height()/2-fm.descent()),text);
174 template<class FontBrushSetGet>
175 void MyWidgetPainterNoFocus::prepareFontAndBrush(FontBrushSetGet *fbsg)
177 QFont ft(fbsg->font());
182 void MyWidgetPainterNoFocus::paintEvent(QPaintEvent *event)
184 prepareFontAndBrush(getWidget());
185 if(!getWidget()->isRandom())
187 if(getWidget()->text().isEmpty())
188 drawPadlock(getWidget());
190 paintDataCommonPart(event,getWidget()->text());
193 drawDice(getWidget());
196 QSize MyWidgetPainterNoFocus::sizeHint() const
198 if(!getWidget()->isRandom())
200 if(getWidget()->text().isEmpty())
201 return QSize(PADLOCK_X/6,PADLOCK_Y/6);
204 QPixmap px(1000,1000);
205 QPainter painter(&px);
206 painter.setPen(QPen(Qt::black,5,Qt::SolidLine,Qt::RoundCap));
207 prepareFontAndBrush(&painter);
208 QRect rect(painter.boundingRect(QRect(),Qt::AlignTop,getWidget()->text()));
209 return QSize(rect.width()+2*SZ_OF_PEN_RECT,rect.height()+2*SZ_OF_PEN_RECT);
213 return QSize(DICE_X/5,DICE_Y/5);
216 void MyWidgetPainterNoFocus::appendLetter(const QString& letter)
220 void MyWidgetPainterNoFocus::supprLetter()
224 template<class FontBrushSetGet>
225 void MyWidgetPainterFocus::prepareFontAndBrush(FontBrushSetGet *fbsg)
227 QFont ft(fbsg->font());
232 void MyWidgetPainterFocus::paintEvent(QPaintEvent *event)
234 prepareFontAndBrush(getWidget());
235 paintDataCommonPart(event,_textEntered);
238 QSize MyWidgetPainterFocus::sizeHint() const
240 QPixmap px(1000,1000);
241 QPainter painter(&px);
242 painter.setPen(QPen(Qt::black,5,Qt::SolidLine,Qt::RoundCap));
243 prepareFontAndBrush(&painter);
244 QRect rect(painter.boundingRect(QRect(),Qt::AlignTop,_textEntered));
245 return QSize(rect.width(),rect.height());
248 void MyWidgetPainterFocus::appendLetter(const QString& letter)
250 _textEntered+=letter;
251 getWidget()->updateGeometry();
252 getWidget()->update();
255 void MyWidgetPainterFocus::supprLetter()
257 _textEntered.chop(1);
258 getWidget()->updateGeometry();
259 getWidget()->update();
264 YDFXGUIInputPortValueEditor::YDFXGUIInputPortValueEditor(YACSEvalInputPort *inp):_inp(inp),_zePainter(new MyWidgetPainterNoFocus(this)),_valid(0)
266 _valid=BuildValidatorFromPort(this,_inp);
269 setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);//Fixed
270 setFocusPolicy(Qt::ClickFocus);
273 YDFXGUIInputPortValueEditor::~YDFXGUIInputPortValueEditor()
278 QString YDFXGUIInputPortValueEditor::text() const
281 if(_inp->hasDefaultValueDefined())
283 YACSEvalAny *val(_inp->getDefaultValueDefined());
284 txt=BuidStringFromAny(val);
290 void YDFXGUIInputPortValueEditor::setText(const QString& text)
292 bool wasKO(!_inp->hasDefaultValueDefined());
293 YACSEvalAny *val(BuildAnyFromString(text,_inp));
294 _inp->setDefaultValue(val);
295 QString text2(BuidStringFromAny(val));
297 QString toolTipText(QString("Default = %1").arg(text2));
299 toolTipText="No default set !";
300 setToolTip(toolTipText);
303 connect(this,SIGNAL(changeLook()),this,SLOT(applyModificationOfLook()));
309 Q_EMIT statusChanged();
310 disconnect(this,SIGNAL(changeLook()),this,SLOT(applyModificationOfLook()));
315 void YDFXGUIInputPortValueEditor::paintEvent(QPaintEvent *event)
317 _zePainter->paintEvent(event);
320 void YDFXGUIInputPortValueEditor::mousePressEvent(QMouseEvent *event)
323 _zePainter=new MyWidgetPainterFocus(this);
328 void YDFXGUIInputPortValueEditor::mouseReleaseEvent(QMouseEvent *event)
330 QClipboard *cb(QApplication::clipboard());
331 if(event->button()==Qt::MidButton && cb->supportsSelection())
333 QString text(cb->text(QClipboard::Selection));
335 if(_valid->validate(text,pos)==QValidator::Acceptable)
338 _zePainter=new MyWidgetPainterNoFocus(this);
345 void YDFXGUIInputPortValueEditor::keyPressEvent(QKeyEvent *event)
347 int ekey(event->key());
348 if(ekey==Qt::Key_Return || ekey==Qt::Key_Enter)
353 if(ekey==Qt::Key_Escape)
356 _zePainter=new MyWidgetPainterNoFocus(this);
360 if(ekey==Qt::Key_Backspace)
362 _zePainter->supprLetter();
365 if((ekey>=Qt::Key_Exclam && ekey<=Qt::Key_Z))
367 QString st(event->text());
368 _zePainter->appendLetter(st);
372 void YDFXGUIInputPortValueEditor::focusOutEvent(QFocusEvent * event)
374 MyWidgetPainterFocus *zePainter(dynamic_cast<MyWidgetPainterFocus *>(_zePainter));
378 QString zeSt(zePainter->getText());
380 _zePainter=new MyWidgetPainterNoFocus(this);
381 if(_valid->validate(zeSt,pos)==QValidator::Acceptable)
388 QSize YDFXGUIInputPortValueEditor::sizeHint() const
390 return _zePainter->sizeHint();
393 QSize YDFXGUIInputPortValueEditor::minimumSizeHint() const
395 return _zePainter->sizeHint();
398 bool YDFXGUIInputPortValueEditor::isOK() const
403 bool YDFXGUIInputPortValueEditor::IsOK(YACSEvalInputPort *inp)
405 return inp->isRandomVar() || inp->hasDefaultValueDefined();
408 bool YDFXGUIInputPortValueEditor::isRandom() const
410 return _inp->isRandomVar();
413 bool YDFXGUIInputPortValueEditor::toggleRandom()
416 bool oldStatus(_inp->isRandomVar());
417 _inp->declareRandomnessStatus(!oldStatus);
418 Q_EMIT statusChanged(); // always Q_EMIT because this even if newOK and oldOK are the same the upon status can changed !
421 return _inp->isRandomVar();
424 void YDFXGUIInputPortValueEditor::applyModificationOfLook()
426 _zePainter->changeAngle();
433 HoverLabel::HoverLabel(QWidget *parent):QLabel(parent),_isin(false),_isPressed(false)
435 //setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
436 setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
439 void HoverLabel::mousePressEvent(QMouseEvent *event)
441 if(event->button()==Qt::LeftButton)
450 void HoverLabel::mouseReleaseEvent(QMouseEvent *event)
452 if(event->button()==Qt::LeftButton)
460 void HoverLabel::enterEvent(QEvent *event)
467 void HoverLabel::leaveEvent(QEvent *event)
474 void HoverLabel::paintEvent(QPaintEvent *event)
477 return paintIfNotOn(event);
479 QPainter painter(this);
480 QFont ft(painter.font());
481 AssignFontOnHover(ft);
484 QPalette pal(QApplication::palette("QPushButton"));
485 QRect refRect(rect());
486 std::vector<ColoredString> sts(textForEmulatedPushButton());
487 QRect rect3(painter.boundingRect(refRect,Qt::AlignTop,sts[0].str()));
488 int deltaY((refRect.height()-sts.size()*rect3.height())/(sts.size()+1));
489 QBrush b0(pal.color(_isPressed?QPalette::Dark:QPalette::Button));
490 painter.setBrush(b0);
491 painter.setPen(QPen(pal.color(QPalette::Highlight),1,Qt::SolidLine,Qt::SquareCap));
492 painter.drawRoundedRect(QRect(0,0,refRect.width()-1,refRect.height()-1),3,3);
493 painter.setBrush(QBrush());
494 painter.setPen(QPen(pal.color(QPalette::Shadow),1,Qt::SolidLine,Qt::SquareCap));
495 painter.drawRoundedRect(QRect(1,1,refRect.width()-3,refRect.height()-3),3,3);
496 painter.setPen(QPen(pal.color(QPalette::Dark),1,Qt::SolidLine,Qt::SquareCap));
497 painter.drawRoundedRect(QRect(2,2,refRect.width()-5,refRect.height()-5),5,5);
498 painter.setPen(QPen(pal.color(QPalette::Midlight),1,Qt::SolidLine,Qt::SquareCap));
499 painter.drawRoundedRect(QRect(3,3,refRect.width()-7,refRect.height()-7),3,3);
500 painter.setPen(QPen(pal.color(QPalette::Light),1,Qt::SolidLine,Qt::SquareCap));
501 painter.drawRoundedRect(QRect(4,4,refRect.width()-9,refRect.height()-9),3,3);
502 //QPalette::Button QPalette::ButtonText
503 painter.setPen(QPen(pal.color(QPalette::ButtonText),2,Qt::SolidLine,Qt::SquareCap));
505 foreach(ColoredString st,sts)
507 QRect rect2(painter.boundingRect(refRect,Qt::AlignTop,st.str()));
508 QPen pen(painter.pen());
510 pen2.setColor(st.color());
511 painter.setPen(pen2);
512 painter.drawText(QPoint((refRect.width()-rect2.width())/2,posY+rect2.height()-fm.descent()),st.str());
514 posY+=deltaY+rect2.height();
518 QSize HoverLabel::sizeHint() const
521 return sizeHintNotHovered();
525 AssignFontOnHover(ft);
527 std::vector<ColoredString> sts(textForEmulatedPushButton());
529 foreach(ColoredString st,sts)
531 QSize elt(fm.boundingRect(st.str()).size());
533 w=std::max(w,elt.width());
536 ret.setHeight(h); ret.setWidth(w);//3*PT_SZ_ON_HOVER
541 void HoverLabel::AssignFontOnHover(QFont& ft)
545 ft.setPointSize(PT_SZ_ON_HOVER);
550 InputLabel::InputLabel(YACSEvalInputPort *inp, QWidget *parent):HoverLabel(parent),_inp(inp)
552 AssignTextAndTooltip(this,_inp);
555 QSize InputLabel::sizeHintNotHovered() const
557 return QLabel::sizeHint();
560 void InputLabel::paintIfNotOn(QPaintEvent *event)
562 QLabel::paintEvent(event);
565 void InputLabel::pressOccured()
567 Q_EMIT randomnessStatusChanged();
570 std::vector<ColoredString> InputLabel::textForEmulatedPushButton() const
572 std::vector<ColoredString> ret;
573 if(!_inp->isRandomVar())
574 ret.push_back(QString(" Parametrize %1 ").arg(text()));
576 ret.push_back(QString(" Unparametrize %1 ").arg(text()));
580 void InputLabel::AssignTextAndTooltip(QLabel *wid, YACSEvalInputPort *port)
582 QString txt(port->getName().c_str());
584 wid->setToolTip(QString("%1 (%2)").arg(txt).arg(QString(port->getTypeOfData().c_str())));
589 InputLabelNonToggle::InputLabelNonToggle(YDFXGUIInputPortValueEditor *wid, QWidget *parent):QLabel(parent),_wid(wid)
591 setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
592 InputLabel::AssignTextAndTooltip(this,_wid->getPort());
597 OutputLabel::OutputLabel(YACSEvalOutputPort *outp, QWidget *parent):HoverLabel(parent),_outp(outp)
599 QString txt(_outp->getName().c_str());
604 bool OutputLabel::isQOfInt() const
606 return _outp->isQOfInterest();
609 QSize OutputLabel::sizeHintNotHovered() const
612 return QLabel::sizeHint();
613 const QFont& ft(font());
617 ComputePointsToCircle(txt,rect(),font(),pts);
620 path.cubicTo(pts[1],pts[2],pts[3]);
621 path.cubicTo(pts[4],pts[5],pts[6]);
622 QSize ret(path.boundingRect().toRect().size());
623 int& rh(ret.rheight()),&rw(ret.rwidth());
624 rh+=2*PEN_SZ_CIRCLED; rw+=2*PEN_SZ_CIRCLED;
628 void OutputLabel::paintIfNotOn(QPaintEvent *event)
630 QLabel::paintEvent(event);
635 const QFont& ft(font());
637 QPainter painter(this);
640 ComputePointsToCircle(txt,rect(),font(),pts);
644 path.cubicTo(pts[1],pts[2],pts[3]);
645 path.cubicTo(pts[4],pts[5],pts[6]);
646 QPen pen(painter.pen());
647 pen.setColor(Qt::green); pen.setWidth(PEN_SZ_CIRCLED);
648 painter.strokePath(path,pen);
651 void OutputLabel::pressOccured()
653 bool oldStatus(_outp->isQOfInterest());
654 _outp->setQOfInterestStatus(!oldStatus);
658 std::vector<ColoredString> OutputLabel::textForEmulatedPushButton() const
660 std::vector<ColoredString> ret;
663 ret.push_back(QString("Make"));
664 ColoredString elt(QString("%1").arg(_outp->getName().c_str()));
665 elt.setColor(Qt::red);
670 ret.push_back(QString("No more"));
671 ColoredString elt(QString("%1").arg(_outp->getName().c_str()));
672 elt.setColor(Qt::red);
674 ret.push_back(QString("as"));
676 ret.push_back(QString("quantity"));
677 ret.push_back(QString("of"));
678 ret.push_back(QString("interest"));
682 QSize OutputLabel::minimumSizeHint() const
687 void OutputLabel::ComputePointsToCircle(const QString& txt, const QRect& refRect, const QFont& font, QPointF pts[8])
689 QFontMetrics fm(font);
690 QSize rect2(fm.boundingRect(txt).size());
691 QPointF refPt(refRect.width()/2,refRect.height()/2+fm.descent());
694 qreal& p0x(pts[0].rx()),&p0y(pts[0].ry()),&p1x(pts[1].rx()),&p1y(pts[1].ry()),&p2x(pts[2].rx()),&p2y(pts[2].ry()),&p3x(pts[3].rx()),&p3y(pts[3].ry());
695 p0x+=rect2.width()/2.; p0y-=rect2.height();
696 p1x+=rect2.width(); p1y-=1.2*rect2.height()/2.;
697 p2x+=rect2.width(); p2y+=1.2*rect2.height();
698 p3y+=1.2*rect2.height();
699 qreal &p4x(pts[4].rx()),&p4y(pts[4].ry()),&p5x(pts[5].rx()),&p5y(pts[5].ry()),&p6x(pts[6].rx()),&p6y(pts[6].ry());
700 p4x-=1.1*rect2.width(); p4y+=1.2*rect2.height();
701 p5x-=rect2.width(); p5y-=1.3*rect2.height()/2.;
702 p6x+=rect2.width()/2.; p6y-=1.4*rect2.height();
707 void YDFXGUIOKCls::initOK()
714 void YDFXGUIGatherPorts::somebodyChangedStatus()
716 bool newStatus(isOK());
717 if(newStatus!=wasOK())
721 setWasOKStatus(newStatus);
723 Q_EMIT theGlobalStatusChanged(newStatus);// Q_EMIT signal always because of input ports and sequences definitions.
728 YDFXGUIInputPortsSelector::YDFXGUIInputPortsSelector(YACSEvalYFXWrap *efx, QWidget *parent):YDFXGUIGatherPorts(parent),_timerId(-1)
730 _inps=efx->getFreeInputPorts();
735 bool YDFXGUIInputPortsSelector::isOK() const
737 const QObjectList &children(this->children());
739 foreach(QObject *child,children)
741 YDFXGUIInputPortValueEditor *childc(qobject_cast<YDFXGUIInputPortValueEditor *>(child));
746 if(childc->isRandom())
750 return nbOfRandom>=1;
753 bool YDFXGUIInputPortsSelector::areSeqWellDefined() const
755 const QObjectList &children(this->children());
756 int nbOfRandom(0),refSz(std::numeric_limits<int>::max());
757 foreach(QObject *child,children)
759 YDFXGUIInputPortValueEditor *childc(qobject_cast<YDFXGUIInputPortValueEditor *>(child));
764 if(!childc->isRandom())
766 YACSEvalInputPort *port(childc->getPort());
767 YACSEvalSeqAny *seq(port->getSequenceOfValuesToEval());
772 if(refSz!=seq->size())
776 return nbOfRandom>=1;
779 void YDFXGUIInputPortsSelector::fillWidget()
781 QVBoxLayout *mainLayout(new QVBoxLayout);
782 for(std::vector< YACSEvalInputPort * >::const_iterator it=_inps.begin();it!=_inps.end();it++)
784 QHBoxLayout *lineLayout(new QHBoxLayout);
785 YDFXGUIInputPortValueEditor *elt1(new YDFXGUIInputPortValueEditor(*it));
787 if((*it)->getTypeOfData()==YACSEvalAnyDouble::TYPE_REPR)
789 InputLabel *elt0c(new InputLabel(*it,this));
791 connect(elt0c,SIGNAL(randomnessStatusChanged()),elt1,SLOT(toggleRandom()));
794 elt0=new InputLabelNonToggle(elt1,this);
795 lineLayout->addWidget(elt0);
796 connect(elt1,SIGNAL(statusChanged()),this,SLOT(somebodyChangedStatus()));
797 lineLayout->addWidget(elt1);
798 mainLayout->addLayout(lineLayout);
800 this->setLayout(mainLayout);
803 YDFXGUIInputPortsSelector::~YDFXGUIInputPortsSelector()
809 void YDFXGUIInputPortsSelector::showEvent(QShowEvent *e)
811 _timerId=startTimer(100);
814 void YDFXGUIInputPortsSelector::timerEvent(QTimerEvent *e)
816 if(e->timerId()==_timerId)
818 const QObjectList &children(this->children());
819 foreach(QObject *child,children)
821 YDFXGUIInputPortValueEditor *childc(qobject_cast<YDFXGUIInputPortValueEditor *>(child));
824 Q_EMIT childc->changeLook();
830 void YDFXGUIInputPortsSelector::DrawWarningSign(QPainter& painter, int width0, int height0)
833 static const int WARN_Y=176,WARN_X=200;
834 const float RATIO(float(WARN_X)/float(WARN_Y));
835 //QPen(QColor(255,203,189)
836 if(float(width0)>RATIO*float(height0))
837 painter.setViewport(int(width0-RATIO*float(height0))/2,0,height0*RATIO,height0);
839 painter.setViewport(0,(float(height0)-width0/RATIO)/2,width0,width0/RATIO);//width-height/RATIO
840 painter.setRenderHint(QPainter::Antialiasing,true);
841 painter.setWindow(0,0,WARN_X,WARN_Y);
843 painter.setPen(QPen(QColor(255,203,189),SZP,Qt::SolidLine,Qt::RoundCap));
844 painter.drawLine(QPoint(100,13),QPoint(11,164));
845 painter.drawLine(QPoint(11,164),QPoint(185,164));
846 painter.drawLine(QPoint(185,164),QPoint(100,13));
847 QColor lightBlack(200,200,200);
848 painter.setBrush(QBrush(lightBlack));
849 painter.setPen(QPen(lightBlack,2,Qt::SolidLine,Qt::RoundCap));
850 painter.drawEllipse(87,47,24,24);
851 painter.drawEllipse(93,105,12,12);
852 painter.drawEllipse(90,129,18,18);
853 const QPoint points[4]={QPoint(87,59),QPoint(93,111),QPoint(105,111),QPoint(111,59)};
854 painter.drawPolygon(points,4);
857 void YDFXGUIInputPortsSelector::paintEvent(QPaintEvent *e)
859 QPainter painter(this);
861 int width0(width()),height0(height());
863 QRect refRect(0,0,width0,height0);
864 painter.eraseRect(refRect);
866 DrawWarningSign(painter,width0,height0);
871 YDFXGUIOutputPortsSelector::YDFXGUIOutputPortsSelector(YACSEvalYFXWrap *efx, QWidget *parent):YDFXGUIGatherPorts(parent)
873 _outps=efx->getFreeOutputPorts();
878 void YDFXGUIOutputPortsSelector::fillWidget()
880 QVBoxLayout *mainLayout(new QVBoxLayout);
881 for(std::vector< YACSEvalOutputPort * >::const_iterator it=_outps.begin();it!=_outps.end();it++)
883 if((*it)->getTypeOfData()==YACSEvalAnyDouble::TYPE_REPR)
885 OutputLabel *elt1(new OutputLabel(*it,this));
886 mainLayout->addWidget(elt1);
887 connect(elt1,SIGNAL(clicked()),this,SLOT(somebodyChangedStatus()));
890 this->setLayout(mainLayout);
893 void YDFXGUIOutputPortsSelector::paintEvent(QPaintEvent *e)
897 QWidget::paintEvent(e);
900 QPainter painter(this);
901 YDFXGUIInputPortsSelector::DrawWarningSign(painter,width(),height());
904 bool YDFXGUIOutputPortsSelector::isOK() const
906 int nbOfOutputsQOI(0);
907 foreach(QObject *child,children())
909 OutputLabel *childc(qobject_cast<OutputLabel *>(child));
912 if(childc->isQOfInt())
915 return nbOfOutputsQOI>=1;
920 QScrollArea *YDFXGUIAbstractPorts::setupWidgets(const QString& title, QWidget *zeWidget)
922 QHBoxLayout *mainLayout(new QHBoxLayout(this));
923 QGroupBox *gb(new QGroupBox(title,this));
924 QVBoxLayout *vbox(new QVBoxLayout);
925 QVBoxLayout *vbox2(new QVBoxLayout);
926 QFrame *frame(new QFrame(this));
927 frame->setFrameStyle(QFrame::Panel | QFrame::Sunken);
928 vbox->addWidget(frame);
930 QScrollArea *sa(new QScrollArea(this));
931 sa->setWidgetResizable(true);
932 sa->setWidget(zeWidget);
933 vbox2->addWidget(sa);
934 frame->setLayout(vbox2);
935 mainLayout->addWidget(gb);
936 this->setLayout(mainLayout);
942 YDFXGUIInputPorts::YDFXGUIInputPorts(YACSEvalYFXWrap *efx, QWidget *parent):YDFXGUIAbstractPorts(efx,parent),_inputsSelector(new YDFXGUIInputPortsSelector(efx,this))
944 QScrollArea *sa(setupWidgets("Inputs",_inputsSelector));
945 connect(efx,SIGNAL(lockSignal(bool)),_inputsSelector,SLOT(setDisabled(bool)));
946 sa->setMinimumWidth(320);
947 sa->setMinimumHeight(360);
952 YDFXGUIOutputPorts::YDFXGUIOutputPorts(YACSEvalYFXWrap *efx, QWidget *parent):YDFXGUIAbstractPorts(efx,parent),_outputsSelector(new YDFXGUIOutputPortsSelector(efx,this))
954 QScrollArea *sa(setupWidgets("Outputs",_outputsSelector));
955 connect(efx,SIGNAL(lockSignal(bool)),_outputsSelector,SLOT(setDisabled(bool)));
956 sa->setMinimumWidth(100);
960 YDFXGUIAllPorts::YDFXGUIAllPorts(YACSEvalYFXWrap *efx, QWidget *parent):QWidget(parent),_in(new YDFXGUIInputPorts(efx,this)),_out(new YDFXGUIOutputPorts(efx,this))
962 QVBoxLayout *mainLayout(new QVBoxLayout(this));
963 QSplitter *sp(new QSplitter(Qt::Horizontal,this));
964 sp->addWidget(_in); sp->setStretchFactor(0,3);
965 sp->addWidget(_out); sp->setStretchFactor(1,1);
966 mainLayout->addWidget(sp);
967 connect(_in->getPortsManager(),SIGNAL(theGlobalStatusChanged(bool)),this,SLOT(somethingChangedInPorts(bool)));
968 connect(_out->getPortsManager(),SIGNAL(theGlobalStatusChanged(bool)),this,SLOT(somethingChangedInPorts(bool)));
971 bool YDFXGUIAllPorts::isOK() const
973 return _in->getPortsManager()->isOK() && _out->getPortsManager()->isOK();
976 void YDFXGUIAllPorts::somethingChangedInPorts(bool status)
978 bool step1(_in->isOK() && _out->isOK());
981 Q_EMIT sequencesCanBeDefinedSignal(false);
982 Q_EMIT canBeExecutedSignal(false);
985 Q_EMIT sequencesCanBeDefinedSignal(true);
986 Q_EMIT canBeExecutedSignal(_in->areSeqWellDefined());