void ActivityView::_Refresh() { bigtime_t lastTimeout = system_time() - RefreshInterval(); BMessenger target(this); while (true) { status_t status = acquire_sem_etc(fRefreshSem, 1, B_ABSOLUTE_TIMEOUT, lastTimeout + RefreshInterval()); if (status == B_OK || status == B_BAD_SEM_ID) break; if (status == B_INTERRUPTED) continue; SystemInfo info(fSystemInfoHandler); lastTimeout += RefreshInterval(); fSourcesLock.Lock(); for (uint32 i = fSources.CountItems(); i-- > 0;) { DataSource* source = fSources.ItemAt(i); DataHistory* values = fValues.ItemAt(i); int64 value = source->NextValue(info); values->AddValue(info.Time(), value); } fSourcesLock.Unlock(); target.SendMessage(B_INVALIDATE); } }
status_t ActivityView::AddDataSource(const DataSource* source, const BMessage* state) { if (source == NULL) return B_BAD_VALUE; BAutolock _(fSourcesLock); // Search for the correct insert spot to maintain the order of the sources int32 insert = DataSource::IndexOf(source); for (int32 i = 0; i < fSources.CountItems() && i < insert; i++) { DataSource* before = fSources.ItemAt(i); if (DataSource::IndexOf(before) > insert) { insert = i; break; } } if (insert > fSources.CountItems()) insert = fSources.CountItems(); // Generate DataHistory and ViewHistory objects for the source // (one might need one history per CPU) uint32 count = 1; if (source->PerCPU()) { SystemInfo info; count = info.CPUCount(); } for (uint32 i = 0; i < count; i++) { DataHistory* values = new(std::nothrow) DataHistory(10 * 60000000LL, RefreshInterval()); ListAddDeleter<DataHistory> valuesDeleter(fValues, values, insert); ViewHistory* viewValues = new(std::nothrow) ViewHistory; ListAddDeleter<ViewHistory> viewValuesDeleter(fViewValues, viewValues, insert); if (valuesDeleter.Failed() || viewValuesDeleter.Failed()) return B_NO_MEMORY; values->SetScale(_ScaleFor(source->ScaleType())); DataSource* copy; if (source->PerCPU()) copy = source->CopyForCPU(i); else copy = source->Copy(); ListAddDeleter<DataSource> sourceDeleter(fSources, copy, insert); if (sourceDeleter.Failed()) return B_NO_MEMORY; BString colorName = source->Name(); colorName << " color"; if (state != NULL) { const rgb_color* color = NULL; ssize_t colorLength; if (state->FindData(colorName.String(), B_RGB_COLOR_TYPE, i, (const void**)&color, &colorLength) == B_OK && colorLength == sizeof(rgb_color)) copy->SetColor(*color); } valuesDeleter.Detach(); viewValuesDeleter.Detach(); sourceDeleter.Detach(); insert++; } #ifdef __HAIKU__ InvalidateLayout(); #endif return B_OK; }
void ActivityView::Draw(BRect updateRect) { bool drawBackground = true; if (Parent() && (Parent()->Flags() & B_DRAW_ON_CHILDREN) != 0) drawBackground = false; _DrawHistory(drawBackground); if (!fShowLegend) return; // draw legend BRect legendFrame = _LegendFrame(); if (LowUIColor() == B_NO_COLOR) SetLowColor(fLegendBackgroundColor); if (drawBackground) { BRect backgroundFrame(legendFrame); backgroundFrame.bottom += kDraggerSize; FillRect(backgroundFrame, B_SOLID_LOW); } BAutolock _(fSourcesLock); font_height fontHeight; GetFontHeight(&fontHeight); for (int32 i = 0; i < fSources.CountItems(); i++) { DataSource* source = fSources.ItemAt(i); DataHistory* values = fValues.ItemAt(i); BRect frame = _LegendFrameAt(legendFrame, i); // draw color box BRect colorBox = _LegendColorFrameAt(legendFrame, i); BRect rect = colorBox; uint32 flags = BControlLook::B_BLEND_FRAME; be_control_look->DrawTextControlBorder(this, rect, rect, fLegendBackgroundColor, flags); SetHighColor(source->Color()); FillRect(rect); // show current value and label float y = frame.top + ceilf(fontHeight.ascent); int64 value = values->ValueAt(values->End()); BString text; source->Print(text, value); float width = StringWidth(text.String()); BString label = source->Label(); float possibleLabelWidth = frame.right - colorBox.right - 12 - width; // TODO: TruncateString() is broken... remove + 5 when fixed! if (ceilf(StringWidth(label.String()) + 5) > possibleLabelWidth) label = source->ShortLabel(); TruncateString(&label, B_TRUNCATE_MIDDLE, possibleLabelWidth); if (drawBackground) SetHighColor(ui_color(B_PANEL_TEXT_COLOR)); if (be_control_look == NULL) { DrawString(label.String(), BPoint(6 + colorBox.right, y)); DrawString(text.String(), BPoint(frame.right - width, y)); } else { be_control_look->DrawLabel(this, label.String(), Parent()->ViewColor(), 0, BPoint(6 + colorBox.right, y)); be_control_look->DrawLabel(this, text.String(), Parent()->ViewColor(), 0, BPoint(frame.right - width, y)); } } }
void ActivityView::Draw(BRect updateRect) { bool drawBackground = true; if (Parent() && (Parent()->Flags() & B_DRAW_ON_CHILDREN) != 0) drawBackground = false; _DrawHistory(drawBackground); if (!fShowLegend) return; // draw legend BRect legendFrame = _LegendFrame(); SetLowColor(fLegendBackgroundColor); if (drawBackground) { BRect backgroundFrame(legendFrame); backgroundFrame.bottom += kDraggerSize; FillRect(backgroundFrame, B_SOLID_LOW); } BAutolock _(fSourcesLock); font_height fontHeight; GetFontHeight(&fontHeight); for (int32 i = 0; i < fSources.CountItems(); i++) { DataSource* source = fSources.ItemAt(i); DataHistory* values = fValues.ItemAt(i); BRect frame = _LegendFrameAt(legendFrame, i); // draw color box BRect colorBox = _LegendColorFrameAt(legendFrame, i); BRect rect = colorBox; uint32 flags = BControlLook::B_BLEND_FRAME; be_control_look->DrawTextControlBorder(this, rect, rect, fLegendBackgroundColor, flags); SetHighColor(source->Color()); FillRect(rect); // show current value and label float y = frame.top + ceilf(fontHeight.ascent); int64 value = values->ValueAt(values->End()); BString text; source->Print(text, value); float width = StringWidth(text.String()); BString label = source->Label(); float possibleLabelWidth = frame.right - colorBox.right - 12 - width; // TODO: TruncateString() is broken... remove + 5 when fixed! if (ceilf(StringWidth(label.String()) + 5) > possibleLabelWidth) label = source->ShortLabel(); TruncateString(&label, B_TRUNCATE_MIDDLE, possibleLabelWidth); if (drawBackground) SetHighColor(ui_color(B_CONTROL_TEXT_COLOR)); else { rgb_color c = Parent()->ViewColor(); rgb_color textColor = c.red + c.green * 1.5f + c.blue * 0.50f >= 300 ? kBlack : kWhite; int32 mask; bool tmpOutline = false; bool outline = fCachedOutline; int8 indice = 0; if (fCachedWorkspace != current_workspace()) { while (fBackgroundInfo.FindInt32("be:bgndimginfoworkspaces", indice, &mask) == B_OK && fBackgroundInfo.FindBool("be:bgndimginfoerasetext", indice, &tmpOutline) == B_OK) { if (((1 << current_workspace()) & mask) != 0) { outline = tmpOutline; fCachedWorkspace = current_workspace(); fCachedOutline = outline; break; } indice++; } } if (outline) { SetDrawingMode(B_OP_ALPHA); SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY); BFont font; GetFont(&font); if (textColor == kBlack) { // Black text with white halo/glow rgb_color glowColor = kWhite; font.SetFalseBoldWidth(2.0); SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); glowColor.alpha = 30; SetHighColor(glowColor); DrawString(label.String(), BPoint(6 + colorBox.right, y)); DrawString(text.String(), BPoint(frame.right - width, y)); font.SetFalseBoldWidth(1.0); SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); glowColor.alpha = 65; SetHighColor(glowColor); DrawString(label.String(), BPoint(6 + colorBox.right, y)); DrawString(text.String(), BPoint(frame.right - width, y)); font.SetFalseBoldWidth(0.0); SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); } else { // white text with black outline rgb_color outlineColor = kBlack; font.SetFalseBoldWidth(1.0); SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); outlineColor.alpha = 30; SetHighColor(outlineColor); DrawString(label.String(), BPoint(6 + colorBox.right, y)); DrawString(text.String(), BPoint(frame.right - width, y)); font.SetFalseBoldWidth(0.0); SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); outlineColor.alpha = 200; SetHighColor(outlineColor); DrawString(label.String(), BPoint(6 + colorBox.right + 1, y + 1)); DrawString(text.String(), BPoint(frame.right - width + 1, y + 1)); } } SetDrawingMode(B_OP_OVER); SetHighColor(textColor); } DrawString(label.String(), BPoint(6 + colorBox.right, y)); DrawString(text.String(), BPoint(frame.right - width, y)); } }