0029684: Configuration: modification of build Inspector tool standalone on occt
[occt.git] / tools / View / View_Window.cxx
1 // Created on: 2017-06-16
2 // Created by: Natalia ERMOLAEVA
3 // Copyright (c) 2017 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement. 
15
16 #if !defined _WIN32
17 #define QT_CLEAN_NAMESPACE         /* avoid definition of INT32 and INT8 */
18 #endif
19
20 #include <inspector/View_Window.hxx>
21
22 #include <inspector/TInspectorAPI_Version.hxx>
23
24 #include <inspector/View_Displayer.hxx>
25 #include <inspector/View_ToolBar.hxx>
26 #include <inspector/View_Tools.hxx>
27 #include <inspector/View_Viewer.hxx>
28 #include <inspector/View_Widget.hxx>
29
30 #include <V3d.hxx>
31
32 #include <Standard_WarningsDisable.hxx>
33 #include <QComboBox>
34 #include <QDockWidget>
35 #include <QGridLayout>
36 #include <QMenu>
37 #include <QToolBar>
38 #include <Standard_WarningsRestore.hxx>
39
40 const int DEFAULT_SPACING = 3;
41
42 // =======================================================================
43 // function : Constructor
44 // purpose :
45 // =======================================================================
46 View_Window::View_Window (QWidget* theParent, const bool isUseKeepView, const bool isFitAllActive)
47 : QWidget (theParent)
48 {
49   QGridLayout* aViewLayout = new QGridLayout (this);
50   aViewLayout->setContentsMargins (0, 0, 0, 0);
51   aViewLayout->setSpacing (DEFAULT_SPACING);
52
53   myView = new View_Widget (this, isFitAllActive);
54   myViewToolBar = new View_ToolBar (this, isUseKeepView);
55   aViewLayout->addWidget (myViewToolBar->GetControl(), 0, 0, 1, 2);
56   connect (myViewToolBar, SIGNAL (contextChanged()), this, SLOT (onViewSelectorActivated()));
57   connect (myViewToolBar, SIGNAL (actionClicked (int)),
58           this, SLOT (onToolBarActionClicked (int)));
59
60   connect (myView, SIGNAL (checkedStateChanged(int, bool)), this, SLOT (onCheckedStateChanged (int, bool)));
61
62   myView->setContextMenuPolicy (Qt::CustomContextMenu);
63   connect (myView, SIGNAL (customContextMenuRequested (const QPoint&)),
64            this, SLOT (onViewContextMenuRequested (const QPoint&)));
65
66   myActionsToolBar = new QToolBar (this);
67   myActionsToolBar->layout()->setContentsMargins (0, 0, 0, 0);
68   myActionsToolBar->setOrientation (Qt::Vertical);
69
70   myActionsToolBar->addWidget (myView-> GetWidget (View_ViewActionType_FitAllId));
71   for (int anActionId = View_ViewActionType_FitAreaId; anActionId <= View_ViewActionType_DisplayModeId; anActionId++)
72     myActionsToolBar->addAction (myView->GetViewAction ((View_ViewActionType)anActionId));
73
74   aViewLayout->addWidget (myActionsToolBar, 1, 0);
75   aViewLayout->addWidget (myView, 1, 1);
76   aViewLayout->setRowStretch (1, 1);
77
78   Handle(AIS_InteractiveContext) aContext = myView->GetViewer()->GetContext();
79   myViewToolBar->SetContext (View_ContextType_Own, aContext);
80
81   myDisplayer = new View_Displayer();
82   if (!isUseKeepView)
83     myDisplayer->KeepPresentations (true);
84   myDisplayer->SetFitAllActive (isFitAllActive);
85   connect (myView, SIGNAL (displayModeClicked()), this, SLOT (onDisplayModeChanged()));
86   onViewSelectorActivated();
87 }
88
89 // =======================================================================
90 // function : SetContext
91 // purpose :
92 // =======================================================================
93 void View_Window::SetContext (View_ContextType /*theType*/, const Handle(AIS_InteractiveContext)& theContext)
94 {
95   GetViewToolBar()->SetContext (View_ContextType_External, theContext);
96 }
97
98 // =======================================================================
99 // function : onViewSelectorActivated
100 // purpose :
101 // =======================================================================
102 void View_Window::onViewSelectorActivated()
103 {
104   View_ContextType aType = myViewToolBar->GetCurrentContextType();
105   bool isViewEnabled = aType == View_ContextType_Own;
106
107   myView->SetEnabledView (isViewEnabled);
108
109   Handle(AIS_InteractiveContext) aContext = myViewToolBar->GetCurrentContext();
110   myDisplayer->EraseAllPresentations (true);
111   emit eraseAllPerformed();
112
113   myDisplayer->SetContext (aContext);
114 }
115
116 // =======================================================================
117 // function : onToolBarActionClicked
118 // purpose :
119 // =======================================================================
120 void View_Window::onToolBarActionClicked (const int theActionId)
121 {
122   switch (theActionId)
123   {
124     case View_ToolActionType_KeepViewId:
125     {
126       myDisplayer->KeepPresentations (myViewToolBar->IsActionChecked (theActionId));
127       break;
128     }
129     case View_ToolActionType_KeepViewOffId:
130     {
131       myDisplayer->KeepPresentations (!myViewToolBar->IsActionChecked (theActionId));
132       break;
133     }
134     case View_ToolActionType_ClearViewId:
135     {
136       myDisplayer->EraseAllPresentations (true);
137       emit eraseAllPerformed();
138       break;
139     }
140     default:
141       break;
142   }
143 }
144
145 // =======================================================================
146 // function : onCheckedStateChanged
147 // purpose :
148 // =======================================================================
149 void View_Window::onCheckedStateChanged (int theActionId, bool theState)
150 {
151   if (theActionId == View_ViewActionType_FitAllId)
152     myDisplayer->SetFitAllActive (theState);
153 }
154
155 // =======================================================================
156 // function : onViewContextMenuRequested
157 // purpose :
158 // =======================================================================
159 void View_Window::onViewContextMenuRequested (const QPoint& thePosition)
160 {
161 #if TINSPECTORAPI_VERSION_HEX > 0x070200
162   QMenu* aMenu = new QMenu (this);
163   QMenu* anOrientationSubMenu = aMenu->addMenu ("Set View Orientation");
164
165   for (int i = 0; i < (int)V3d_XnegYnegZneg; i++)
166   {
167     V3d_TypeOfOrientation anOrientationType = (V3d_TypeOfOrientation)i;
168     anOrientationSubMenu->addAction (View_Tools::CreateAction (V3d::TypeOfOrientationToString (anOrientationType),
169                                                                SLOT (onSetOrientation()), this, this));
170   }
171   aMenu->addMenu (anOrientationSubMenu);
172
173   QPoint aPoint = myView->mapToGlobal (thePosition);
174   aMenu->exec (aPoint);
175 #else
176   (void)thePosition;
177 #endif
178 }
179
180 // =======================================================================
181 // function : onSetOrientation
182 // purpose :
183 // =======================================================================
184 void View_Window::onSetOrientation()
185 {
186 #if TINSPECTORAPI_VERSION_HEX > 0x070200
187   QAction* anAction = (QAction*)(sender());
188
189   TCollection_AsciiString anOrientationStr (anAction->text().toStdString().c_str());
190
191   V3d_TypeOfOrientation anOrientationType;
192   if (!V3d::TypeOfOrientationFromString (anOrientationStr.ToCString(), anOrientationType))
193     return;
194
195   Handle(V3d_View) aView = myView->GetViewer()->GetView();
196   if (aView.IsNull())
197     return;
198
199   aView->SetProj (anOrientationType);
200   aView->FitAll();
201   aView->Redraw();
202 #endif
203 }
204
205 // =======================================================================
206 // function : onDisplayModeChanged
207 // purpose :
208 // =======================================================================
209 void View_Window::onDisplayModeChanged()
210 {
211   int aDisplayMode = myView->GetDisplayMode();
212   for (NCollection_DataMap<View_PresentationType, NCollection_Shared<AIS_ListOfInteractive> >::Iterator
213        anIterator(myDisplayer->GetDisplayed()); anIterator.More(); anIterator.Next())
214     myDisplayer->SetDisplayMode (aDisplayMode, anIterator.Key(), false);
215   myDisplayer->UpdateViewer();
216 }