* Made the button bar no longer draw over the menu bar, and it now uses the

BControlLook to draw its bottom border instead of using a BBox, and have the
  parent move it around to make it somehow fit (or not).
* Cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29913 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-04-04 23:05:55 +00:00
parent 37fbed721c
commit aeab3755ee
3 changed files with 104 additions and 76 deletions
+97 -67
View File
@@ -33,76 +33,83 @@ All rights reserved.
*/
#include "ButtonBar.h"
#include <stdlib.h>
#include <math.h>
#include <ControlLook.h>
struct BBDivider {
float where;
float vmargin;
BmapButton *button;
BmapButton* button;
};
static const int32 kDividerBlockSize = 8;
ButtonBar::ButtonBar(BRect frame, const char *name, uint8 enabledOffset, uint8 disabledOffset,
uint8 rollOffset, uint8 pressedOffset, float Hmargin, float Vmargin,
uint32 resizeMask, int32 flags, border_style border)
: BBox(frame, name, resizeMask, flags, border),
fMaxHeight(0),
fMaxWidth(0),
fNextXOffset(Hmargin),
fHMargin(Hmargin),
fVMargin(Vmargin),
fEnabledOffset(enabledOffset),
fDisabledOffset(disabledOffset),
fRollOffset(rollOffset),
fPressedOffset(pressedOffset),
fDividerArray(NULL),
fDividers(0),
fShowLabels(true)
ButtonBar::ButtonBar(BRect frame, const char* name, uint8 enabledOffset,
uint8 disabledOffset, uint8 rollOffset, uint8 pressedOffset,
float Hmargin, float Vmargin, uint32 resizeMask, int32 flags)
: BView(frame, name, resizeMask, flags),
fMaxHeight(0),
fMaxWidth(0),
fNextXOffset(Hmargin),
fHMargin(Hmargin),
fVMargin(Vmargin),
fEnabledOffset(enabledOffset),
fDisabledOffset(disabledOffset),
fRollOffset(rollOffset),
fPressedOffset(pressedOffset),
fDividerArray(NULL),
fDividers(0),
fShowLabels(true)
{
}
ButtonBar::~ButtonBar(void)
ButtonBar::~ButtonBar()
{
if (fDividerArray)
free(fDividerArray);
free(fDividerArray);
}
BmapButton *ButtonBar::AddButton(const char *label, int32 baseID, BMessage *msg)
BmapButton*
ButtonBar::AddButton(const char *label, int32 baseID, BMessage *msg)
{
BmapButton *button;
button = new BmapButton(BRect(0, 0, 31, 31), label, label, baseID+fEnabledOffset,
baseID+fDisabledOffset, baseID+fRollOffset, baseID+fPressedOffset,
fShowLabels, msg, B_FOLLOW_LEFT | B_FOLLOW_TOP);
BmapButton* button = new BmapButton(BRect(0, 0, 31, 31), label, label,
baseID + fEnabledOffset, baseID + fDisabledOffset, baseID + fRollOffset,
baseID + fPressedOffset, fShowLabels, msg,
B_FOLLOW_LEFT | B_FOLLOW_TOP);
fButtonList.AddItem(button);
AddChild(button);
return button;
}
void ButtonBar::Arrange(bool fixedWidth)
void
ButtonBar::Arrange(bool fixedWidth)
{
// Reset Positioning Info
fNextXOffset = fHMargin;
fMaxHeight = 0;
fMaxWidth = 0;
int32 i;
float width, height;
BmapButton *button;
// Determine Largest button dimensions
for (i = 0; (button = (BmapButton *)fButtonList.ItemAt(i)) != NULL; i++)
{
for (i = 0; (button = (BmapButton*)fButtonList.ItemAt(i)) != NULL; i++) {
button->GetPreferredSize(&width, &height);
if (height > fMaxHeight)
fMaxHeight = height;
if (width > fMaxWidth)
fMaxWidth = width;
}
// Arrange buttons
for (i = 0; (button = (BmapButton *)fButtonList.ItemAt(i)) != NULL; i++) {
button->MoveTo(fNextXOffset, fVMargin);
@@ -115,69 +122,92 @@ void ButtonBar::Arrange(bool fixedWidth)
fNextXOffset += width + fHMargin;
}
}
// Move dividers to match
for(i = 0; i < fDividers; i++) {
if (fDividerArray[i].button)
fDividerArray[i].where = fDividerArray[i].button->Frame().right + floor(fHMargin/2);
else
for (i = 0; i < fDividers; i++) {
if (fDividerArray[i].button) {
fDividerArray[i].where = fDividerArray[i].button->Frame().right
+ floor(fHMargin/2);
} else
fDividerArray[i].where = floor(fHMargin / 2);
}
}
void ButtonBar::GetPreferredSize(float *width, float *height)
void
ButtonBar::GetPreferredSize(float* width, float* height)
{
*width = fNextXOffset + fHMargin;
*height = fMaxHeight + (2 * fVMargin);
*height = fMaxHeight + (2 * fVMargin) + 3;
}
void ButtonBar::AttachedToWindow(void)
void
ButtonBar::AttachedToWindow()
{
if (Parent())
SetViewColor(Parent()->ViewColor());
BBox::AttachedToWindow();
}
void ButtonBar::Draw(BRect updateRect)
void
ButtonBar::Draw(BRect updateRect)
{
BBox::Draw(updateRect);
rgb_color high = { 184, 184, 184, 255 };
rgb_color low = { 232, 232, 232, 255 };
BRect bounds = Bounds();
float where, vmargin;
BeginLineArray(fDividers*2);
for (int32 i=0; i<fDividers; i++) {
where = fDividerArray[i].where;
vmargin = fDividerArray[i].vmargin;
AddLine(BPoint(where, fVMargin+vmargin), BPoint(where, bounds.bottom-fVMargin-vmargin), high);
AddLine(BPoint(where+1, fVMargin+vmargin), BPoint(where+1, bounds.bottom-fVMargin-vmargin), low);
rgb_color high = tint_color(ViewColor(), 1.1);
rgb_color low = tint_color(ViewColor(), 0.8);
BRect bounds = Bounds();
BeginLineArray(fDividers * 2);
for (int32 i = 0; i < fDividers; i++) {
float where = fDividerArray[i].where;
float vmargin = fDividerArray[i].vmargin;
AddLine(BPoint(where, fVMargin + vmargin),
BPoint(where, bounds.bottom - fVMargin - vmargin), high);
AddLine(BPoint(where + 1, fVMargin + vmargin),
BPoint(where + 1, bounds.bottom - fVMargin - vmargin), low);
}
EndLineArray();
be_control_look->DrawBorder(this, bounds, updateRect, ViewColor(),
B_FANCY_BORDER, 0, BControlLook::B_BOTTOM_BORDER);
}
void ButtonBar::AddDivider(float vmargin)
void
ButtonBar::AddDivider(float vmargin)
{
// Do we need to allocate memory?
if (fDividers == 0)
fDividerArray = (BBDivider *)malloc(sizeof(BBDivider)*kDividerBlockSize);
if ((fDividers % kDividerBlockSize) == 0)
fDividerArray = (BBDivider *)realloc(fDividerArray, sizeof(BBDivider)*kDividerBlockSize*((fDividers/kDividerBlockSize)+1));
if (fDividers == 0) {
fDividerArray = (BBDivider*)malloc(sizeof(BBDivider)
* kDividerBlockSize);
}
if ((fDividers % kDividerBlockSize) == 0) {
fDividerArray = (BBDivider*)realloc(fDividerArray,
sizeof(BBDivider) * kDividerBlockSize
* ((fDividers/kDividerBlockSize) + 1));
}
// Cache the location and the button which proceeds it
// The button is stored because we may later wish to change the layout
fDividerArray[fDividers].vmargin = vmargin;
fDividerArray[fDividers].where = fNextXOffset+floor(fHMargin/2);
fDividerArray[fDividers].button = (BmapButton *)fButtonList.ItemAt(fButtonList.CountItems()-1);
fDividerArray[fDividers].where = fNextXOffset + floorf(fHMargin / 2);
fDividerArray[fDividers].button = (BmapButton*)fButtonList.ItemAt(
fButtonList.CountItems() - 1);
fDividers++;
}
void ButtonBar::ShowLabels(bool show)
void
ButtonBar::ShowLabels(bool show)
{
BmapButton *button;
BmapButton* button;
// Set show label flags on buttons
for (int32 i=0; (button = (BmapButton *)fButtonList.ItemAt(i)) != NULL; i++)
for (int32 i = 0; (button = (BmapButton*)fButtonList.ItemAt(i)) != NULL;
i++) {
button->ShowLabel(show);
}
fShowLabels = show;
}
+2 -3
View File
@@ -41,14 +41,13 @@ All rights reserved.
struct BBDivider;
class ButtonBar : public BBox {
class ButtonBar : public BView {
public:
ButtonBar(BRect frame, const char *name, uint8 enabledOffset,
uint8 disabledOffset, uint8 rollOffset, uint8 pressedOffset,
float Hmargin, float Vmargin,
uint32 resizeMask = B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP,
int32 flags = B_NAVIGABLE_JUMP | B_FRAME_EVENTS | B_WILL_DRAW,
border_style border = B_FANCY_BORDER);
int32 flags = B_NAVIGABLE_JUMP | B_FRAME_EVENTS | B_WILL_DRAW);
virtual ~ButtonBar( void );
// Hooks
+5 -6
View File
@@ -493,11 +493,10 @@ TMailWindow::TMailWindow(BRect rect, const char* title, TMailApp* app,
if (showButtonBar) {
BuildButtonBar();
fButtonBar->ShowLabels(showButtonBar);
fButtonBar->Arrange(/* True for all buttons same size, false to just fit */
MDR_DIALECT_CHOICE (true, true));
fButtonBar->Arrange(MDR_DIALECT_CHOICE(true, true));
fButtonBar->GetPreferredSize(&bbwidth, &bbheight);
fButtonBar->ResizeTo(Bounds().right+3, bbheight+1);
fButtonBar->MoveTo(-1, height-1);
fButtonBar->ResizeTo(Bounds().right, bbheight);
fButtonBar->MoveTo(0, height);
fButtonBar->Show();
} else
fButtonBar = NULL;
@@ -646,8 +645,8 @@ TMailWindow::UpdateViews()
fButtonBar->Arrange(/* True for all buttons same size, false to just fit */
MDR_DIALECT_CHOICE (true, true));
fButtonBar->GetPreferredSize( &bbwidth, &bbheight);
fButtonBar->ResizeTo(Bounds().right+3, bbheight+1);
fButtonBar->MoveTo(-1, nextY-1);
fButtonBar->ResizeTo(Bounds().right, bbheight);
fButtonBar->MoveTo(0, nextY);
nextY += bbheight + 1;
if (fButtonBar->IsHidden())
fButtonBar->Show();