HaikuDepot: Added ratings summary view

This commit is contained in:
Stephan Aßmus 2013-08-17 13:33:08 +02:00
parent 4f434bc67a
commit 057633446b

View File

@ -13,6 +13,7 @@
#include <CardLayout.h>
#include <Catalog.h>
#include <Font.h>
#include <GridView.h>
#include <LayoutBuilder.h>
#include <LayoutUtils.h>
#include <Message.h>
@ -328,6 +329,72 @@ private:
};
class DiagramBarView : public BView {
public:
DiagramBarView()
:
BView("diagram bar view", B_WILL_DRAW),
fValue(0.0f)
{
SetViewColor(B_TRANSPARENT_COLOR);
SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR));
SetHighColor(tint_color(LowColor(), B_DARKEN_2_TINT));
}
virtual ~DiagramBarView()
{
}
virtual void AttachedToWindow()
{
BView* parent = Parent();
if (parent != NULL) {
SetLowColor(parent->ViewColor());
SetHighColor(tint_color(LowColor(), B_DARKEN_2_TINT));
}
}
virtual void Draw(BRect updateRect)
{
FillRect(updateRect, B_SOLID_LOW);
if (fValue <= 0.0f)
return;
BRect rect(Bounds());
rect.right = ceilf(rect.left + fValue * rect.Width());
FillRect(rect, B_SOLID_HIGH);
}
virtual BSize MinSize()
{
return BSize(64, 10);
}
virtual BSize PreferredSize()
{
return MinSize();
}
virtual BSize MaxSize()
{
return BSize(64, 10);
}
void SetValue(float value)
{
if (fValue != value) {
fValue = value;
Invalidate();
}
}
private:
float fValue;
};
// #pragma mark - TitleView
@ -814,15 +881,83 @@ protected:
};
class RatingSummaryView : public BGridView {
public:
RatingSummaryView()
:
BGridView("rating summary view", B_USE_HALF_ITEM_SPACING, 0.0f)
{
SetViewColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR),
kContentTint - 0.1));
BLayoutBuilder::Grid<> layoutBuilder(this);
BFont smallFont;
GetFont(&smallFont);
smallFont.SetSize(std::max(9.0f, floorf(smallFont.Size() * 0.85f)));
for (int32 i = 0; i < 5; i++) {
BString label;
label.SetToFormat("%ld", 5 - i);
fLabelViews[i] = new BStringView("", label);
fLabelViews[i]->SetFont(&smallFont);
fLabelViews[i]->SetHighColor(kLightBlack);
layoutBuilder.Add(fLabelViews[i], 0, i);
fDiagramBarViews[i] = new DiagramBarView();
layoutBuilder.Add(fDiagramBarViews[i], 1, i);
fCountViews[i] = new BStringView("", "");
fCountViews[i]->SetFont(&smallFont);
fCountViews[i]->SetHighColor(kLightBlack);
fCountViews[i]->SetAlignment(B_ALIGN_RIGHT);
layoutBuilder.Add(fCountViews[i], 2, i);
}
layoutBuilder.SetInsets(5);
}
void SetToSummary(const RatingSummary& summary) {
for (int32 i = 0; i < 5; i++) {
int count = summary.ratingCountByStar[4 - i];
BString label;
label.SetToFormat("%ld", count);
fCountViews[i]->SetText(label);
if (summary.ratingCount > 0) {
fDiagramBarViews[i]->SetValue(
(float)count / summary.ratingCount);
} else
fDiagramBarViews[i]->SetValue(0.0f);
}
}
void Clear() {
for (int32 i = 0; i < 5; i++) {
fCountViews[i]->SetText("");
fDiagramBarViews[i]->SetValue(0.0f);
}
}
private:
BStringView* fLabelViews[5];
DiagramBarView* fDiagramBarViews[5];
BStringView* fCountViews[5];
};
class UserRatingsView : public BGroupView {
public:
UserRatingsView()
:
BGroupView("package ratings view", B_VERTICAL)
BGroupView("package ratings view", B_HORIZONTAL)
{
SetViewColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR),
kContentTint));
fRatingSummaryView = new RatingSummaryView();
RatingContainerView* ratingsContainerView = new RatingContainerView();
fRatingContainerLayout = ratingsContainerView->GroupLayout();
@ -830,6 +965,11 @@ public:
"ratings scroll view", ratingsContainerView);
BLayoutBuilder::Group<>(this)
.AddGroup(B_VERTICAL)
.Add(fRatingSummaryView, 0.0f)
.AddGlue()
.SetInsets(0.0f, B_USE_DEFAULT_SPACING, 0.0f, 0.0f)
.End()
.Add(scrollView, 1.0f)
.SetInsets(B_USE_DEFAULT_SPACING, -1.0f, -1.0f, -1.0f)
;
@ -842,7 +982,10 @@ public:
void SetPackage(const PackageInfo& package)
{
Clear();
ClearRatings();
// TODO: Re-use rating summary already used for TitleView...
fRatingSummaryView->SetToSummary(package.CalculateRatingSummary());
const UserRatingList& userRatings = package.UserRatings();
@ -857,6 +1000,12 @@ public:
}
void Clear()
{
fRatingSummaryView->Clear();
ClearRatings();
}
void ClearRatings()
{
for (int32 i = fRatingContainerLayout->CountItems() - 1;
BLayoutItem* item = fRatingContainerLayout->ItemAt(i); i--) {
@ -870,7 +1019,8 @@ public:
}
private:
BGroupLayout* fRatingContainerLayout;
BGroupLayout* fRatingContainerLayout;
RatingSummaryView* fRatingSummaryView;
};