From 0c3344f4a18959a347e6ed9d58fc31976b72d6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Fri, 3 Jun 2005 19:55:49 +0000 Subject: [PATCH] no Invalidate in BControl::SetValue, I figure more controls need to be updated for this change git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12947 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/interface/CheckBox.h | 220 +++++++++++++++-------------- headers/os/interface/RadioButton.h | 93 ++++++------ src/kits/interface/Button.cpp | 5 +- src/kits/interface/CheckBox.cpp | 18 ++- src/kits/interface/Control.cpp | 8 -- src/kits/interface/RadioButton.cpp | 36 +++-- 6 files changed, 205 insertions(+), 175 deletions(-) diff --git a/headers/os/interface/CheckBox.h b/headers/os/interface/CheckBox.h index f918dc8987..c591313306 100644 --- a/headers/os/interface/CheckBox.h +++ b/headers/os/interface/CheckBox.h @@ -1,111 +1,113 @@ -//------------------------------------------------------------------------------ -// Copyright (c) 2001-2002, OpenBeOS -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// File Name: CheckBox.h -// Author: Marc Flerackers (mflerackers@androme.be) -// Description: BCheckBox displays an on/off control. -//------------------------------------------------------------------------------ - -#ifndef _CHECK_BOX_H -#define _CHECK_BOX_H - -// Standard Includes ----------------------------------------------------------- - -// System Includes ------------------------------------------------------------- -#include -#include -// Project Includes ------------------------------------------------------------ - -// Local Includes -------------------------------------------------------------- - -// Local Defines --------------------------------------------------------------- - -// Globals --------------------------------------------------------------------- - - -// BCheckBox class ------------------------------------------------------------- -class BCheckBox : public BControl { - -public: - BCheckBox(BRect frame, - const char *name, - const char *label, - BMessage *message, - uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP, - uint32 flags = B_WILL_DRAW | B_NAVIGABLE); -virtual ~BCheckBox(); - -/* Archiving */ - BCheckBox(BMessage *archive); -static BArchivable *Instantiate(BMessage *archive); -virtual status_t Archive(BMessage *archive, bool deep = true) const; - -virtual void Draw(BRect updateRect); -virtual void AttachedToWindow(); -virtual void MouseDown(BPoint point); - -virtual void MessageReceived(BMessage *message); -virtual void WindowActivated(bool active); -virtual void KeyDown(const char *bytes, int32 numBytes); -virtual void MouseUp(BPoint point); -virtual void MouseMoved(BPoint point, uint32 transit, const BMessage *message); -virtual void DetachedFromWindow(); -virtual void SetValue(int32 value); -virtual void GetPreferredSize(float *width, float *height); -virtual void ResizeToPreferred(); -virtual status_t Invoke(BMessage *message = NULL); -virtual void FrameMoved(BPoint newLocation); -virtual void FrameResized(float width, float height); - -virtual BHandler *ResolveSpecifier(BMessage *message, - int32 index, - BMessage *specifier, - int32 what, - const char *property); -virtual status_t GetSupportedSuites(BMessage *message); - -virtual void MakeFocus(bool focused = true); -virtual void AllAttached(); -virtual void AllDetached(); - -virtual status_t Perform(perform_code d, void *arg); - -private: - -virtual void _ReservedCheckBox1(); -virtual void _ReservedCheckBox2(); -virtual void _ReservedCheckBox3(); - - BCheckBox &operator=(const BCheckBox &); - - bool fOutlined; - uint32 _reserved[2]; -}; +//------------------------------------------------------------------------------ +// Copyright (c) 2001-2002, OpenBeOS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// File Name: CheckBox.h +// Author: Marc Flerackers (mflerackers@androme.be) +// Description: BCheckBox displays an on/off control. //------------------------------------------------------------------------------ -#endif // _CHECK_BOX_H - -/* - * $Log $ - * - * $Id $ - * - */ +#ifndef _CHECK_BOX_H +#define _CHECK_BOX_H + +// Standard Includes ----------------------------------------------------------- + +// System Includes ------------------------------------------------------------- +#include +#include +// Project Includes ------------------------------------------------------------ + +// Local Includes -------------------------------------------------------------- + +// Local Defines --------------------------------------------------------------- + +// Globals --------------------------------------------------------------------- + + +// BCheckBox class ------------------------------------------------------------- +class BCheckBox : public BControl { + +public: + BCheckBox(BRect frame, + const char *name, + const char *label, + BMessage *message, + uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP, + uint32 flags = B_WILL_DRAW | B_NAVIGABLE); +virtual ~BCheckBox(); + +/* Archiving */ + BCheckBox(BMessage *archive); +static BArchivable *Instantiate(BMessage *archive); +virtual status_t Archive(BMessage *archive, bool deep = true) const; + +virtual void Draw(BRect updateRect); +virtual void AttachedToWindow(); +virtual void MouseDown(BPoint point); + +virtual void MessageReceived(BMessage *message); +virtual void WindowActivated(bool active); +virtual void KeyDown(const char *bytes, int32 numBytes); +virtual void MouseUp(BPoint point); +virtual void MouseMoved(BPoint point, uint32 transit, const BMessage *message); +virtual void DetachedFromWindow(); +virtual void SetValue(int32 value); +virtual void GetPreferredSize(float *width, float *height); +virtual void ResizeToPreferred(); +virtual status_t Invoke(BMessage *message = NULL); +virtual void FrameMoved(BPoint newLocation); +virtual void FrameResized(float width, float height); + +virtual BHandler *ResolveSpecifier(BMessage *message, + int32 index, + BMessage *specifier, + int32 what, + const char *property); +virtual status_t GetSupportedSuites(BMessage *message); + +virtual void MakeFocus(bool focused = true); +virtual void AllAttached(); +virtual void AllDetached(); + +virtual status_t Perform(perform_code d, void *arg); + +private: + +virtual void _ReservedCheckBox1(); +virtual void _ReservedCheckBox2(); +virtual void _ReservedCheckBox3(); + + BRect _CheckBoxFrame() const; + + BCheckBox &operator=(const BCheckBox &); + + bool fOutlined; + uint32 _reserved[2]; +}; +//------------------------------------------------------------------------------ + +#endif // _CHECK_BOX_H + +/* + * $Log $ + * + * $Id $ + * + */ diff --git a/headers/os/interface/RadioButton.h b/headers/os/interface/RadioButton.h index 973d0c1522..0a03a62c12 100644 --- a/headers/os/interface/RadioButton.h +++ b/headers/os/interface/RadioButton.h @@ -1,49 +1,49 @@ -//------------------------------------------------------------------------------ -// Copyright (c) 2001-2002, OpenBeOS -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// File Name: RadioButton.cpp -// Author: Marc Flerackers (mflerackers@androme.be) -// Description: BRadioButton represents a single on/off button. All -// sibling BRadioButton objects comprise a single -// "multiple choice" control. +//------------------------------------------------------------------------------ +// Copyright (c) 2001-2002, OpenBeOS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// File Name: RadioButton.cpp +// Author: Marc Flerackers (mflerackers@androme.be) +// Description: BRadioButton represents a single on/off button. All +// sibling BRadioButton objects comprise a single +// "multiple choice" control. //------------------------------------------------------------------------------ #ifndef _RADIO_BUTTON_H #define _RADIO_BUTTON_H - -// Standard Includes ----------------------------------------------------------- - + +// Standard Includes ----------------------------------------------------------- + // System Includes ------------------------------------------------------------- #include -#include -#include +#include +#include + +// Project Includes ------------------------------------------------------------ + +// Local Includes -------------------------------------------------------------- + +// Local Defines --------------------------------------------------------------- -// Project Includes ------------------------------------------------------------ - -// Local Includes -------------------------------------------------------------- - -// Local Defines --------------------------------------------------------------- - // Globals --------------------------------------------------------------------- - + // BRadioButton class ---------------------------------------------------------- class BRadioButton : public BControl { @@ -98,6 +98,9 @@ virtual void _ReservedRadioButton1(); virtual void _ReservedRadioButton2(); BRadioButton &operator=(const BRadioButton &); + + BRect _KnobFrame() const; + static BBitmap *sBitmaps[2][3]; bool fOutlined; @@ -106,10 +109,10 @@ static BBitmap *sBitmaps[2][3]; //------------------------------------------------------------------------------ #endif // _RADIO_BUTTON_H - -/* - * $Log $ - * - * $Id $ - * - */ + +/* + * $Log $ + * + * $Id $ + * + */ diff --git a/src/kits/interface/Button.cpp b/src/kits/interface/Button.cpp index c29276bf83..61591fe2ec 100644 --- a/src/kits/interface/Button.cpp +++ b/src/kits/interface/Button.cpp @@ -376,7 +376,10 @@ void BButton::DetachedFromWindow() //------------------------------------------------------------------------------ void BButton::SetValue(int32 value) { - BControl::SetValue(value); + if (value != Value()) { + BControl::SetValue(value); + Invalidate(); + } } //------------------------------------------------------------------------------ void BButton::GetPreferredSize(float *width, float *height) diff --git a/src/kits/interface/CheckBox.cpp b/src/kits/interface/CheckBox.cpp index 06bf590914..104c197f00 100644 --- a/src/kits/interface/CheckBox.cpp +++ b/src/kits/interface/CheckBox.cpp @@ -101,8 +101,7 @@ BCheckBox::Draw(BRect updateRect) darken4 = tint_color(no_tint, B_DARKEN_4_TINT), darkenmax = tint_color(no_tint, B_DARKEN_MAX_TINT); - BRect rect(1.0f, 3.0f, (float)ceil(3.0f + fontHeight.ascent), - (float)ceil(5.0f + fontHeight.ascent)); + BRect rect = _CheckBoxFrame(); if (IsEnabled()) { // Filling @@ -350,7 +349,10 @@ BCheckBox::DetachedFromWindow() void BCheckBox::SetValue(int32 value) { - BControl::SetValue(value); + if (value != Value()) { + BControl::SetValue(value); + Invalidate(_CheckBoxFrame()); + } } @@ -452,3 +454,13 @@ BCheckBox::operator=(const BCheckBox &) { return *this; } + +// _CheckBoxFrame +BRect +BCheckBox::_CheckBoxFrame() const +{ + font_height fh; + GetFontHeight(&fh); + + return BRect(1.0f, 3.0f, ceilf(3.0f + fh.ascent), ceilf(5.0f + fh.ascent)); +} diff --git a/src/kits/interface/Control.cpp b/src/kits/interface/Control.cpp index 9528373582..31d16eeb9b 100644 --- a/src/kits/interface/Control.cpp +++ b/src/kits/interface/Control.cpp @@ -309,15 +309,7 @@ BControl::Label() const void BControl::SetValue(int32 value) { - if (fValue == value) - return; - fValue = value; - - if (Window()) { - Invalidate(Bounds()); - Flush(); - } } diff --git a/src/kits/interface/RadioButton.cpp b/src/kits/interface/RadioButton.cpp index 37ffbad12c..bed19034de 100644 --- a/src/kits/interface/RadioButton.cpp +++ b/src/kits/interface/RadioButton.cpp @@ -73,17 +73,10 @@ void BRadioButton::Draw(BRect updateRect) GetFontHeight(&fh); // layout the rect for the dot - BRect rect(Bounds()); + BRect rect = _KnobFrame(); // its size depends on the text height float textHeight = floorf(fh.ascent + fh.descent + 0.5); - float inset = -floorf(textHeight / 2 - 2); - - rect.left -= (inset - 1); - rect.top = floorf((rect.top + rect.bottom) / 2.0); - rect.bottom = rect.top; - rect.right = rect.left; - rect.InsetBy(inset, inset); BPoint labelPos(rect.right + floorf(textHeight / 2.0), floorf((rect.top + rect.bottom + textHeight) / 2.0 - fh.descent + 0.5) + 1.0); @@ -302,7 +295,10 @@ void BRadioButton::KeyDown(const char *bytes, int32 numBytes) //------------------------------------------------------------------------------ void BRadioButton::SetValue(int32 value) { - BControl::SetValue(value); + if (value != Value()) { + BControl::SetValue(value); + Invalidate(_KnobFrame()); + } if (!value) return; @@ -477,6 +473,28 @@ BRadioButton &BRadioButton::operator=(const BRadioButton &) return *this; } //------------------------------------------------------------------------------ +BRect +BRadioButton::_KnobFrame() const +{ + font_height fh; + GetFontHeight(&fh); + + // layout the rect for the dot + BRect rect(Bounds()); + + // its size depends on the text height + float textHeight = floorf(fh.ascent + fh.descent + 0.5); + float inset = -floorf(textHeight / 2 - 2); + + rect.left -= (inset - 1); + rect.top = floorf((rect.top + rect.bottom) / 2.0); + rect.bottom = rect.top; + rect.right = rect.left; + rect.InsetBy(inset, inset); + + return rect; +} + /* * $Log $