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