Pulse : Couldn't close Pulse CPUButton replicants

* It nows leave enough room to display the dragger into the replicant in most
   cases...

 * ...excepts in deskbar.  Then it instead allows you to right click to 
   access a popup menu allowing you to close the replicant.

   The dragger isn't shown due to space constraints.

Fixing ticket #4244.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35110 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Philippe Saint-Pierre 2010-01-17 05:12:09 +00:00
parent 2a94c3b35b
commit e20b156868
4 changed files with 78 additions and 25 deletions

View File

@ -14,6 +14,10 @@
#include <stdlib.h>
#include <Alert.h>
#include <Dragger.h>
#include <PopUpMenu.h>
#include <ViewPrivate.h>
#include <syscalls.h>
@ -37,6 +41,13 @@ CPUButton::CPUButton(BMessage *message)
: BControl(message)
{
fReplicant = true;
/* We remove the dragger if we are in deskbar */
if (CountChildren() > 1)
RemoveChild(ChildAt(1));
ResizeBy(-7, -7);
_InitData();
}
@ -56,6 +67,18 @@ CPUButton::_InitData()
}
void
CPUButton::_AddDragger()
{
BRect rect(Bounds());
rect.top = rect.bottom - 7;
rect.left = rect.right - 7;
BDragger* dragger = new BDragger(rect, this,
B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
AddChild(dragger);
}
//! Redraw the button depending on whether it's up or down
void
CPUButton::Draw(BRect rect)
@ -63,7 +86,16 @@ CPUButton::Draw(BRect rect)
bool value = (bool)Value();
SetHighColor(value ? fOnColor : fOffColor);
if (!fReplicant) {
SetLowColor(Parent()->LowColor());
FillRect(Bounds(), B_SOLID_LOW);
}
BRect bounds = Bounds();
if (!fReplicantInDeskbar) {
bounds.bottom -= 7;
bounds.right -= 7;
}
BRect color_rect(bounds);
color_rect.InsetBy(2, 2);
if (value) {
@ -148,19 +180,40 @@ CPUButton::Draw(BRect rect)
void
CPUButton::MouseDown(BPoint point)
{
SetValue(!Value());
SetTracking(true);
SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS);
BPoint mousePosition;
uint32 mouseButtons;
GetMouse(&mousePosition, &mouseButtons);
if ((B_PRIMARY_MOUSE_BUTTON & mouseButtons) != 0) {
SetValue(!Value());
SetTracking(true);
SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS);
} else if ((B_SECONDARY_MOUSE_BUTTON & mouseButtons) != 0
&& fReplicantInDeskbar) {
BPopUpMenu *menu = new BPopUpMenu("Deskbar menu");
menu->AddItem(new BMenuItem("About Pulse" B_UTF8_ELLIPSIS,
new BMessage(B_ABOUT_REQUESTED)));
menu->AddSeparatorItem();
menu->AddItem(new BMenuItem("Remove replicant",
new BMessage(kDeleteReplicant)));
menu->SetTargetForItems(this);
ConvertToScreen(&point);
menu->Go(point, true, true, true);
}
}
void
CPUButton::MouseUp(BPoint point)
{
if (Bounds().Contains(point))
Invoke();
if (IsTracking()) {
if (Bounds().Contains(point))
Invoke();
SetTracking(false);
SetTracking(false);
}
}
@ -225,6 +278,10 @@ CPUButton::MessageReceived(BMessage *message)
SetValue(!Value());
break;
}
case kDeleteReplicant: {
Window()->PostMessage(kDeleteReplicant, this, NULL);
break;
}
default:
BControl::MessageReceived(message);
break;
@ -248,14 +305,24 @@ CPUButton::AttachedToWindow()
SetTarget(this);
SetFont(be_plain_font);
SetFontSize(10);
fReplicantInDeskbar = false;
if (fReplicant) {
if (strcmp(Window()->Title(), "Deskbar")) {
// return to original size
ResizeBy(7, 7);
_AddDragger();
} else
fReplicantInDeskbar = true;
Prefs *prefs = new Prefs();
UpdateColors(prefs->normal_bar_color);
delete prefs;
} else {
PulseApp *pulseapp = (PulseApp *)be_app;
UpdateColors(pulseapp->prefs->normal_bar_color);
_AddDragger();
}
BMessenger messenger(this);
@ -269,4 +336,3 @@ CPUButton::DetachedFromWindow()
{
delete fPulseRunner;
}

View File

@ -37,11 +37,13 @@ class CPUButton : public BControl {
private:
void _InitData();
void _AddDragger();
rgb_color fOnColor, fOffColor;
bool fReplicant;
int32 fCPU;
BMessageRunner *fPulseRunner;
bool fReplicantInDeskbar;
};
#endif // CPUBUTTON_H

View File

@ -1,7 +1,7 @@
SubDir HAIKU_TOP src apps pulse ;
UsePrivateSystemHeaders ;
UsePrivateHeaders shared ;
UsePrivateHeaders shared interface app ;
if ! $(TARGET_PLATFORM_HAIKU_COMPATIBLE) {
UseHeaders [ FDirName $(HAIKU_TOP) headers os kernel ] : true ;
}

View File

@ -73,27 +73,12 @@ NormalPulseView::NormalPulseView(BRect rect)
AddChild(fProgressBars[x]);
r.Set(CPUBUTTON_MLEFT, CPUBUTTON_MTOP + ITEM_OFFSET * x,
CPUBUTTON_MLEFT + CPUBUTTON_WIDTH,
CPUBUTTON_MTOP + ITEM_OFFSET * x + CPUBUTTON_HEIGHT);
CPUBUTTON_MLEFT + CPUBUTTON_WIDTH + 7,
CPUBUTTON_MTOP + ITEM_OFFSET * x + CPUBUTTON_HEIGHT + 7);
char temp[4];
sprintf(temp, "%d", x + 1);
fCpuButtons[x] = new CPUButton(r, "CPUButton", temp, NULL);
AddChild(fCpuButtons[x]);
// If there is only 1 cpu it will be hidden below
// thus, no need to add the dragger as it will still
// be visible when replicants are turned on
if (fCpuCount > 1) {
BRect dragger_rect;
dragger_rect = r;
dragger_rect.top = dragger_rect.bottom;
dragger_rect.left = dragger_rect.right;
dragger_rect.bottom += 7;
dragger_rect.right += 7;
dragger_rect.OffsetBy(-1, -1);
BDragger *dragger = new BDragger(dragger_rect, fCpuButtons[x], 0);
AddChild(dragger);
}
}
if (fCpuCount == 1) {