haiku/src/apps/pulse/ConfigView.cpp

377 lines
11 KiB
C++

/*
* Copyright 2002-2009, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Copyright 1999, Be Incorporated. All Rights Reserved.
* This file may be used under the terms of the Be Sample Code License.
*
* Written by: Daniel Switkin
*/
#include "ConfigView.h"
#include "Common.h"
#include "PulseApp.h"
#include "PrefsWindow.h"
#include <Catalog.h>
#include <CheckBox.h>
#include <RadioButton.h>
#include <TextControl.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "ConfigView"
RTColorControl::RTColorControl(BPoint point, BMessage *message)
: BColorControl(point, B_CELLS_32x8, 6, "ColorControl", message, false)
{
}
/*!
Send a message every time the color changes, not just
when the mouse button is released
*/
void
RTColorControl::SetValue(int32 color)
{
BColorControl::SetValue(color);
Invoke();
}
// #pragma mark -
/*!
A single class for all three prefs views, needs to be
customized below to give each control the right message
*/
ConfigView::ConfigView(BRect rect, const char *name, uint32 mode, BMessenger& target,
Prefs *prefs)
: BBox(rect, name, B_FOLLOW_NONE, B_WILL_DRAW),
fMode(mode),
fTarget(target),
fPrefs(prefs),
fFirstTimeAttached(true)
{
fFadeCheckBox = NULL;
fActiveButton = fIdleButton = fFrameButton = NULL;
fIconWidthControl = NULL;
SetLabel(B_TRANSLATE("Bar colors"));
font_height fontHeight;
be_bold_font->GetHeight(&fontHeight);
fColorControl = new RTColorControl(BPoint(10, 5.0f + fontHeight.ascent
+ fontHeight.descent), new BMessage(fMode));
fColorControl->ResizeToPreferred();
AddChild(fColorControl);
rect = fColorControl->Frame();
rect.top = rect.bottom + 10.0f;
rect.bottom = rect.top + 15.0f;
if (mode == PRV_NORMAL_CHANGE_COLOR) {
// normal mode
fFadeCheckBox = new BCheckBox(rect, "FadeColors",
B_TRANSLATE("Fade colors"), new BMessage(PRV_NORMAL_FADE_COLORS));
fFadeCheckBox->ResizeToPreferred();
AddChild(fFadeCheckBox);
fColorControl->SetValue(fPrefs->normal_bar_color);
fFadeCheckBox->SetValue(fPrefs->normal_fade_colors);
} else if (mode == PRV_MINI_CHANGE_COLOR) {
// mini mode
fActiveButton = new BRadioButton(rect, "ActiveColor",
B_TRANSLATE("Active color"), new BMessage(PRV_MINI_ACTIVE));
fActiveButton->ResizeToPreferred();
fActiveButton->SetValue(B_CONTROL_ON);
AddChild(fActiveButton);
rect.left = fActiveButton->Frame().right + 5.0f;
fIdleButton = new BRadioButton(rect, "IdleColor",
B_TRANSLATE("Idle color"), new BMessage(PRV_MINI_IDLE));
fIdleButton->ResizeToPreferred();
AddChild(fIdleButton);
rect.left = fIdleButton->Frame().right + 5.0f;
fFrameButton = new BRadioButton(rect, "FrameColor",
B_TRANSLATE("Frame color"), new BMessage(PRV_MINI_FRAME));
fFrameButton->ResizeToPreferred();
AddChild(fFrameButton);
fColorControl->SetValue(fPrefs->mini_active_color);
} else {
// deskbar mode
fActiveButton = new BRadioButton(rect, "ActiveColor",
B_TRANSLATE("Active color"), new BMessage(PRV_DESKBAR_ACTIVE));
fActiveButton->ResizeToPreferred();
fActiveButton->SetValue(B_CONTROL_ON);
AddChild(fActiveButton);
rect.left = fActiveButton->Frame().right + 5.0f;
fIdleButton = new BRadioButton(rect, "IdleColor",
B_TRANSLATE("Idle color"), new BMessage(PRV_DESKBAR_IDLE));
fIdleButton->ResizeToPreferred();
AddChild(fIdleButton);
rect.left = fIdleButton->Frame().right + 5.0f;
fFrameButton = new BRadioButton(rect, "FrameColor",
B_TRANSLATE("Frame color"), new BMessage(PRV_DESKBAR_FRAME));
fFrameButton->ResizeToPreferred();
AddChild(fFrameButton);
rect.left = fColorControl->Frame().left;
rect.top = fActiveButton->Frame().bottom + 5.0f;
char temp[10];
snprintf(temp, sizeof(temp), "%d", fPrefs->deskbar_icon_width);
fIconWidthControl = new BTextControl(rect, "Width",
B_TRANSLATE("Width of icon:"), temp,
new BMessage(PRV_DESKBAR_ICON_WIDTH));
AddChild(fIconWidthControl);
fIconWidthControl->SetDivider(be_plain_font->StringWidth(
fIconWidthControl->Label()) + 5.0f);
for (int c = 0; c < 256; c++) {
if (!isdigit(c))
fIconWidthControl->TextView()->DisallowChar(c);
}
fIconWidthControl->TextView()->SetMaxBytes(2);
float width, height;
fIconWidthControl->GetPreferredSize(&width, &height);
fIconWidthControl->ResizeTo(fIconWidthControl->Divider() + 32.0f
+ fIconWidthControl->StringWidth("999"), height);
fColorControl->SetValue(fPrefs->deskbar_active_color);
}
}
void
ConfigView::GetPreferredSize(float* _width, float* _height)
{
float right, bottom;
if (fMode == PRV_NORMAL_CHANGE_COLOR) {
// normal mode
bottom = fFadeCheckBox->Frame().bottom;
right = fFadeCheckBox->Frame().right;
} else if (fMode == PRV_MINI_CHANGE_COLOR) {
// mini mode
bottom = fIdleButton->Frame().bottom;
right = fFrameButton->Frame().right;
} else {
// deskbar mode
bottom = fIconWidthControl->Frame().bottom;
right = fFrameButton->Frame().right;
}
if (right < fColorControl->Frame().right)
right = fColorControl->Frame().right;
if (right < 300)
right = 300;
if (_width)
*_width = right + 10.0f;
if (_height)
*_height = bottom + 8.0f;
}
void
ConfigView::AttachedToWindow()
{
BView::AttachedToWindow();
// AttachedToWindow() gets called every time this tab is brought
// to the front, but we only want this initialization to happen once
if (fFirstTimeAttached) {
AdoptParentColors();
if (Parent() == NULL)
SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
BMessenger messenger(this);
fColorControl->SetTarget(messenger);
if (fFadeCheckBox != NULL)
fFadeCheckBox->SetTarget(messenger);
if (fActiveButton != NULL)
fActiveButton->SetTarget(messenger);
if (fIdleButton != NULL)
fIdleButton->SetTarget(messenger);
if (fFrameButton != NULL)
fFrameButton->SetTarget(messenger);
if (fIconWidthControl != NULL)
fIconWidthControl->SetTarget(messenger);
fFirstTimeAttached = false;
}
}
void
ConfigView::MessageReceived(BMessage *message)
{
switch (message->what) {
// These two send the color and the status of the fade checkbox together
case PRV_NORMAL_FADE_COLORS:
case PRV_NORMAL_CHANGE_COLOR:
{
bool fade_colors = (bool)fFadeCheckBox->Value();
int32 bar_color = fColorControl->Value();
message->AddInt32("color", bar_color);
message->AddBool("fade", fade_colors);
fPrefs->normal_fade_colors = fade_colors;
fPrefs->normal_bar_color = bar_color;
fTarget.SendMessage(message);
break;
}
// Share the single color control among three values
case PRV_MINI_ACTIVE:
fColorControl->SetValue(fPrefs->mini_active_color);
break;
case PRV_MINI_IDLE:
fColorControl->SetValue(fPrefs->mini_idle_color);
break;
case PRV_MINI_FRAME:
fColorControl->SetValue(fPrefs->mini_frame_color);
break;
case PRV_MINI_CHANGE_COLOR: {
int32 color = fColorControl->Value();
if (fActiveButton->Value())
fPrefs->mini_active_color = color;
else if (fIdleButton->Value())
fPrefs->mini_idle_color = color;
else
fPrefs->mini_frame_color = color;
message->AddInt32("active_color", fPrefs->mini_active_color);
message->AddInt32("idle_color", fPrefs->mini_idle_color);
message->AddInt32("frame_color", fPrefs->mini_frame_color);
fTarget.SendMessage(message);
break;
}
case PRV_DESKBAR_ACTIVE:
fColorControl->SetValue(fPrefs->deskbar_active_color);
break;
case PRV_DESKBAR_IDLE:
fColorControl->SetValue(fPrefs->deskbar_idle_color);
break;
case PRV_DESKBAR_FRAME:
fColorControl->SetValue(fPrefs->deskbar_frame_color);
break;
case PRV_DESKBAR_ICON_WIDTH:
UpdateDeskbarIconWidth();
break;
case PRV_DESKBAR_CHANGE_COLOR: {
int32 color = fColorControl->Value();
if (fActiveButton->Value())
fPrefs->deskbar_active_color = color;
else if (fIdleButton->Value())
fPrefs->deskbar_idle_color = color;
else
fPrefs->deskbar_frame_color = color;
message->AddInt32("active_color", fPrefs->deskbar_active_color);
message->AddInt32("idle_color", fPrefs->deskbar_idle_color);
message->AddInt32("frame_color", fPrefs->deskbar_frame_color);
fTarget.SendMessage(message);
break;
}
case PRV_BOTTOM_DEFAULTS:
_ResetDefaults();
break;
default:
BView::MessageReceived(message);
break;
}
}
void
ConfigView::UpdateDeskbarIconWidth()
{
// Make sure the width shows at least one pixel per CPU and
// that it will fit in the tray in any Deskbar orientation
int width = atoi(fIconWidthControl->Text());
int min_width = GetMinimumViewWidth();
if (width < min_width || width > 50) {
char temp[10];
if (width < min_width) {
sprintf(temp, "%d", min_width);
width = min_width;
} else {
strcpy(temp, "50");
width = 50;
}
fIconWidthControl->SetText(temp);
}
fPrefs->deskbar_icon_width = width;
BMessage message(PRV_DESKBAR_ICON_WIDTH);
message.AddInt32("width", width);
fTarget.SendMessage(&message);
}
void
ConfigView::_ResetDefaults()
{
if (fMode == PRV_NORMAL_CHANGE_COLOR) {
fColorControl->SetValue(DEFAULT_NORMAL_BAR_COLOR);
fFadeCheckBox->SetValue(DEFAULT_NORMAL_FADE_COLORS);
} else if (fMode == PRV_MINI_CHANGE_COLOR) {
fPrefs->mini_active_color = DEFAULT_MINI_ACTIVE_COLOR;
fPrefs->mini_idle_color = DEFAULT_MINI_IDLE_COLOR;
fPrefs->mini_frame_color = DEFAULT_MINI_FRAME_COLOR;
if (fActiveButton->Value())
fColorControl->SetValue(DEFAULT_MINI_ACTIVE_COLOR);
else if (fIdleButton->Value())
fColorControl->SetValue(DEFAULT_MINI_IDLE_COLOR);
else
fColorControl->SetValue(DEFAULT_MINI_FRAME_COLOR);
BMessage *message = new BMessage(PRV_MINI_CHANGE_COLOR);
message->AddInt32("active_color", DEFAULT_MINI_ACTIVE_COLOR);
message->AddInt32("idle_color", DEFAULT_MINI_IDLE_COLOR);
message->AddInt32("frame_color", DEFAULT_MINI_FRAME_COLOR);
fTarget.SendMessage(message);
} else {
fPrefs->deskbar_active_color = DEFAULT_DESKBAR_ACTIVE_COLOR;
fPrefs->deskbar_idle_color = DEFAULT_DESKBAR_IDLE_COLOR;
fPrefs->deskbar_frame_color = DEFAULT_DESKBAR_FRAME_COLOR;
if (fActiveButton->Value())
fColorControl->SetValue(DEFAULT_DESKBAR_ACTIVE_COLOR);
else if (fIdleButton->Value())
fColorControl->SetValue(DEFAULT_DESKBAR_IDLE_COLOR);
else
fColorControl->SetValue(DEFAULT_DESKBAR_FRAME_COLOR);
BMessage *message = new BMessage(PRV_DESKBAR_CHANGE_COLOR);
message->AddInt32("active_color", DEFAULT_DESKBAR_ACTIVE_COLOR);
message->AddInt32("idle_color", DEFAULT_DESKBAR_IDLE_COLOR);
message->AddInt32("frame_color", DEFAULT_DESKBAR_FRAME_COLOR);
fTarget.SendMessage(message);
char temp[10];
sprintf(temp, "%d", DEFAULT_DESKBAR_ICON_WIDTH);
fIconWidthControl->SetText(temp);
// Need to force the model message to be sent
fIconWidthControl->Invoke();
}
}