0030507: Visualization - introduce AIS_ViewController
[occt.git] / src / Aspect / Aspect_VKeySet.cxx
1 // Copyright (c) 2016-2019 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include "Aspect_VKeySet.hxx"
15
16 IMPLEMENT_STANDARD_RTTIEXT(Aspect_VKeySet, Standard_Transient)
17
18 // ================================================================
19 // Function : As1pect_VKeySet
20 // Purpose  :
21 // ================================================================
22 Aspect_VKeySet::Aspect_VKeySet()
23 : myKeys (0, Aspect_VKey_MAX),
24   myModifiers (Aspect_VKeyFlags_NONE)
25 {
26   //
27 }
28
29 // ================================================================
30 // Function : Reset
31 // Purpose  :
32 // ================================================================
33 void Aspect_VKeySet::Reset()
34 {
35   Standard_Mutex::Sentry aLock (myLock);
36   myModifiers = 0;
37   for (NCollection_Array1<KeyState>::Iterator aKeyIter (myKeys); aKeyIter.More(); aKeyIter.Next())
38   {
39     aKeyIter.ChangeValue().Reset();
40   }
41 }
42
43 // ================================================================
44 // Function : KeyDown
45 // Purpose  :
46 // ================================================================
47 void Aspect_VKeySet::KeyDown (Aspect_VKey theKey,
48                               double theTime,
49                               double thePressure)
50 {
51   Standard_Mutex::Sentry aLock (myLock);
52   if (myKeys[theKey].Status != KeyStatus_Pressed)
53   {
54     myKeys[theKey].Status   = KeyStatus_Pressed;
55     myKeys[theKey].TimeDown = theTime;
56   }
57   myKeys[theKey].Pressure = thePressure;
58
59   const unsigned int aModif = Aspect_VKey2Modifier (theKey);
60   myModifiers = myModifiers | aModif;
61 }
62
63 // ================================================================
64 // Function : KeyUp
65 // Purpose  :
66 // ================================================================
67 void Aspect_VKeySet::KeyUp (Aspect_VKey theKey,
68                             double theTime)
69 {
70   Standard_Mutex::Sentry aLock (myLock);
71   if (myKeys[theKey].Status == KeyStatus_Pressed)
72   {
73     myKeys[theKey].Status = KeyStatus_Released;
74     myKeys[theKey].TimeUp = theTime;
75   }
76
77   const unsigned int aModif = Aspect_VKey2Modifier (theKey);
78   if (aModif != 0)
79   {
80     myModifiers = myModifiers & ~aModif;
81   }
82 }
83
84 // ================================================================
85 // Function : KeyFromAxis
86 // Purpose  :
87 // ================================================================
88 void Aspect_VKeySet::KeyFromAxis (Aspect_VKey theNegative,
89                                   Aspect_VKey thePositive,
90                                   double theTime,
91                                   double thePressure)
92 {
93   Standard_Mutex::Sentry aLock (myLock);
94   if (thePressure != 0)
95   {
96     const Aspect_VKey aKeyDown = thePressure > 0 ? thePositive : theNegative;
97     const Aspect_VKey aKeyUp   = thePressure < 0 ? thePositive : theNegative;
98
99     KeyDown (aKeyDown, theTime, Abs (thePressure));
100     if (myKeys[aKeyUp].Status == KeyStatus_Pressed)
101     {
102       KeyUp (aKeyUp, theTime);
103     }
104   }
105   else
106   {
107     if (myKeys[theNegative].Status == KeyStatus_Pressed)
108     {
109       KeyUp (theNegative, theTime);
110     }
111     if (myKeys[thePositive].Status == KeyStatus_Pressed)
112     {
113       KeyUp (thePositive, theTime);
114     }
115   }
116 }
117
118 // ================================================================
119 // Function : HoldDuration
120 // Purpose  :
121 // ================================================================
122 bool Aspect_VKeySet::HoldDuration (Aspect_VKey theKey,
123                                    double theTime,
124                                    double& theDuration,
125                                    double& thePressure)
126 {
127   Standard_Mutex::Sentry aLock (myLock);
128   switch (myKeys[theKey].Status)
129   {
130     case KeyStatus_Free:
131     {
132       theDuration = 0.0;
133       return false;
134     }
135     case KeyStatus_Released:
136     {
137       myKeys[theKey].Status = KeyStatus_Free;
138       theDuration = myKeys[theKey].TimeUp - myKeys[theKey].TimeDown;
139       thePressure = myKeys[theKey].Pressure;
140       return true;
141     }
142     case KeyStatus_Pressed:
143     {
144       theDuration = theTime - myKeys[theKey].TimeDown;
145       thePressure = myKeys[theKey].Pressure;
146       return true;
147     }
148   }
149   return false;
150 }