From 157cd8913e6173dae21b43aef5bfd5419d4a5f68 Mon Sep 17 00:00:00 2001 From: Alexandre Deckner Date: Mon, 16 Jun 2008 13:14:46 +0000 Subject: [PATCH] - Calculating the space left for deskbar replicants was broken. The TimeView could overlap on the left. This fixes #1408 - Placement of the time text was broken. With big fonts, the text was way too low. Using text bounding box now, it looks pretty and robust too. - Fixed the height of the time view to the replicant height. The view has a fixed height now and can never overlap deskbar at the bottom (horizontal deskbar mode) or other replicant below. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25970 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/deskbar/StatusView.cpp | 8 ++-- src/apps/deskbar/TimeView.cpp | 66 ++++++++++++++++----------------- src/apps/deskbar/TimeView.h | 5 ++- 3 files changed, 39 insertions(+), 40 deletions(-) diff --git a/src/apps/deskbar/StatusView.cpp b/src/apps/deskbar/StatusView.cpp index b7cd833a65..12639437d4 100644 --- a/src/apps/deskbar/StatusView.cpp +++ b/src/apps/deskbar/StatusView.cpp @@ -236,9 +236,9 @@ TReplicantTray::DealWithClock(bool showClock) if (!fClock) { desk_settings *settings = ((TBarApp *)be_app)->Settings(); - fClock = new TTimeView(settings->timeShowSeconds, - settings->timeShowMil, settings->timeFullDate, - settings->timeShowEuro, false); + fClock = new TTimeView(kMinimumTrayWidth, kMaxReplicantHeight - 1.0, + settings->timeShowSeconds, settings->timeShowMil, + settings->timeFullDate, settings->timeShowEuro, false); AddChild(fClock); fClock->MoveTo(Bounds().right - fClock->Bounds().Width() - 1, 2); @@ -1276,7 +1276,7 @@ TReplicantTray::LocationForReplicant(int32 index, float width) // try to find free space in every row for (int32 row = 0; ; loc.y += kMaxReplicantHeight + kIconGap, row++) { // determine free space in this row - BRect rect(loc.x, loc.y, loc.x + kMinimumTrayWidth + 2, kMaxReplicantHeight); + BRect rect(loc.x, loc.y, loc.x + kMinimumTrayWidth - kIconGap - 2.0, loc.y + kMaxReplicantHeight); if (row == 0 && fBarView->ShowingClock()) rect.right -= fClock->Frame().Width() + kIconGap; diff --git a/src/apps/deskbar/TimeView.cpp b/src/apps/deskbar/TimeView.cpp index 02f67560c2..48220826b3 100644 --- a/src/apps/deskbar/TimeView.cpp +++ b/src/apps/deskbar/TimeView.cpp @@ -55,20 +55,7 @@ const char *kLongDateFormat = "%a, %B %d, %Y"; const char *kLongEuroDateFormat = "%a, %d %B, %Y"; static const char * const kMinString = "99:99 AM"; - - -static float -FontHeight(BView *target, bool full) -{ - font_height fontInfo; - target->GetFontHeight(&fontInfo); - float h = fontInfo.ascent + fontInfo.descent; - - if (full) - h += fontInfo.leading; - - return h; -} +static const float kHMargin = 2.0; enum { @@ -78,7 +65,7 @@ enum { }; -TTimeView::TTimeView(bool showSeconds, bool milTime, bool fullDate, bool euroDate, bool) +TTimeView::TTimeView(float maxWidth, float height, bool showSeconds, bool milTime, bool fullDate, bool euroDate, bool) : BView(BRect(-100,-100,-90,-90), "_deskbar_tv_", B_FOLLOW_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW | B_PULSE_NEEDED | B_FRAME_EVENTS), @@ -89,7 +76,9 @@ TTimeView::TTimeView(bool showSeconds, bool milTime, bool fullDate, bool euroDat fFullDate(fullDate), fCanShowFullDate(false), fEuroDate(euroDate), - fOrientation(false) + fMaxWidth(maxWidth), + fHeight(height), + fOrientation(true) { fShowingDate = false; fTime = fLastTime = time(NULL); @@ -159,7 +148,6 @@ TTimeView::AttachedToWindow() } else SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); - fFontHeight = FontHeight(this, true); ResizeToPreferred(); CalculateTextPlacement(); } @@ -168,18 +156,23 @@ TTimeView::AttachedToWindow() void TTimeView::GetPreferredSize(float *width, float *height) { - *height = fFontHeight; - + *height = fHeight; + GetCurrentTime(); GetCurrentDate(); + // TODO: SetOrientation never gets called, fix that + // When in vertical mode, we want to limit the width so that it can't + // overlap the bevels in the parent view. if (ShowingDate()) - *width = 6 + StringWidth(fDateStr); - else { - *width = 6 + StringWidth(fTimeStr); - // Changed this from 10 to 6 so even with interval + seconds, there still - // is room for two replicants in the default tray. - } + *width = fOrientation ? + min_c(fMaxWidth - kHMargin, kHMargin + StringWidth(fDateStr)) + : kHMargin + StringWidth(fDateStr); + else { + *width = fOrientation ? + min_c(fMaxWidth - kHMargin, kHMargin + StringWidth(fTimeStr)) + : kHMargin + StringWidth(fTimeStr); + } } @@ -495,15 +488,20 @@ TTimeView::CalculateTextPlacement() { BRect bounds(Bounds()); - if (fOrientation) { // vertical mode - fDateLocation.x = bounds.Width()/2 - StringWidth(fDateStr)/2; - fTimeLocation.x = bounds.Width()/2 - StringWidth(fTimeStr)/2; - } else { - fTimeLocation.x = bounds.Width() - StringWidth(fTimeStr) - 5; - fDateLocation.x = bounds.Width() - StringWidth(fDateStr) - 5; - } - // center vertically - fDateLocation.y = fTimeLocation.y = bounds.Height()/2 + fFontHeight/2; + fDateLocation.x = 0.0; + fTimeLocation.x = 0.0; + + BFont font; + GetFont(&font); + const char* stringArray[1]; + stringArray[0] = fTimeStr; + BRect rectArray[1]; + escapement_delta delta = { 0.0, 0.0 }; + font.GetBoundingBoxesForStrings(stringArray, 1, B_SCREEN_METRIC, &delta, + rectArray); + + fTimeLocation.y = fDateLocation.y = ceilf((bounds.Height() - + rectArray[0].Height() + 1.0) / 2.0 - rectArray[0].top); } diff --git a/src/apps/deskbar/TimeView.h b/src/apps/deskbar/TimeView.h index 4cdd563284..4039e17e8e 100644 --- a/src/apps/deskbar/TimeView.h +++ b/src/apps/deskbar/TimeView.h @@ -51,7 +51,7 @@ class _EXPORT TTimeView; class TTimeView : public BView { public: - TTimeView(bool showSeconds = false, bool milTime = false, bool fullDate = false, + TTimeView(float maxWidth, float height, bool showSeconds = false, bool milTime = false, bool fullDate = false, bool euroDate = false, bool showInterval = false); TTimeView(BMessage *data); ~TTimeView(); @@ -119,7 +119,8 @@ class TTimeView : public BView { bool fCanShowFullDate; bool fEuroDate; - float fFontHeight; + float fMaxWidth; + float fHeight; bool fOrientation; // vertical = true BPoint fTimeLocation; BPoint fDateLocation;