Allow the user to select the scrollbar setting graphically.

This uses custom controls to allow the user to choose between
single and double arrows and none, dots, or line knob styles
in a graphical fashion copied from BeOS Scrollbar preflet.
This commit is contained in:
John Scipione
2012-11-02 01:06:59 -04:00
parent 4b5a6861f2
commit 928ffe6dee
5 changed files with 609 additions and 48 deletions
@@ -0,0 +1,348 @@
/*
* Copyright 2010-2012 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* DarkWyrm <[email protected]>
* John Scipione <[email protected]>
*/
#include "FakeScrollBar.h"
#include <Box.h>
#include <ControlLook.h>
#include <Message.h>
#include <ScrollBar.h>
#include <Shape.h>
#include <Size.h>
#include <Window.h>
typedef enum {
ARROW_LEFT = 0,
ARROW_RIGHT,
ARROW_UP,
ARROW_DOWN,
ARROW_NONE
} arrow_direction;
FakeScrollBar::FakeScrollBar(bool drawArrows, bool doubleArrows,
int32 knobStyle, BMessage* message)
:
BControl("FakeScrollBar", NULL, message, B_WILL_DRAW),
fDrawArrows(drawArrows),
fDoubleArrows(doubleArrows),
fKnobStyle(knobStyle)
{
SetExplicitMinSize(BSize(160, 20));
SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 20));
}
FakeScrollBar::~FakeScrollBar(void)
{
}
void
FakeScrollBar::Draw(BRect updateRect)
{
BRect bounds = Bounds();
rgb_color normal = ui_color(B_PANEL_BACKGROUND_COLOR);
if (Value() == B_CONTROL_ON)
SetHighColor(ui_color(B_CONTROL_MARK_COLOR));
else
SetHighColor(normal);
// Draw the selected border (2px)
StrokeRect(bounds);
bounds.InsetBy(1.0, 1.0);
StrokeRect(bounds);
bounds.InsetBy(1.0, 1.0);
// draw a gap (1px)
SetHighColor(normal);
StrokeRect(bounds);
bounds.InsetBy(1.0, 1.0);
// draw a border around control (1px)
SetHighColor(tint_color(normal, B_DARKEN_1_TINT));
StrokeRect(bounds);
bounds.InsetBy(1.0, 1.0);
BRect thumbBG = bounds;
BRect bgRect = bounds;
if (fDrawArrows) {
// draw arrows
SetDrawingMode(B_OP_OVER);
BRect buttonFrame(bounds.left, bounds.top,
bounds.left + bounds.Height(), bounds.bottom);
_DrawArrowButton(ARROW_LEFT, fDoubleArrows, buttonFrame, updateRect);
if (fDoubleArrows) {
buttonFrame.OffsetBy(bounds.Height() + 1, 0.0);
_DrawArrowButton(ARROW_RIGHT, fDoubleArrows, buttonFrame,
updateRect);
buttonFrame.OffsetTo(bounds.right - ((bounds.Height() * 2) + 1),
bounds.top);
_DrawArrowButton(ARROW_LEFT, fDoubleArrows, buttonFrame,
updateRect);
thumbBG.left += bounds.Height() * 2 + 2;
thumbBG.right -= bounds.Height() * 2 + 2;
} else {
thumbBG.left += bounds.Height() + 1;
thumbBG.right -= bounds.Height() + 1;
}
buttonFrame.OffsetTo(bounds.right - bounds.Height(), bounds.top);
_DrawArrowButton(ARROW_RIGHT, fDoubleArrows, buttonFrame, updateRect);
SetDrawingMode(B_OP_COPY);
bgRect = bounds.InsetByCopy(48, 0);
} else
bgRect = bounds.InsetByCopy(16, 0);
// fill background besides the thumb
BRect leftOfThumb(thumbBG.left, thumbBG.top, bgRect.left - 1,
thumbBG.bottom);
BRect rightOfThumb(bgRect.right + 1, thumbBG.top, thumbBG.right,
thumbBG.bottom);
be_control_look->DrawScrollBarBackground(this, leftOfThumb,
rightOfThumb, updateRect, normal, 0, B_HORIZONTAL);
// Draw scroll thumb
// fill the clickable surface of the thumb
be_control_look->DrawButtonBackground(this, bgRect, updateRect,
normal, 0, BControlLook::B_ALL_BORDERS, B_HORIZONTAL);
if (fKnobStyle == KNOB_STYLE_NONE)
return;
// draw the scrollbar thumb knobs
bool square = fKnobStyle == KNOB_STYLE_DOTS;
int32 hextent = 0;
int32 vextent = 0;
if (square) {
hextent = 2;
vextent = 2;
} else {
hextent = 1;
vextent = 3;
}
float hmiddle = bgRect.Width() / 2;
float vmiddle = bgRect.Height() / 2;
BRect middleKnob = BRect(bgRect.left + hmiddle - hextent,
bgRect.top + vmiddle - vextent,
bgRect.left + hmiddle + hextent,
bgRect.top + vmiddle + vextent);
BRect leftKnob = middleKnob.OffsetByCopy(hextent * -4, 0);
if (leftKnob.left > bgRect.left + hextent) {
be_control_look->DrawButtonBackground(this, leftKnob, updateRect,
normal, 0, BControlLook::B_ALL_BORDERS, B_HORIZONTAL);
}
BRect rightKnob = middleKnob.OffsetByCopy(hextent * 4, 0);
if (rightKnob.right < bgRect.right - hextent) {
be_control_look->DrawButtonBackground(this, rightKnob, updateRect,
normal, 0, BControlLook::B_ALL_BORDERS, B_HORIZONTAL);
}
// draw middle knob last because it modifies middleKnob
be_control_look->DrawButtonBackground(this, middleKnob, updateRect,
normal, 0, BControlLook::B_ALL_BORDERS, B_HORIZONTAL);
}
void
FakeScrollBar::MouseDown(BPoint point)
{
BControl::MouseDown(point);
}
void
FakeScrollBar::MouseMoved(BPoint point, uint32 transit,
const BMessage* message)
{
BControl::MouseMoved(point, transit, message);
}
void
FakeScrollBar::MouseUp(BPoint point)
{
SetValue(B_CONTROL_ON);
Invoke();
Invalidate();
BControl::MouseUp(point);
}
void
FakeScrollBar::SetValue(int32 value)
{
if (value != Value()) {
BControl::SetValueNoUpdate(value);
Invalidate();
}
if (!value)
return;
BView* parent = Parent();
BView* child = NULL;
if (parent != NULL) {
// If the parent is a BBox, the group parent is the parent of the BBox
BBox* box = dynamic_cast<BBox*>(parent);
if (box && box->LabelView() == this)
parent = box->Parent();
if (parent != NULL) {
BBox* box = dynamic_cast<BBox*>(parent);
// If the parent is a BBox, skip the label if there is one
if (box && box->LabelView())
child = parent->ChildAt(1);
else
child = parent->ChildAt(0);
} else
child = Window()->ChildAt(0);
} else if (Window())
child = Window()->ChildAt(0);
while (child) {
FakeScrollBar* scrollbar = dynamic_cast<FakeScrollBar*>(child);
if (scrollbar != NULL && (scrollbar != this))
scrollbar->SetValue(B_CONTROL_OFF);
else {
// If the child is a BBox, check if the label is a scrollbarbutton
BBox* box = dynamic_cast<BBox*>(child);
if (box && box->LabelView()) {
scrollbar = dynamic_cast<FakeScrollBar*>(box->LabelView());
if (scrollbar != NULL && (scrollbar != this))
scrollbar->SetValue(B_CONTROL_OFF);
}
}
child = child->NextSibling();
}
//ASSERT(Value() == B_CONTROL_ON);
}
// #pragma mark -
void
FakeScrollBar::SetDoubleArrows(bool doublearrows)
{
fDoubleArrows = doublearrows;
Invalidate();
}
void
FakeScrollBar::SetKnobStyle(uint32 style)
{
fKnobStyle = style;
Invalidate();
}
void
FakeScrollBar::SetFromScrollBarInfo(const scroll_bar_info &info)
{
fDoubleArrows = info.double_arrows;
fKnobStyle = info.knob;
Invalidate();
}
// #pragma mark -
void
FakeScrollBar::_DrawArrowButton(int32 direction, bool doubleArrows, BRect r,
const BRect& updateRect)
{
if (!updateRect.Intersects(r))
return;
rgb_color c = ui_color(B_PANEL_BACKGROUND_COLOR);
rgb_color light = tint_color(c, B_LIGHTEN_MAX_TINT);
rgb_color dark = tint_color(c, B_DARKEN_1_TINT);
rgb_color darker = tint_color(c, B_DARKEN_2_TINT);
rgb_color normal = c;
rgb_color arrow = tint_color(c,
(B_DARKEN_MAX_TINT + B_DARKEN_4_TINT) / 2.0);
BPoint tri1, tri2, tri3;
float hInset = r.Width() / 3;
float vInset = r.Height() / 3;
r.InsetBy(hInset, vInset);
switch (direction) {
case ARROW_LEFT:
tri1.Set(r.right, r.top);
tri2.Set(r.right - r.Width() / 1.33, (r.top + r.bottom + 1) / 2);
tri3.Set(r.right, r.bottom + 1);
break;
case ARROW_RIGHT:
tri1.Set(r.left, r.bottom + 1);
tri2.Set(r.left + r.Width() / 1.33, (r.top + r.bottom + 1) / 2);
tri3.Set(r.left, r.top);
break;
case ARROW_UP:
tri1.Set(r.left, r.bottom);
tri2.Set((r.left + r.right + 1) / 2, r.bottom - r.Height() / 1.33);
tri3.Set(r.right + 1, r.bottom);
break;
default:
tri1.Set(r.left, r.top);
tri2.Set((r.left + r.right + 1) / 2, r.top + r.Height() / 1.33);
tri3.Set(r.right + 1, r.top);
break;
}
r.InsetBy(-(hInset - 1), -(vInset - 1));
BRect temp(r.InsetByCopy(-1, -1));
be_control_look->DrawButtonBackground(this, temp, updateRect,
normal, 0, BControlLook::B_ALL_BORDERS, B_HORIZONTAL);
BShape arrowShape;
arrowShape.MoveTo(tri1);
arrowShape.LineTo(tri2);
arrowShape.LineTo(tri3);
SetHighColor(arrow);
SetPenSize(ceilf(hInset / 2.0));
StrokeShape(&arrowShape);
SetPenSize(1.0);
}
@@ -0,0 +1,46 @@
/*
* Copyright 2010-2012 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* DarkWyrm <[email protected]>
* John Scipione <[email protected]>
*/
#ifndef FAKE_SCROLL_BAR_H
#define FAKE_SCROLL_BAR_H
#include <Control.h>
class FakeScrollBar : public BControl {
public:
FakeScrollBar(bool drawArrows, bool doubleArrows,
int32 knobStyle, BMessage* message);
~FakeScrollBar(void);
virtual void MouseDown(BPoint point);
virtual void MouseMoved(BPoint point, uint32 transit,
const BMessage *message);
virtual void MouseUp(BPoint point);
virtual void Draw(BRect updateRect);
virtual void SetValue(int32 value);
void SetDoubleArrows(bool doublearrows);
void SetKnobStyle(uint32 style);
void SetFromScrollBarInfo(const scroll_bar_info &info);
private:
void _DrawArrowButton(int32 direction,
bool doubleArrows, BRect r,
const BRect& updateRect);
bool fDrawArrows;
bool fDoubleArrows;
int32 fKnobStyle;
};
#endif // FAKE_SCROLL_BAR_H
+1
View File
@@ -10,6 +10,7 @@ Preference Appearance :
APRMain.cpp APRMain.cpp
AntialiasingSettingsView.cpp AntialiasingSettingsView.cpp
LookAndFeelSettingsView.cpp LookAndFeelSettingsView.cpp
FakeScrollBar.cpp
FontSelectionView.cpp FontSelectionView.cpp
FontView.cpp FontView.cpp
APRView.cpp APRView.cpp
@@ -3,8 +3,9 @@
* Distributed under the terms of the MIT license. * Distributed under the terms of the MIT license.
* *
* Authors: * Authors:
* Alexander von Gluck, [email protected]
* Stephan Aßmus <[email protected]> * Stephan Aßmus <[email protected]>
* Alexander von Gluck <[email protected]>
* John Scipione <[email protected]>
* Ryan Leavengood <[email protected]> * Ryan Leavengood <[email protected]>
*/ */
@@ -22,15 +23,22 @@
#include <GridLayoutBuilder.h> #include <GridLayoutBuilder.h>
#include <GroupLayoutBuilder.h> #include <GroupLayoutBuilder.h>
#include <InterfaceDefs.h> #include <InterfaceDefs.h>
#include <LayoutBuilder.h>
#include <Locale.h> #include <Locale.h>
#include <MenuField.h> #include <MenuField.h>
#include <MenuItem.h> #include <MenuItem.h>
#include <PopUpMenu.h> #include <PopUpMenu.h>
#include <RadioButton.h>
#include <ScrollBar.h>
#include <StringView.h>
#include <Size.h>
#include <Slider.h> #include <Slider.h>
#include <SpaceLayoutItem.h> #include <SpaceLayoutItem.h>
#include <StringView.h>
#include <TextView.h> #include <TextView.h>
#include "APRWindow.h" #include "APRWindow.h"
#include "FakeScrollBar.h"
#undef B_TRANSLATION_CONTEXT #undef B_TRANSLATION_CONTEXT
@@ -40,9 +48,17 @@
static const int32 kMsgSetDecor = 'deco'; static const int32 kMsgSetDecor = 'deco';
static const int32 kMsgDecorInfo = 'idec'; static const int32 kMsgDecorInfo = 'idec';
static const int32 kMsgDoubleScrollbarArrows = 'dsba';
static const bool kDefaultDoubleScrollbarArrowsSetting = false; static const int32 kMsgDoubleScrollBarArrows = 'dsba';
static const int32 kMsgArrowStyleSingle = 'mass';
static const int32 kMsgArrowStyleDouble = 'masd';
static const int32 kMsgKnobStyleNone = 'mksn';
static const int32 kMsgKnobStyleDots = 'mksd';
static const int32 kMsgKnobStyleLines = 'mksl';
static const bool kDefaultDoubleScrollBarArrowsSetting = false;
// #pragma mark - // #pragma mark -
@@ -53,8 +69,7 @@ LookAndFeelSettingsView::LookAndFeelSettingsView(const char* name)
BView(name, 0), BView(name, 0),
fDecorInfoButton(NULL), fDecorInfoButton(NULL),
fDecorMenuField(NULL), fDecorMenuField(NULL),
fDecorMenu(NULL), fDecorMenu(NULL)
fDoubleScrollbarArrowsCheckBox(NULL)
{ {
// Decorator menu // Decorator menu
_BuildDecorMenu(); _BuildDecorMenu();
@@ -64,24 +79,78 @@ LookAndFeelSettingsView::LookAndFeelSettingsView(const char* name)
fDecorInfoButton = new BButton(B_TRANSLATE("About"), fDecorInfoButton = new BButton(B_TRANSLATE("About"),
new BMessage(kMsgDecorInfo)); new BMessage(kMsgDecorInfo));
fDoubleScrollbarArrowsCheckBox = new BCheckBox("doubleScrollbarArrows", // scrollbar arrow style
B_TRANSLATE("Use double scrollbar arrows"), BBox* arrowStyleBox = new BBox("arrow style");
new BMessage(kMsgDoubleScrollbarArrows)); arrowStyleBox->SetLabel(B_TRANSLATE("Arrow style"));
fSavedDoubleArrowsValue = _GetDoubleScrollbarArrowsSetting(); fSavedDoubleArrowsValue = _DoubleScrollBarArrows();
fDoubleScrollbarArrowsCheckBox->SetValue(fSavedDoubleArrowsValue);
fArrowStyleSingle = new FakeScrollBar(true, false, KNOB_STYLE_LINES,
new BMessage(kMsgArrowStyleSingle));
fArrowStyleDouble = new FakeScrollBar(true, true, KNOB_STYLE_LINES,
new BMessage(kMsgArrowStyleDouble));
BView* arrowStyleView;
arrowStyleView = BLayoutBuilder::Group<>()
.AddGroup(B_VERTICAL, 0)
.Add(new BStringView("single", B_TRANSLATE("Single:")))
.Add(fArrowStyleSingle)
.Add(new BStringView("spacer", ""))
.Add(new BStringView("double", B_TRANSLATE("Double:")))
.Add(fArrowStyleDouble)
.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING)
.End()
.View();
arrowStyleBox->AddChild(arrowStyleView);
// scrollbar knob style
fSavedKnobStyleValue = _ScrollBarKnobStyle();
BBox* knobStyleBox = new BBox("knob style");
knobStyleBox->SetLabel(B_TRANSLATE("Knob style"));
fKnobStyleNone = new FakeScrollBar(false, false, KNOB_STYLE_NONE,
new BMessage(kMsgKnobStyleNone));
fKnobStyleDots = new FakeScrollBar(false, false, KNOB_STYLE_DOTS,
new BMessage(kMsgKnobStyleDots));
fKnobStyleLines = new FakeScrollBar(false, false, KNOB_STYLE_LINES,
new BMessage(kMsgKnobStyleLines));
BView* knobStyleView;
knobStyleView = BLayoutBuilder::Group<>()
.AddGroup(B_VERTICAL, 0)
.Add(fKnobStyleNone)
.Add(new BStringView("spacer", ""))
.Add(fKnobStyleDots)
.Add(new BStringView("spacer", ""))
.Add(fKnobStyleLines)
.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING)
.End()
.View();
knobStyleBox->AddChild(knobStyleView);
SetLayout(new BGroupLayout(B_VERTICAL)); SetLayout(new BGroupLayout(B_VERTICAL));
// control layout // control layout
AddChild(BGridLayoutBuilder(10, 10) AddChild(BGroupLayoutBuilder(B_VERTICAL, B_USE_DEFAULT_SPACING)
.Add(fDecorMenuField->CreateLabelLayoutItem(), 0, 0) .AddGroup(B_VERTICAL, B_USE_DEFAULT_SPACING)
.Add(fDecorMenuField->CreateMenuBarLayoutItem(), 1, 0) .Add(BGridLayoutBuilder(B_USE_DEFAULT_SPACING,
.Add(fDecorInfoButton, 2, 0) B_USE_DEFAULT_SPACING)
.Add(fDecorMenuField->CreateLabelLayoutItem(), 0, 0)
.Add(fDoubleScrollbarArrowsCheckBox, 0, 3, 2) .Add(fDecorMenuField->CreateMenuBarLayoutItem(), 1, 0)
.Add(BSpaceLayoutItem::CreateGlue(), 0, 4, 2) .Add(fDecorInfoButton, 2, 0)
.SetInsets(10, 10, 10, 10) )
.Add(new BStringView("label", B_TRANSLATE("Scrollbars:")))
.AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING)
.Add(arrowStyleBox)
.Add(knobStyleBox)
.End()
.AddGlue()
.End()
.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING)
); );
// TODO : Decorator Preview Image? // TODO : Decorator Preview Image?
} }
@@ -102,7 +171,30 @@ LookAndFeelSettingsView::AttachedToWindow()
fDecorMenu->SetTargetForItems(this); fDecorMenu->SetTargetForItems(this);
fDecorInfoButton->SetTarget(this); fDecorInfoButton->SetTarget(this);
fDoubleScrollbarArrowsCheckBox->SetTarget(this); fArrowStyleSingle->SetTarget(this);
fArrowStyleDouble->SetTarget(this);
fKnobStyleNone->SetTarget(this);
fKnobStyleDots->SetTarget(this);
fKnobStyleLines->SetTarget(this);
if (fSavedDoubleArrowsValue)
fArrowStyleDouble->SetValue(B_CONTROL_ON);
else
fArrowStyleSingle->SetValue(B_CONTROL_ON);
switch (fSavedKnobStyleValue) {
case KNOB_STYLE_NONE:
fKnobStyleNone->SetValue(B_CONTROL_ON);
break;
case KNOB_STYLE_DOTS:
fKnobStyleDots->SetValue(B_CONTROL_ON);
break;
case KNOB_STYLE_LINES:
fKnobStyleLines->SetValue(B_CONTROL_ON);
break;
}
} }
@@ -117,6 +209,7 @@ LookAndFeelSettingsView::MessageReceived(BMessage *msg)
_SetDecor(newDecor); _SetDecor(newDecor);
break; break;
} }
case kMsgDecorInfo: case kMsgDecorInfo:
{ {
DecorInfo* decor = fDecorUtility.FindDecorator(fCurrentDecor); DecorInfo* decor = fDecorUtility.FindDecorator(fCurrentDecor);
@@ -145,8 +238,25 @@ LookAndFeelSettingsView::MessageReceived(BMessage *msg)
break; break;
} }
case kMsgDoubleScrollbarArrows:
_SetDoubleScrollbarArrowsSetting(fDoubleScrollbarArrowsCheckBox->Value()); case kMsgArrowStyleSingle:
_SetDoubleScrollBarArrows(false);
break;
case kMsgArrowStyleDouble:
_SetDoubleScrollBarArrows(true);
break;
case kMsgKnobStyleNone:
_SetScrollBarKnobStyle(KNOB_STYLE_NONE);
break;
case kMsgKnobStyleDots:
_SetScrollBarKnobStyle(KNOB_STYLE_DOTS);
break;
case kMsgKnobStyleLines:
_SetScrollBarKnobStyle(KNOB_STYLE_LINES);
break; break;
default: default:
@@ -221,7 +331,7 @@ LookAndFeelSettingsView::_AdoptInterfaceToCurrentDecor()
bool bool
LookAndFeelSettingsView::_GetDoubleScrollbarArrowsSetting() LookAndFeelSettingsView::_DoubleScrollBarArrows()
{ {
scroll_bar_info info; scroll_bar_info info;
get_scroll_bar_info(&info); get_scroll_bar_info(&info);
@@ -231,42 +341,84 @@ LookAndFeelSettingsView::_GetDoubleScrollbarArrowsSetting()
void void
LookAndFeelSettingsView::_SetDoubleScrollbarArrowsSetting(bool value) LookAndFeelSettingsView::_SetDoubleScrollBarArrows(bool on)
{ {
scroll_bar_info info; scroll_bar_info info;
get_scroll_bar_info(&info); get_scroll_bar_info(&info);
info.double_arrows = value; info.double_arrows = on;
set_scroll_bar_info(&info); set_scroll_bar_info(&info);
if (on)
fArrowStyleDouble->SetValue(B_CONTROL_ON);
else
fArrowStyleSingle->SetValue(B_CONTROL_ON);
Window()->PostMessage(kMsgUpdate); Window()->PostMessage(kMsgUpdate);
} }
int32
LookAndFeelSettingsView::_ScrollBarKnobStyle()
{
scroll_bar_info info;
get_scroll_bar_info(&info);
return info.knob;
}
void
LookAndFeelSettingsView::_SetScrollBarKnobStyle(int32 knobStyle)
{
scroll_bar_info info;
get_scroll_bar_info(&info);
info.knob = knobStyle;
set_scroll_bar_info(&info);
switch (knobStyle) {
case KNOB_STYLE_NONE:
fKnobStyleNone->SetValue(B_CONTROL_ON);
break;
case KNOB_STYLE_DOTS:
fKnobStyleDots->SetValue(B_CONTROL_ON);
break;
case KNOB_STYLE_LINES:
fKnobStyleLines->SetValue(B_CONTROL_ON);
break;
}
Window()->PostMessage(kMsgUpdate);
}
bool
LookAndFeelSettingsView::IsDefaultable()
{
return fCurrentDecor != fDecorUtility.DefaultDecorator()->Name()
|| _DoubleScrollBarArrows() != false
|| _ScrollBarKnobStyle() != KNOB_STYLE_DOTS;
}
void void
LookAndFeelSettingsView::SetDefaults() LookAndFeelSettingsView::SetDefaults()
{ {
_SetDecor(fDecorUtility.DefaultDecorator()); _SetDecor(fDecorUtility.DefaultDecorator());
_SetDoubleScrollbarArrowsSetting(kDefaultDoubleScrollbarArrowsSetting); _SetDoubleScrollBarArrows(false);
fDoubleScrollbarArrowsCheckBox->SetValue( _SetScrollBarKnobStyle(KNOB_STYLE_DOTS);
kDefaultDoubleScrollbarArrowsSetting);
}
bool
LookAndFeelSettingsView::IsDefaultable()
{
return fCurrentDecor != fDecorUtility.DefaultDecorator()->Name() ||
fDoubleScrollbarArrowsCheckBox->Value() !=
kDefaultDoubleScrollbarArrowsSetting;
} }
bool bool
LookAndFeelSettingsView::IsRevertable() LookAndFeelSettingsView::IsRevertable()
{ {
return fCurrentDecor != fSavedDecor || return fCurrentDecor != fSavedDecor
fDoubleScrollbarArrowsCheckBox->Value() != fSavedDoubleArrowsValue; || _DoubleScrollBarArrows() != fSavedDoubleArrowsValue
|| _ScrollBarKnobStyle() != fSavedKnobStyleValue;
} }
@@ -274,6 +426,6 @@ void
LookAndFeelSettingsView::Revert() LookAndFeelSettingsView::Revert()
{ {
_SetDecor(fSavedDecor); _SetDecor(fSavedDecor);
_SetDoubleScrollbarArrowsSetting(fSavedDoubleArrowsValue); _SetScrollBarKnobStyle(fSavedKnobStyleValue);
fDoubleScrollbarArrowsCheckBox->SetValue(fSavedDoubleArrowsValue); _SetDoubleScrollBarArrows(fSavedDoubleArrowsValue);
} }
@@ -2,9 +2,10 @@
* Copyright 2010-2012 Haiku, Inc. All rights reserved. * Copyright 2010-2012 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license. * Distributed under the terms of the MIT license.
* *
* Authors: * Authors:
* Alexander von Gluck, [email protected]
* Stephan Aßmus <[email protected]> * Stephan Aßmus <[email protected]>
* Alexander von Gluck <[email protected]>
* John Scipione <[email protected]>
* Ryan Leavengood <[email protected]> * Ryan Leavengood <[email protected]>
*/ */
#ifndef LOOK_AND_FEEL_SETTINGS_VIEW_H #ifndef LOOK_AND_FEEL_SETTINGS_VIEW_H
@@ -20,7 +21,7 @@ class BButton;
class BCheckBox; class BCheckBox;
class BMenuField; class BMenuField;
class BPopUpMenu; class BPopUpMenu;
class FakeScrollBar;
class LookAndFeelSettingsView : public BView { class LookAndFeelSettingsView : public BView {
public: public:
@@ -30,10 +31,11 @@ public:
virtual void AttachedToWindow(); virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message); virtual void MessageReceived(BMessage* message);
void SetDefaults();
void Revert();
bool IsDefaultable(); bool IsDefaultable();
void SetDefaults();
bool IsRevertable(); bool IsRevertable();
void Revert();
private: private:
void _SetDecor(const BString& name); void _SetDecor(const BString& name);
@@ -42,8 +44,12 @@ private:
void _BuildDecorMenu(); void _BuildDecorMenu();
void _AdoptToCurrentDecor(); void _AdoptToCurrentDecor();
void _AdoptInterfaceToCurrentDecor(); void _AdoptInterfaceToCurrentDecor();
bool _GetDoubleScrollbarArrowsSetting();
void _SetDoubleScrollbarArrowsSetting(bool value); bool _DoubleScrollBarArrows();
void _SetDoubleScrollBarArrows(bool on);
int32 _ScrollBarKnobStyle();
void _SetScrollBarKnobStyle(int32 knobStyle);
private: private:
DecorInfoUtility fDecorUtility; DecorInfoUtility fDecorUtility;
@@ -51,11 +57,19 @@ private:
BButton* fDecorInfoButton; BButton* fDecorInfoButton;
BMenuField* fDecorMenuField; BMenuField* fDecorMenuField;
BPopUpMenu* fDecorMenu; BPopUpMenu* fDecorMenu;
BCheckBox* fDoubleScrollbarArrowsCheckBox;
FakeScrollBar* fArrowStyleSingle;
FakeScrollBar* fArrowStyleDouble;
FakeScrollBar* fKnobStyleNone;
FakeScrollBar* fKnobStyleDots;
FakeScrollBar* fKnobStyleLines;
BString fSavedDecor; BString fSavedDecor;
BString fCurrentDecor; BString fCurrentDecor;
bool fSavedDoubleArrowsValue; bool fSavedDoubleArrowsValue;
int32 fSavedKnobStyleValue;
}; };
#endif // LOOK_AND_FEEL_SETTINGS_VIEW_H #endif // LOOK_AND_FEEL_SETTINGS_VIEW_H