diff --git a/src/apps/powerstatus/ExtendedInfoWindow.cpp b/src/apps/powerstatus/ExtendedInfoWindow.cpp index 190861e368..d1daddc22a 100644 --- a/src/apps/powerstatus/ExtendedInfoWindow.cpp +++ b/src/apps/powerstatus/ExtendedInfoWindow.cpp @@ -10,10 +10,15 @@ #include "ExtendedInfoWindow.h" -#include +#include #include #include +#include #include +#include + + +#include #undef B_TRANSLATION_CONTEXT @@ -32,7 +37,10 @@ BatteryInfoView::BatteryInfoView() { SetViewUIColor(B_PANEL_BACKGROUND_COLOR); - SetLayout(new BGroupLayout(B_VERTICAL, B_USE_ITEM_SPACING)); + BGroupLayout* layout = new BGroupLayout(B_VERTICAL, 0); + layout->SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING, + 0, B_USE_DEFAULT_SPACING); + SetLayout(layout); for (size_t i = 0; i < kLinesCount; i++) { BStringView* view = new BStringView("info", ""); @@ -188,44 +196,107 @@ BatteryInfoView::_GetTextForLine(size_t line) // #pragma mark - +BatteryTab::BatteryTab(BatteryInfoView* target, + ExtPowerStatusView* view) + : + fBatteryView(view) +{ +} + + +BatteryTab::~BatteryTab() +{ +} + + +void +BatteryTab::Select(BView* owner) +{ + BTab::Select(owner); + fBatteryView->Select(); +} + +void +BatteryTab::DrawFocusMark(BView* owner, BRect frame) +{ + float vertOffset = IsSelected() ? 3 : 2; + float horzOffset = IsSelected() ? 2 : 4; + float width = frame.Width() - horzOffset * 2; + BPoint pt1((frame.left + frame.right - width) / 2.0 + horzOffset, + frame.bottom - vertOffset); + BPoint pt2((frame.left + frame.right + width) / 2.0, + frame.bottom - vertOffset); + owner->SetHighUIColor(B_KEYBOARD_NAVIGATION_COLOR); + owner->StrokeLine(pt1, pt2); +} + + +void +BatteryTab::DrawLabel(BView* owner, BRect frame) +{ + BRect rect = frame; + float size = std::min(rect.Width(), rect.Height()); + rect.right = rect.left + size; + rect.bottom = rect.top + size; + if (frame.Width() > rect.Height()) { + rect.OffsetBy((frame.Width() - size) / 2.0f, 0.0f); + } else { + rect.OffsetBy(0.0f, (frame.Height() - size) / 2.0f); + } + fBatteryView->DrawTo(owner, rect); +} + + +BatteryTabView::BatteryTabView(const char* name) + : + BTabView(name) +{ +} + + +BatteryTabView::~BatteryTabView() +{ +} + + +BRect +BatteryTabView::TabFrame(int32 index) const +{ + BRect bounds(Bounds()); + float width = TabHeight(); + float height = TabHeight(); + float offset = BControlLook::ComposeSpacing(B_USE_WINDOW_SPACING); + switch (TabSide()) { + case kTopSide: + return BRect(offset + index * width, 0.0f, + offset + index * width + width, height); + case kBottomSide: + return BRect(offset + index * width, bounds.bottom - height, + offset + index * width + width, bounds.bottom); + case kLeftSide: + return BRect(0.0f, offset + index * width, height, + offset + index * width + width); + case kRightSide: + return BRect(bounds.right - height, offset + index * width, + bounds.right, offset + index * width + width); + default: + return BRect(); + } +} + + ExtPowerStatusView::ExtPowerStatusView(PowerStatusDriverInterface* interface, BRect frame, int32 resizingMode, int batteryID, - ExtendedInfoWindow* window) + BatteryInfoView* batteryInfoView, ExtendedInfoWindow* window) : PowerStatusView(interface, frame, resizingMode, batteryID), fExtendedInfoWindow(window), - fBatteryInfoView(window->GetExtendedBatteryInfoView()), - fSelected(false) + fBatteryInfoView(batteryInfoView), + fBatteryTabView(window->GetBatteryTabView()) { } -void -ExtPowerStatusView::Draw(BRect updateRect) -{ - if (fSelected) { - rgb_color lowColor = LowColor(); - SetLowColor(102, 152, 203); - FillRect(updateRect, B_SOLID_LOW); - SetLowColor(lowColor); - } - PowerStatusView::Draw(updateRect); -} - - -void -ExtPowerStatusView::MouseDown(BPoint where) -{ - if (!fSelected) { - fSelected = true; - Update(true); - if (ExtendedInfoWindow* window - = dynamic_cast(Window())) - window->BatterySelected(this); - } -} - - void ExtPowerStatusView::Select(bool select) { @@ -253,6 +324,8 @@ ExtPowerStatusView::Update(bool force) fBatteryInfoView->Update(fBatteryInfo, extInfo); fBatteryInfoView->Invalidate(); + + fBatteryTabView->Invalidate(); } @@ -270,56 +343,36 @@ ExtendedInfoWindow::ExtendedInfoWindow(PowerStatusDriverInterface* interface) { fDriverInterface->AcquireReference(); - BView *view = new BView(Bounds(), "view", B_FOLLOW_ALL, 0); - view->SetViewUIColor(B_PANEL_BACKGROUND_COLOR); - AddChild(view); + fBatteryTabView = new BatteryTabView("tabview"); + fBatteryTabView->SetBorder(B_NO_BORDER); + fBatteryTabView->SetTabHeight(70.0f); + fBatteryTabView->SetTabSide(BTabView::kLeftSide); + BLayoutBuilder::Group<>(this, B_VERTICAL, 0) + .SetInsets(B_USE_DEFAULT_SPACING, 0, B_USE_DEFAULT_SPACING, 0) + .Add(fBatteryTabView); - BGroupLayout* mainLayout = new BGroupLayout(B_VERTICAL); - mainLayout->SetSpacing(10); - mainLayout->SetInsets(10, 10, 10, 10); - view->SetLayout(mainLayout); - - BRect rect = Bounds(); - rect.InsetBy(5, 5); - BBox *infoBox = new BBox(rect, B_TRANSLATE("Power status box")); - infoBox->SetLabel(B_TRANSLATE("Battery info")); - BGroupLayout* infoLayout = new BGroupLayout(B_HORIZONTAL); - infoLayout->SetInsets(10, infoBox->TopBorderOffset() * 2 + 10, 10, 10); - infoLayout->SetSpacing(10); - infoBox->SetLayout(infoLayout); - mainLayout->AddView(infoBox); - - BGroupView* batteryView = new BGroupView(B_VERTICAL); - batteryView->GroupLayout()->SetSpacing(10); - infoLayout->AddView(batteryView); - - // create before the battery views - fBatteryInfoView = new BatteryInfoView(); - - BGroupLayout* batteryLayout = batteryView->GroupLayout(); BRect batteryRect(0, 0, 50, 30); for (int i = 0; i < interface->GetBatteryCount(); i++) { + BatteryInfoView* batteryInfoView = new BatteryInfoView(); ExtPowerStatusView* view = new ExtPowerStatusView(interface, - batteryRect, B_FOLLOW_NONE, i, this); - view->SetExplicitMaxSize(BSize(70, 80)); - view->SetExplicitMinSize(BSize(70, 80)); + batteryRect, B_FOLLOW_NONE, i, batteryInfoView, this); + BatteryTab* tab = new BatteryTab(batteryInfoView, view); + fBatteryTabView->AddTab(batteryInfoView, tab); + // Has to be added, otherwise it won't get info updates + view->Hide(); + AddChild(view); - batteryLayout->AddView(view); fBatteryViewList.AddItem(view); fDriverInterface->StartWatching(view); if (!view->IsCritical()) fSelectedView = view; } - batteryLayout->AddItem(BSpaceLayoutItem::CreateGlue()); - - infoLayout->AddView(fBatteryInfoView); - if (!fSelectedView && fBatteryViewList.CountItems() > 0) fSelectedView = fBatteryViewList.ItemAt(0); fSelectedView->Select(); - BSize size = mainLayout->PreferredSize(); + BSize size = GetLayout()->PreferredSize(); ResizeTo(size.width, size.height); } @@ -333,20 +386,8 @@ ExtendedInfoWindow::~ExtendedInfoWindow() } -BatteryInfoView* -ExtendedInfoWindow::GetExtendedBatteryInfoView() +BatteryTabView* +ExtendedInfoWindow::GetBatteryTabView() { - return fBatteryInfoView; -} - - -void -ExtendedInfoWindow::BatterySelected(ExtPowerStatusView* view) -{ - if (fSelectedView) { - fSelectedView->Select(false); - fSelectedView->Invalidate(); - } - - fSelectedView = view; + return fBatteryTabView; } diff --git a/src/apps/powerstatus/ExtendedInfoWindow.h b/src/apps/powerstatus/ExtendedInfoWindow.h index 9c2804568a..20b0dbb650 100644 --- a/src/apps/powerstatus/ExtendedInfoWindow.h +++ b/src/apps/powerstatus/ExtendedInfoWindow.h @@ -1,9 +1,10 @@ /* - * Copyright 2009, Haiku, Inc. All Rights Reserved. + * Copyright 2009-2017, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * Clemens Zeidler, haiku@Clemens-Zeidler.de + * Kacper Kasper, kacperkasper@gmail.com */ #ifndef EXTENDED_INFO_WINDOW_H @@ -13,6 +14,7 @@ #include #include #include +#include #include #include @@ -40,16 +42,16 @@ private: class ExtendedInfoWindow; +class BatteryTabView; class ExtPowerStatusView : public PowerStatusView { public: ExtPowerStatusView( PowerStatusDriverInterface* interface, BRect frame, int32 resizingMode, - int batteryID, ExtendedInfoWindow* window); - - virtual void Draw(BRect updateRect); - virtual void MouseDown(BPoint where); + int batteryID, + BatteryInfoView* batteryInfoView, + ExtendedInfoWindow* window); virtual void Select(bool select = true); @@ -62,26 +64,49 @@ protected: private: ExtendedInfoWindow* fExtendedInfoWindow; BatteryInfoView* fBatteryInfoView; + BatteryTabView* fBatteryTabView; bool fSelected; }; +class BatteryTab : public BTab { +public: + BatteryTab(BatteryInfoView* target, + ExtPowerStatusView* view); + ~BatteryTab(); + + virtual void Select(BView* owner); + + virtual void DrawFocusMark(BView* owner, BRect frame); + virtual void DrawLabel(BView* owner, BRect frame); +private: + ExtPowerStatusView* fBatteryView; +}; + + +class BatteryTabView : public BTabView { +public: + BatteryTabView(const char* name); + ~BatteryTabView(); + + virtual BRect TabFrame(int32 index) const; +}; + + class ExtendedInfoWindow : public BWindow { public: ExtendedInfoWindow(PowerStatusDriverInterface* interface); ~ExtendedInfoWindow(); - BatteryInfoView* GetExtendedBatteryInfoView(); - - void BatterySelected(ExtPowerStatusView* view); + BatteryTabView* GetBatteryTabView(); private: PowerStatusDriverInterface* fDriverInterface; BObjectList fBatteryViewList; - BatteryInfoView* fBatteryInfoView; + BatteryTabView* fBatteryTabView; ExtPowerStatusView* fSelectedView; }; diff --git a/src/apps/powerstatus/PowerStatusView.cpp b/src/apps/powerstatus/PowerStatusView.cpp index 81bb06e2a6..f7374482d1 100644 --- a/src/apps/powerstatus/PowerStatusView.cpp +++ b/src/apps/powerstatus/PowerStatusView.cpp @@ -1,11 +1,12 @@ /* - * Copyright 2006-2015, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2017, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * Axel Dörfler, axeld@pinc-software.de * Clemens Zeidler, haiku@Clemens-Zeidler.de * Alexander von Gluck, kallisti5@unixzen.com + * Kacper Kasper, kacperkasper@gmail.com */ @@ -161,7 +162,7 @@ PowerStatusView::MessageReceived(BMessage *message) void -PowerStatusView::_DrawBattery(BRect rect) +PowerStatusView::_DrawBattery(BView* view, BRect rect) { BRect lightningRect = rect; float quarter = floorf((rect.Height() + 1) / 4); @@ -172,31 +173,33 @@ PowerStatusView::_DrawBattery(BRect rect) float left = rect.left; rect.left += rect.Width() / 11; + lightningRect.left = rect.left; + lightningRect.InsetBy(0.0f, 5.0f * rect.Height() / 16); - if (LowColor().Brightness() > 100) - SetHighColor(0, 0, 0); + if (view->LowColor().Brightness() > 100) + view->SetHighColor(0, 0, 0); else - SetHighColor(128, 128, 128); + view->SetHighColor(128, 128, 128); float gap = 1; if (rect.Height() > 8) { gap = ceilf((rect.left - left) / 2); // left - FillRect(BRect(rect.left, rect.top, rect.left + gap - 1, rect.bottom)); + view->FillRect(BRect(rect.left, rect.top, rect.left + gap - 1, rect.bottom)); // right - FillRect(BRect(rect.right - gap + 1, rect.top, rect.right, + view->FillRect(BRect(rect.right - gap + 1, rect.top, rect.right, rect.bottom)); // top - FillRect(BRect(rect.left + gap, rect.top, rect.right - gap, + view->FillRect(BRect(rect.left + gap, rect.top, rect.right - gap, rect.top + gap - 1)); // bottom - FillRect(BRect(rect.left + gap, rect.bottom + 1 - gap, + view->FillRect(BRect(rect.left + gap, rect.bottom + 1 - gap, rect.right - gap, rect.bottom)); } else - StrokeRect(rect); + view->StrokeRect(rect); - FillRect(BRect(left, floorf(rect.top + rect.Height() / 4) + 1, + view->FillRect(BRect(left, floorf(rect.top + rect.Height() / 4) + 1, rect.left - 1, floorf(rect.bottom - rect.Height() / 4))); int32 percent = fPercent; @@ -208,7 +211,7 @@ PowerStatusView::_DrawBattery(BRect rect) if (percent > 0) { rect.InsetBy(gap, gap); rgb_color base = (rgb_color){84, 84, 84, 255}; - if (LowColor().Brightness() < 128) + if (view->LowColor().Brightness() < 128) base = (rgb_color){172, 172, 172, 255}; if (be_control_look != NULL) { @@ -216,7 +219,7 @@ PowerStatusView::_DrawBattery(BRect rect) if (fHasBattery && percent > 0) empty.left += empty.Width() * percent / 100.0; - be_control_look->DrawButtonBackground(this, empty, empty, base, + be_control_look->DrawButtonBackground(view, empty, empty, base, fHasBattery ? BControlLook::B_ACTIVATED : BControlLook::B_DISABLED, fHasBattery && percent > 0 @@ -236,18 +239,17 @@ PowerStatusView::_DrawBattery(BRect rect) rect.right = rect.left + rect.Width() * percent / 100.0; if (be_control_look != NULL) { - be_control_look->DrawButtonBackground(this, rect, rect, base, + be_control_look->DrawButtonBackground(view, rect, rect, base, fHasBattery ? 0 : BControlLook::B_DISABLED); } else - FillRect(rect); + view->FillRect(rect); } } if (fOnline) { // When charging, draw a lightning symbol over the battery. - SetHighColor(255, 255, 0, 180); - SetDrawingMode(B_OP_ALPHA); - SetScale(std::min(lightningRect.Width(), lightningRect.Height()) / 16); + view->SetHighColor(255, 255, 0, 180); + view->SetDrawingMode(B_OP_ALPHA); static const BPoint points[] = { BPoint(3, 14), @@ -257,54 +259,49 @@ PowerStatusView::_DrawBattery(BRect rect) BPoint(9, 12), BPoint(9, 10) }; - FillPolygon(points, 6); + view->FillPolygon(points, 6, lightningRect); - SetScale(1); - SetDrawingMode(B_OP_OVER); + view->SetDrawingMode(B_OP_OVER); } - SetHighColor(0, 0, 0); + view->SetHighColor(0, 0, 0); } void PowerStatusView::Draw(BRect updateRect) { - bool drawBackground = Parent() == NULL - || (Parent()->Flags() & B_DRAW_ON_CHILDREN) == 0; + DrawTo(this, Bounds()); +} - float aspect = Bounds().Width() / Bounds().Height(); - bool below = aspect <= 1.0f; +void +PowerStatusView::DrawTo(BView* view, BRect rect) +{ + bool inside = rect.Width() >= 50.0f && rect.Height() >= 40.0f; font_height fontHeight; - GetFontHeight(&fontHeight); + view->GetFontHeight(&fontHeight); float baseLine = ceilf(fontHeight.ascent); char text[64]; _SetLabel(text, sizeof(text)); float textHeight = ceilf(fontHeight.descent + fontHeight.ascent); - float textWidth = StringWidth(text); + float textWidth = view->StringWidth(text); bool showLabel = fShowLabel && text[0]; BRect iconRect; if (fShowStatusIcon) { - iconRect = Bounds(); + iconRect = rect; if (showLabel) { - if (below) - iconRect.bottom -= textHeight + 2; - else + if (inside == false) iconRect.right -= textWidth + 2; } - // make a square - iconRect.bottom = min_c(iconRect.bottom, iconRect.right); - iconRect.right = iconRect.bottom; - if (iconRect.Width() + 1 >= kMinIconWidth && iconRect.Height() + 1 >= kMinIconHeight) { - _DrawBattery(iconRect); + _DrawBattery(view, iconRect); } else { // there is not enough space for the icon iconRect.Set(0, 0, -1, -1); @@ -312,32 +309,30 @@ PowerStatusView::Draw(BRect updateRect) } if (showLabel) { - BPoint point(0, baseLine); + BPoint point(0, baseLine + rect.top); if (iconRect.IsValid()) { - if (below) { - point.x = (iconRect.Width() - textWidth) / 2; - point.y += iconRect.Height() + 2; + if (inside == true) { + point.x = rect.left + (iconRect.Width() - textWidth) / 2 + + iconRect.Width() / 20; + point.y += (iconRect.Height() - textHeight) / 2; } else { - point.x = iconRect.Width() + 2; + point.x = rect.left + iconRect.Width() + 2; point.y += (iconRect.Height() - textHeight) / 2; } } else { - point.x = (Bounds().Width() - textWidth) / 2; + point.x = rect.left + (Bounds().Width() - textWidth) / 2; point.y += (Bounds().Height() - textHeight) / 2; } - if (drawBackground) - SetHighColor(ui_color(B_CONTROL_TEXT_COLOR)); - else { - SetDrawingMode(B_OP_OVER); - if (LowColor().Brightness() > 100) - SetHighColor(0, 0, 0); - else - SetHighColor(255, 255, 255); + view->SetDrawingMode(B_OP_OVER); + if (fInDeskbar == false || inside == true) { + view->SetHighUIColor(B_CONTROL_BACKGROUND_COLOR); + view->DrawString(text, BPoint(point.x + 1, point.y + 1)); } + view->SetHighUIColor(B_CONTROL_TEXT_COLOR); - DrawString(text, point); + view->DrawString(text, point); } } diff --git a/src/apps/powerstatus/PowerStatusView.h b/src/apps/powerstatus/PowerStatusView.h index ca0d62eed7..69fc122ec8 100644 --- a/src/apps/powerstatus/PowerStatusView.h +++ b/src/apps/powerstatus/PowerStatusView.h @@ -1,5 +1,5 @@ /* - * Copyright 2006-2015, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2017, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -34,6 +34,7 @@ public: virtual void MessageReceived(BMessage* message); virtual void Draw(BRect updateRect); + void DrawTo(BView* view, BRect rect); protected: @@ -48,7 +49,7 @@ private: void _GetBatteryInfo(int batteryID, battery_info* info); void _Init(); void _SetLabel(char* buffer, size_t bufferLength); - void _DrawBattery(BRect rect); + void _DrawBattery(BView* view, BRect rect); void _NotifyLowBattery(); protected: