void PowerStatusView::Draw(BRect updateRect) { bool drawBackground = Parent() == NULL || (Parent()->Flags() & B_DRAW_ON_CHILDREN) == 0; if (drawBackground) FillRect(updateRect, B_SOLID_LOW); float aspect = Bounds().Width() / Bounds().Height(); bool below = aspect <= 1.0f; font_height fontHeight; 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); bool showLabel = fShowLabel && text[0]; BRect iconRect; if (fShowStatusIcon) { iconRect = Bounds(); if (showLabel) { if (below) iconRect.bottom -= textHeight + 4; else iconRect.right -= textWidth + 4; } // 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); } else { // there is not enough space for the icon iconRect.Set(0, 0, -1, -1); } } if (showLabel) { BPoint point(0, baseLine); if (iconRect.IsValid()) { if (below) { point.x = (iconRect.Width() - textWidth) / 2; point.y += iconRect.Height() + 2; } else { point.x = iconRect.Width() + 2; point.y += (iconRect.Height() - textHeight) / 2; } } else { point.x = (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); } DrawString(text, point); } }
void PowerStatusView::Update(bool force) { int32 previousPercent = fPercent; time_t previousTimeLeft = fTimeLeft; bool wasOnline = fOnline; bool hadBattery = fHasBattery; _GetBatteryInfo(fBatteryID, &fBatteryInfo); fHasBattery = fBatteryInfo.full_capacity > 0; if (fBatteryInfo.full_capacity > 0 && fHasBattery) { fPercent = (100 * fBatteryInfo.capacity) / fBatteryInfo.full_capacity; fOnline = (fBatteryInfo.state & BATTERY_DISCHARGING) == 0; fTimeLeft = fBatteryInfo.time_left; } else { fPercent = 0; fOnline = false; fTimeLeft = -1; } if (fHasBattery && (fPercent <= 0 || fPercent > 100)) { // Just ignore this probe -- it obviously returned invalid values fPercent = previousPercent; fTimeLeft = previousTimeLeft; fOnline = wasOnline; fHasBattery = hadBattery; return; } if (fInDeskbar) { // make sure the tray icon is large enough float width = fShowStatusIcon ? kMinIconWidth + 2 : 0; if (fShowLabel) { char text[64]; _SetLabel(text, sizeof(text)); if (text[0]) width += ceilf(StringWidth(text)) + 4; } else { char text[256]; const char* open = ""; const char* close = ""; if (fOnline) { open = "("; close = ")"; } if (fHasBattery) { size_t length = snprintf(text, sizeof(text), "%s%" B_PRId32 "%%%s", open, fPercent, close); if (fTimeLeft >= 0) { length += snprintf(text + length, sizeof(text) - length, "\n%" B_PRId32 ":%02" B_PRId32, fTimeLeft / 3600, (fTimeLeft / 60) % 60); } const char* state = NULL; if ((fBatteryInfo.state & BATTERY_CHARGING) != 0) state = B_TRANSLATE("charging"); else if ((fBatteryInfo.state & BATTERY_DISCHARGING) != 0) state = B_TRANSLATE("discharging"); if (state != NULL) { snprintf(text + length, sizeof(text) - length, "\n%s", state); } } else strcpy(text, B_TRANSLATE("no battery")); SetToolTip(text); } if (width == 0) { // make sure we're not going away completely width = 8; } if (width != Bounds().Width()) ResizeTo(width, Bounds().Height()); } if (force || wasOnline != fOnline || (fShowTime && fTimeLeft != previousTimeLeft) || (!fShowTime && fPercent != previousPercent)) { Invalidate(); } if (!fOnline && fHasBattery && previousPercent > kLowBatteryPercentage && fPercent <= kLowBatteryPercentage) { _NotifyLowBattery(); } }
void PowerStatusView::Update(bool force) { int32 previousPercent = fPercent; bool previousTimeLeft = fTimeLeft; bool wasOnline = fOnline; _GetBatteryInfo(&fBatteryInfo, fBatteryID); fHasBattery = (fBatteryInfo.state & BATTERY_CRITICAL_STATE) == 0; if (fBatteryInfo.full_capacity > 0 && fHasBattery) { fPercent = (100 * fBatteryInfo.capacity) / fBatteryInfo.full_capacity; fOnline = (fBatteryInfo.state & BATTERY_CHARGING) != 0; fTimeLeft = fBatteryInfo.time_left; } else { fPercent = 0; fOnline = false; fTimeLeft = false; } if (fInDeskbar) { // make sure the tray icon is large enough float width = fShowStatusIcon ? kMinIconWidth + 2 : 0; if (fShowLabel) { char text[64]; _SetLabel(text, sizeof(text)); if (text[0]) width += ceilf(StringWidth(text)) + 4; } else { char text[256]; const char* open = ""; const char* close = ""; if (fOnline) { open = "("; close = ")"; } if (fHasBattery) { size_t length = snprintf(text, sizeof(text), "%s%ld%%%s", open, fPercent, close); if (fTimeLeft) { length += snprintf(text + length, sizeof(text) - length, "\n%ld:%02ld", fTimeLeft / 3600, (fTimeLeft / 60) % 60); } const char* state = NULL; if ((fBatteryInfo.state & BATTERY_CHARGING) != 0) state = B_TRANSLATE("charging"); else if ((fBatteryInfo.state & BATTERY_DISCHARGING) != 0) state = B_TRANSLATE("discharging"); if (state != NULL) { snprintf(text + length, sizeof(text) - length, "\n%s", state); } } else strcpy(text, B_TRANSLATE("no battery")); SetToolTip(text); } if (width == 0) { // make sure we're not going away completely width = 8; } if (width != Bounds().Width()) ResizeTo(width, Bounds().Height()); } if (force || wasOnline != fOnline || (fShowTime && fTimeLeft != previousTimeLeft) || (!fShowTime && fPercent != previousPercent)) Invalidate(); }