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