From aeab3755ee80350b09b1f5824e941a8abddd4204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sat, 4 Apr 2009 23:05:55 +0000 Subject: [PATCH] * 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 --- src/apps/mail/ButtonBar.cpp | 164 +++++++++++++++++++++-------------- src/apps/mail/ButtonBar.h | 5 +- src/apps/mail/MailWindow.cpp | 11 ++- 3 files changed, 104 insertions(+), 76 deletions(-) diff --git a/src/apps/mail/ButtonBar.cpp b/src/apps/mail/ButtonBar.cpp index 64a7147440..cccdca4bd7 100644 --- a/src/apps/mail/ButtonBar.cpp +++ b/src/apps/mail/ButtonBar.cpp @@ -33,76 +33,83 @@ All rights reserved. */ #include "ButtonBar.h" + #include #include +#include + + 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; iDrawBorder(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; } diff --git a/src/apps/mail/ButtonBar.h b/src/apps/mail/ButtonBar.h index a7e17bfe05..be671155df 100644 --- a/src/apps/mail/ButtonBar.h +++ b/src/apps/mail/ButtonBar.h @@ -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 diff --git a/src/apps/mail/MailWindow.cpp b/src/apps/mail/MailWindow.cpp index 43f696bc41..8c48ce007b 100644 --- a/src/apps/mail/MailWindow.cpp +++ b/src/apps/mail/MailWindow.cpp @@ -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();