xref: /haiku/src/apps/pulse/MiniPulseView.cpp (revision b3fe70844e087a579563b43cf4c1b2525946ca27)
1 //*****************************************************************************
2 //
3 //	File:		MiniPulseView.cpp
4 //
5 //	Written by:	Arve Hjonnevag and Daniel Switkin
6 //
7 //	Copyright 1999, Be Incorporated
8 //
9 //*****************************************************************************
10 
11 #include "MiniPulseView.h"
12 #include "Common.h"
13 #include <Catalog.h>
14 #include <interface/Window.h>
15 
16 #undef B_TRANSLATION_CONTEXT
17 #define B_TRANSLATION_CONTEXT "MiniPulseView"
18 
19 
20 MiniPulseView::MiniPulseView(BRect rect, const char *name, Prefs *prefs) :
21 	PulseView(rect, name) {
22 
23 	mode1->SetLabel(B_TRANSLATE("Normal mode"));
24 	mode1->SetMessage(new BMessage(PV_NORMAL_MODE));
25 	mode2->SetLabel(B_TRANSLATE("Deskbar mode"));
26 	mode2->SetMessage(new BMessage(PV_DESKBAR_MODE));
27 	quit = new BMenuItem(B_TRANSLATE("Quit"), new BMessage(PV_QUIT), 0, 0);
28 	popupmenu->AddSeparatorItem();
29 	popupmenu->AddItem(quit);
30 
31 	// Our drawing covers every pixel in the view, so no reason to
32 	// take the time (and to flicker) by resetting the view color
33 	SetViewColor(B_TRANSPARENT_COLOR);
34 
35 	active_color.red = (prefs->mini_active_color & 0xff000000) >> 24;
36 	active_color.green = (prefs->mini_active_color & 0x00ff0000) >> 16;
37 	active_color.blue = (prefs->mini_active_color & 0x0000ff00) >> 8;
38 
39 	idle_color.red = (prefs->mini_idle_color & 0xff000000) >> 24;
40 	idle_color.green = (prefs->mini_idle_color & 0x00ff0000) >> 16;
41 	idle_color.blue = (prefs->mini_idle_color & 0x0000ff00) >> 8;
42 
43 	frame_color.red = (prefs->mini_frame_color & 0xff000000) >> 24;
44 	frame_color.green = (prefs->mini_frame_color & 0x00ff0000) >> 16;
45 	frame_color.blue = (prefs->mini_frame_color & 0x0000ff00) >> 8;
46 }
47 
48 // These two are only used by DeskbarPulseView, and so do nothing
49 MiniPulseView::MiniPulseView(BRect rect, const char *name)
50  :
51  PulseView(rect, name)
52 {
53 
54 }
55 
56 MiniPulseView::MiniPulseView(BMessage *message)
57  :
58  PulseView(message)
59 {
60 
61 }
62 
63 // This method is used by DeskbarPulseView as well
64 void MiniPulseView::Draw(BRect rect) {
65 	system_info sys_info;
66 	get_system_info(&sys_info);
67 	if (sys_info.cpu_count <= 0)
68 		return;
69 
70 	BRect bounds(Bounds());
71 	SetDrawingMode(B_OP_COPY);
72 
73 	int h = bounds.IntegerHeight() - 2;
74 	float top = 1, left = 1;
75 	float bottom = top + h;
76 	float bar_width = (bounds.Width()) / sys_info.cpu_count - 2;
77 	float right = bar_width + left;
78 
79 	for (unsigned int x = 0; x < sys_info.cpu_count; x++) {
80 		int bar_height = (int)(cpu_times[x] * (h + 1));
81 		if (bar_height > h) bar_height = h;
82 		double rem = cpu_times[x] * (h + 1) - bar_height;
83 
84 		rgb_color fraction_color;
85 		fraction_color.red = (uint8)(idle_color.red + rem
86 			* (active_color.red - idle_color.red));
87 		fraction_color.green = (uint8)(idle_color.green + rem
88 			* (active_color.green - idle_color.green));
89 		fraction_color.blue = (uint8)(idle_color.blue + rem
90 			* (active_color.blue - idle_color.blue));
91 		fraction_color.alpha = 0xff;
92 
93 		int idle_height = h - bar_height;
94 		SetHighColor(frame_color);
95 		StrokeRect(BRect(left - 1, top - 1, right + 1, bottom + 1));
96 		if (idle_height > 0) {
97 			SetHighColor(idle_color);
98 			FillRect(BRect(left, top, right, top + idle_height - 1));
99 		}
100 		SetHighColor(fraction_color);
101 		FillRect(BRect(left, bottom - bar_height, right, bottom - bar_height));
102 		if (bar_height > 0) {
103 			SetHighColor(active_color);
104 			FillRect(BRect(left, bottom - bar_height + 1, right, bottom));
105 		}
106 		left += bar_width + 2;
107 		right += bar_width + 2;
108 	}
109 }
110 
111 void MiniPulseView::Pulse() {
112 	// Don't recalculate and redraw if this view is hidden
113 	if (!IsHidden()) {
114 		Update();
115 		Draw(Bounds());
116 	}
117 }
118 
119 void MiniPulseView::FrameResized(float width, float height) {
120 	Draw(Bounds());
121 }
122 
123 void MiniPulseView::AttachedToWindow() {
124 	BMessenger messenger(Window());
125 	mode1->SetTarget(messenger);
126 	mode2->SetTarget(messenger);
127 	preferences->SetTarget(messenger);
128 	about->SetTarget(messenger);
129 	quit->SetTarget(messenger);
130 
131 	system_info sys_info;
132 	get_system_info(&sys_info);
133 	if (sys_info.cpu_count >= 2) {
134 		for (unsigned int x = 0; x < sys_info.cpu_count; x++)
135 			cpu_menu_items[x]->SetTarget(messenger);
136 	}
137 }
138 
139 // Redraw the view with the new colors but do not call
140 // Update() again - we don't want to recalculate activity
141 void MiniPulseView::UpdateColors(BMessage *message) {
142 	int32 ac = message->FindInt32("active_color");
143 	int32 ic = message->FindInt32("idle_color");
144 	int32 fc = message->FindInt32("frame_color");
145 
146 	active_color.red = (ac & 0xff000000) >> 24;
147 	active_color.green = (ac & 0x00ff0000) >> 16;
148 	active_color.blue = (ac & 0x0000ff00) >> 8;
149 
150 	idle_color.red = (ic & 0xff000000) >> 24;
151 	idle_color.green = (ic & 0x00ff0000) >> 16;
152 	idle_color.blue = (ic & 0x0000ff00) >> 8;
153 
154 	frame_color.red = (fc & 0xff000000) >> 24;
155 	frame_color.green = (fc & 0x00ff0000) >> 16;
156 	frame_color.blue = (fc & 0x0000ff00) >> 8;
157 
158 	Draw(Bounds());
159 }
160 
161 MiniPulseView::~MiniPulseView() {
162 
163 }
164