diff options
Diffstat (limited to 'experimental/tqtinterface/qt4/src/kernel/tqpalette.cpp')
-rw-r--r-- | experimental/tqtinterface/qt4/src/kernel/tqpalette.cpp | 1348 |
1 files changed, 1348 insertions, 0 deletions
diff --git a/experimental/tqtinterface/qt4/src/kernel/tqpalette.cpp b/experimental/tqtinterface/qt4/src/kernel/tqpalette.cpp new file mode 100644 index 000000000..2e9e49eee --- /dev/null +++ b/experimental/tqtinterface/qt4/src/kernel/tqpalette.cpp @@ -0,0 +1,1348 @@ +/**************************************************************************** +** +** Implementation of TQColorGroup and TQPalette classes +** +** Created : 950323 +** +** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. +** +** This file is part of the kernel module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include <tqtglobaldefines.h> +// Nasty, nasty horrid HACK to get access to QPalette's private members +// This is TERRIBLE and I wish there was a way around it +// This is a good example of the new, broken & irritating Qt4 API, +// and the corresponding loss in functionality versus Qt3. +// See also tqrect.cpp +#define private protected +#include <Qt/qpalette.h> +#undef private + +#include "tqpalette.h" + +#ifndef TQT_NO_PALETTE +#include "tqdatastream.h" +#include "tqcleanuphandler.h" + +#ifdef USE_QT4 + +#include <Qt/qvariant.h> + +/*! + Constructs a palette with the specified \a active, \a disabled and + \a inactive color groups. +*/ +TQPalette::TQPalette(const TQColorGroup &active, const TQColorGroup &disabled, const TQColorGroup &inactive) : QPalette() +{ + Q_ASSERT(TQPalette::NColorRoles == TQPalette::ToolTipText + 1); + tqsetColorGroup(Active, active); + tqsetColorGroup(Disabled, disabled); + tqsetColorGroup(Inactive, inactive); +} + +TQColorGroup TQPalette::createColorGroup(ColorGroup cr) const +{ + TQColorGroup ret(*this); + ret.setCurrentColorGroup(cr); + return ret; +} + +void TQPalette::tqsetColorGroup(ColorGroup cg, const TQColorGroup &g) +{ + setColorGroup(cg, g.brush(WindowText), g.brush(Button), g.brush(Light), + g.brush(Dark), g.brush(Mid), g.brush(Text), g.brush(BrightText), + g.brush(Base), g.brush(AlternateBase), g.brush(Window), + g.brush(Midlight), g.brush(ButtonText), g.brush(Shadow), + g.brush(Highlight), g.brush(HighlightedText), g.brush(Link), + g.brush(LinkVisited), g.brush(ToolTipBase), g.brush(ToolTipText)); +} + +bool TQColorGroup::operator==(const TQColorGroup &other) const +{ + if (isCopyOf(other)) + return true; + for (int role = 0; role < int(NColorRoles); role++) { + if (brush(currentColorGroup(), (QPalette::ColorRole)role) != other.brush((QPalette::ColorGroup)(other.currentColorGroup()), (QPalette::ColorRole)role)) + return false; + } + return true; +} + +/*! + Returns the color group as a QVariant +*/ +// TQColorGroup::operator QVariant() const +// { +// return QVariant(QVariant::ColorGroup, this); +// } + +/*!\internal*/ +TQPalette::ColorRole TQPalette::foregroundRoleFromMode( TQt::BackgroundMode mode ) +{ + switch (mode) { + case TQt::PaletteButton: + return TQColorGroup::ButtonText; + case TQt::PaletteBase: + return TQColorGroup::Text; + case TQt::PaletteDark: + case TQt::PaletteShadow: + return TQColorGroup::Light; + case TQt::PaletteHighlight: + return TQColorGroup::HighlightedText; + case TQt::PaletteBackground: + default: + return TQColorGroup::Foreground; + } +} + +/*!\internal*/ +TQPalette::ColorRole TQPalette::backgroundRoleFromMode( TQt::BackgroundMode mode) +{ + switch (mode) { + case TQt::PaletteForeground: + return TQColorGroup::Foreground; + case TQt::PaletteButton: + return TQColorGroup::Button; + case TQt::PaletteLight: + return TQColorGroup::Light; + case TQt::PaletteMidlight: + return TQColorGroup::Midlight; + case TQt::PaletteDark: + return TQColorGroup::Dark; + case TQt::PaletteMid: + return TQColorGroup::Mid; + case TQt::PaletteText: + return TQColorGroup::Text; + case TQt::PaletteBrightText: + return TQColorGroup::BrightText; + case TQt::PaletteButtonText: + return TQColorGroup::ButtonText; + case TQt::PaletteBase: + return TQColorGroup::Base; + case TQt::PaletteShadow: + return TQColorGroup::Shadow; + case TQt::PaletteHighlight: + return TQColorGroup::Highlight; + case TQt::PaletteHighlightedText: + return TQColorGroup::HighlightedText; + case TQt::PaletteLink: + return TQColorGroup::Link; + case TQt::PaletteLinkVisited: + return TQColorGroup::LinkVisited; + case TQt::PaletteBackground: + default: + return TQColorGroup::Background; + } +} + +#else // USE_QT4 + +/***************************************************************************** + TQColorGroup member functions + *****************************************************************************/ + +/*! + \class TQColorGroup tqpalette.h + \brief The TQColorGroup class tqcontains a group of widget colors. + + \ingroup appearance + \ingroup graphics + \ingroup images + + A color group tqcontains a group of colors used by widgets for + drawing themselves. We recommend that widgets use color group + roles such as "foreground" and "base" rather than literal colors + like "red" or "turquoise". The color roles are enumerated and + defined in the \l ColorRole documentation. + + The most common use of TQColorGroup is like this: + + \code + TQPainter p; + ... + p.setPen( tqcolorGroup().foreground() ); + p.drawLine( ... ) + \endcode + + It is also possible to modify color groups or create new color + groups from scratch. + + The color group class can be created using three different + constructors or by modifying one supplied by TQt. The default + constructor creates an all-black color group, which can then be + modified using set functions; there's also a constructor for + specifying all the color group colors. And there is also a copy + constructor. + + We strongly recommend using a system-supplied color group and + modifying that as necessary. + + You modify a color group by calling the access functions + setColor() and setBrush(), depending on whether you want a pure + color or a pixmap pattern. + + There are also corresponding color() and brush() getters, and a + commonly used convenience function to get each ColorRole: + background(), foreground(), base(), etc. + + \sa TQColor TQPalette TQWidget::tqcolorGroup() +*/ + + +/*! + \enum TQColorGroup::ColorRole + + The ColorRole enum defines the different symbolic color roles used + in current GUIs. + + The central roles are: + + \value Background general background color. + + \value Foreground general foreground color. + + \value Base used as background color for text entry widgets, for example; + usually white or another light color. + + \value Text the foreground color used with \c Base. Usually this + is the same as the \c Foreground, in which case it must provide good + contrast with \c Background and \c Base. + + \value Button general button background color in which buttons need a + background different from \c Background, as in the Macintosh style. + + \value ButtonText a foreground color used with the \c Button color. + + There are some color roles used mostly for 3D bevel and shadow + effects: + + \value Light lighter than \c Button color. + + \value Midlight between \c Button and \c Light. + + \value Dark darker than \c Button. + + \value Mid between \c Button and \c Dark. + + \value Shadow a very dark color. + By default, the shadow color is \c TQt::black. + + All of these are normally derived from \c Background and used in + ways that depend on that relationship. For example, buttons depend + on it to make the bevels look attractive, and Motif scroll bars + depend on \c Mid to be slightly different from \c Background. + + Selected (marked) items have two roles: + + \value Highlight a color to indicate a selected item or the + current item. By default, the highlight color is \c TQt::darkBlue. + + \value HighlightedText a text color that contrasts with \c Highlight. + By default, the highlighted text color is \c TQt::white. + + Finally, there is a special role for text that needs to be + drawn where \c Text or \c Foreground would give poor contrast, + such as on pressed push buttons: + + \value BrightText a text color that is very different from \c + Foreground and contrasts well with e.g. \c Dark. + + \value Link a text color used for unvisited hyperlinks. + By default, the link color is \c TQt::blue. + + \value LinkVisited a text color used for already visited hyperlinks. + By default, the linkvisited color is \c TQt::magenta. + + \value NColorRoles Internal. + + Note that text colors can be used for things other than just + words; text colors are \e usually used for text, but it's quite + common to use the text color roles for lines, icons, etc. + + This image shows most of the color roles in use: + \img palette.png Color Roles +*/ + + +class TQColorGroupPrivate : public TQShared +{ +public: + TQBrush br[TQColorGroup::NColorRoles]; + TQColorGroupPrivate* detach() { + if ( count > 1 ) { + deref(); + TQColorGroupPrivate* d = new TQColorGroupPrivate; + for (int i=0; i<TQColorGroup::NColorRoles; i++) + d->br[i] = br[i]; + return d; + } + return this; + } +}; + +/*! + Constructs a color group with all colors set to black. +*/ + +TQColorGroup::TQColorGroup() +{ + static TQColorGroupPrivate* defColorGroupData = 0; + if ( !defColorGroupData ) { + static TQSharedCleanupHandler<TQColorGroupPrivate> defColorGroupCleanup; + defColorGroupData = new TQColorGroupPrivate; + defColorGroupCleanup.set( &defColorGroupData ); + } + d = defColorGroupData; + br = d->br; + d->ref(); +} + +/*! + Constructs a color group that is an independent copy of \a other. +*/ +TQColorGroup::TQColorGroup( const TQColorGroup& other ) +{ + d = other.d; + d->ref(); + br = d->br; +} + +/*! + Copies the colors of \a other to this color group. +*/ +TQColorGroup& TQColorGroup::operator =(const TQColorGroup& other) +{ + if ( d != other.d ) { + if ( d->deref() ) + delete d; + d = other.d; + br = d->br; + d->ref(); + } + return *this; +} + +static TQColor qt_mix_colors( TQColor a, TQColor b) +{ + return TQColor( (a.red() + b.red()) / 2, (a.green() + b.green()) / 2, (a.blue() + b.blue()) / 2 ); +} + + +/*! + Constructs a color group. You can pass either brushes, pixmaps or + plain colors for \a foreground, \a button, \a light, \a dark, \a + mid, \a text, \a bright_text, \a base and \a background. + + \sa TQBrush +*/ + TQColorGroup::TQColorGroup( const TQBrush &foreground, const TQBrush &button, + const TQBrush &light, const TQBrush &dark, + const TQBrush &mid, const TQBrush &text, + const TQBrush &bright_text, const TQBrush &base, + const TQBrush &background) +{ + d = new TQColorGroupPrivate; + br = d->br; + br[Foreground] = foreground; + br[Button] = button; + br[Light] = light; + br[Dark] = dark; + br[Mid] = mid; + br[Text] = text; + br[BrightText] = bright_text; + br[ButtonText] = text; + br[Base] = base; + br[Background] = background; + br[Midlight] = qt_mix_colors( br[Button].color(), br[Light].color() ); + br[Shadow] = TQt::black; + br[Highlight] = TQt::darkBlue; + br[HighlightedText] = TQt::white; + br[Link] = TQt::blue; + br[LinkVisited] = TQt::magenta; +} + + +/*!\obsolete + + Constructs a color group with the specified colors. The button + color will be set to the background color. +*/ + +TQColorGroup::TQColorGroup( const TQColor &foreground, const TQColor &background, + const TQColor &light, const TQColor &dark, + const TQColor &mid, + const TQColor &text, const TQColor &base ) +{ + d = new TQColorGroupPrivate; + br = d->br; + br[Foreground] = TQBrush(foreground); + br[Button] = TQBrush(background); + br[Light] = TQBrush(light); + br[Dark] = TQBrush(dark); + br[Mid] = TQBrush(mid); + br[Text] = TQBrush(text); + br[BrightText] = br[Light]; + br[ButtonText] = br[Text]; + br[Base] = TQBrush(base); + br[Background] = TQBrush(background); + br[Midlight] = qt_mix_colors( br[Button].color(), br[Light].color() ); + br[Shadow] = TQt::black; + br[Highlight] = TQt::darkBlue; + br[HighlightedText] = TQt::white; + br[Link] = TQt::blue; + br[LinkVisited] = TQt::magenta; +} + +/*! + Destroys the color group. +*/ + +TQColorGroup::~TQColorGroup() +{ + if ( d->deref() ) + delete d; +} + +/*! + Returns the color that has been set for color role \a r. + + \sa brush() ColorRole + */ +const TQColor &TQColorGroup::color( ColorRole r ) const +{ + return br[r].color(); +} + +/*! + Returns the brush that has been set for color role \a r. + + \sa color() setBrush() ColorRole +*/ +const TQBrush &TQColorGroup::brush( ColorRole r ) const +{ + return br[r]; +} + +/*! + Sets the brush used for color role \a r to a solid color \a c. + + \sa brush() setColor() ColorRole +*/ +void TQColorGroup::setColor( ColorRole r, const TQColor &c ) +{ + setBrush( r, TQBrush(c) ); +} + +/*! + Sets the brush used for color role \a r to \a b. + + \sa brush() setColor() ColorRole +*/ +void TQColorGroup::setBrush( ColorRole r, const TQBrush &b ) +{ + d = d->detach(); + br = d->br; + br[r] = b; +} + + +/*! + \fn const TQColor & TQColorGroup::foreground() const + + Returns the foreground color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::button() const + + Returns the button color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::light() const + + Returns the light color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor& TQColorGroup::midlight() const + + Returns the midlight color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::dark() const + + Returns the dark color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::mid() const + + Returns the mid color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::text() const + + Returns the text foreground color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::brightText() const + + Returns the bright text foreground color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::buttonText() const + + Returns the button text foreground color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::base() const + + Returns the base color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::background() const + + Returns the background color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::shadow() const + + Returns the shadow color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::highlight() const + + Returns the highlight color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::highlightedText() const + + Returns the highlighted text color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::link() const + + Returns the unvisited link text color of the color group. + + \sa ColorRole +*/ + +/*! + \fn const TQColor & TQColorGroup::linkVisited() const + + Returns the visited link text color of the color group. + + \sa ColorRole +*/ + +/*! + \fn bool TQColorGroup::operator!=( const TQColorGroup &g ) const + + Returns TRUE if this color group is different from \a g; otherwise + returns FALSE. + + \sa operator!=() +*/ + +/*! + Returns TRUE if this color group is equal to \a g; otherwise + returns FALSE. + + \sa operator==() +*/ + +bool TQColorGroup::operator==( const TQColorGroup &g ) const +{ + if ( d == g.d ) + return TRUE; + for( int r = 0 ; r < NColorRoles ; r++ ) + if ( br[r] != g.br[r] ) + return FALSE; + return TRUE; +} + +/***************************************************************************** + TQPalette member functions + *****************************************************************************/ + +/*! + \class TQPalette tqpalette.h + + \brief The TQPalette class tqcontains color groups for each widget state. + + \ingroup appearance + \ingroup shared + \ingroup graphics + \ingroup images + \mainclass + + A palette consists of three color groups: \e active, \e disabled, + and \e inactive. All widgets contain a palette, and all widgets in + TQt use their palette to draw themselves. This makes the user + interface easily configurable and easier to keep consistent. + + If you create a new widget we strongly recommend that you use the + colors in the palette rather than hard-coding specific colors. + + The color groups: + \list + \i The active() group is used for the window that has keyboard focus. + \i The inactive() group is used for other windows. + \i The disabled() group is used for widgets (not windows) that are + disabled for some reason. + \endlist + + Both active and inactive windows can contain disabled widgets. + (Disabled widgets are often called \e inaccessible or \e{grayed + out}.) + + In Motif style, active() and inactive() look the same. In Windows + 2000 style and Macintosh Platinum style, the two styles look + slightly different. + + There are setActive(), setInactive(), and setDisabled() functions + to modify the palette. (TQt also supports a normal() group; this is + an obsolete alias for active(), supported for backwards + compatibility.) + + Colors and brushes can be set for particular roles in any of a + palette's color groups with setColor() and setBrush(). + + You can copy a palette using the copy constructor and test to see + if two palettes are \e identical using isCopyOf(). + + \sa TQApplication::setPalette(), TQWidget::setPalette(), TQColorGroup, TQColor +*/ + +/*! + \enum TQPalette::ColorGroup + + \value Disabled + \value Active + \value Inactive + \value NColorGroups + \value Normal synonym for Active +*/ + +/*! + \obsolete + + \fn const TQColorGroup &TQPalette::normal() const + + Returns the active color group. Use active() instead. + + \sa setActive() active() +*/ + +/*! + \obsolete + + \fn void TQPalette::setNormal( const TQColorGroup & cg ) + + Sets the active color group to \a cg. Use setActive() instead. + + \sa setActive() active() +*/ + + +static int palette_count = 1; + +/*! + Constructs a palette that consists of color groups with only black + colors. +*/ + +TQPalette::TQPalette() +{ + static TQPalData *defPalData = 0; + if ( !defPalData ) { // create common palette data + defPalData = new TQPalData; // for the default palette + static TQSharedCleanupHandler<TQPalData> defPalCleanup; + defPalCleanup.set( &defPalData ); + defPalData->ser_no = palette_count++; + } + data = defPalData; + data->ref(); +} + +/*!\obsolete + Constructs a palette from the \a button color. The other colors are + automatically calculated, based on this color. Background will be + the button color as well. +*/ + +TQPalette::TQPalette( const TQColor &button ) +{ + data = new TQPalData; + TQ_CHECK_PTR( data ); + data->ser_no = palette_count++; + TQColor bg = button, btn = button, fg, base, disfg; + int h, s, v; + bg.hsv( &h, &s, &v ); + if ( v > 128 ) { // light background + fg = TQt::black; + base = TQt::white; + disfg = TQt::darkGray; + } else { // dark background + fg = TQt::white; + base = TQt::black; + disfg = TQt::darkGray; + } + data->active = TQColorGroup( fg, btn, btn.light(150), btn.dark(), + btn.dark(150), fg, TQt::white, base, bg ); + data->disabled = TQColorGroup( disfg, btn, btn.light(150), btn.dark(), + btn.dark(150), disfg, TQt::white, base, bg ); + data->inactive = data->active; +} + +/*! + Constructs a palette from a \a button color and a \a background. + The other colors are automatically calculated, based on these + colors. +*/ + +TQPalette::TQPalette( const TQColor &button, const TQColor &background ) +{ + data = new TQPalData; + TQ_CHECK_PTR( data ); + data->ser_no = palette_count++; + TQColor bg = background, btn = button, fg, base, disfg; + int h, s, v; + bg.hsv( &h, &s, &v ); + if ( v > 128 ) { // light background + fg = TQt::black; + base = TQt::white; + disfg = TQt::darkGray; + } else { // dark background + fg = TQt::white; + base = TQt::black; + disfg = TQt::darkGray; + } + data->active = TQColorGroup( fg, btn, btn.light(150), btn.dark(), + btn.dark(150), fg, TQt::white, base, bg ); + data->disabled = TQColorGroup( disfg, btn, btn.light(150), btn.dark(), + btn.dark(150), disfg, TQt::white, base, bg ); + data->inactive = data->active; +} + +/*! + Constructs a palette that consists of the three color groups \a + active, \a disabled and \a inactive. See the \link #details + Detailed Description\endlink for definitions of the color groups + and \l TQColorGroup::ColorRole for definitions of each color role + in the three groups. + + \sa TQColorGroup TQColorGroup::ColorRole TQPalette +*/ + +TQPalette::TQPalette( const TQColorGroup &active, const TQColorGroup &disabled, + const TQColorGroup &inactive ) +{ + data = new TQPalData; + TQ_CHECK_PTR( data ); + data->ser_no = palette_count++; + data->active = active; + data->disabled = disabled; + data->inactive = inactive; +} + +/*! + Constructs a copy of \a p. + + This constructor is fast (it uses copy-on-write). +*/ + +TQPalette::TQPalette( const TQPalette &p ) +{ + data = p.data; + data->ref(); +} + +/*! + Destroys the palette. +*/ + +TQPalette::~TQPalette() +{ + if ( data->deref() ) + delete data; +} + +/*! + Assigns \a p to this palette and returns a reference to this + palette. + + This is fast (it uses copy-on-write). + + \sa copy() +*/ + +TQPalette &TQPalette::operator=( const TQPalette &p ) +{ + p.data->ref(); + if ( data->deref() ) + delete data; + data = p.data; + return *this; +} + + +/*! + Returns the color in color group \a gr, used for color role \a r. + + \sa brush() setColor() TQColorGroup::ColorRole +*/ +const TQColor &TQPalette::color( ColorGroup gr, TQColorGroup::ColorRole r ) const +{ + return directBrush( gr, r ).color(); +} + +/*! + Returns the brush in color group \a gr, used for color role \a r. + + \sa color() setBrush() TQColorGroup::ColorRole +*/ +const TQBrush &TQPalette::brush( ColorGroup gr, TQColorGroup::ColorRole r ) const +{ + return directBrush( gr, r ); +} + +/*! + Sets the brush in color group \a gr, used for color role \a r, to + the solid color \a c. + + \sa setBrush() color() TQColorGroup::ColorRole +*/ +void TQPalette::setColor( ColorGroup gr, TQColorGroup::ColorRole r, + const TQColor &c) +{ + setBrush( gr, r, TQBrush(c) ); +} + +/*! + Sets the brush in color group \a gr, used for color role \a r, to + \a b. + + \sa brush() setColor() TQColorGroup::ColorRole +*/ +void TQPalette::setBrush( ColorGroup gr, TQColorGroup::ColorRole r, + const TQBrush &b) +{ + detach(); + data->ser_no = palette_count++; + directSetBrush( gr, r, b); +} + +/*! + \overload + + Sets the brush color used for color role \a r to color \a c in all + three color groups. + + \sa color() setBrush() TQColorGroup::ColorRole +*/ +void TQPalette::setColor( TQColorGroup::ColorRole r, const TQColor &c ) +{ + setBrush( r, TQBrush(c) ); +} + +/*! + \overload + + Sets the brush in for color role \a r in all three color groups to + \a b. + + \sa brush() setColor() TQColorGroup::ColorRole active() inactive() disabled() +*/ +void TQPalette::setBrush( TQColorGroup::ColorRole r, const TQBrush &b ) +{ + detach(); + data->ser_no = palette_count++; + directSetBrush( Active, r, b ); + directSetBrush( Disabled, r, b ); + directSetBrush( Inactive, r, b ); +} + + +/*! + Returns a deep copy of this palette. + + \warning This is slower than the copy constructor and assignment + operator and offers no benefits. +*/ + +TQPalette TQPalette::copy() const +{ + TQPalette p( data->active, data->disabled, data->inactive ); + return p; +} + + +/*! + Detaches this palette from any other TQPalette objects with which + it might implicitly share TQColorGroup objects. In essence, does + the copying part of copy-on-write. + + Calling this should generally not be necessary; TQPalette calls it + itself when necessary. +*/ + +void TQPalette::detach() +{ + if ( data->count != 1 ) + *this = copy(); +} + +/*! + \fn const TQColorGroup & TQPalette::disabled() const + + Returns the disabled color group of this palette. + + \sa TQColorGroup, setDisabled(), active(), inactive() +*/ + +/*! + Sets the \c Disabled color group to \a g. + + \sa disabled() setActive() setInactive() +*/ + +void TQPalette::setDisabled( const TQColorGroup &g ) +{ + detach(); + data->ser_no = palette_count++; + data->disabled = g; +} + +/*! + \fn const TQColorGroup & TQPalette::active() const + + Returns the active color group of this palette. + + \sa TQColorGroup, setActive(), inactive(), disabled() +*/ + +/*! + Sets the \c Active color group to \a g. + + \sa active() setDisabled() setInactive() TQColorGroup +*/ + +void TQPalette::setActive( const TQColorGroup &g ) +{ + detach(); + data->ser_no = palette_count++; + data->active = g; +} + +/*! + \fn const TQColorGroup & TQPalette::inactive() const + + Returns the inactive color group of this palette. + + \sa TQColorGroup, setInactive(), active(), disabled() +*/ + +/*! + Sets the \c Inactive color group to \a g. + + \sa active() setDisabled() setActive() TQColorGroup +*/ + +void TQPalette::setInactive( const TQColorGroup &g ) +{ + detach(); + data->ser_no = palette_count++; + data->inactive = g; +} + + +/*! + \fn bool TQPalette::operator!=( const TQPalette &p ) const + + Returns TRUE (slowly) if this palette is different from \a p; + otherwise returns FALSE (usually quickly). +*/ + +/*! + Returns TRUE (usually quickly) if this palette is equal to \a p; + otherwise returns FALSE (slowly). +*/ + +bool TQPalette::operator==( const TQPalette &p ) const +{ + return data->active == p.data->active && + data->disabled == p.data->disabled && + data->inactive == p.data->inactive; +} + + +/*! + \fn int TQPalette::serialNumber() const + + Returns a number that uniquely identifies this TQPalette object. + The serial number is intended for caching. Its value may not be + used for anything other than equality testing. + + Note that TQPalette uses copy-on-write, and the serial number + changes during the lazy copy operation (detach()), not during a + shallow copy (copy constructor or assignment). + + \sa TQPixmap TQPixmapCache TQCache +*/ + + +/***************************************************************************** + TQColorGroup/TQPalette stream functions + *****************************************************************************/ + +#ifndef TQT_NO_DATASTREAM +/*! + \relates TQColorGroup + + Writes color group, \a g to the stream \a s. + + \sa \link datastreamformat.html Format of the TQDataStream operators \endlink +*/ + +TQDataStream &operator<<( TQDataStream &s, const TQColorGroup &g ) +{ + if ( s.version() == 1 ) { + // TQt 1.x + s << g.foreground() + << g.background() + << g.light() + << g.dark() + << g.mid() + << g.text() + << g.base(); + } else { + int max = TQColorGroup::NColorRoles; + if ( s.version() <= 3) // TQt 2.x + max = 14; + + for( int r = 0 ; r < max ; r++ ) + s << g.brush( (TQColorGroup::ColorRole)r); + } + return s; +} + +/*! + \related TQColorGroup + + Reads a color group from the stream. + + \sa \link datastreamformat.html Format of the TQDataStream operators \endlink +*/ + +TQDataStream &operator>>( TQDataStream &s, TQColorGroup &g ) +{ + if ( s.version() == 1 ) { + // TQt 1.x + TQColor fg, bg, light, dark, mid, text, base; + s >> fg >> bg >> light >> dark >> mid >> text >> base; + TQPalette p( bg ); + TQColorGroup n( p.active() ); + n.setColor( TQColorGroup::Foreground, fg ); + n.setColor( TQColorGroup::Light, light ); + n.setColor( TQColorGroup::Dark, dark ); + n.setColor( TQColorGroup::Mid, mid ); + n.setColor( TQColorGroup::Text, text ); + n.setColor( TQColorGroup::Base, base ); + g = n; + } else { + int max = TQColorGroup::NColorRoles; + if (s.version() <= 3) // TQt 2.x + max = 14; + + TQBrush tmp; + for( int r = 0 ; r < max; r++ ) { + s >> tmp; + g.setBrush( (TQColorGroup::ColorRole)r, tmp); + } + } + return s; +} + + +/*! + \relates TQPalette + + Writes the palette, \a p to the stream \a s and returns a + reference to the stream. + + \sa \link datastreamformat.html Format of the TQDataStream operators \endlink +*/ + +TQDataStream &operator<<( TQDataStream &s, const TQPalette &p ) +{ + return s << p.active() + << p.disabled() + << p.inactive(); +} + + +static void readV1ColorGroup( TQDataStream &s, TQColorGroup &g, + TQPalette::ColorGroup r ) +{ + TQColor fg, bg, light, dark, mid, text, base; + s >> fg >> bg >> light >> dark >> mid >> text >> base; + TQPalette p( bg ); + TQColorGroup n; + switch ( r ) { + case TQPalette::Disabled: + n = p.disabled(); + break; + case TQPalette::Inactive: + n = p.inactive(); + break; + default: + n = p.active(); + break; + } + n.setColor( TQColorGroup::Foreground, fg ); + n.setColor( TQColorGroup::Light, light ); + n.setColor( TQColorGroup::Dark, dark ); + n.setColor( TQColorGroup::Mid, mid ); + n.setColor( TQColorGroup::Text, text ); + n.setColor( TQColorGroup::Base, base ); + g = n; +} + + +/*! + \relates TQPalette + + Reads a palette from the stream, \a s into the palette \a p, and + returns a reference to the stream. + + \sa \link datastreamformat.html Format of the TQDataStream operators \endlink +*/ + +TQDataStream &operator>>( TQDataStream &s, TQPalette &p ) +{ + TQColorGroup active, disabled, inactive; + if ( s.version() == 1 ) { + readV1ColorGroup( s, active, TQPalette::Active ); + readV1ColorGroup( s, disabled, TQPalette::Disabled ); + readV1ColorGroup( s, inactive, TQPalette::Inactive ); + } else { + s >> active >> disabled >> inactive; + } + TQPalette newpal( active, disabled, inactive ); + p = newpal; + return s; +} +#endif //TQT_NO_DATASTREAM + +/*! + Returns TRUE if this palette and \a p are copies of each other, + i.e. one of them was created as a copy of the other and neither + was subsequently modified; otherwise returns FALSE. This is much + stricter than equality. + + \sa operator=() operator==() +*/ + +bool TQPalette::isCopyOf( const TQPalette & p ) +{ + return data && data == p.data; +} + +const TQBrush &TQPalette::directBrush( ColorGroup gr, TQColorGroup::ColorRole r ) const +{ + if ( (uint)gr > (uint)TQPalette::NColorGroups ) { +#if defined(TQT_CHECK_RANGE) + qWarning( "TQPalette::directBrush: tqcolorGroup(%i) out of range", gr ); +#endif + return data->active.br[TQColorGroup::Foreground]; + } + if ( (uint)r >= (uint)TQColorGroup::NColorRoles ) { +#if defined(TQT_CHECK_RANGE) + qWarning( "TQPalette::directBrush: colorRole(%i) out of range", r ); +#endif + return data->active.br[TQColorGroup::Foreground]; + } + switch( gr ) { + case Active: + return data->active.br[r]; + //break; + case Disabled: + return data->disabled.br[r]; + //break; + case Inactive: + return data->inactive.br[r]; + //break; + default: + break; + } +#if defined(TQT_CHECK_RANGE) + qWarning( "TQPalette::directBrush: tqcolorGroup(%i) internal error", gr ); +#endif + return data->active.br[TQColorGroup::Foreground]; // Satisfy compiler +} + +void TQPalette::directSetBrush( ColorGroup gr, TQColorGroup::ColorRole r, const TQBrush& b) +{ + if ( (uint)gr > (uint)TQPalette::NColorGroups ) { +#if defined(TQT_CHECK_RANGE) + qWarning( "TQPalette::directBrush: tqcolorGroup(%i) out of range", gr ); +#endif + return; + } + if ( (uint)r >= (uint)TQColorGroup::NColorRoles ) { +#if defined(TQT_CHECK_RANGE) + qWarning( "TQPalette::directBrush: colorRole(%i) out of range", r ); +#endif + return; + } + switch( gr ) { + case Active: + data->active.setBrush(r,b); + break; + case Disabled: + data->disabled.setBrush(r,b); + break; + case Inactive: + data->inactive.setBrush(r,b); + break; + default: +#if defined(TQT_CHECK_RANGE) + qWarning( "TQPalette::directBrush: tqcolorGroup(%i) internal error", gr ); +#endif + break; + } +} + + +/*!\internal*/ +TQColorGroup::ColorRole TQPalette::foregroundRoleFromMode( TQt::BackgroundMode mode ) +{ + switch (mode) { + case TQt::PaletteButton: + return TQColorGroup::ButtonText; + case TQt::PaletteBase: + return TQColorGroup::Text; + case TQt::PaletteDark: + case TQt::PaletteShadow: + return TQColorGroup::Light; + case TQt::PaletteHighlight: + return TQColorGroup::HighlightedText; + case TQt::PaletteBackground: + default: + return TQColorGroup::Foreground; + } +} + +/*!\internal*/ +TQColorGroup::ColorRole TQPalette::backgroundRoleFromMode( TQt::BackgroundMode mode) +{ + switch (mode) { + case TQt::PaletteForeground: + return TQColorGroup::Foreground; + case TQt::PaletteButton: + return TQColorGroup::Button; + case TQt::PaletteLight: + return TQColorGroup::Light; + case TQt::PaletteMidlight: + return TQColorGroup::Midlight; + case TQt::PaletteDark: + return TQColorGroup::Dark; + case TQt::PaletteMid: + return TQColorGroup::Mid; + case TQt::PaletteText: + return TQColorGroup::Text; + case TQt::PaletteBrightText: + return TQColorGroup::BrightText; + case TQt::PaletteButtonText: + return TQColorGroup::ButtonText; + case TQt::PaletteBase: + return TQColorGroup::Base; + case TQt::PaletteShadow: + return TQColorGroup::Shadow; + case TQt::PaletteHighlight: + return TQColorGroup::Highlight; + case TQt::PaletteHighlightedText: + return TQColorGroup::HighlightedText; + case TQt::PaletteLink: + return TQColorGroup::Link; + case TQt::PaletteLinkVisited: + return TQColorGroup::LinkVisited; + case TQt::PaletteBackground: + default: + return TQColorGroup::Background; + } +} + +#endif // USE_QT4 + +#endif // TQT_NO_PALETTE
\ No newline at end of file |