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