//------------------------------------------------------------------------------ // emClockHandsPanel.cpp // // Copyright (C) 2006-2008,2016 Oliver Hamann. // // Homepage: http://eaglemode.sourceforge.net/ // // This program is free software: you can redistribute it and/or modify it under // the terms of the GNU General Public License version 3 as published by the // Free Software Foundation. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS // FOR A PARTICULAR PURPOSE. See the GNU General Public License version 3 for // more details. // // You should have received a copy of the GNU General Public License version 3 // along with this program. If not, see . //------------------------------------------------------------------------------ #include emClockHandsPanel::emClockHandsPanel( ParentArg parent, const emString & name, emColor fgColor ) : emPanel(parent,name) { FgColor=fgColor; Hour=0; Minute=0; Second=0; SetFocusable(false); } emClockHandsPanel::~emClockHandsPanel() { } void emClockHandsPanel::SetFgColor(emColor fgColor) { FgColor=fgColor; InvalidatePainting(); } void emClockHandsPanel::SetTime(int hour, int minute, int second) { if (Hour!=hour || Minute!=minute || Second!=second) { Hour=hour; Minute=minute; Second=second; InvalidatePainting(); } } bool emClockHandsPanel::IsOpaque() const { return false; } void emClockHandsPanel::Paint( const emPainter & painter, emColor canvasColor ) const { double hxy[5*2]; double mxy[5*2]; double sxy[4*2]; double u,v,a,cx,cy,r,dx,dy,shx,shy,smx,smy,ssx,ssy; emColor color,shadow; int i; u=emMin(GetViewedWidth(),GetViewedHeight()); v=emMin(GetView().GetCurrentWidth(),GetView().GetCurrentHeight()); a=(v/u*0.75-0.08)*255.0; if (a<=0.0) return; if (a>255.0) a=255.0; shadow=emColor(0,0,0,(emByte)(a*0.2)); color=FgColor; color.SetAlpha((emByte)a); cx=0.5; cy=GetHeight()*0.5; r=emMin(cx,cy); shx=r*0.010; shy=r*0.015; smx=r*0.016; smy=r*0.024; ssx=r*0.020; ssy=r*0.030; dx=r*sin((Hour+Minute/60.0+Second/3600.0)*M_PI/6.0); dy=-r*cos((Hour+Minute/60.0+Second/3600.0)*M_PI/6.0); hxy[0]=cx+shx-0.100*dx+0.039*dy; hxy[1]=cy+shy-0.100*dy-0.039*dx; hxy[2]=cx+shx-0.100*dx-0.039*dy; hxy[3]=cy+shy-0.100*dy+0.039*dx; hxy[4]=cx+shx+0.530*dx-0.039*dy; hxy[5]=cy+shy+0.530*dy+0.039*dx; hxy[6]=cx+shx+0.610*dx; hxy[7]=cy+shy+0.610*dy; hxy[8]=cx+shx+0.530*dx+0.039*dy; hxy[9]=cy+shy+0.530*dy-0.039*dx; dx=r*sin((Minute+Second/60.0)*M_PI/30.0); dy=-r*cos((Minute+Second/60.0)*M_PI/30.0); mxy[0]=cx+smx-0.100*dx+0.035*dy; mxy[1]=cy+smy-0.100*dy-0.035*dx; mxy[2]=cx+smx-0.100*dx-0.035*dy; mxy[3]=cy+smy-0.100*dy+0.035*dx; mxy[4]=cx+smx+0.910*dx-0.035*dy; mxy[5]=cy+smy+0.910*dy+0.035*dx; mxy[6]=cx+smx+0.960*dx; mxy[7]=cy+smy+0.960*dy; mxy[8]=cx+smx+0.910*dx+0.035*dy; mxy[9]=cy+smy+0.910*dy-0.035*dx; dx=r*sin(Second*M_PI/30.0); dy=-r*cos(Second*M_PI/30.0); sxy[0]=cx+ssx-0.150*dx+0.008*dy; sxy[1]=cy+ssy-0.150*dy-0.008*dx; sxy[2]=cx+ssx-0.150*dx-0.008*dy; sxy[3]=cy+ssy-0.150*dy+0.008*dx; sxy[4]=cx+ssx+1.000*dx-0.008*dy; sxy[5]=cy+ssy+1.000*dy+0.008*dx; sxy[6]=cx+ssx+1.000*dx+0.008*dy; sxy[7]=cy+ssy+1.000*dy-0.008*dx; painter.PaintPolygon(hxy,5,shadow); painter.PaintPolygon(mxy,5,shadow); painter.PaintPolygon(sxy,4,shadow); for (i=0; i<5; i++) { hxy[i*2]-=shx; hxy[i*2+1]-=shy; } for (i=0; i<5; i++) { mxy[i*2]-=smx; mxy[i*2+1]-=smy; } for (i=0; i<4; i++) { sxy[i*2]-=ssx; sxy[i*2+1]-=ssy; } painter.PaintPolygon(hxy,5,color); painter.PaintPolygon(mxy,5,color); painter.PaintPolygon(sxy,4,color); }