tagging release
[dasher.git] / trunk / Src / DasherCore / CircleStartHandler.cpp
blobbbc5e8b182a4f7deb1e85b720eaf7aa2622f83f3
2 #include "../Common/Common.h"
4 #include "CircleStartHandler.h"
5 #include "Event.h"
7 CCircleStartHandler::CCircleStartHandler(Dasher::CEventHandler * pEventHandler, CSettingsStore * pSettingsStore, CDasherInterfaceBase *pInterface)
8 : CStartHandler(pEventHandler, pSettingsStore, pInterface) {
9 m_iStatus = -1;
10 m_iChangeTime = 0;
11 m_iCircleRadius = GetLongParameter(LP_MAX_Y) * GetLongParameter(LP_CIRCLE_PERCENT) / 100;
12 m_iScreenRadius = 0;
15 bool CCircleStartHandler::DecorateView(CDasherView *pView) {
16 screenint iCX;
17 screenint iCY;
19 pView->Dasher2Screen(2048, 2048, iCX, iCY);
21 screenint iCX2;
22 screenint iCY2;
24 pView->Dasher2Screen(2048, 2048 + m_iCircleRadius, iCX2, iCY2);
26 m_iScreenRadius = iCY2 - iCY;
28 if((m_iStatus == 0) || (m_iStatus == 2))
29 pView->Screen()->DrawCircle(iCX, iCY, m_iScreenRadius, 2, 242, 1, true);
30 else if((m_iStatus == 1) || (m_iStatus == 3))
31 pView->Screen()->DrawCircle(iCX, iCY, m_iScreenRadius, 240, 0, 1, false);
32 else if(m_iStatus == 5)
33 pView->Screen()->DrawCircle(iCX, iCY, m_iScreenRadius, 2, 241, 1, true);
34 else
35 pView->Screen()->DrawCircle(iCX, iCY, m_iScreenRadius, 240, 0, 3, false);
37 return true;
40 void CCircleStartHandler::Timer(int iTime, CDasherView *m_pDasherView, CDasherModel *m_pDasherModel) {
41 myint iDasherX;
42 myint iDasherY;
43 m_pDasherView->GetCoordinates(iTime, iDasherX, iDasherY);
45 screenint iCX;
46 screenint iCY;
47 m_pDasherView->Dasher2Screen(2048, 2048, iCX, iCY);
49 screenint iCursorX;
50 screenint iCursorY;
51 m_pDasherView->Dasher2Screen(iDasherX, iDasherY, iCursorX, iCursorY);
53 double dR;
55 dR = sqrt(pow(static_cast<double>(iCX - iCursorX), 2.0) + pow(static_cast<double>(iCY - iCursorY), 2.0));
57 int iNewStatus(-1);
59 // Status flags:
60 // -1 undefined
61 // 0 = out of circle, stopped
62 // 1 = out of circle, started
63 // 2 = in circle, stopped
64 // 3 = in circle, started
65 // 4 = in circle, stopping
66 // 5 = in circle, starting
68 // TODO - need to check that these respond correctly to (eg) external pauses
70 if(dR < m_iScreenRadius) {
71 switch(m_iStatus) {
72 case -1:
73 if(m_pInterface->GetBoolParameter(BP_DASHER_PAUSED))
74 iNewStatus = 2;
75 else
76 iNewStatus = 3;
77 break;
78 case 0:
79 iNewStatus = 5;
80 break;
81 case 1:
82 iNewStatus = 4;
83 break;
84 case 2:
85 case 3:
86 case 4:
87 case 5:
88 iNewStatus = m_iStatus;
89 break;
92 else {
93 switch(m_iStatus) {
94 case -1:
95 if(m_pInterface->GetBoolParameter(BP_DASHER_PAUSED))
96 iNewStatus = 0;
97 else
98 iNewStatus = 1;
99 break;
100 case 0:
101 case 1:
102 iNewStatus = m_iStatus;
103 break;
104 case 2:
105 iNewStatus = 0;
106 break;
107 case 3:
108 iNewStatus = 1;
109 break;
110 case 4:
111 iNewStatus = 1;
112 break;
113 case 5:
114 iNewStatus = 0;
115 break;
119 if(iNewStatus != m_iStatus) {
120 m_iChangeTime = iTime;
123 if(iTime - m_iChangeTime > 1000) {
124 if(iNewStatus == 4) {
125 iNewStatus = 2;
126 m_pInterface->PauseAt(0, 0);
128 else if(iNewStatus == 5) {
129 iNewStatus = 3;
130 m_pInterface->Unpause(iTime);
134 m_iStatus = iNewStatus;
138 void CCircleStartHandler::HandleEvent(Dasher::CEvent * pEvent) {
139 if(pEvent->m_iEventType == 1) {
140 Dasher::CParameterNotificationEvent * pEvt(static_cast < Dasher::CParameterNotificationEvent * >(pEvent));
142 switch (pEvt->m_iParameter) {
143 case BP_DASHER_PAUSED:
144 m_iStatus = -1;
145 break;