From ccbc1c3572fd0e26480c1432fff55d2909545538 Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Sat, 8 Jun 2024 14:55:59 +0900 Subject: Rename icon nt* related files to equivalent tq* Signed-off-by: Michele Calgaro --- src/kernel/ntqiconset.h | 132 ------- src/kernel/ntqstyle.h | 2 +- src/kernel/ntqt.h | 4 +- src/kernel/qiconset.cpp | 949 ----------------------------------------------- src/kernel/qt_kernel.pri | 4 +- src/kernel/qvariant.cpp | 2 +- src/kernel/tqiconset.cpp | 949 +++++++++++++++++++++++++++++++++++++++++++++++ src/kernel/tqiconset.h | 132 +++++++ 8 files changed, 1087 insertions(+), 1087 deletions(-) delete mode 100644 src/kernel/ntqiconset.h delete mode 100644 src/kernel/qiconset.cpp create mode 100644 src/kernel/tqiconset.cpp create mode 100644 src/kernel/tqiconset.h (limited to 'src/kernel') diff --git a/src/kernel/ntqiconset.h b/src/kernel/ntqiconset.h deleted file mode 100644 index 66fc71146..000000000 --- a/src/kernel/ntqiconset.h +++ /dev/null @@ -1,132 +0,0 @@ -/**************************************************************************** -** -** Definition of TQIconSet class -** -** Created : 980318 -** -** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. -** -** 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. -** -**********************************************************************/ - -#ifndef TQICONSET_H -#define TQICONSET_H - -#ifndef QT_H -#include "tqobject.h" -#include "ntqpixmap.h" -#endif // QT_H - -#ifndef TQT_NO_ICONSET - -class TQIconFactory; -class TQIconSetPrivate; - -// ### Remove all 'virtual' functions in TQIconSet (but not TQIconFactory) in TQt 4.0 -class TQ_EXPORT TQIconSet -{ -public: - // the implementation makes assumptions about the value of these - enum Size { Automatic, Small, Large }; - enum Mode { Normal, Disabled, Active }; - enum State { On, Off }; - - TQIconSet(); - TQIconSet( const TQPixmap& pixmap, Size size = Automatic ); - TQIconSet( const TQPixmap& smallPix, const TQPixmap& largePix ); - TQIconSet( const TQIconSet& other ); - virtual ~TQIconSet(); - - void reset( const TQPixmap& pixmap, Size size ); - - virtual void setPixmap( const TQPixmap& pixmap, Size size, - Mode mode = Normal, State state = Off ); - virtual void setPixmap( const TQString& fileName, Size size, - Mode mode = Normal, State state = Off ); - TQPixmap pixmap( Size size, Mode mode, State state = Off ) const; - TQPixmap pixmap( Size size, bool enabled, State state = Off ) const; - TQPixmap pixmap() const; - bool isGenerated( Size size, Mode mode, State state = Off ) const; - void clearGenerated(); - void installIconFactory( TQIconFactory *factory ); - - bool isNull() const; - - void detach(); - - TQIconSet& operator=( const TQIconSet& other ); - - // static functions - static void setIconSize( Size which, const TQSize& size ); - static const TQSize& iconSize( Size which ); - -#ifndef Q_QDOC - TQ_DUMMY_COMPARISON_OPERATOR(TQIconSet) -#endif - -private: - void normalize( Size& which, const TQSize& pixSize ); - TQPixmap *createScaled( Size size, const TQPixmap *suppliedPix ) const; - TQPixmap *createDisabled( Size size, State state ) const; - - TQIconSetPrivate *d; -}; - -class TQ_EXPORT TQIconFactory : private TQShared -{ -public: - TQIconFactory(); - virtual ~TQIconFactory(); - - virtual TQPixmap *createPixmap( const TQIconSet& iconSet, TQIconSet::Size size, - TQIconSet::Mode mode, TQIconSet::State state ); - void setAutoDelete( bool autoDelete ) { autoDel = autoDelete; } - bool autoDelete() const { return autoDel; } - - static TQIconFactory *defaultFactory(); - static void installDefaultFactory( TQIconFactory *factory ); - -private: -#if defined(TQ_DISABLE_COPY) - TQIconFactory( const TQIconFactory & ); - TQIconFactory &operator=( const TQIconFactory & ); -#endif - - friend class TQIconSet; - friend class TQIconSetPrivate; - - uint autoDel : 1; - uint unused : 31; -}; - -#endif // TQT_NO_ICONSET -#endif diff --git a/src/kernel/ntqstyle.h b/src/kernel/ntqstyle.h index d4288aa33..6fc61b456 100644 --- a/src/kernel/ntqstyle.h +++ b/src/kernel/ntqstyle.h @@ -44,7 +44,7 @@ #include "tqobject.h" #include "ntqpixmap.h" #include "ntqcolor.h" -#include "ntqiconset.h" +#include "tqiconset.h" #include "ntqtabbar.h" #include "ntqtoolbutton.h" #endif // QT_H diff --git a/src/kernel/ntqt.h b/src/kernel/ntqt.h index 3e62736f3..78ce0ca55 100644 --- a/src/kernel/ntqt.h +++ b/src/kernel/ntqt.h @@ -68,7 +68,7 @@ #include "tqtextcodec.h" #include "ntqpixmap.h" #include -#include "ntqiconset.h" +#include "tqiconset.h" #include "ntqbutton.h" #include #include "ntqstyle.h" @@ -151,7 +151,7 @@ #include #include "ntqpen.h" #include "ntqdragobject.h" -#include +#include #include #include #include diff --git a/src/kernel/qiconset.cpp b/src/kernel/qiconset.cpp deleted file mode 100644 index 0b17d6193..000000000 --- a/src/kernel/qiconset.cpp +++ /dev/null @@ -1,949 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQIconSet class -** -** Created : 980318 -** -** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. -** -** 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 "ntqiconset.h" - -#ifndef TQT_NO_ICONSET - -#include "ntqapplication.h" -#include "ntqbitmap.h" -#include "ntqcleanuphandler.h" -#include "tqimage.h" -#include "ntqpainter.h" - -enum { NumSizes = 2, NumModes = 3, NumStates = 2 }; - -static TQIconFactory *defaultFac = 0; -static TQSingleCleanupHandler q_cleanup_icon_factory; - -static short widths[2] = { 22, 32 }; -static short heights[2] = { 22, 32 }; - -enum TQIconSetIconOrigin { - SuppliedFileName, // 'fileName' contains 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 ) -{ - // ### replace '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->mask() ) { - TQBitmap mask; - mask.convertFromImage( img.createHeuristicMask(), - TQt::MonoOnly | TQt::ThresholdDither ); - pixmap->setMask( mask ); - } - 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.mask() ) { - normalMask = *normalPix.mask(); - } 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::palette().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.mask() ) - normalMask.setMask( normalMask ); - - TQBitmap mask( pixmap->size() ); - mask.fill( TQt::color0 ); - painter.begin( &mask ); - painter.drawPixmap( 0, 0, normalMask ); - painter.drawPixmap( 1, 1, normalMask ); - painter.end(); - pixmap->setMask( mask ); - 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 diff --git a/src/kernel/qt_kernel.pri b/src/kernel/qt_kernel.pri index 5f20c7111..a021a33fe 100644 --- a/src/kernel/qt_kernel.pri +++ b/src/kernel/qt_kernel.pri @@ -31,7 +31,7 @@ kernel { $$KERNEL_H/ntqfontmetrics.h \ $$KERNEL_H/ntqguardedptr.h \ $$KERNEL_H/ntqgif.h \ - $$KERNEL_H/ntqiconset.h \ + $$KERNEL_H/tqiconset.h \ $$KERNEL_H/tqimage.h \ $$KERNEL_P/tqimageformatinterface_p.h \ $$KERNEL_H/tqimageformatplugin.h \ @@ -215,7 +215,7 @@ kernel { $$KERNEL_CPP/qfont.cpp \ $$KERNEL_CPP/qfontdatabase.cpp \ $$KERNEL_CPP/qguardedptr.cpp \ - $$KERNEL_CPP/qiconset.cpp \ + $$KERNEL_CPP/tqiconset.cpp \ $$KERNEL_CPP/tqimage.cpp \ $$KERNEL_CPP/tqimageformatplugin.cpp \ $$KERNEL_CPP/qkeysequence.cpp \ diff --git a/src/kernel/qvariant.cpp b/src/kernel/qvariant.cpp index 3665062c1..d3782f483 100644 --- a/src/kernel/qvariant.cpp +++ b/src/kernel/qvariant.cpp @@ -53,7 +53,7 @@ #include "ntqsize.h" #include "ntqcolor.h" #include "ntqpalette.h" -#include "ntqiconset.h" +#include "tqiconset.h" #include "ntqdatastream.h" #include "ntqregion.h" #include "ntqpointarray.h" diff --git a/src/kernel/tqiconset.cpp b/src/kernel/tqiconset.cpp new file mode 100644 index 000000000..6bbf4c17a --- /dev/null +++ b/src/kernel/tqiconset.cpp @@ -0,0 +1,949 @@ +/**************************************************************************** +** +** Implementation of TQIconSet class +** +** Created : 980318 +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** 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 "ntqapplication.h" +#include "ntqbitmap.h" +#include "ntqcleanuphandler.h" +#include "tqimage.h" +#include "ntqpainter.h" + +enum { NumSizes = 2, NumModes = 3, NumStates = 2 }; + +static TQIconFactory *defaultFac = 0; +static TQSingleCleanupHandler q_cleanup_icon_factory; + +static short widths[2] = { 22, 32 }; +static short heights[2] = { 22, 32 }; + +enum TQIconSetIconOrigin { + SuppliedFileName, // 'fileName' contains 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 ) +{ + // ### replace '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->mask() ) { + TQBitmap mask; + mask.convertFromImage( img.createHeuristicMask(), + TQt::MonoOnly | TQt::ThresholdDither ); + pixmap->setMask( mask ); + } + 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.mask() ) { + normalMask = *normalPix.mask(); + } 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::palette().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.mask() ) + normalMask.setMask( normalMask ); + + TQBitmap mask( pixmap->size() ); + mask.fill( TQt::color0 ); + painter.begin( &mask ); + painter.drawPixmap( 0, 0, normalMask ); + painter.drawPixmap( 1, 1, normalMask ); + painter.end(); + pixmap->setMask( mask ); + 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 diff --git a/src/kernel/tqiconset.h b/src/kernel/tqiconset.h new file mode 100644 index 000000000..66fc71146 --- /dev/null +++ b/src/kernel/tqiconset.h @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Definition of TQIconSet class +** +** Created : 980318 +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** 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. +** +**********************************************************************/ + +#ifndef TQICONSET_H +#define TQICONSET_H + +#ifndef QT_H +#include "tqobject.h" +#include "ntqpixmap.h" +#endif // QT_H + +#ifndef TQT_NO_ICONSET + +class TQIconFactory; +class TQIconSetPrivate; + +// ### Remove all 'virtual' functions in TQIconSet (but not TQIconFactory) in TQt 4.0 +class TQ_EXPORT TQIconSet +{ +public: + // the implementation makes assumptions about the value of these + enum Size { Automatic, Small, Large }; + enum Mode { Normal, Disabled, Active }; + enum State { On, Off }; + + TQIconSet(); + TQIconSet( const TQPixmap& pixmap, Size size = Automatic ); + TQIconSet( const TQPixmap& smallPix, const TQPixmap& largePix ); + TQIconSet( const TQIconSet& other ); + virtual ~TQIconSet(); + + void reset( const TQPixmap& pixmap, Size size ); + + virtual void setPixmap( const TQPixmap& pixmap, Size size, + Mode mode = Normal, State state = Off ); + virtual void setPixmap( const TQString& fileName, Size size, + Mode mode = Normal, State state = Off ); + TQPixmap pixmap( Size size, Mode mode, State state = Off ) const; + TQPixmap pixmap( Size size, bool enabled, State state = Off ) const; + TQPixmap pixmap() const; + bool isGenerated( Size size, Mode mode, State state = Off ) const; + void clearGenerated(); + void installIconFactory( TQIconFactory *factory ); + + bool isNull() const; + + void detach(); + + TQIconSet& operator=( const TQIconSet& other ); + + // static functions + static void setIconSize( Size which, const TQSize& size ); + static const TQSize& iconSize( Size which ); + +#ifndef Q_QDOC + TQ_DUMMY_COMPARISON_OPERATOR(TQIconSet) +#endif + +private: + void normalize( Size& which, const TQSize& pixSize ); + TQPixmap *createScaled( Size size, const TQPixmap *suppliedPix ) const; + TQPixmap *createDisabled( Size size, State state ) const; + + TQIconSetPrivate *d; +}; + +class TQ_EXPORT TQIconFactory : private TQShared +{ +public: + TQIconFactory(); + virtual ~TQIconFactory(); + + virtual TQPixmap *createPixmap( const TQIconSet& iconSet, TQIconSet::Size size, + TQIconSet::Mode mode, TQIconSet::State state ); + void setAutoDelete( bool autoDelete ) { autoDel = autoDelete; } + bool autoDelete() const { return autoDel; } + + static TQIconFactory *defaultFactory(); + static void installDefaultFactory( TQIconFactory *factory ); + +private: +#if defined(TQ_DISABLE_COPY) + TQIconFactory( const TQIconFactory & ); + TQIconFactory &operator=( const TQIconFactory & ); +#endif + + friend class TQIconSet; + friend class TQIconSetPrivate; + + uint autoDel : 1; + uint unused : 31; +}; + +#endif // TQT_NO_ICONSET +#endif -- cgit v1.2.1