Salome HOME
Implementation of the Feature Validator
[modules/shaper.git] / src / XGUI / XGUI_MainMenu.cpp
1 #include <XGUI_MainMenu.h>
2 #include <XGUI_Workbench.h>
3 #include <XGUI_MenuGroupPanel.h>
4 #include <XGUI_MainWindow.h>
5 #include <XGUI_Command.h>
6
7 #include <QLayout>
8 #include <QTabWidget>
9 #include <QLabel>
10 #include <QDockWidget>
11 #include <QEvent>
12 #include <QPushButton>
13 #include <QTabBar>
14
15 XGUI_MainMenu::XGUI_MainMenu(XGUI_MainWindow *parent)
16     : QWidget(parent), myDesktop(parent)
17 {
18   myGeneralPage = new XGUI_MenuGroupPanel(this);
19   myGeneralPage->setObjectName("Default");
20   myGeneralPage->parentWidget()->setMaximumWidth(200);
21   myGeneralPage->installEventFilter(this);
22   myGeneralPage->setFrameStyle(QFrame::StyledPanel);
23
24   myMenuTabs = new QTabWidget(this);
25   myMenuTabs->setStyleSheet("QTabBar::tab {height: 24px;} QTabWidget:pane {border: 0px;}");
26   QHBoxLayout* aMainLayout = new QHBoxLayout(this);
27   aMainLayout->addWidget(myGeneralPage);
28   aMainLayout->addWidget(myMenuTabs);
29   aMainLayout->setContentsMargins(0, 2, 2, 0);
30   aMainLayout->setSpacing(2);
31   setLayout(aMainLayout);
32   setFixedHeight(menuHeight());
33 }
34
35 XGUI_MainMenu::~XGUI_MainMenu(void)
36 {
37 }
38
39 XGUI_Workbench* XGUI_MainMenu::addWorkbench(const QString& theId, const QString& theTitle)
40 {
41   QString aTitle = theTitle;
42   if (aTitle.isEmpty()) {
43     aTitle = tr(theId.toLatin1().constData());
44   }
45   XGUI_Workbench* aPage = new XGUI_Workbench(myMenuTabs);
46   aPage->setObjectName(theId);
47   myMenuTabs->addTab(aPage, aTitle);
48   return aPage;
49 }
50
51 /*
52  * Searches for already created workbench with given name.
53  */
54 XGUI_Workbench* XGUI_MainMenu::findWorkbench(const QString& theObjName) const
55 {
56   return myDesktop->findChild<XGUI_Workbench*>(theObjName);
57 }
58
59
60 bool XGUI_MainMenu::eventFilter(QObject *theWatched, QEvent *theEvent)
61 {
62   if (theWatched == myGeneralPage) {
63     if (theEvent->type() == QEvent::Show) {
64       myGeneralPage->parentWidget()->setMaximumWidth(16777215);
65       myGeneralPage->removeEventFilter(this);
66     }
67   }
68   return QObject::eventFilter(theWatched, theEvent);
69 }
70
71 void XGUI_MainMenu::insertConsole(QWidget* theConsole)
72 {
73   int aConsoleTabId = myMenuTabs->addTab(theConsole, "Console");
74
75   QTabBar* aTabBar = myMenuTabs->findChild<QTabBar*>();
76   QPushButton* aCloseTabButton = new QPushButton();
77   aCloseTabButton->setFixedSize(16, 16);
78   aCloseTabButton->setIcon(QIcon(":pictures/wnd_close.png"));
79   aCloseTabButton->setFlat(true);
80   aTabBar->setTabButton(aConsoleTabId,
81                         QTabBar::RightSide,
82                         aCloseTabButton);
83
84   connect(aCloseTabButton, SIGNAL(clicked()),
85           myDesktop, SLOT(dockPythonConsole()));
86 }
87
88 void XGUI_MainMenu::removeConsole()
89 {
90   const int kLastTab = myMenuTabs->count() - 1;
91   myMenuTabs->removeTab(kLastTab);
92 }
93
94 XGUI_Command* XGUI_MainMenu::feature(const QString& theId) const
95 {
96   XGUI_Command* result;
97   result = myGeneralPage->feature(theId);
98   if (!result) {
99     for (int aTabIdx = 0; aTabIdx < myMenuTabs->count(); ++aTabIdx) {
100       XGUI_Workbench* aWbn = static_cast<XGUI_Workbench*>(myMenuTabs->widget(aTabIdx));
101       result = aWbn->feature(theId);
102       if (result) break;
103     }
104   }
105   return result;
106 }
107
108 QList<XGUI_Command*> XGUI_MainMenu::features() const
109 {
110   QList<XGUI_Command*> aList = myGeneralPage->features();
111   for (int aTabIdx = 0; aTabIdx < myMenuTabs->count(); ++aTabIdx) {
112     XGUI_Workbench* aWbn = static_cast<XGUI_Workbench*>(myMenuTabs->widget(aTabIdx));
113     aList.append(aWbn->features());
114   }
115   return aList;
116 }
117
118 int XGUI_MainMenu::menuItemSize() const
119 {
120   //TODO(sbh, vsv): get this value from the preferences
121   static const ItemSize DEFAULT_ITEM_SIZE = Medium;
122   return (int) DEFAULT_ITEM_SIZE;
123 }
124
125 int XGUI_MainMenu::menuHeight() const
126 {
127   // Default group has no tabs above --> one extra row
128   int rows = menuItemRowsCount() + 1;
129   const int kMarginsSpacings = 4;
130   return rows * menuItemSize() + kMarginsSpacings;
131 }
132
133 int XGUI_MainMenu::menuItemRowsCount() const
134 {
135   //TODO(sbh, vsv): get this value from the preferences
136   static const int DEFAULT_ITEM_ROWS_COUNT = 3;
137   return DEFAULT_ITEM_ROWS_COUNT;
138 }