* Draw the background for the column headers.

* Added PreferredHeaderWidth() to HeaderRenderer, so that it could add
  additional spacing required by the look. Not yet used.
* Added mouse hooks to HeaderView and very humble beginnings of view state
  support.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31886 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2009-07-29 01:10:14 +00:00
parent e558530ebb
commit a794819144
2 changed files with 108 additions and 9 deletions
+92 -9
View File
@@ -45,10 +45,30 @@ DefaultHeaderRenderer::HeaderHeight(BView* view, const Header* header)
return 0;
if (value.Type() == B_STRING_TYPE) {
return 15;
// TODO:...
} else
font_height fontHeight;
view->GetFontHeight(&fontHeight);
return ceilf((fontHeight.ascent + fontHeight.descent) * 1.2f) + 2.0f;
} else {
// TODO: Support more value types.
return 0;
}
}
float
DefaultHeaderRenderer::PreferredHeaderWidth(BView* view, const Header* header)
{
BVariant value;
if (!header->GetValue(value))
return 0;
if (value.Type() == B_STRING_TYPE) {
float width = view->StringWidth(value.ToString());
return width + be_control_look->DefaultLabelSpacing() * 2.0f;
} else {
// TODO: Support more value types.
return 0;
}
}
@@ -56,12 +76,14 @@ void
DefaultHeaderRenderer::DrawHeader(BView* view, BRect frame, BRect updateRect,
const Header* header, uint32 flags)
{
printf("DefaultHeaderRenderer::DrawHeader(): frame: (%f, %f) - (%f, %f), header: %p\n",
frame.left, frame.top, frame.right, frame.bottom, header);
DrawHeaderBackground(view, frame, updateRect, flags);
BVariant value;
if (!header->GetValue(value))
return;
frame.InsetBy(be_control_look->DefaultLabelSpacing(), 0);
if (value.Type() == B_STRING_TYPE) {
be_control_look->DrawLabel(view, value.ToString(), frame, updateRect,
view->LowColor(), 0);
@@ -69,6 +91,29 @@ frame.left, frame.top, frame.right, frame.bottom, header);
}
void
DefaultHeaderRenderer::DrawHeaderBackground(BView* view, BRect frame,
BRect updateRect, uint32 flags)
{
BRect bgRect = frame;
rgb_color base = ui_color(B_PANEL_BACKGROUND_COLOR);
view->SetHighColor(tint_color(base, B_DARKEN_2_TINT));
view->StrokeLine(bgRect.LeftBottom(), bgRect.RightBottom());
bgRect.bottom--;
bgRect.right--;
// if ((flags & CLICKED) != 0)
// base = tint_color(base, B_DARKEN_1_TINT);
be_control_look->DrawButtonBackground(view, bgRect, updateRect, base, 0,
BControlLook::B_TOP_BORDER | BControlLook::B_BOTTOM_BORDER);
view->StrokeLine(frame.RightTop(), frame.RightBottom());
}
// #pragma mark - HeaderListener
@@ -494,6 +539,22 @@ struct HeaderView::HeaderEntry {
};
// #pragma mark - HeaderEntry
class HeaderView::DragState {
public:
virtual ~DragState()
{
}
virtual void MouseDown(BPoint where) = 0;
virtual void DragTo(BPoint where) = 0;
virtual void MouseUp();
};
// #pragma mark - HeaderView
@@ -526,6 +587,7 @@ HeaderView::Draw(BRect updateRect)
DefaultHeaderRenderer defaultRenderer;
float bottom = Bounds().Height();
float left = 0.0f;
for (int32 i = 0; HeaderEntry* entry = fHeaderEntries.ItemAt(i); i++) {
if (Header* header = fModel->HeaderAt(i)) {
@@ -537,8 +599,14 @@ HeaderView::Draw(BRect updateRect)
bottom);
renderer->DrawHeader(this, frame, updateRect, header, 0);
// TODO: flags!
left = entry->position + entry->width;
}
}
// TODO: We are not using any custom renderer here.
defaultRenderer.DrawHeaderBackground(this,
BRect(left, 0, Bounds().right + 1, bottom), updateRect, 0);
}
@@ -579,20 +647,35 @@ HeaderView::Model() const
}
void
HeaderView::MouseDown(BPoint where)
{
}
void
HeaderView::MouseUp(BPoint where)
{
}
void
HeaderView::MouseMoved(BPoint where, uint32 transit,
const BMessage* dragMessage)
{
}
status_t
HeaderView::SetModel(HeaderModel* model)
{
if (model == fModel)
return B_OK;
printf("HeaderView::SetModel(%p)\n", model);
if (fModel != NULL) {
// remove all headers
for (int32 i = 0; HeaderEntry* entry = fHeaderEntries.ItemAt(i); i++)
{
printf(" unsetting entry %p, header: %p\n", entry, entry->header);
entry->header->RemoveListener(this);
}
fHeaderEntries.MakeEmpty();
fModel->RemoveListener(this);
+16
View File
@@ -25,9 +25,13 @@ public:
virtual float HeaderHeight(BView* view, const Header* header)
= 0;
virtual float PreferredHeaderWidth(BView* view,
const Header* header) = 0;
virtual void DrawHeader(BView* view, BRect frame,
BRect updateRect, const Header* header,
uint32 flags) = 0;
virtual void DrawHeaderBackground(BView* view, BRect frame,
BRect updateRect, uint32 flags) = 0;
};
@@ -37,9 +41,13 @@ public:
virtual ~DefaultHeaderRenderer();
virtual float HeaderHeight(BView* view, const Header* header);
virtual float PreferredHeaderWidth(BView* view,
const Header* header);
virtual void DrawHeader(BView* view, BRect frame,
BRect updateRect, const Header* header,
uint32 flags);
virtual void DrawHeaderBackground(BView* view, BRect frame,
BRect updateRect, uint32 flags);
};
@@ -160,6 +168,11 @@ public:
virtual void Draw(BRect updateRect);
virtual void MouseDown(BPoint where);
virtual void MouseUp(BPoint where);
virtual void MouseMoved(BPoint where, uint32 transit,
const BMessage* dragMessage);
virtual BSize MinSize();
virtual BSize MaxSize();
virtual BSize PreferredSize();
@@ -176,6 +189,8 @@ private:
typedef BObjectList<HeaderEntry> HeaderEntryList;
typedef BObjectList<HeaderViewListener> ListenerList;
class DragState;
private:
// HeaderModelListener
virtual void HeaderAdded(HeaderModel* model, int32 index);
@@ -203,6 +218,7 @@ private:
float fPreferredHeight;
bool fLayoutValid;
ListenerList fListeners;
DragState* fDragState;
};