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