HaikuDepot: PackagesListView

BColumnListView derived class with code-duplication from
DriveSetup that should be refactored eventually (BIconStringColumn
and BColumn implementation to show it). Does nothing except create
some columns.
This commit is contained in:
Stephan Aßmus
2013-07-27 22:57:23 +02:00
parent 8608501abb
commit 7fa83160f8
2 changed files with 290 additions and 0 deletions
+223
View File
@@ -0,0 +1,223 @@
/*
* Copyright 2013, Stephan Aßmus <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include "PackageListView.h"
#include <algorithm>
#include <stdio.h>
#include <Catalog.h>
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "PackageListView"
// #pragma mark - BBitmapStringField
// TODO: Code-duplication with DriveSetup PartitionList.cpp
BBitmapStringField::BBitmapStringField(BBitmap* bitmap, const char* string)
:
Inherited(string),
fBitmap(bitmap)
{
}
BBitmapStringField::~BBitmapStringField()
{
delete fBitmap;
}
void
BBitmapStringField::SetBitmap(BBitmap* bitmap)
{
delete fBitmap;
fBitmap = bitmap;
// TODO: cause a redraw?
}
// #pragma mark - PackageColumn
// TODO: Code-duplication with DriveSetup PartitionList.cpp
float PackageColumn::sTextMargin = 0.0;
PackageColumn::PackageColumn(const char* title, float width, float minWidth,
float maxWidth, uint32 truncateMode, alignment align)
:
Inherited(title, width, minWidth, maxWidth, align),
fTruncateMode(truncateMode)
{
SetWantsEvents(true);
}
void
PackageColumn::DrawField(BField* field, BRect rect, BView* parent)
{
BBitmapStringField* bitmapField
= dynamic_cast<BBitmapStringField*>(field);
BStringField* stringField = dynamic_cast<BStringField*>(field);
if (bitmapField) {
const BBitmap* bitmap = bitmapField->Bitmap();
// figure out the placement
float x = 0.0;
BRect r = bitmap ? bitmap->Bounds() : BRect(0, 0, 15, 15);
float y = rect.top + ((rect.Height() - r.Height()) / 2);
float width = 0.0;
switch (Alignment()) {
default:
case B_ALIGN_LEFT:
case B_ALIGN_CENTER:
x = rect.left + sTextMargin;
width = rect.right - (x + r.Width()) - (2 * sTextMargin);
r.Set(x + r.Width(), rect.top, rect.right - width, rect.bottom);
break;
case B_ALIGN_RIGHT:
x = rect.right - sTextMargin - r.Width();
width = (x - rect.left - (2 * sTextMargin));
r.Set(rect.left, rect.top, rect.left + width, rect.bottom);
break;
}
if (width != bitmapField->Width()) {
BString truncatedString(bitmapField->String());
parent->TruncateString(&truncatedString, fTruncateMode, width + 2);
bitmapField->SetClippedString(truncatedString.String());
bitmapField->SetWidth(width);
}
// draw the bitmap
if (bitmap) {
parent->SetDrawingMode(B_OP_ALPHA);
parent->DrawBitmap(bitmap, BPoint(x, y));
parent->SetDrawingMode(B_OP_OVER);
}
// draw the string
DrawString(bitmapField->ClippedString(), parent, r);
} else if (stringField) {
float width = rect.Width() - (2 * sTextMargin);
if (width != stringField->Width()) {
BString truncatedString(stringField->String());
parent->TruncateString(&truncatedString, fTruncateMode, width + 2);
stringField->SetClippedString(truncatedString.String());
stringField->SetWidth(width);
}
DrawString(stringField->ClippedString(), parent, rect);
}
}
float
PackageColumn::GetPreferredWidth(BField *_field, BView* parent) const
{
BBitmapStringField* bitmapField
= dynamic_cast<BBitmapStringField*>(_field);
BStringField* stringField = dynamic_cast<BStringField*>(_field);
float parentWidth = Inherited::GetPreferredWidth(_field, parent);
float width = 0.0;
if (bitmapField) {
const BBitmap* bitmap = bitmapField->Bitmap();
BFont font;
parent->GetFont(&font);
width = font.StringWidth(bitmapField->String()) + 3 * sTextMargin;
if (bitmap)
width += bitmap->Bounds().Width();
else
width += 16;
} else if (stringField) {
BFont font;
parent->GetFont(&font);
width = font.StringWidth(stringField->String()) + 2 * sTextMargin;
}
return max_c(width, parentWidth);
}
bool
PackageColumn::AcceptsField(const BField* field) const
{
return dynamic_cast<const BStringField*>(field) != NULL;
}
void
PackageColumn::InitTextMargin(BView* parent)
{
BFont font;
parent->GetFont(&font);
sTextMargin = ceilf(font.Size() * 0.8);
}
// #pragma mark - PackageListView
enum {
kNameColumn,
kRatingColumn,
kDescriptionColumn,
kSizeColumn,
kStatusColumn,
};
PackageListView::PackageListView()
:
BColumnListView("package list view", 0, B_FANCY_BORDER, true)
{
AddColumn(new PackageColumn(B_TRANSLATE("Name"), 150, 50, 500,
B_TRUNCATE_MIDDLE), kNameColumn);
AddColumn(new PackageColumn(B_TRANSLATE("Rating"), 100, 50, 500,
B_TRUNCATE_MIDDLE), kRatingColumn);
AddColumn(new PackageColumn(B_TRANSLATE("Description"), 130, 50, 500,
B_TRUNCATE_MIDDLE), kDescriptionColumn);
AddColumn(new PackageColumn(B_TRANSLATE("Size"), 100, 50, 500,
B_TRUNCATE_END), kSizeColumn);
AddColumn(new PackageColumn(B_TRANSLATE("Status"), 100, 50, 500,
B_TRUNCATE_END), kStatusColumn);
}
PackageListView::~PackageListView()
{
}
void
PackageListView::AttachedToWindow()
{
PackageColumn::InitTextMargin(ScrollView());
}
void
PackageListView::MessageReceived(BMessage* message)
{
switch (message->what) {
default:
BColumnListView::MessageReceived(message);
break;
}
}
+67
View File
@@ -0,0 +1,67 @@
/*
* Copyright 2013, Stephan Aßmus <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#ifndef PACKAGE_LIST_VIEW_H
#define PACKAGE_LIST_VIEW_H
#include <ColumnListView.h>
#include <ColumnTypes.h>
// A field type displaying both a bitmap and a string so that the
// tree display looks nicer (both text and bitmap are indented)
// TODO: Code-duplication with DriveSetup PartitionList.h
class BBitmapStringField : public BStringField {
typedef BStringField Inherited;
public:
BBitmapStringField(BBitmap* bitmap,
const char* string);
virtual ~BBitmapStringField();
void SetBitmap(BBitmap* bitmap);
const BBitmap* Bitmap() const
{ return fBitmap; }
private:
BBitmap* fBitmap;
};
// BColumn for PackageListView which knows how to render
// a BBitmapStringField
// TODO: Code-duplication with DriveSetup PartitionList.h
class PackageColumn : public BTitledColumn {
typedef BTitledColumn Inherited;
public:
PackageColumn(const char* title,
float width, float minWidth,
float maxWidth, uint32 truncateMode,
alignment align = B_ALIGN_LEFT);
virtual void DrawField(BField* field, BRect rect,
BView* parent);
virtual float GetPreferredWidth(BField* field,
BView* parent) const;
virtual bool AcceptsField(const BField* field) const;
static void InitTextMargin(BView* parent);
private:
uint32 fTruncateMode;
static float sTextMargin;
};
class PackageListView : public BColumnListView {
public:
PackageListView();
virtual ~PackageListView();
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message);
};
#endif // PACKAGE_LIST_VIEW_H