Making the clock optionally non-interactive, display-only and drawn without the seconds hand.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39668 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jonas Sundström 2010-11-28 15:57:46 +00:00
parent c0aa3379bb
commit e55a3c6a38
2 changed files with 45 additions and 14 deletions

View File

@ -26,7 +26,8 @@
class OffscreenClock : public BView {
public:
OffscreenClock(BRect frame, const char* name);
OffscreenClock(BRect frame, const char* name,
bool drawSecondHand = true);
virtual ~OffscreenClock();
void SetTime(int32 hour, int32 minute, int32 second);
@ -62,10 +63,13 @@ private:
bool fHourDragging;
bool fMinuteDragging;
bool fDrawSecondHand;
};
OffscreenClock::OffscreenClock(BRect frame, const char* name)
OffscreenClock::OffscreenClock(BRect frame, const char* name,
bool drawSecondHand)
:
BView(frame, name, B_FOLLOW_NONE, B_WILL_DRAW),
fHours(0),
@ -73,7 +77,8 @@ OffscreenClock::OffscreenClock(BRect frame, const char* name)
fSeconds(0),
fDirty(true),
fHourDragging(false),
fMinuteDragging(false)
fMinuteDragging(false),
fDrawSecondHand(drawSecondHand)
{
SetFlags(Flags() | B_SUBPIXEL_PRECISE);
@ -343,13 +348,15 @@ OffscreenClock::_DrawHands(float x, float y, float radius,
offsetY = (radius * 0.9) * cosf((minutes * M_PI) / 30.0);
StrokeLine(BPoint(x, y), BPoint(x + offsetX, y - offsetY));
// calc, draw second hand
SetHighColor(secondsColor);
SetPenSize(1.0);
offsetX = (radius * 0.95) * sinf((fSeconds * M_PI) / 30.0);
offsetY = (radius * 0.95) * cosf((fSeconds * M_PI) / 30.0);
StrokeLine(BPoint(x, y), BPoint(x + offsetX, y - offsetY));
if (fDrawSecondHand) {
// calc, draw second hand
SetHighColor(secondsColor);
SetPenSize(1.0);
offsetX = (radius * 0.95) * sinf((fSeconds * M_PI) / 30.0);
offsetY = (radius * 0.95) * cosf((fSeconds * M_PI) / 30.0);
StrokeLine(BPoint(x, y), BPoint(x + offsetX, y - offsetY));
}
// draw the center knob
SetHighColor(knobColor);
FillEllipse(BPoint(x, y), radius * 0.06, radius * 0.06);
@ -359,11 +366,14 @@ OffscreenClock::_DrawHands(float x, float y, float radius,
// #pragma mark -
TAnalogClock::TAnalogClock(BRect frame, const char* name)
TAnalogClock::TAnalogClock(BRect frame, const char* name,
bool drawSecondHand = true, bool interactive = true)
:
BView(frame, name, B_FOLLOW_NONE, B_WILL_DRAW | B_DRAW_ON_CHILDREN),
fBitmap(NULL),
fClock(NULL),
fDrawSecondHand(drawSecondHand),
fInteractive(interactive),
fDraggingHourHand(false),
fDraggingMinuteHand(false),
fTimeChangeIsOngoing(false)
@ -381,7 +391,7 @@ TAnalogClock::~TAnalogClock()
void
TAnalogClock::_InitView(BRect rect)
{
fClock = new OffscreenClock(Bounds(), "offscreen");
fClock = new OffscreenClock(Bounds(), "offscreen", fDrawSecondHand);
fBitmap = new BBitmap(Bounds(), B_RGB32, true);
fBitmap->Lock();
fBitmap->AddChild(fClock);
@ -430,6 +440,11 @@ TAnalogClock::MessageReceived(BMessage* message)
void
TAnalogClock::MouseDown(BPoint point)
{
if(!fInteractive) {
BView::MouseDown(point);
return;
}
fDraggingMinuteHand = fClock->InMinuteHand(point);
if (fDraggingMinuteHand) {
fClock->SetMinuteDragging(true);
@ -450,6 +465,11 @@ TAnalogClock::MouseDown(BPoint point)
void
TAnalogClock::MouseUp(BPoint point)
{
if(!fInteractive) {
BView::MouseUp(point);
return;
}
if (fDraggingHourHand || fDraggingMinuteHand) {
int32 hour, minute, second;
fClock->GetTime(&hour, &minute, &second);
@ -470,6 +490,10 @@ TAnalogClock::MouseUp(BPoint point)
void
TAnalogClock::MouseMoved(BPoint point, uint32 transit, const BMessage* message)
{
if(!fInteractive) {
BView::MouseMoved(point, transit, message);
return;
}
if (fDraggingMinuteHand)
fClock->SetMinuteHand(point);
@ -501,7 +525,11 @@ TAnalogClock::SetTime(int32 hour, int32 minute, int32 second)
if (fClock)
fClock->SetTime(hour, minute, second);
Invalidate();
BWindow* window = Window();
if (window && window->Lock()) {
Invalidate();
Window()->Unlock();
}
}

View File

@ -19,7 +19,8 @@ class OffscreenClock;
class TAnalogClock : public BView {
public:
TAnalogClock(BRect frame, const char* name);
TAnalogClock(BRect frame, const char* name,
bool drawSecondHand = true, bool interactive = true);
virtual ~TAnalogClock();
virtual void AttachedToWindow();
@ -41,6 +42,8 @@ private:
BBitmap* fBitmap;
OffscreenClock* fClock;
bool fDrawSecondHand;
bool fInteractive;
bool fDraggingHourHand;
bool fDraggingMinuteHand;