diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-07-10 15:17:53 -0500 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-07-10 15:17:53 -0500 |
commit | dda8474928bd7276e1fad8fb7a601e7c83ff2bc2 (patch) | |
tree | 7f83910598b33b12730035f086df20b5a53ab99c /tqtinterface/qt4/src/kernel/tqiconset.cpp | |
parent | 6260b6178868c03aab1644bf93b0ef043654bdb0 (diff) | |
download | experimental-dda8474928bd7276e1fad8fb7a601e7c83ff2bc2.tar.gz experimental-dda8474928bd7276e1fad8fb7a601e7c83ff2bc2.zip |
Added TQt4 HEAD
Diffstat (limited to 'tqtinterface/qt4/src/kernel/tqiconset.cpp')
-rw-r--r-- | tqtinterface/qt4/src/kernel/tqiconset.cpp | 949 |
1 files changed, 949 insertions, 0 deletions
diff --git a/tqtinterface/qt4/src/kernel/tqiconset.cpp b/tqtinterface/qt4/src/kernel/tqiconset.cpp new file mode 100644 index 0000000..e5769f8 --- /dev/null +++ b/tqtinterface/qt4/src/kernel/tqiconset.cpp @@ -0,0 +1,949 @@ +/**************************************************************************** +** +** Implementation of TQIconSet class +** +** Created : 980318 +** +** 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 "tqiconset.h" + +#ifndef TQT_NO_ICONSET + +#include "tqapplication.h" +#include "tqbitmap.h" +#include "tqcleanuphandler.h" +#include "tqimage.h" +#include "tqpainter.h" + +enum { NumSizes = 2, NumModes = 3, NumStates = 2 }; + +static TQIconFactory *defaultFac = 0; +static TQSingleCleanupHandler<TQIconFactory> q_cleanup_icon_factory; + +static short widths[2] = { 22, 32 }; +static short heights[2] = { 22, 32 }; + +enum TQIconSetIconOrigin { + SuppliedFileName, // 'fileName' tqcontains the name of the file + SuppliedPixmap, // 'pixmap' is a pointer to the user-supplied pixmap + Manufactured, // 'pixmap' is a factory-generated pixmap (or 0) + Generated // 'pixmap' is a TQIconSet-generated pixmap (or 0) +}; + +struct TQIconSetIcon +{ + TQIconSetIconOrigin origin; + union { + TQString *fileName; + TQPixmap *pixmap; + }; + + TQIconSetIcon() : origin( Generated ) { pixmap = 0; } + TQIconSetIcon( const TQIconSetIcon& other ) + : origin( Generated ) { + pixmap = 0; + operator=( other ); + } + ~TQIconSetIcon() { + if ( origin == SuppliedFileName ) { + delete fileName; + } else { + delete pixmap; + } + } + + TQIconSetIcon& operator=( const TQIconSetIcon& other ); + + void clearCached() { + if ( pixmap && (origin == Manufactured || origin == Generated) ) { + origin = Generated; + delete pixmap; + pixmap = 0; + } + } +}; + +TQIconSetIcon& TQIconSetIcon::operator=( const TQIconSetIcon& other ) +{ + TQPixmap *oldPixmap = 0; + TQString *oldFileName = 0; + if ( origin == SuppliedFileName ) { + oldFileName = fileName; + } else { + oldPixmap = pixmap; + } + + origin = other.origin; + if ( other.origin == SuppliedFileName ) { + fileName = new TQString( *other.fileName ); + } else { + if ( other.pixmap ) { + pixmap = new TQPixmap( *other.pixmap ); + } else { + pixmap = 0; + } + } + delete oldPixmap; + delete oldFileName; + return *this; +} + +class TQIconSetPrivate : public TQShared +{ +public: + TQIconSetIcon icons[NumSizes][NumModes][NumStates]; + TQPixmap defaultPix; + TQIconFactory *factory; + + TQIconSetPrivate() : factory( 0 ) { } + TQIconSetPrivate( const TQIconSetPrivate& other ) : TQShared() { + count = 1; + for ( int i = 0; i < NumSizes; i++ ) { + for ( int j = 0; j < NumModes; j++ ) { + for ( int k = 0; k < NumStates; k++ ) { + icons[i][j][k] = other.icons[i][j][k]; + } + } + } + defaultPix = other.defaultPix; + factory = other.factory; + if ( factory ) + factory->ref(); + } + ~TQIconSetPrivate() { + setFactory( 0 ); + } + + TQIconSetIcon *icon( const TQIconSet *iconSet, TQIconSet::Size size, + TQIconSet::Mode mode, TQIconSet::State state ); + void setFactory( TQIconFactory *newFactory ) { + if ( newFactory ) + newFactory->ref(); + if ( factory && factory->deref() && factory->autoDelete() ) + delete factory; + factory = newFactory; + } + + TQ_DUMMY_COMPARISON_OPERATOR( TQIconSetPrivate ) +}; + +TQIconSetIcon *TQIconSetPrivate::icon( const TQIconSet *iconSet, + TQIconSet::Size size, TQIconSet::Mode mode, + TQIconSet::State state ) +{ + TQIconSetIcon *ik = &icons[(int) size - 1][(int) mode][(int) state]; + + if ( iconSet ) { + if ( ik->origin == SuppliedFileName ) { + TQPixmap *newPixmap = new TQPixmap( *ik->fileName ); + delete ik->fileName; + + if ( newPixmap->isNull() ) { + delete newPixmap; + ik->origin = Generated; + ik->pixmap = 0; + } else { + ik->origin = SuppliedPixmap; + ik->pixmap = newPixmap; + } + } + + if ( !ik->pixmap && ik->origin == Generated ) { + TQIconFactory *f = factory; + if ( !f ) + f = defaultFac; + + if ( f ) { + /* + We set 'origin' to Manufactured half a second too + early to prevent recursive calls to this function. + (This can happen if createPixmap() calls + TQIconSet::pixmap(), which in turn calls this + function.) + */ + ik->origin = Manufactured; + ik->pixmap = f->createPixmap( *iconSet, size, mode, state ); + if ( !ik->pixmap ) + ik->origin = Generated; + } + } + } + return ik; +} + +/*! \class TQIconSet + + \brief The TQIconSet class provides a set of icons with different + styles and sizes. + + \ingroup graphics + \ingroup images + \ingroup shared + \mainclass + + A TQIconSet can generate smaller, larger, active, and disabled pixmaps + from the set of icons it is given. Such pixmaps are used by + TQToolButton, TQHeader, TQPopupMenu, etc. to show an icon representing a + particular action. + + The simplest use of TQIconSet is to create one from a TQPixmap and then + use it, allowing TQt to work out all the required icon styles and + sizes. For example: + + \code + TQToolButton *but = new TQToolButton( TQIconSet( TQPixmap("open.xpm") ), ... ); + \endcode + + Using whichever pixmaps you specify as a base, TQIconSet provides a + set of six icons, each with a \l Size and a \l Mode: Small Normal, + Small Disabled, Small Active, Large Normal, Large Disabled, and + Large Active. + + An additional set of six icons can be provided for widgets that have + an "On" or "Off" state, like checkable menu items or toggleable + toolbuttons. If you provide pixmaps for the "On" state, but not for + the "Off" state, the TQIconSet will provide the "Off" pixmaps. You may + specify icons for both states in you wish. + + You can set any of the icons using setPixmap(). + + When you retrieve a pixmap using pixmap(Size, Mode, State), + TQIconSet will return the icon that has been set or previously + generated for that size, mode and state combination. If none is + available, TQIconSet will ask the icon factory. If the icon factory + cannot provide any (the default), TQIconSet generates a pixmap based + on the pixmaps it has been given and returns it. + + The \c Disabled appearance is computed using an algorithm that + produces results very similar to those used in Microsoft Windows + 95. The \c Active appearance is identical to the \c Normal + appearance unless you use setPixmap() to set it to something + special. + + When scaling icons, TQIconSet uses \link TQImage::smoothScale() + smooth scaling\endlink, which can partially blend the color component + of pixmaps. If the results look poor, the best solution + is to supply pixmaps in both large and small sizes. + + You can use the static function setIconSize() to set the preferred + size of the generated large/small icons. The default small size is + 22 x 22, while the default large size is 32 x 32. These sizes only + affect generated icons. + + The isGenerated() function returns TRUE if an icon was generated by + TQIconSet or by a factory; clearGenerated() clears all cached + pixmaps. + + \section1 Making Classes that Use TQIconSet + + If you write your own widgets that have an option to set a small + pixmap, consider allowing a TQIconSet to be set for that pixmap. The + TQt class TQToolButton is an example of such a widget. + + Provide a method to set a TQIconSet, and when you draw the icon, choose + whichever icon is appropriate for the current state of your widget. + For example: + \code + void MyWidget::drawIcon( TQPainter* p, TQPoint pos ) + { + p->drawPixmap( pos, icons->pixmap( + TQIconSet::Small, + isEnabled() ? TQIconSet::Normal : + TQIconSet::Disabled, + isEnabled() ? TQIconSet::On : + TQIconSet::Off)); + } + \endcode + + You might also make use of the \c Active mode, perhaps making your + widget \c Active when the mouse is over the widget (see \l + TQWidget::enterEvent()), while the mouse is pressed pending the + release that will activate the function, or when it is the currently + selected item. If the widget can be toggled, the "On" mode might be + used to draw a different icon. + + \img iconset.png TQIconSet + + \sa TQIconFactory TQPixmap TQMainWindow::setUsesBigPixmaps() + \link guibooks.html#fowler GUI Design Handbook: Iconic Label \endlink +*/ + + +/*! + \enum TQIconSet::Size + + This enum type describes the size at which a pixmap is intended to be + used. + The currently defined sizes are: + + \value Automatic The size of the pixmap is determined from its + pixel size. This is a useful default. + \value Small The pixmap is the smaller of two. + \value Large The pixmap is the larger of two. + + If a Small pixmap is not set by TQIconSet::setPixmap(), the Large + pixmap will be automatically scaled down to the size of a small pixmap + to generate the Small pixmap when required. Similarly, a Small pixmap + will be automatically scaled up to generate a Large pixmap. The + preferred sizes for large/small generated icons can be set using + setIconSize(). + + \sa setIconSize() iconSize() setPixmap() pixmap() TQMainWindow::setUsesBigPixmaps() +*/ + +/*! + \enum TQIconSet::Mode + + This enum type describes the mode for which a pixmap is intended to be + used. + The currently defined modes are: + + \value Normal + Display the pixmap when the user is + not interacting with the icon, but the + functionality represented by the icon is available. + \value Disabled + Display the pixmap when the + functionality represented by the icon is not available. + \value Active + Display the pixmap when the + functionality represented by the icon is available and + the user is interacting with the icon, for example, moving the + mouse over it or clicking it. +*/ + +/*! + \enum TQIconSet::State + + This enum describes the state for which a pixmap is intended to be + used. The \e state can be: + + \value Off Display the pixmap when the widget is in an "off" state + \value On Display the pixmap when the widget is in an "on" state + + \sa setPixmap() pixmap() +*/ + +/*! + Constructs a null icon set. + + \sa setPixmap(), reset() +*/ +TQIconSet::TQIconSet() + : d( 0 ) +{ +} + +/*! + Constructs an icon set for which the Normal pixmap is \a pixmap, + which is assumed to be of size \a size. + + The default for \a size is \c Automatic, which means that TQIconSet + will determine whether the pixmap is Small or Large from its pixel + size. Pixmaps less than the width of a small generated icon are + considered to be Small. You can use setIconSize() to set the + preferred size of a generated icon. + + \sa setIconSize() reset() +*/ +TQIconSet::TQIconSet( const TQPixmap& pixmap, Size size ) + : d( 0 ) +{ + reset( pixmap, size ); +} + +/*! Creates an iconset which uses the pixmap \a smallPix for for + displaying a small icon, and the pixmap \a largePix for displaying a + large icon. +*/ +TQIconSet::TQIconSet( const TQPixmap& smallPix, const TQPixmap& largePix ) + : d( 0 ) +{ + reset( smallPix, Small ); + reset( largePix, Large ); +} + +/*! + Constructs a copy of \a other. This is very fast. +*/ +TQIconSet::TQIconSet( const TQIconSet& other ) + : d( other.d ) +{ + if ( d ) + d->ref(); +} + +/*! + Destroys the icon set and frees any allocated resources. +*/ +TQIconSet::~TQIconSet() +{ + if ( d && d->deref() ) + delete d; +} + +/*! + Sets this icon set to use pixmap \a pixmap for the Normal pixmap, + assuming it to be of size \a size. + + This is equivalent to assigning TQIconSet(\a pixmap, \a size) to this + icon set. + + This function does nothing if \a pixmap is a null pixmap. +*/ +void TQIconSet::reset( const TQPixmap& pixmap, Size size ) +{ + if ( pixmap.isNull() ) + return; + + detach(); + normalize( size, pixmap.size() ); + setPixmap( pixmap, size, Normal ); + d->defaultPix = pixmap; + d->setFactory( 0 ); +} + +/*! + Sets this icon set to provide pixmap \a pixmap for size \a size, mode \a + mode and state \a state. The icon set may also use \a pixmap for + generating other pixmaps if they are not explicitly set. + + The \a size can be one of Automatic, Large or Small. If Automatic is + used, TQIconSet will determine if the pixmap is Small or Large from its + pixel size. + + Pixmaps less than the width of a small generated icon are + considered to be Small. You can use setIconSize() to set the preferred + size of a generated icon. + + This function does nothing if \a pixmap is a null pixmap. + + \sa reset() +*/ +void TQIconSet::setPixmap( const TQPixmap& pixmap, Size size, Mode mode, + State state ) +{ + if ( pixmap.isNull() ) + return; + + normalize( size, pixmap.size() ); + + detach(); + clearGenerated(); + + TQIconSetIcon *icon = d->icon( 0, size, mode, state ); + if ( icon->origin == SuppliedFileName ) { + delete icon->fileName; + icon->pixmap = 0; + } + icon->origin = SuppliedPixmap; + if ( icon->pixmap == 0 ) { + icon->pixmap = new TQPixmap( pixmap ); + } else { + *icon->pixmap = pixmap; + } +} + +/*! + \overload + + The pixmap is loaded from \a fileName when it becomes necessary. +*/ +void TQIconSet::setPixmap( const TQString& fileName, Size size, Mode mode, + State state ) +{ + if ( size == Automatic ) { + setPixmap( TQPixmap(fileName), size, mode, state ); + } else { + detach(); + clearGenerated(); + + TQIconSetIcon *icon = d->icon( 0, size, mode, state ); + if ( icon->origin == SuppliedFileName ) { + *icon->fileName = fileName; + } else { + delete icon->pixmap; + icon->fileName = new TQString( fileName ); + icon->origin = SuppliedFileName; + } + } +} + +/*! + Returns a pixmap with size \a size, mode \a mode and state \a + state, generating one if necessary. Generated pixmaps are cached. +*/ +TQPixmap TQIconSet::pixmap( Size size, Mode mode, State state ) const +{ + if ( !d ) { + if ( defaultFac ) { + TQIconSet *that = (TQIconSet *) this; + that->detach(); + } else { + return TQPixmap(); + } + } + + if ( size == Automatic ) + size = Small; + + TQIconSetIcon *icon = d->icon( this, size, mode, state ); + if ( icon->pixmap ) + return *icon->pixmap; + if ( icon->origin == Manufactured ) { + /* + This can only occur during the half a second's time when + the icon is being manufactured. If TQIconFactory somehow + tries to access the pixmap it's supposed to be creating, it + will get a null pixmap. + */ + return TQPixmap(); + } + + if ( mode == Active ) + return pixmap( size, Normal, state ); + + Size otherSize = ( size == Large ) ? Small : Large; + TQIconSetIcon *otherSizeIcon = d->icon( this, otherSize, mode, state ); + + if ( state == Off ) { + if ( mode == Disabled && + d->icon(this, size, Normal, Off)->origin != Generated ) { + icon->pixmap = createDisabled( size, Off ); + } else if ( otherSizeIcon->origin != Generated ) { + icon->pixmap = createScaled( size, otherSizeIcon->pixmap ); + } else if ( mode == Disabled ) { + icon->pixmap = createDisabled( size, Off ); + } else if ( !d->defaultPix.isNull() ) { + icon->pixmap = new TQPixmap( d->defaultPix ); + } else { + /* + No icons are available for { TRUE, Normal, Off } and + { FALSE, Normal, Off }. Try the other 10 combinaisons, + best ones first. + */ + const int N = 10; + static const struct { + bool sameSize; + Mode mode; + State state; + } tryList[N] = { + { TRUE, Active, Off }, + { TRUE, Normal, On }, + { TRUE, Active, On }, + { FALSE, Active, Off }, + { FALSE, Normal, On }, + { FALSE, Active, On }, + { TRUE, Disabled, Off }, + { TRUE, Disabled, On }, + { FALSE, Disabled, Off }, + { FALSE, Disabled, On } + }; + + for ( int i = 0; i < N; i++ ) { + bool sameSize = tryList[i].sameSize; + TQIconSetIcon *tryIcon = + d->icon( this, sameSize ? size : otherSize, + tryList[i].mode, tryList[i].state ); + if ( tryIcon->origin != Generated ) { + if ( sameSize ) { + if ( tryIcon->pixmap ) + icon->pixmap = new TQPixmap( *tryIcon->pixmap ); + } else { + icon->pixmap = createScaled( size, tryIcon->pixmap ); + } + break; + } + } + } + } else { /* ( state == On ) */ + if ( mode == Normal ) { + if ( otherSizeIcon->origin != Generated ) { + icon->pixmap = createScaled( size, otherSizeIcon->pixmap ); + } else { + icon->pixmap = new TQPixmap( pixmap(size, mode, Off) ); + } + } else { /* ( mode == Disabled ) */ + TQIconSetIcon *offIcon = d->icon( this, size, mode, Off ); + TQIconSetIcon *otherSizeOffIcon = d->icon( this, otherSize, mode, + Off ); + + if ( offIcon->origin != Generated ) { + if ( offIcon->pixmap ) + icon->pixmap = new TQPixmap( *offIcon->pixmap ); + } else if ( d->icon(this, size, Normal, On)->origin != Generated ) { + icon->pixmap = createDisabled( size, On ); + } else if ( otherSizeIcon->origin != Generated ) { + icon->pixmap = createScaled( size, otherSizeIcon->pixmap ); + } else if ( otherSizeOffIcon->origin != Generated ) { + icon->pixmap = createScaled( size, otherSizeOffIcon->pixmap ); + } else { + icon->pixmap = createDisabled( size, On ); + } + } + } + if ( icon->pixmap ) { + return *icon->pixmap; + } else { + return TQPixmap(); + } +} + +/*! \overload + \obsolete + + This is the same as pixmap(\a size, \a enabled, \a state). +*/ +TQPixmap TQIconSet::pixmap( Size size, bool enabled, State state ) const +{ + return pixmap( size, enabled ? Normal : Disabled, state ); +} + +/*! + \overload + + Returns the pixmap originally provided to the constructor or to + reset(). This is the Normal pixmap of unspecified Size. + + \sa reset() +*/ +TQPixmap TQIconSet::pixmap() const +{ + if ( !d ) + return TQPixmap(); + return d->defaultPix; +} + +/*! + Returns TRUE if the pixmap with size \a size, mode \a mode and + state \a state is generated from other pixmaps; otherwise returns + FALSE. + + A pixmap obtained from a TQIconFactory is considered non-generated. +*/ +bool TQIconSet::isGenerated( Size size, Mode mode, State state ) const +{ + if ( !d ) + return TRUE; + return d->icon( this, size, mode, state )->origin == Generated; +} + +/*! + Clears all cached pixmaps, including those obtained from an + eventual TQIconFactory. +*/ +void TQIconSet::clearGenerated() +{ + if ( !d ) + return; + + for ( int i = 0; i < NumSizes; i++ ) { + for ( int j = 0; j < NumModes; j++ ) { + for ( int k = 0; k < NumStates; k++ ) { + d->icons[i][j][k].clearCached(); + } + } + } +} + +/*! + Installs \a factory as the icon factory for this iconset. The + icon factory is used to generates pixmaps not set by the user. + + If no icon factory is installed, TQIconFactory::defaultFactory() + is used. +*/ +void TQIconSet::installIconFactory( TQIconFactory *factory ) +{ + detach(); + d->setFactory( factory ); +} + +/*! + Returns TRUE if the icon set is empty; otherwise returns FALSE. +*/ +bool TQIconSet::isNull() const +{ + return !d; +} + +/*! + Detaches this icon set from others with which it may share data. + + You will never need to call this function; other TQIconSet functions + call it as necessary. +*/ +void TQIconSet::detach() +{ + if ( !d ) { + d = new TQIconSetPrivate; + return; + } + if ( d->count != 1 ) { + d->deref(); + d = new TQIconSetPrivate( *d ); + } +} + +/*! + Assigns \a other to this icon set and returns a reference to this + icon set. + + \sa detach() +*/ +TQIconSet& TQIconSet::operator=( const TQIconSet& other ) +{ + if ( other.d ) + other.d->ref(); + + if ( d && d->deref() ) + delete d; + d = other.d; + return *this; +} + +/*! + Set the preferred size for all small or large icons that are + generated after this call. If \a which is Small, sets the preferred + size of small generated icons to \a size. Similarly, if \a which is + Large, sets the preferred size of large generated icons to \a size. + + Note that cached icons will not be regenerated, so it is recommended + that you set the preferred icon sizes before generating any icon sets. + Also note that the preferred icon sizes will be ignored for icon sets + that have been created using both small and large pixmaps. + + \sa iconSize() +*/ +void TQIconSet::setIconSize( Size which, const TQSize& size ) +{ + widths[(int) which - 1] = size.width(); + heights[(int) which - 1] = size.height(); +} + +/*! + If \a which is Small, returns the preferred size of a small + generated icon; if \a which is Large, returns the preferred size + of a large generated icon. + + \sa setIconSize() +*/ +const TQSize& TQIconSet::iconSize( Size which ) +{ + // ### tqreplace 'const TQSize&' with TQSize in TQt 4 and simply this code + static TQSize size; + size = TQSize( widths[(int) which - 1], heights[(int) which - 1] ); + return size; +} + +void TQIconSet::normalize( Size& which, const TQSize& pixSize ) +{ + if ( which == Automatic ) + which = pixSize.width() > iconSize( Small ).width() ? Large : Small; +} + +/*! + Returns a new pixmap that is a copy of \a suppliedPix, scaled to + the icon size \a size. +*/ +TQPixmap *TQIconSet::createScaled( Size size, const TQPixmap *suppliedPix ) const +{ + if ( !suppliedPix || suppliedPix->isNull() ) + return 0; + + TQImage img = suppliedPix->convertToImage(); + TQSize imgSize = iconSize( size ); + if ( size == Small ) { + imgSize = imgSize.boundedTo( img.size() ); + } else { + imgSize = imgSize.expandedTo( img.size() ); + } + img = img.smoothScale( imgSize ); + + TQPixmap *pixmap = new TQPixmap( img ); + if ( !pixmap->tqmask() ) { + TQBitmap tqmask; + tqmask.convertFromImage( img.createHeuristicMask(), + TQt::MonoOnly | TQt::ThresholdDither ); + pixmap->setMask( tqmask ); + } + return pixmap; +} + +/*! + Returns a new pixmap that has a 'disabled' look, taking as its + base the iconset's icon with size \a size and state \a state. +*/ +TQPixmap *TQIconSet::createDisabled( Size size, State state ) const +{ + TQPixmap normalPix = pixmap( size, Normal, state ); + if ( normalPix.isNull() ) + return 0; + + TQImage img; + TQPixmap *pixmap = 0; + TQBitmap normalMask; + if ( normalPix.tqmask() ) { + normalMask = *normalPix.tqmask(); + } else { + img = normalPix.convertToImage(); + normalMask.convertFromImage( img.createHeuristicMask(), + TQt::MonoOnly | TQt::ThresholdDither ); + } + + pixmap = new TQPixmap( normalPix.width() + 1, + normalPix.height() + 1 ); + const TQColorGroup &dis = TQApplication::tqpalette().disabled(); + pixmap->fill( dis.background() ); + + TQPainter painter; + painter.begin( pixmap ); + painter.setPen( dis.base() ); + painter.drawPixmap( 1, 1, normalMask ); + painter.setPen( dis.foreground() ); + painter.drawPixmap( 0, 0, normalMask ); + painter.end(); + + if ( !normalMask.tqmask() ) + normalMask.setMask( normalMask ); + + TQBitmap tqmask( pixmap->size() ); + tqmask.fill( TQt::color0 ); + painter.begin( &tqmask ); + painter.drawPixmap( 0, 0, normalMask ); + painter.drawPixmap( 1, 1, normalMask ); + painter.end(); + pixmap->setMask( tqmask ); + return pixmap; +} + +/*! \class TQIconFactory + \ingroup advanced + \brief The TQIconFactory class is used to create pixmaps for a TQIconSet. + + By reimplementing createPixmap(), you can override TQIconSet's + default algorithm for computing pixmaps not supplied by the user. + + Call setAutoDelete(TRUE) if you want the factory to automatically + delete itself when it is no longer needed by TQIconSet. + + \sa TQIconSet +*/ + +/*! + Constructs an icon factory. +*/ +TQIconFactory::TQIconFactory() + : autoDel( 0 ) +{ + count = 0; +} + +/*! + Destroys the object and frees any allocated resources. +*/ +TQIconFactory::~TQIconFactory() +{ +} + +/*! + Ceates a pixmap for \a iconSet with a certain \a size, \a mode, and + \a state. Returns 0 if the default TQIconSet algorithm should be + used to create a pixmap that wasn't supplied by the user. + + It is the caller's responsibility to delete the returned pixmap. + + The default implementation always returns 0. +*/ +TQPixmap *TQIconFactory::createPixmap( const TQIconSet& /* iconSet */, + TQIconSet::Size /* size */, + TQIconSet::Mode /* mode */, + TQIconSet::State /* state */ ) +{ + return 0; +} + +/*! + \fn void TQIconFactory::setAutoDelete( bool autoDelete ) + + If \a autoDelete is TRUE, sets the icon factory to automatically + delete itself when it is no longer referenced by any TQIconSet and + isn't the default factory. If \a autoDelete is FALSE (the default) + auto-deletion is disabled. + + \sa autoDelete(), defaultFactory() +*/ + +/*! + \fn bool TQIconFactory::autoDelete() const + + Returns TRUE if auto-deletion is enabled; otherwise returns FALSE. + + \sa setAutoDelete() +*/ + +/*! + Returns the default icon factory. + + \sa installDefaultFactory() +*/ +TQIconFactory *TQIconFactory::defaultFactory() +{ + if ( !defaultFac ) { + defaultFac = new TQIconFactory; + defaultFac->setAutoDelete( TRUE ); + defaultFac->ref(); + q_cleanup_icon_factory.set( &defaultFac ); + } + return defaultFac; +} + +/*! + Replaces the default icon factory with \a factory. +*/ +void TQIconFactory::installDefaultFactory( TQIconFactory *factory ) +{ + if ( !factory ) + return; + + factory->ref(); + if ( defaultFac && defaultFac->deref() && defaultFac->autoDelete() ) + delete defaultFac; + defaultFac = factory; + q_cleanup_icon_factory.set( &defaultFac ); +} + +#endif // TQT_NO_ICONSET |