Salome HOME
4661f5791fd73c2baf829e907b5bd7c319bdeac9
[modules/shaper.git] / src / XGUI / XGUI_Workbench.cpp
1 #include "XGUI_Workbench.h"
2 #include "XGUI_MenuGroupPanel.h"
3
4 #include <QLayout>
5 #include <QResizeEvent>
6 #include <QPushButton>
7
8
9 #define SCROLL_STEP 20
10
11 //**************************************************
12 class CommandsArea : public QScrollArea
13 {
14 public:
15     CommandsArea(QWidget* theParent) : QScrollArea(theParent) {}
16
17 protected:
18     virtual void resizeEvent(QResizeEvent * theEvent);
19 };
20
21 void CommandsArea::resizeEvent(QResizeEvent* theEvent)
22 {
23     int x = widget()->x();
24     QScrollArea::resizeEvent(theEvent);
25     QRect aRect = widget()->childrenRect();
26     QSize aNewSize = theEvent->size();
27     if (aRect.width() > aNewSize.width())
28         aNewSize.setWidth(aRect.width() * 2);
29     widget()->resize(aNewSize);
30     widget()->move(x, 0);
31 }
32
33
34 //**************************************************
35 XGUI_Workbench::XGUI_Workbench(QWidget *theParent) :
36     QWidget(theParent)
37 {
38     setMinimumHeight(30);
39     QHBoxLayout* aMainLayout = new QHBoxLayout(this);
40     aMainLayout->setSpacing(0);
41     aMainLayout->setMargin(0);
42     aMainLayout->setContentsMargins(0,0,0,0);
43
44     myLeftButton = new QPushButton("<", this);
45     myLeftButton->setMaximumWidth(14);
46     myLeftButton->setVisible(false);
47     connect(myLeftButton,SIGNAL(clicked()), this, SLOT(onLeftScroll()));
48     aMainLayout->addWidget(myLeftButton);
49
50     myCommandsArea = new CommandsArea(this);
51     aMainLayout->addWidget(myCommandsArea);
52
53     myChildWidget = new QWidget(myCommandsArea);
54     myCommandsArea->setWidget(myChildWidget);
55     myCommandsArea->setAlignment(Qt::AlignLeft | Qt::AlignTop);
56     myCommandsArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
57     myCommandsArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
58
59     myLayout = new QHBoxLayout(myChildWidget);
60     myLayout->setSpacing(0);
61     myLayout->setMargin(0);
62     myLayout->setContentsMargins(0,0,0,0);
63
64     myRightButton = new QPushButton(">", this);
65     myRightButton->setMaximumWidth(14);
66     myRightButton->setVisible(false);
67     connect(myRightButton,SIGNAL(clicked()), this, SLOT(onRightScroll()));
68     aMainLayout->addWidget(myRightButton);
69
70 }
71
72 /*
73  * Creates a new group in the workbench with given name.
74  * If no name provided it would be defined as {workbench_name}_Group_N.
75  */
76 XGUI_MenuGroupPanel* XGUI_Workbench::addGroup(const QString& theName)
77 {
78     QString aGroupName = theName;
79     //Generate a group name.
80     if(theName.isEmpty()){
81       QString aGroupName = objectName();
82       aGroupName = aGroupName.replace("_Workbench", "_Group_%1");
83       aGroupName = aGroupName.arg(myGroups.count());
84     }
85     if (!myLayout->isEmpty()) {
86         int aNb = myLayout->count();
87         QLayoutItem* aItem = myLayout->itemAt(aNb - 1);
88         myLayout->removeItem(aItem);
89     }
90     XGUI_MenuGroupPanel* aGroup = new XGUI_MenuGroupPanel(myChildWidget);
91     aGroup->setObjectName(aGroupName);
92     myLayout->addWidget(aGroup);
93     addSeparator();
94     myLayout->addStretch();
95     myGroups.append(aGroup);
96     return aGroup;
97 }
98
99 /*
100  * Searches for already created group with given name.
101  */
102 XGUI_MenuGroupPanel* XGUI_Workbench::findGroup(const QString& theName)
103 {
104   QString aGroupName = theName;
105   XGUI_MenuGroupPanel* aPanel;
106   foreach(aPanel, myGroups) {
107     if(aPanel->objectName() == theName) {
108       return aPanel;
109     }
110   }
111   return NULL;
112 }
113
114
115 void XGUI_Workbench::addSeparator()
116 {
117     QFrame* aLine = new QFrame(myChildWidget);
118     aLine->setFrameShape(QFrame::VLine);
119     aLine->setFrameShadow(QFrame::Sunken);
120     myLayout->addWidget(aLine);
121 }
122
123
124 void XGUI_Workbench::resizeEvent(QResizeEvent* theEvent)
125 {
126     QWidget::resizeEvent(theEvent);
127     QSize aSize = theEvent->size();
128     myLeftButton->setMinimumHeight(aSize.height() - 2);
129     myRightButton->setMinimumHeight(aSize.height() - 2);
130
131     QSize aS = myChildWidget->sizeHint();
132         int aW = myChildWidget->width();
133         if (aW < aS.width())
134                 myChildWidget->resize(aS.width(), myChildWidget->height());
135
136     myLeftButton->setVisible(isExceedsLeft());
137     myRightButton->setVisible(isExceedsRight());
138 }
139
140
141 void XGUI_Workbench::onLeftScroll()
142 {
143     if (!isExceedsLeft())
144                 return;
145     myChildWidget->move( myChildWidget->pos().x() + SCROLL_STEP, 0 );
146     myLeftButton->setVisible(isExceedsLeft());
147     myRightButton->setVisible(isExceedsRight());
148 }
149
150
151 void XGUI_Workbench::onRightScroll()
152 {
153     if (!isExceedsRight())
154                 return;
155     myChildWidget->move( myChildWidget->pos().x() - SCROLL_STEP, 0 );
156     myLeftButton->setVisible(isExceedsLeft());
157     myRightButton->setVisible(isExceedsRight());
158 }
159
160
161 bool XGUI_Workbench::isExceedsLeft()
162 {
163     QPoint aPos = myChildWidget->pos();
164     return (aPos.x() < 0);
165 }
166
167 bool XGUI_Workbench::isExceedsRight()
168 {
169     QPoint aPos = myChildWidget->pos();
170     int aVPWidth = myCommandsArea->viewport()->rect().width();
171     int aWgtWidth = myChildWidget->childrenRect().width();
172     return ((aVPWidth - aPos.x()) < aWgtWidth);
173 }