* 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;
|
return 0;
|
||||||
|
|
||||||
if (value.Type() == B_STRING_TYPE) {
|
if (value.Type() == B_STRING_TYPE) {
|
||||||
return 15;
|
font_height fontHeight;
|
||||||
// TODO:...
|
view->GetFontHeight(&fontHeight);
|
||||||
} else
|
return ceilf((fontHeight.ascent + fontHeight.descent) * 1.2f) + 2.0f;
|
||||||
|
} else {
|
||||||
|
// TODO: Support more value types.
|
||||||
return 0;
|
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,
|
DefaultHeaderRenderer::DrawHeader(BView* view, BRect frame, BRect updateRect,
|
||||||
const Header* header, uint32 flags)
|
const Header* header, uint32 flags)
|
||||||
{
|
{
|
||||||
printf("DefaultHeaderRenderer::DrawHeader(): frame: (%f, %f) - (%f, %f), header: %p\n",
|
DrawHeaderBackground(view, frame, updateRect, flags);
|
||||||
frame.left, frame.top, frame.right, frame.bottom, header);
|
|
||||||
BVariant value;
|
BVariant value;
|
||||||
if (!header->GetValue(value))
|
if (!header->GetValue(value))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
frame.InsetBy(be_control_look->DefaultLabelSpacing(), 0);
|
||||||
|
|
||||||
if (value.Type() == B_STRING_TYPE) {
|
if (value.Type() == B_STRING_TYPE) {
|
||||||
be_control_look->DrawLabel(view, value.ToString(), frame, updateRect,
|
be_control_look->DrawLabel(view, value.ToString(), frame, updateRect,
|
||||||
view->LowColor(), 0);
|
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
|
// #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
|
// #pragma mark - HeaderView
|
||||||
|
|
||||||
|
|
||||||
@@ -526,6 +587,7 @@ HeaderView::Draw(BRect updateRect)
|
|||||||
|
|
||||||
DefaultHeaderRenderer defaultRenderer;
|
DefaultHeaderRenderer defaultRenderer;
|
||||||
float bottom = Bounds().Height();
|
float bottom = Bounds().Height();
|
||||||
|
float left = 0.0f;
|
||||||
|
|
||||||
for (int32 i = 0; HeaderEntry* entry = fHeaderEntries.ItemAt(i); i++) {
|
for (int32 i = 0; HeaderEntry* entry = fHeaderEntries.ItemAt(i); i++) {
|
||||||
if (Header* header = fModel->HeaderAt(i)) {
|
if (Header* header = fModel->HeaderAt(i)) {
|
||||||
@@ -537,8 +599,14 @@ HeaderView::Draw(BRect updateRect)
|
|||||||
bottom);
|
bottom);
|
||||||
renderer->DrawHeader(this, frame, updateRect, header, 0);
|
renderer->DrawHeader(this, frame, updateRect, header, 0);
|
||||||
// TODO: flags!
|
// 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
|
status_t
|
||||||
HeaderView::SetModel(HeaderModel* model)
|
HeaderView::SetModel(HeaderModel* model)
|
||||||
{
|
{
|
||||||
if (model == fModel)
|
if (model == fModel)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
printf("HeaderView::SetModel(%p)\n", model);
|
|
||||||
|
|
||||||
if (fModel != NULL) {
|
if (fModel != NULL) {
|
||||||
// remove all headers
|
// remove all headers
|
||||||
for (int32 i = 0; HeaderEntry* entry = fHeaderEntries.ItemAt(i); i++)
|
for (int32 i = 0; HeaderEntry* entry = fHeaderEntries.ItemAt(i); i++)
|
||||||
{
|
|
||||||
printf(" unsetting entry %p, header: %p\n", entry, entry->header);
|
|
||||||
entry->header->RemoveListener(this);
|
entry->header->RemoveListener(this);
|
||||||
}
|
|
||||||
fHeaderEntries.MakeEmpty();
|
fHeaderEntries.MakeEmpty();
|
||||||
|
|
||||||
fModel->RemoveListener(this);
|
fModel->RemoveListener(this);
|
||||||
|
|||||||
@@ -25,9 +25,13 @@ public:
|
|||||||
|
|
||||||
virtual float HeaderHeight(BView* view, const Header* header)
|
virtual float HeaderHeight(BView* view, const Header* header)
|
||||||
= 0;
|
= 0;
|
||||||
|
virtual float PreferredHeaderWidth(BView* view,
|
||||||
|
const Header* header) = 0;
|
||||||
virtual void DrawHeader(BView* view, BRect frame,
|
virtual void DrawHeader(BView* view, BRect frame,
|
||||||
BRect updateRect, const Header* header,
|
BRect updateRect, const Header* header,
|
||||||
uint32 flags) = 0;
|
uint32 flags) = 0;
|
||||||
|
virtual void DrawHeaderBackground(BView* view, BRect frame,
|
||||||
|
BRect updateRect, uint32 flags) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -37,9 +41,13 @@ public:
|
|||||||
virtual ~DefaultHeaderRenderer();
|
virtual ~DefaultHeaderRenderer();
|
||||||
|
|
||||||
virtual float HeaderHeight(BView* view, const Header* header);
|
virtual float HeaderHeight(BView* view, const Header* header);
|
||||||
|
virtual float PreferredHeaderWidth(BView* view,
|
||||||
|
const Header* header);
|
||||||
virtual void DrawHeader(BView* view, BRect frame,
|
virtual void DrawHeader(BView* view, BRect frame,
|
||||||
BRect updateRect, const Header* header,
|
BRect updateRect, const Header* header,
|
||||||
uint32 flags);
|
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 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 MinSize();
|
||||||
virtual BSize MaxSize();
|
virtual BSize MaxSize();
|
||||||
virtual BSize PreferredSize();
|
virtual BSize PreferredSize();
|
||||||
@@ -176,6 +189,8 @@ private:
|
|||||||
typedef BObjectList<HeaderEntry> HeaderEntryList;
|
typedef BObjectList<HeaderEntry> HeaderEntryList;
|
||||||
typedef BObjectList<HeaderViewListener> ListenerList;
|
typedef BObjectList<HeaderViewListener> ListenerList;
|
||||||
|
|
||||||
|
class DragState;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// HeaderModelListener
|
// HeaderModelListener
|
||||||
virtual void HeaderAdded(HeaderModel* model, int32 index);
|
virtual void HeaderAdded(HeaderModel* model, int32 index);
|
||||||
@@ -203,6 +218,7 @@ private:
|
|||||||
float fPreferredHeight;
|
float fPreferredHeight;
|
||||||
bool fLayoutValid;
|
bool fLayoutValid;
|
||||||
ListenerList fListeners;
|
ListenerList fListeners;
|
||||||
|
DragState* fDragState;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user