0026603: Problem with maximization and normalization document windows in Qt samples...
[occt.git] / samples / qt / Common / src / OcctWindow.cxx
1 #include <OcctWindow.h>
2
3 // =======================================================================
4 // function : OcctWindow
5 // purpose  :
6 // =======================================================================
7 OcctWindow::OcctWindow ( QWidget* theWidget, const Quantity_NameOfColor theBackColor )
8 : Aspect_Window(), 
9   myWidget( theWidget )
10 {
11   SetBackground (theBackColor);
12   myXLeft   = myWidget->rect().left();
13   myYTop    = myWidget->rect().top();
14   myXRight  = myWidget->rect().right();
15   myYBottom = myWidget->rect().bottom();
16 }
17
18 // =======================================================================
19 // function : Destroy
20 // purpose  :
21 // =======================================================================
22 void OcctWindow::Destroy()
23 {
24   myWidget = NULL;
25 }
26
27 // =======================================================================
28 // function : NativeParentHandle
29 // purpose  :
30 // =======================================================================
31 Aspect_Drawable OcctWindow::NativeParentHandle() const
32 {
33   QWidget* aParentWidget = myWidget->parentWidget();
34   if ( aParentWidget != NULL )
35     return (Aspect_Drawable)aParentWidget->winId();
36   else
37     return 0;
38 }
39
40 // =======================================================================
41 // function : NativeHandle
42 // purpose  :
43 // =======================================================================
44 Aspect_Drawable OcctWindow::NativeHandle() const
45 {
46   return (Aspect_Drawable)myWidget->winId();
47 }
48
49 // =======================================================================
50 // function : IsMapped
51 // purpose  :
52 // =======================================================================
53 Standard_Boolean OcctWindow::IsMapped() const
54 {
55   return !( myWidget->isMinimized() || myWidget->isHidden() );
56 }
57
58 // =======================================================================
59 // function : Map
60 // purpose  :
61 // =======================================================================
62 void OcctWindow::Map() const
63 {
64   myWidget->show();
65   myWidget->update();
66 }
67
68 // =======================================================================
69 // function : Unmap
70 // purpose  :
71 // =======================================================================
72 void OcctWindow::Unmap() const
73 {
74   myWidget->hide();
75   myWidget->update();
76 }
77
78 // =======================================================================
79 // function : DoResize
80 // purpose  :
81 // =======================================================================
82 Aspect_TypeOfResize OcctWindow::DoResize() const
83 {
84   int                 aMask = 0;
85   Aspect_TypeOfResize aMode = Aspect_TOR_UNKNOWN;
86
87   if ( !myWidget->isMinimized() )
88   {
89     if ( Abs ( myWidget->rect().left()   - myXLeft   ) > 2 ) aMask |= 1;
90     if ( Abs ( myWidget->rect().right()  - myXRight  ) > 2 ) aMask |= 2;
91     if ( Abs ( myWidget->rect().top()    - myYTop    ) > 2 ) aMask |= 4;
92     if ( Abs ( myWidget->rect().bottom() - myYBottom ) > 2 ) aMask |= 8;
93
94     switch ( aMask )
95     {
96       case 0:
97         aMode = Aspect_TOR_NO_BORDER;
98         break;
99       case 1:
100         aMode = Aspect_TOR_LEFT_BORDER;
101         break;
102       case 2:
103         aMode = Aspect_TOR_RIGHT_BORDER;
104         break;
105       case 4:
106         aMode = Aspect_TOR_TOP_BORDER;
107         break;
108       case 5:
109         aMode = Aspect_TOR_LEFT_AND_TOP_BORDER;
110         break;
111       case 6:
112         aMode = Aspect_TOR_TOP_AND_RIGHT_BORDER;
113         break;
114       case 8:
115         aMode = Aspect_TOR_BOTTOM_BORDER;
116         break;
117       case 9:
118         aMode = Aspect_TOR_BOTTOM_AND_LEFT_BORDER;
119         break;
120       case 10:
121         aMode = Aspect_TOR_RIGHT_AND_BOTTOM_BORDER;
122         break;
123       default:
124         break;
125     }  // end switch
126
127     *( ( Standard_Integer* )&myXLeft  ) = myWidget->rect().left();
128     *( ( Standard_Integer* )&myXRight ) = myWidget->rect().right();
129     *( ( Standard_Integer* )&myYTop   ) = myWidget->rect().top();
130     *( ( Standard_Integer* )&myYBottom) = myWidget->rect().bottom();
131   }
132
133   return aMode;
134 }
135
136 // =======================================================================
137 // function : Ratio
138 // purpose  :
139 // =======================================================================
140 Quantity_Ratio OcctWindow::Ratio() const
141 {
142   QRect aRect = myWidget->rect();
143   return Quantity_Ratio( aRect.right() - aRect.left() ) / Quantity_Ratio( aRect.bottom() - aRect.top() );
144 }
145
146 // =======================================================================
147 // function : Size
148 // purpose  :
149 // =======================================================================
150 void OcctWindow::Size ( Standard_Integer& theWidth, Standard_Integer& theHeight ) const
151 {
152   QRect aRect = myWidget->rect();
153   theWidth  = aRect.right();
154   theHeight = aRect.bottom();
155 }
156
157 // =======================================================================
158 // function : Position
159 // purpose  :
160 // =======================================================================
161 void OcctWindow::Position ( Standard_Integer& theX1, Standard_Integer& theY1,
162                             Standard_Integer& theX2, Standard_Integer& theY2 ) const
163 {
164   theX1 = myWidget->rect().left();
165   theX2 = myWidget->rect().right();
166   theY1 = myWidget->rect().top();
167   theY2 = myWidget->rect().bottom();
168 }