xref: /haiku/src/apps/haikudepot/ui/FeaturedPackagesView.cpp (revision f545fe6accd10cea983bb62caceb1aef32b90f2d)
1*f545fe6aSStephan Aßmus /*
2*f545fe6aSStephan Aßmus  * Copyright 2013-214, Stephan Aßmus <superstippi@gmx.de>.
3*f545fe6aSStephan Aßmus  * All rights reserved. Distributed under the terms of the MIT License.
4*f545fe6aSStephan Aßmus  */
5*f545fe6aSStephan Aßmus 
6*f545fe6aSStephan Aßmus #include "FeaturedPackagesView.h"
7*f545fe6aSStephan Aßmus 
8*f545fe6aSStephan Aßmus #include <stdio.h>
9*f545fe6aSStephan Aßmus 
10*f545fe6aSStephan Aßmus #include <Catalog.h>
11*f545fe6aSStephan Aßmus #include <Font.h>
12*f545fe6aSStephan Aßmus #include <LayoutBuilder.h>
13*f545fe6aSStephan Aßmus #include <Message.h>
14*f545fe6aSStephan Aßmus #include <ScrollView.h>
15*f545fe6aSStephan Aßmus #include <StringView.h>
16*f545fe6aSStephan Aßmus #include <SpaceLayoutItem.h>
17*f545fe6aSStephan Aßmus 
18*f545fe6aSStephan Aßmus #include "BitmapView.h"
19*f545fe6aSStephan Aßmus #include "MessagePackageListener.h"
20*f545fe6aSStephan Aßmus #include "RatingView.h"
21*f545fe6aSStephan Aßmus #include "ScrollableGroupView.h"
22*f545fe6aSStephan Aßmus 
23*f545fe6aSStephan Aßmus 
24*f545fe6aSStephan Aßmus #undef B_TRANSLATION_CONTEXT
25*f545fe6aSStephan Aßmus #define B_TRANSLATION_CONTEXT "FeaturedPackagesView"
26*f545fe6aSStephan Aßmus 
27*f545fe6aSStephan Aßmus 
28*f545fe6aSStephan Aßmus static const rgb_color kLightBlack = (rgb_color){ 60, 60, 60, 255 };
29*f545fe6aSStephan Aßmus 
30*f545fe6aSStephan Aßmus 
31*f545fe6aSStephan Aßmus // #pragma mark - PackageView
32*f545fe6aSStephan Aßmus 
33*f545fe6aSStephan Aßmus 
34*f545fe6aSStephan Aßmus class PackageView : public BGroupView {
35*f545fe6aSStephan Aßmus public:
36*f545fe6aSStephan Aßmus 	PackageView()
37*f545fe6aSStephan Aßmus 		:
38*f545fe6aSStephan Aßmus 		BGroupView("package view", B_HORIZONTAL),
39*f545fe6aSStephan Aßmus 		fPackageListener(new(std::nothrow) MessagePackageListener(this))
40*f545fe6aSStephan Aßmus 	{
41*f545fe6aSStephan Aßmus 		fIconView = new BitmapView("package icon view");
42*f545fe6aSStephan Aßmus 		fTitleView = new BStringView("package title view", "");
43*f545fe6aSStephan Aßmus 		fPublisherView = new BStringView("package publisher view", "");
44*f545fe6aSStephan Aßmus 
45*f545fe6aSStephan Aßmus 		// Title font
46*f545fe6aSStephan Aßmus 		BFont font;
47*f545fe6aSStephan Aßmus 		GetFont(&font);
48*f545fe6aSStephan Aßmus 		font_family family;
49*f545fe6aSStephan Aßmus 		font_style style;
50*f545fe6aSStephan Aßmus 		font.SetSize(ceilf(font.Size() * 1.5f));
51*f545fe6aSStephan Aßmus 		font.GetFamilyAndStyle(&family, &style);
52*f545fe6aSStephan Aßmus 		font.SetFamilyAndStyle(family, "Bold");
53*f545fe6aSStephan Aßmus 		fTitleView->SetFont(&font);
54*f545fe6aSStephan Aßmus 
55*f545fe6aSStephan Aßmus 		// Publisher font
56*f545fe6aSStephan Aßmus 		GetFont(&font);
57*f545fe6aSStephan Aßmus 		font.SetSize(std::max(9.0f, floorf(font.Size() * 0.92f)));
58*f545fe6aSStephan Aßmus 		font.SetFamilyAndStyle(family, "Italic");
59*f545fe6aSStephan Aßmus 		fPublisherView->SetFont(&font);
60*f545fe6aSStephan Aßmus 		fPublisherView->SetHighColor(kLightBlack);
61*f545fe6aSStephan Aßmus 
62*f545fe6aSStephan Aßmus 		// slightly bigger font
63*f545fe6aSStephan Aßmus 		GetFont(&font);
64*f545fe6aSStephan Aßmus 		font.SetSize(ceilf(font.Size() * 1.2f));
65*f545fe6aSStephan Aßmus 
66*f545fe6aSStephan Aßmus 		// Version info
67*f545fe6aSStephan Aßmus 		fVersionInfo = new BStringView("package version info", "");
68*f545fe6aSStephan Aßmus 		fVersionInfo->SetFont(&font);
69*f545fe6aSStephan Aßmus 		fVersionInfo->SetHighColor(kLightBlack);
70*f545fe6aSStephan Aßmus 
71*f545fe6aSStephan Aßmus 		BLayoutBuilder::Group<>(this)
72*f545fe6aSStephan Aßmus 			.Add(fIconView)
73*f545fe6aSStephan Aßmus 			.AddGroup(B_VERTICAL, 1.0f, 2.2f)
74*f545fe6aSStephan Aßmus 				.Add(fTitleView)
75*f545fe6aSStephan Aßmus 				.Add(fPublisherView)
76*f545fe6aSStephan Aßmus 				.SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET))
77*f545fe6aSStephan Aßmus 			.End()
78*f545fe6aSStephan Aßmus 			.AddGlue(0.1f)
79*f545fe6aSStephan Aßmus 			.AddGroup(B_HORIZONTAL, B_USE_SMALL_SPACING, 2.0f)
80*f545fe6aSStephan Aßmus 				.Add(fVersionInfo)
81*f545fe6aSStephan Aßmus 				.AddGlue()
82*f545fe6aSStephan Aßmus 				.SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET))
83*f545fe6aSStephan Aßmus 			.End()
84*f545fe6aSStephan Aßmus 		;
85*f545fe6aSStephan Aßmus 
86*f545fe6aSStephan Aßmus 		Clear();
87*f545fe6aSStephan Aßmus 	}
88*f545fe6aSStephan Aßmus 
89*f545fe6aSStephan Aßmus 	virtual ~PackageView()
90*f545fe6aSStephan Aßmus 	{
91*f545fe6aSStephan Aßmus 		fPackageListener->SetPackage(PackageInfoRef(NULL));
92*f545fe6aSStephan Aßmus 		delete fPackageListener;
93*f545fe6aSStephan Aßmus 	}
94*f545fe6aSStephan Aßmus 
95*f545fe6aSStephan Aßmus 	virtual void MessageReceived(BMessage* message)
96*f545fe6aSStephan Aßmus 	{
97*f545fe6aSStephan Aßmus 		switch (message->what) {
98*f545fe6aSStephan Aßmus 			case MSG_UPDATE_PACKAGE:
99*f545fe6aSStephan Aßmus 			{
100*f545fe6aSStephan Aßmus 				SetPackage(fPackageListener->Package());
101*f545fe6aSStephan Aßmus 				break;
102*f545fe6aSStephan Aßmus 			}
103*f545fe6aSStephan Aßmus 		}
104*f545fe6aSStephan Aßmus 	}
105*f545fe6aSStephan Aßmus 
106*f545fe6aSStephan Aßmus 	void SetPackage(const PackageInfoRef& package)
107*f545fe6aSStephan Aßmus 	{
108*f545fe6aSStephan Aßmus 		fPackageListener->SetPackage(package);
109*f545fe6aSStephan Aßmus 
110*f545fe6aSStephan Aßmus 		if (package->Icon().Get() != NULL) {
111*f545fe6aSStephan Aßmus 			fIconView->SetBitmap(
112*f545fe6aSStephan Aßmus 				package->Icon()->Bitmap(SharedBitmap::SIZE_32));
113*f545fe6aSStephan Aßmus 		} else
114*f545fe6aSStephan Aßmus 			fIconView->SetBitmap(NULL);
115*f545fe6aSStephan Aßmus 
116*f545fe6aSStephan Aßmus 		fTitleView->SetText(package->Title());
117*f545fe6aSStephan Aßmus 
118*f545fe6aSStephan Aßmus 		BString publisher = package->Publisher().Name();
119*f545fe6aSStephan Aßmus 		fPublisherView->SetText(publisher);
120*f545fe6aSStephan Aßmus 
121*f545fe6aSStephan Aßmus 		BString version = B_TRANSLATE("%Version%");
122*f545fe6aSStephan Aßmus 		version.ReplaceAll("%Version%", package->Version().ToString());
123*f545fe6aSStephan Aßmus 		fVersionInfo->SetText(version);
124*f545fe6aSStephan Aßmus 
125*f545fe6aSStephan Aßmus 		InvalidateLayout();
126*f545fe6aSStephan Aßmus 		Invalidate();
127*f545fe6aSStephan Aßmus 	}
128*f545fe6aSStephan Aßmus 
129*f545fe6aSStephan Aßmus 	void Clear()
130*f545fe6aSStephan Aßmus 	{
131*f545fe6aSStephan Aßmus 		fPackageListener->SetPackage(PackageInfoRef(NULL));
132*f545fe6aSStephan Aßmus 
133*f545fe6aSStephan Aßmus 		fIconView->SetBitmap(NULL);
134*f545fe6aSStephan Aßmus 		fTitleView->SetText("");
135*f545fe6aSStephan Aßmus 		fPublisherView->SetText("");
136*f545fe6aSStephan Aßmus 		fVersionInfo->SetText("");
137*f545fe6aSStephan Aßmus 	}
138*f545fe6aSStephan Aßmus 
139*f545fe6aSStephan Aßmus private:
140*f545fe6aSStephan Aßmus 	MessagePackageListener*			fPackageListener;
141*f545fe6aSStephan Aßmus 
142*f545fe6aSStephan Aßmus 	BitmapView*						fIconView;
143*f545fe6aSStephan Aßmus 
144*f545fe6aSStephan Aßmus 	BStringView*					fTitleView;
145*f545fe6aSStephan Aßmus 	BStringView*					fPublisherView;
146*f545fe6aSStephan Aßmus 
147*f545fe6aSStephan Aßmus 	BStringView*					fVersionInfo;
148*f545fe6aSStephan Aßmus };
149*f545fe6aSStephan Aßmus 
150*f545fe6aSStephan Aßmus 
151*f545fe6aSStephan Aßmus // #pragma mark - FeaturedPackagesView
152*f545fe6aSStephan Aßmus 
153*f545fe6aSStephan Aßmus 
154*f545fe6aSStephan Aßmus FeaturedPackagesView::FeaturedPackagesView()
155*f545fe6aSStephan Aßmus 	:
156*f545fe6aSStephan Aßmus 	BView("featured package view", 0)
157*f545fe6aSStephan Aßmus {
158*f545fe6aSStephan Aßmus 	BGroupLayout* layout = new BGroupLayout(B_VERTICAL);
159*f545fe6aSStephan Aßmus 	SetLayout(layout);
160*f545fe6aSStephan Aßmus 
161*f545fe6aSStephan Aßmus 	ScrollableGroupView* containerView = new ScrollableGroupView();
162*f545fe6aSStephan Aßmus 	containerView->SetViewColor(255, 255, 255);
163*f545fe6aSStephan Aßmus 	fPackageListLayout = containerView->GroupLayout();
164*f545fe6aSStephan Aßmus 
165*f545fe6aSStephan Aßmus 	BScrollView* scrollView = new BScrollView(
166*f545fe6aSStephan Aßmus 		"packages scroll view", containerView);
167*f545fe6aSStephan Aßmus 
168*f545fe6aSStephan Aßmus 	BLayoutBuilder::Group<>(this)
169*f545fe6aSStephan Aßmus 		.Add(scrollView, 1.0f)
170*f545fe6aSStephan Aßmus 	;
171*f545fe6aSStephan Aßmus }
172*f545fe6aSStephan Aßmus 
173*f545fe6aSStephan Aßmus 
174*f545fe6aSStephan Aßmus FeaturedPackagesView::~FeaturedPackagesView()
175*f545fe6aSStephan Aßmus {
176*f545fe6aSStephan Aßmus }
177*f545fe6aSStephan Aßmus 
178*f545fe6aSStephan Aßmus 
179*f545fe6aSStephan Aßmus void
180*f545fe6aSStephan Aßmus FeaturedPackagesView::AddPackage(const PackageInfoRef& package)
181*f545fe6aSStephan Aßmus {
182*f545fe6aSStephan Aßmus 	PackageView* view = new PackageView();
183*f545fe6aSStephan Aßmus 	view->SetPackage(package);
184*f545fe6aSStephan Aßmus 	fPackageListLayout->AddView(view);
185*f545fe6aSStephan Aßmus }
186*f545fe6aSStephan Aßmus 
187*f545fe6aSStephan Aßmus 
188*f545fe6aSStephan Aßmus void
189*f545fe6aSStephan Aßmus FeaturedPackagesView::Clear()
190*f545fe6aSStephan Aßmus {
191*f545fe6aSStephan Aßmus 	for (int32 i = fPackageListLayout->CountItems() - 1;
192*f545fe6aSStephan Aßmus 			BLayoutItem* item = fPackageListLayout->ItemAt(i); i--) {
193*f545fe6aSStephan Aßmus 		BView* view = dynamic_cast<PackageView*>(item->View());
194*f545fe6aSStephan Aßmus 		if (view != NULL) {
195*f545fe6aSStephan Aßmus 			view->RemoveSelf();
196*f545fe6aSStephan Aßmus 			delete view;
197*f545fe6aSStephan Aßmus 		}
198*f545fe6aSStephan Aßmus 	}
199*f545fe6aSStephan Aßmus }
200*f545fe6aSStephan Aßmus 
201