* 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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user