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