diff --git a/src/kits/tracker/Pose.cpp b/src/kits/tracker/Pose.cpp index 9284d49a7c..8d493b02f4 100644 --- a/src/kits/tracker/Pose.cpp +++ b/src/kits/tracker/Pose.cpp @@ -526,7 +526,7 @@ BPose::PointInPose(BPoint loc, const BPoseView *poseView, BPoint where, void BPose::Draw(BRect rect, BPoseView *poseView, BView *drawView, bool fullDraw, - const BRegion *updateRgn, BPoint offset, bool selected, bool recalculateText) + const BRegion *updateRgn, BPoint offset, bool selected) { // If the background wasn't cleared and Draw() is not called after // having edited a name or similar (with fullDraw) @@ -536,7 +536,7 @@ BPose::Draw(BRect rect, BPoseView *poseView, BView *drawView, bool fullDraw, return; } else fBackgroundClean = false; - + bool directDraw = (drawView == poseView); bool windowActive = poseView->Window()->IsActive(); bool showSelectionWhenInactive = poseView->fShowSelectionWhenInactive; @@ -577,9 +577,6 @@ BPose::Draw(BRect rect, BPoseView *poseView, BView *drawView, bool fullDraw, BRect widgetTextRect(widget->CalcRect(rect.LeftTop(), column, poseView)); - if (recalculateText) - widget->RecalculateText(poseView); - bool selectDuringDraw = directDraw && selected && windowActive; diff --git a/src/kits/tracker/Pose.h b/src/kits/tracker/Pose.h index 9246742c3b..680e282d49 100644 --- a/src/kits/tracker/Pose.h +++ b/src/kits/tracker/Pose.h @@ -63,10 +63,10 @@ class BPose { void SetLocation(BPoint); void MoveTo(BPoint, BPoseView *, bool inval = true); - void Draw(BRect, BPoseView *, bool fullDraw = true, const BRegion * = 0, - bool recalculateText = false); + void Draw(BRect, BPoseView *, bool fullDraw = true, + const BRegion * = 0); void Draw(BRect, BPoseView *, BView *drawView, bool fullDraw, - const BRegion *, BPoint offset, bool selected, bool recalculateText = false); + const BRegion *, BPoint offset, bool selected); void DeselectWithoutErasingBackground(BRect rect, BPoseView *poseView); // special purpose draw call for deselecting over a textured // background @@ -252,11 +252,11 @@ debugger("BPose::SetLocation() - infinite location"); inline void -BPose::Draw(BRect rect, BPoseView *view, bool fullDraw, const BRegion *updateRgn, - bool recalculateText) +BPose::Draw(BRect rect, BPoseView *view, bool fullDraw, + const BRegion *updateRgn) { Draw(rect, view, (BView *)view, fullDraw, updateRgn, BPoint(0, 0), - IsSelected(), recalculateText); + IsSelected()); } diff --git a/src/kits/tracker/PoseView.cpp b/src/kits/tracker/PoseView.cpp index bdcef02347..90dd490f86 100644 --- a/src/kits/tracker/PoseView.cpp +++ b/src/kits/tracker/PoseView.cpp @@ -8143,7 +8143,7 @@ BPoseView::SynchronousUpdate(BRect updateRect, bool clip) void -BPoseView::DrawViewCommon(BRect updateRect, bool recalculateText) +BPoseView::DrawViewCommon(const BRect &updateRect) { GetClippingRegion(fUpdateRegion); @@ -8158,7 +8158,7 @@ BPoseView::DrawViewCommon(BRect updateRect, bool recalculateText) for (int32 index = startIndex; index < count; index++) { BPose *pose = fPoseList->ItemAt(index); BRect poseRect(pose->CalcRect(loc, this, true)); - pose->Draw(poseRect, this, true, fUpdateRegion, recalculateText); + pose->Draw(poseRect, this, true, fUpdateRegion); loc.y += fListElemHeight; if (loc.y >= updateRect.bottom) break; @@ -9213,7 +9213,7 @@ BPoseView::UpdateDateColumns(BMessage *message) if (col && col->AttrType() == B_TIME_TYPE) { columnRect.left = col->Offset(); columnRect.right = columnRect.left + col->Width(); - DrawViewCommon(columnRect, true); // true means recalculate texts. + Invalidate(columnRect); } } } diff --git a/src/kits/tracker/PoseView.h b/src/kits/tracker/PoseView.h index 74f9fdabaa..0965029ab5 100644 --- a/src/kits/tracker/PoseView.h +++ b/src/kits/tracker/PoseView.h @@ -471,7 +471,7 @@ class BPoseView : public BView { // pose handling BRect CalcPoseRect(BPose *, int32 index, bool minimal = false) const; void DrawPose(BPose *, int32 index, bool fullDraw = true); - void DrawViewCommon(BRect, bool recalculateText = false); + void DrawViewCommon(const BRect &updateRect); // pose list handling int32 BSearchList(const BPose *, int32 *index); diff --git a/src/kits/tracker/TextWidget.cpp b/src/kits/tracker/TextWidget.cpp index 1a74483235..4e32205ec8 100644 --- a/src/kits/tracker/TextWidget.cpp +++ b/src/kits/tracker/TextWidget.cpp @@ -83,14 +83,6 @@ BTextWidget::Compare(const BTextWidget &with, BPoseView *view) const } -void -BTextWidget::RecalculateText(const BPoseView *view) -{ - fText->SetDirty(true); - fText->CheckViewChanged(view); -} - - const char * BTextWidget::Text(const BPoseView *view) const { diff --git a/src/kits/tracker/TextWidget.h b/src/kits/tracker/TextWidget.h index 3c9537fcac..f9fe3a86e5 100644 --- a/src/kits/tracker/TextWidget.h +++ b/src/kits/tracker/TextWidget.h @@ -91,8 +91,6 @@ public: float PreferredWidth(const BPoseView *) const; int Compare(const BTextWidget &, BPoseView *) const; // used for sorting in PoseViews - - void RecalculateText(const BPoseView *view); private: BRect CalcRectCommon(BPoint poseLoc, const BColumn *, const BPoseView *, float width); diff --git a/src/kits/tracker/WidgetAttributeText.cpp b/src/kits/tracker/WidgetAttributeText.cpp index 4b07980e83..74c2b90aa8 100644 --- a/src/kits/tracker/WidgetAttributeText.cpp +++ b/src/kits/tracker/WidgetAttributeText.cpp @@ -155,7 +155,8 @@ WidgetAttributeText::~WidgetAttributeText() const char * WidgetAttributeText::FittingText(const BPoseView *view) { - if (fDirty || fColumn->Width() != fOldWidth || !fValueIsDefined) + if (fDirty || fColumn->Width() != fOldWidth || CheckSettingsChanged() + || !fValueIsDefined ) CheckViewChanged(view); ASSERT(!fDirty); @@ -168,7 +169,6 @@ WidgetAttributeText::CheckViewChanged(const BPoseView *view) { BString newText; FitValue(&newText, view); - if (newText == fText) return false; @@ -177,6 +177,13 @@ WidgetAttributeText::CheckViewChanged(const BPoseView *view) } +bool +WidgetAttributeText::CheckSettingsChanged() +{ + return false; +} + + float WidgetAttributeText::TruncString(BString *result, const char *str, int32 length, const BPoseView *view, float width, uint32 truncMode) @@ -1087,6 +1094,23 @@ TimeAttributeText::FitValue(BString *result, const BPoseView *view) } +bool +TimeAttributeText::CheckSettingsChanged() +{ + bool changed = fLastClockIs24 != fSettings.ClockIs24Hr() + || fLastDateOrder != fSettings.DateOrderFormat() + || fLastTimeFormatSeparator != fSettings.TimeFormatSeparator(); + + if (changed) { + fLastClockIs24 = fSettings.ClockIs24Hr(); + fLastDateOrder = fSettings.DateOrderFormat(); + fLastTimeFormatSeparator = fSettings.TimeFormatSeparator(); + } + + return changed; +} + + CreationTimeAttributeText::CreationTimeAttributeText(const Model *model, const BColumn *column) : TimeAttributeText(model, column) diff --git a/src/kits/tracker/WidgetAttributeText.h b/src/kits/tracker/WidgetAttributeText.h index 021ad08d39..b4206f6129 100644 --- a/src/kits/tracker/WidgetAttributeText.h +++ b/src/kits/tracker/WidgetAttributeText.h @@ -66,6 +66,9 @@ class WidgetAttributeText { // returns true if fitted text changed, either because value // changed or because width/view changed + virtual bool CheckSettingsChanged(); + // override if the text rendering depends on a setting + const char *FittingText(const BPoseView *); // returns text, recalculating if not yet calculated @@ -233,10 +236,17 @@ class GenericAttributeText : public StringAttributeText { class TimeAttributeText : public ScalarAttributeText { - protected: + public: TimeAttributeText(const Model *, const BColumn *); + protected: virtual float PreferredWidth(const BPoseView *) const; virtual void FitValue(BString *result, const BPoseView *); + virtual bool CheckSettingsChanged(); + + TrackerSettings fSettings; + bool fLastClockIs24; + DateOrder fLastDateOrder; + FormatSeparator fLastTimeFormatSeparator; };