home *** CD-ROM | disk | FTP | other *** search
- /* -*- Mode: C++ -*-
- KDChart - a multi-platform charting engine
- */
-
- /****************************************************************************
- ** Copyright (C) 2001-2003 Klarälvdalens Datakonsult AB. All rights reserved.
- **
- ** This file is part of the KDChart library.
- **
- ** This file may be distributed and/or modified under the terms of the
- ** GNU General Public License version 2 as published by the Free Software
- ** Foundation and appearing in the file LICENSE.GPL included in the
- ** packaging of this file.
- **
- ** Licensees holding valid commercial KDChart licenses may use this file in
- ** accordance with the KDChart Commercial License Agreement provided with
- ** the Software.
- **
- ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- **
- ** See http://www.klaralvdalens-datakonsult.se/?page=products for
- ** information about KDChart Commercial License Agreements.
- **
- ** Contact info@klaralvdalens-datakonsult.se if any conditions of this
- ** licensing are not clear to you.
- **
- **********************************************************************/
- #ifndef __KDFRAME_H__
- #define __KDFRAME_H__
-
- #include <qapplication.h>
- #include <qfont.h>
- #include <qcolor.h>
- #include <qpixmap.h>
- #include <qpen.h>
- #include <qmap.h>
- #include <qobject.h>
- #include <qtextstream.h>
- #include <qdom.h>
-
- #include <KDFrameProfileSection.h>
-
-
- /** \file KDFrame.h
- \brief Header of the KDFrame class providing highly configurable rectangular frame drawing.
-
- \ifnot v200
- This class is work in progress, at present only single line frame borders
- and (scaled/streched) background pictures are available.
- See KDChartParams::setSimpleFrame() to learn how to use them.
- \else
- A frame may consist of an (optional) border and/or an (optional) background.
- The border may consist of up to four edges and/or up to four border corners.
-
- \note Each of the edges and each of the corners may use their own user-definable profile.
-
- The frame corners ( see types defined in \c CornerStyle ) are set up via setCorner()
-
- Some commonly used frame profiles (e.g. raised box, sunken panel) are predefined in \c SimpleFrame, see setSimpleFrame().
- To learn how to specify your frame profiles have a look at example code given with setProfile()
- \endif
- */
-
-
- /**
- \brief The main class of KDFrame.
-
- KDFrame is made for highly configurable rectangular frame drawing.
-
- A frame may consist of an (optional) border and/or an (optional) background.
- \ifndef v200
- This class is work in progress, at present only single line frame borders
- and (scaled/streched) background pictures are available.
- See KDChartParams::setSimpleFrame() to learn how to use them.
- \else
- The border may consist of up to four edges and/or up to four border corners.
-
- \note Each of the edges and each of the corners may use their own user-definable profile.
-
- The frame corners ( see types defined in CornerStyle ) are set up via setCorner()
-
- Some commonly used frame profiles (e.g. raised box, sunken panel) are predefined in SimpleFrame, see setSimpleFrame().
- To learn how to specify your frame profiles have a look at example code given with setProfile()
- \endif
- */
- class KDCHART_EXPORT KDFrame : public QObject
- {
- Q_OBJECT
- Q_ENUMS( BackPixmapMode )
- Q_ENUMS( SimpleFrame )
- Q_ENUMS( ProfileName )
- Q_ENUMS( CornerName )
- Q_ENUMS( CornerStyle )
- Q_ENUMS( KDFramePaintSteps )
-
- public:
- //// GENERAL
-
-
- /**
- These are ways how to display a pixmap that might
- be painted into the inner area.
-
- \Note To have a 'tiled' background image do not use a background
- pixmap but use a background <b>brush</b> holding this pixmap.
- */
- enum BackPixmapMode { PixCentered, PixScaled, PixStretched };
-
- public slots:
-
- /**
- Converts the specified background pixmap mode enum to a string
- representation.
-
- \param type the background pixmap mode to convert
- \return the string representation of the background pixmap mode enum
- */
- static QString backPixmapModeToString( BackPixmapMode type ) {
- switch( type ) {
- case PixCentered:
- return "Centered";
- case PixScaled:
- return "Scaled";
- case PixStretched:
- return "Stretched";
- }
-
- return "Stretched";
- }
-
-
- /**
- Converts the specified string to a background pixmap mode enum value.
-
- \param string the string to convert
- \return the background pixmap mode enum value
- */
- static BackPixmapMode stringToBackPixmapMode( const QString& string ) {
- if( string == "Centered" )
- return PixCentered;
- else if( string == "Scaled" )
- return PixScaled;
- else if( string == "Stretched" )
- return PixStretched;
-
- return PixStretched;
- }
-
-
- public:
-
-
- /**
- These simple frames are pre-defined for your convenience
-
- \li \c FrameFlat a flat rectangular frame
- \li \c FrameElegance a flat frame consisting of three lines
- \li \c FrameBoxRaized a raised box
- \li \c FrameBoxSunken a sunken box
- \li \c FramePanelRaized a raised panel
- \li \c FramePanelSunken a sunken panel
- \li \c FrameSemicircular a raised box with round edges
-
- \ifnot v200
- All pre-defined frames have normal corners.
- \else
- All pre-defined frames have normal corners but
- of course you may specify differently looking corners by
- calling setCorners() (or setCorner(), resp.) after having
- called setSimpleFrame()
-
- \sa setSimpleFrame
- \endif
- */
- enum SimpleFrame { FrameFlat, FrameElegance,
- FrameBoxRaized, FrameBoxSunken,
- FramePanelRaized, FramePanelSunken,
- FrameSemicircular };
-
- public slots:
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Select a pre-defined frame.
- This methode is provided for convenience, the same results can be obtained by calling
- addProfileSection multiple times specifying the appropriate parameters and finally
- setting the corners to \c CornerNormal
-
- \note When using FrameElegance the midLineWidth value will be ignored since
- in this special case the lineValue will indicate the <b>total width</b> of the frame.
- FrameElegance frames look best when lineWidth is 16 or the multiple of 16.
-
- \Note To have a 'tiled' background image do not use a background
- pixmap but use a background <b>brush</b> holding this pixmap.
-
- See setProfile for a short example using this method.
-
- \param frame one of the values defined for enum \c SimpleFrame
- \param lineWidth for FrameFlat and FrameElegance: the complete frame width;
- for frames with 2-line edges (FramePanelRaized, FramePanelSunken): the width of each of the lines;
- for frames with 3-line edges (FrameBoxRaized, FrameBoxSunken, FrameSemicircular): the width of the outer and the
- width of the inner line.
- \param midLineWidth only used for frames with 3-line edges: the width
- of the middle line.
- \param pen the basic pen to be used for this frame's lines
- \param background the brush to be used for the frame's background or QBrush() if the background is not to be filled by a brush
- \param backPixmap if not zero points to a pixmap to be used for the background
- \param backPixmapMode determines how the size pixmap is adjusted to the frame size,
- see \c BackPixmapMode for the possible values.
-
- \sa SimpleFrame, BackPixmapMode, addProfileSection, setProfile, profile, setCorners, setCorner, cornerStyle, cornerWidth
- \endif
- */
- void setSimpleFrame( SimpleFrame frame,
- int lineWidth,
- int midLineWidth,
- QPen pen,
- QBrush background = QBrush(),
- const QPixmap* backPixmap = 0,
- BackPixmapMode backPixmapMode = PixStretched );
-
- public:
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Names of the four frame edges
-
- \li \c ProfileTop
- \li \c ProfileRight
- \li \c ProfileBottom
- \li \c ProfileLeft
-
- \sa setSimpleFrame, clearProfile, addProfileSection, setProfile, profile
- \endif
- */
- enum ProfileName { ProfileTop, ProfileRight,
- ProfileBottom, ProfileLeft };
-
- public slots:
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Add another section to one of the frames profiles.
-
- \note The sections will be drawn in the order in which they were added to the profile
- beginning at the outside and ending with the inner section of the frame
-
- See setProfile for a short example using this method.
-
- \sa ProfileName, setSimpleFrame, addProfileSection, setProfile, profile
- \endif
- */
- void clearProfile( ProfileName name );
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Add another section to one of the frames profiles.
-
- \note The sections will be drawn in the order in which they were added to the profile
- beginning at the outside and ending with the inner section of the frame.
-
- Adding a gap between two sections can be done by specifying a <b>QPen( Qt::NoPen )</b>.
-
- See setProfile for a short example using this method.
-
- \sa ProfileName, setSimpleFrame, clearProfile, setProfile, profile
- \endif
- */
- void addProfileSection( ProfileName name,
- int wid,
- QPen pen,
- KDFrameProfileSection::Direction dir = KDFrameProfileSection::DirPlain, // PENDING(blackie) possible enum problem
- KDFrameProfileSection::Curvature curv = KDFrameProfileSection::CvtPlain );
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Specify one of the frames profiles by copying another KDFrameProfile.
- Use this function if a profile shall look the same as another one.
-
- <b>Example:</b>
-
- \verbatim
- // instantiate a frame around an inner rectangle 50/20, 250/20
- KDFrame myFrame( 50,20, 250,120 );
-
- // select a very simple rectangular frame with normal corners, black border, white background
- myFrame.setSimpleFrame( KDFrame::FrameFlat, 1, 0, QPen( Qt::Black ), QBrush( Qt::White ) );
-
- // make the top profile look more nice
- myFrame.clearProfile( KDFrame::ProfileTop );
- myFrame.addProfileSection( KDFrame::ProfileTop, 2, QPen( Qt::Black ),
- KDFrameProfileSection::DirPlain,
- KDFrameProfileSection::CvtPlain );
- myFrame.addProfileSection( KDFrame::ProfileTop, 5, QPen( Qt::NoPen ),
- KDFrameProfileSection::DirPlain,
- KDFrameProfileSection::CvtPlain );
- myFrame.addProfileSection( KDFrame::ProfileTop, 1, QPen( Qt::Black ),
- KDFrameProfileSection::DirPlain,
- KDFrameProfileSection::CvtPlain );
-
- // copy the top profile settings into the bottom profile
- myFrame.setProfile( KDFrame::ProfileBottom,
- myFrame.profile( KDFrame::ProfileTop ) );
- \endverbatim
-
-
- \sa ProfileName, setSimpleFrame, clearProfile, addProfileSection, profile
- \endif
- */
- void setProfile( ProfileName name, const KDFrameProfile& profile );
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Return one of the frames profiles.
-
- \sa ProfileName, setSimpleFrame, clearProfile, addProfileSection, setProfile
- \endif
- */
- const KDFrameProfile& profile( ProfileName name ) const;
-
- public:
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Names of the frame corners:
-
- \li \c CornerTopLeft
- \li \c CornerTopRight
- \li \c CornerBottomLeft
- \li \c CornerBottomRight
-
- \sa setCorners, setCorner, setSunPos, cornerStyle, cornerWidth, sunPos
- \endif
- */
- enum CornerName { CornerTopLeft,
- CornerTopRight,
- CornerBottomLeft,
- CornerBottomRight,
- CornerUNKNOWN };
-
- public slots:
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Converts the specified corner name enum to a string representation.
-
- \param type the corner name to convert
- \return the string representation of the corner name enum
- \endif
- */
- static QString cornerNameToString( CornerName type ) {
- switch( type ) {
- case CornerTopLeft:
- return "TopLeft";
- case CornerTopRight:
- return "TopRight";
- case CornerBottomLeft:
- return "BottomLeft";
- case CornerBottomRight:
- return "BottomRight";
- case CornerUNKNOWN:
- return "UNKNOWN";
- }
-
- return "UNKNOWN";
- }
-
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Converts the specified string to a corner name enum value.
-
- \param string the string to convert
- \return the corner name enum value
- \endif
- */
- static CornerName stringToCornerName( const QString& string ) {
- if( string == "TopLeft" )
- return CornerTopLeft;
- else if( string == "TopRight" )
- return CornerTopRight;
- else if( string == "BottomLeft" )
- return CornerBottomLeft;
- else if( string == "BottomRight" )
- return CornerBottomRight;
- else if( string == "UNKNOWN" )
- return CornerUNKNOWN;
-
- return CornerUNKNOWN;
- }
-
- public:
-
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Look of the frame corners:
-
- \li \c CornerNormal a square angle corner.
- \li \c CornerRound a quarter of a circle.
- \li \c CornerOblique corner cut-off by 45 degrees.
-
- \sa setCorners, setCorner, cornerStyle, cornerWidth
- \endif
- */
- enum CornerStyle { CornerNormal,
- CornerRound,
- CornerOblique };
-
- public slots:
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Converts the specified corner style enum to a string representation.
-
- \param type the corner style enum to convert
- \return the string representation of the corner style enum
- \endif
- */
- static QString cornerStyleToString( CornerStyle type ) {
- switch( type ) {
- case CornerNormal:
- return "Normal";
- case CornerRound:
- return "Round";
- case CornerOblique:
- return "Oblique";
- }
-
- return "Normal";
- }
-
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Converts the specified string to a corner stylye enum value.
-
- \param string the string to convert
- \return the corner style enum value
- \endif
- */
- static CornerStyle stringToCornerStyle( const QString& string ) {
- if( string == "Normal" )
- return CornerNormal;
- else if( string == "Round" )
- return CornerRound;
- else if( string == "Oblique" )
- return CornerOblique;
-
- return CornerNormal;
- }
-
-
- public:
-
- // MOC_SKIP_BEGIN
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Helper class storing settings for one corner of the frame.
-
- To set/retrieve information stored in this class please use
- the appropriate methods of the KDFrame class.
-
- \sa setCorners, setCorner, cornerStyle, cornerWidth, cornerProfile, CornerName, CornerStyle
- \endif
- */
- class KDCHART_EXPORT KDFrameCorner
- {
- friend class KDFrame;
- public:
- KDFrameCorner( CornerStyle style = CornerNormal,
- int width = 0,
- KDFrameProfile* const profile = 0 )
- : _style( style ),
- _width( width )
- {
- if( profile )
- _profile = *profile;
- else
- _profile.clear();
- }
- /**
- Destructor. Only defined to have it virtual.
- */
- virtual ~KDFrameCorner();
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Creates a DOM element node that represents a frame corner for use
- in a DOM document.
-
- \param document the DOM document to which the node will belong
- \param parent the parent node to which the new node will be appended
- \param elementName the name of the new node
- \param corner the corner to be represented
- \endif
- */
- static void createFrameCornerNode( QDomDocument& document,
- QDomNode& parent,
- const QString& elementName,
- const KDFrameCorner& corner );
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Reads data from a DOM element node that represents a frame
- corner and fills a KDFrameCorner object with the data.
-
- \param element the DOM element to read from
- \param corner the frame corner object to read the data into
- \endif
- */
- static bool readFrameCornerNode( const QDomElement& element,
- KDFrameCorner& corner );
-
- protected:
- void setAll( CornerStyle style,
- int width,
- KDFrameProfile* const profile = 0 )
- {
- _style = style;
- _width = width;
- if( profile )
- _profile = *profile;
- else
- _profile.clear();
- }
- CornerStyle style() const
- {
- return _style;
- }
- int width() const
- {
- return _width;
- }
- const KDFrameProfile& profile() const
- {
- return _profile;
- }
- private:
- CornerStyle _style;
- int _width;
- KDFrameProfile _profile;
- };
-
- // MOC_SKIP_END
-
- public slots:
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Specify the look and the width and (optionally) the profile
- of one of the frame corners.
-
- \sa setCorners, cornerStyle, cornerWidth, cornerWidth, CornerName, CornerStyle
- \endif
- */
- void setCorner( CornerName name,
- CornerStyle style,
- int width,
- KDFrameProfile* const profile = 0 )
- {
- switch( name ) {
- case CornerTopLeft: _cornerTL.setAll( style, width, profile );
- break;
- case CornerTopRight: _cornerTR.setAll( style, width, profile );
- break;
- case CornerBottomLeft: _cornerBL.setAll( style, width, profile );
- break;
- case CornerBottomRight: _cornerBR.setAll( style, width, profile );
- break;
- case CornerUNKNOWN:
- break;
- }
- }
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Specify the look and the width and (optionally) the profile
- of all of the frame corners.
-
- \sa setCorner, cornerStyle, cornerWidth, CornerName, CornerStyle
- \endif
- */
- void setCorners( CornerStyle style,
- int width,
- KDFrameProfile* const profile = 0 )
- {
- _cornerTL.setAll( style, width, profile );
- _cornerTR.setAll( style, width, profile );
- _cornerBL.setAll( style, width, profile );
- _cornerBR.setAll( style, width, profile );
- }
-
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Returns the look of one of the frame corners.
-
- \sa setCorners, cornerWidth, CornerName, CornerStyle
- \endif
- */
- CornerStyle cornerStyle( CornerName name ) const
- {
- switch( name ) {
- case CornerTopLeft: return _cornerTL.style();
- case CornerTopRight: return _cornerTR.style();
- case CornerBottomLeft: return _cornerBL.style();
- case CornerBottomRight: return _cornerBR.style();
- case CornerUNKNOWN:
- default: return CornerNormal;
- }
- }
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Returns the width of one of the frame corners.
-
- \sa setCorners, cornerStyle, CornerName, CornerStyle
- \endif
- */
- int cornerWidth( CornerName name ) const
- {
- switch( name ) {
- case CornerTopLeft: return _cornerTL.width();
- case CornerTopRight: return _cornerTR.width();
- case CornerBottomLeft: return _cornerBL.width();
- case CornerBottomRight: return _cornerBR.width();
- case CornerUNKNOWN:
- default: return 0;
- }
- }
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Returns the profile of one of the frame corners.
-
- \sa setCorners, cornerStyle, CornerName, CornerStyle
- \endif
- */
- const KDFrameProfile& cornerProfile( CornerName name ) const
- {
- switch( name ) {
- case CornerUNKNOWN:
- case CornerTopLeft: return _cornerTL.profile();
- case CornerTopRight: return _cornerTR.profile();
- case CornerBottomLeft: return _cornerBL.profile();
- case CornerBottomRight: return _cornerBR.profile();
- default: return _cornerTL.profile();
- }
- }
-
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Specifies the position of the sun, normally this is the upper left corner.
-
- \sa sunPos
- \endif
- */
- void setSunPos( CornerName sunPos )
- {
- _sunPos = sunPos;
- }
-
- /**
- \ifnot v200
- \deprecated Feature scheduled for future release, at present not implemented.
- \else
- Returns the position of the sun.
-
- \sa setSunPos
- \endif
- */
- CornerName sunPos() const
- {
- return _sunPos;
- }
-
-
- /**
- Specifies the brush to be used to fill the inner area of this frame,
- calling this methode without passing in a parameter re-sets the background brush
- to \c QBrush( \cQt::NoBrush \c).
-
- \Note To have a 'tiled' background image just use a brush
- holding this pixmap - for other ways to show background
- images please use setBackPixmap.
-
- \sa setBackPixmap, background
- */
- void setBackground( QBrush background = QBrush( Qt::NoBrush ) )
- {
- _background = background;
- }
-
- /**
- Specifies a pixmap to be used to fill the inner area of this frame,
- calling this methode without passing in a parameter removes the background pixmap.
-
- \Note To have a 'tiled' background image do not use setBackPixmap
- but use setBackground specifying a brush holding the pixmap.
-
- \sa setBackground, background
- */
- void setBackPixmap( const QPixmap* backPixmap = 0,
- BackPixmapMode backPixmapMode = PixStretched )
- {
- _backPixmap = backPixmap ? *backPixmap : QPixmap();
- _backPixmapMode = backPixmapMode;
- }
-
- /**
- Returns the brush that is used to fill the inner area of this frame,
- or a QBrush( \cNoBrush \c) if no background is to be drawn.
-
- \param backPixmap receives the pixmap used for drawing the background or
- a null pixmap, test this by calling backPixmap.isNull()
-
- \Note If a 'tiled' background image is shown the respective pixmap
- may be found by calling the <b>brush's</b> pixmap() function.
-
- \sa setBackground, setBackPixmap
- */
- const QBrush& background( const QPixmap*& backPixmap,
- BackPixmapMode& backPixmapMode ) const
- {
- backPixmap = &_backPixmap;
- backPixmapMode = _backPixmapMode;
- return _background;
- }
-
-
- /**
- Specifies the position and the size of area that is surrounded by the frame.
-
- \note The rectangle applies to the <b>inner</b> area of the frame.
- The Frame is drawn around this area: touching it but not covering it.
- The outer size of the frame and the position of its outer left corner
- depends from the frame profile width(s).
-
- \sa innerRect, setCorners, setSimpleFrame, setProfile
- */
- void setInnerRect( QRect innerRect )
- {
- _innerRect = innerRect;
- }
-
- /**
- Returns the position and the size of the frame.
-
- \note The rectangle returns to the <b>inner</b> area of the frame.
- The Frame is drawn around this area: touching it but not covering it.
- The outer size of the frame and the position of its outer left corner
- depends from the frame profile width.
-
- \sa setInnerRect, setProfile
- */
- QRect innerRect() const
- {
- return _innerRect;
- }
-
-
- /**
- Paint methode drawing the background (if any) of the frame.
-
- \note Under normal circumstances you will <b>never</b> have to
- call this methode since it is called internally by paint() if you
- start it with \c PaintBackground (or with \c PaintAll, resp.) for the \c steps parameter.
- */
- virtual void paintBackground( QPainter& painter, const QRect& innerRect ) const;
- /**
- Paint methode drawing the edges (if any) of the frame.
-
- \note Under normal circumstances you will <b>never</b> have to
- call this methode since it is called internally by paint() if you
- start it with \c PaintEdges (or with \c PaintAll, \c PaintBorder, resp.) for the \c steps parameter.
- */
- virtual void paintEdges( QPainter& painter, const QRect& innerRect ) const;
- /**
- Paint methode drawing the corners (if any) of the frame.
-
- \note Under normal circumstances you will <b>never</b> have to
- call this methode since it is called internally by paint() if you
- start it with \c PaintCorners (or with \c PaintAll, \c PaintBorder, resp.) for the \c steps parameter.
- */
- virtual void paintCorners( QPainter& painter, const QRect& innerRect ) const;
-
-
- public:
- /**
- The different steps taken to paint the frame:
- first paint the background then the edges then the corners.
- By choosing \c PaintAll all the parts of the frame will be drawn.
-
- \li \c PaintBackground -- first paints the brush, then paints the pixmap if any
- \li \c PaintEdges
- \li \c PaintCorners
- \li \c PaintBorder -- paint the edges and the corners but not the background
- \li \c PaintAll
-
- \sa paint
- */
- enum KDFramePaintSteps { PaintBackground, PaintEdges, PaintCorners, PaintBorder, PaintAll };
-
- public slots:
-
- /**
- Paint methode actually drawing the frame.
-
- This method must be called from inside the \c paint() methode of your widget.
-
- In order not to override the inner contents of the frame you normally would
- first call <b>paint( painter, PaintBackground );</b> then do all the inside
- drawing and finally call <b>paint( painter, PaintBorder );</b>. In case the
- inner contents <b>are</b> allowed to (partially) override the frame border
- you could do the following: First call <b>paint( painter, PaintBackground );</b>
- immediately followed by <b>paint( painter, PaintEdges );</b> then do all your
- inside work and finally draw <b>paint( painter, PaintCorners );</b>.
-
- \param painter The QPainter to be used for drawing.
- \param steps The part of the frame to be drawn, use KDFrame::PaintAll to draw the entire frame and the background,
- use KDFrame::PaintBackground to draw only the background, use KDFrame::PaintEdges to draw just the edges,
- use KDFrame::PaintCorners to draw only the corners.
- \param innerRect The area inside the frame. Use this parameter to temporarily override the \c innerRect set by
- the constructor of KDFrame or by setInnerRect(). This approach can be usefull if you want to draw several
- frames that differ only regarding to their position and size but share the same edges/corners/background settings.
- In this case you could decide to instantiate only one KDFrame set up the desired settings and just call
- its paint() methode several time - giving it the appropriate innerRect for each frame. This would result in
- less memory usage since you could use that single KDFrame object as kind of a shared ressource.
- */
- virtual void paint( QPainter* painter,
- KDFramePaintSteps steps = PaintAll,
- QRect innerRect = QRect(0,0,0,0) ) const;
-
-
- /**
- Remove all settings and specify no border, no edges, no background.
- */
- void clearAll()
- {
- _background = QBrush();
- _backPixmap = QPixmap();
- _backPixmapMode = PixStretched;
- _shadowWidth = 0;
- _sunPos = CornerTopLeft;
- _innerRect = QRect( 0,0, 0,0 );
- _topProfile.clear();
- _rightProfile.clear();
- _bottomProfile.clear();
- _leftProfile.clear();
- _cornerTL.setAll( CornerNormal, 0, 0 );
- _cornerTR.setAll( CornerNormal, 0, 0 );
- _cornerBL.setAll( CornerNormal, 0, 0 );
- _cornerBR.setAll( CornerNormal, 0, 0 );
- }
-
- public:
-
- /**
- Default Constructor. Defines default values.
-
- The constructor does *not* have a \c parent parameter since drawing
- of the frame is not done transparently but by (one or more) explicit
- calls of the frames paint() methode. See explanation given there
- to learn about the why and how of this...
-
- \note The rectangle applies to the <b>inner</b> area of the frame.
- The Frame is drawn around this area: touching it but not covering it.
- The outer size of the frame and the position of its outer left corner
- depends from the frame profile width.
-
- \Note To have a 'tiled' background image do not specify a backPixmap
- but use a background <b>brush</b> holding this pixmap.
-
- \sa rect, setInnerRect, setProfile
- */
- KDFrame( QRect innerRect = QRect(0,0,0,0),
- SimpleFrame frame = FrameFlat,
- int lineWidth = 1,
- int midLineWidth = 0,
- QPen pen = QPen(), // solid black line with 0 width
- QBrush background = QBrush(), // no brush
- const QPixmap* backPixmap = 0, // no pixmap
- BackPixmapMode backPixmapMode = PixStretched,
- int shadowWidth = 0,
- CornerName sunPos = CornerTopLeft )
- {
- _profileSections.setAutoDelete( true );
- _innerRect = innerRect;
- setSimpleFrame( frame,
- lineWidth,
- midLineWidth,
- pen,
- background,
- backPixmap,
- backPixmapMode );
- _shadowWidth = shadowWidth;
- _sunPos = sunPos;
- }
-
-
- /*
- Constructor. Set up a frame by copying settings of another frame.
-
- The constructor does *not* have a \c parent parameter since drawing
- of the frame is not done transparently but by (one or more) explicit
- calls of the frames paint() methode. See explanation given there
- to learn about the why and how of this...
-
- \note The rectangle applies to the <b>inner</b> area of the frame.
- The Frame is drawn around this area: touching it but not covering it.
- The outer size of the frame and the position of its outer left corner
- depends from the frame profile width.
-
- \sa rect, setInnerRect, setProfile
-
- KDFrame( QRect innerRect,
- const KDFrame& R,
- CornerName sunPos = CornerUNKNOWN )
- {
- deepCopy( *this, R );
- if( innerRect.isValid() )
- _innerRect = innerRect;
- if( CornerUNKNOWN != sunPos )
- _sunPos = sunPos;
-
- _profileSections.setAutoDelete( true );
- }
- */
- private:
- KDFrame( const KDFrame& ) : QObject(0) {}
- KDFrame& operator=( const KDFrame& ){return *this;}
-
-
-
- public:
- /**
- Destructor. Only defined to have it virtual.
- */
- virtual ~KDFrame();
-
- /*
- Kopierroutine, aufgerufen im Copy-C'tor und im Zuweisungs-Operator
- */
- static void deepCopy( KDFrame& D, const KDFrame& R )
- {
- D._shadowWidth = R._shadowWidth;
- D._sunPos = R._sunPos;
- D._background = R._background;
- D._backPixmap = R._backPixmap;
- D._backPixmapMode = R._backPixmapMode;
- D._innerRect = R._innerRect;
- D._topProfile = R._topProfile;
- D._rightProfile = R._rightProfile;
- D._bottomProfile = R._bottomProfile;
- D._leftProfile = R._leftProfile;
- D._cornerTL = R._cornerTL;
- D._cornerTR = R._cornerTR;
- D._cornerBL = R._cornerBL;
- D._cornerBR = R._cornerBR;
- D._profileSections= R._profileSections;
- D._profileSections.setAutoDelete( true );
- R.setProfileSectionsAutoDelete( false );
- }
-
- friend QTextStream& operator<<( QTextStream& s, const KDFrame& p );
- friend QTextStream& operator>>( QTextStream& s, KDFrame& p );
-
- /**
- Creates a DOM element node that represents a frame for use
- in a DOM document.
-
- \param document the DOM document to which the node will belong
- \param parent the parent node to which the new node will be appended
- \param elementName the name of the new node
- \param frame the frame to be represented
- */
- static void createFrameNode( QDomDocument& document, QDomNode& parent,
- const QString& elementName,
- const KDFrame& frame );
-
- /**
- Creates a DOM element node that represents a frame profile for use
- in a DOM document.
-
- \param document the DOM document to which the node will belong
- \param parent the parent node to which the new node will be appended
- \param elementName the name of the new node
- \param profile the profile to be represented
- */
- static void createFrameProfileNode( QDomDocument& document,
- QDomNode& parent,
- const QString& elementName,
- KDFrameProfile profile );
-
- /**
- Reads data from a DOM element node that represents a frame
- object and fills a KDFrame object with the data.
-
- \param element the DOM element to read from
- \param frame the frame object to read the data into
- */
- static bool readFrameNode( const QDomElement& element,
- KDFrame& frame );
-
- /**
- Reads data from a DOM element node that represents a frame
- profile and fills a KDFrameProfile object with the data.
-
- \param element the DOM element to read from
- \param profile the frame profile object to read the data into
- */
- static bool readFrameProfileNode( const QDomElement& element,
- KDFrameProfile& profile );
-
- signals:
- /**
- This signal is emitted when any of the frame parameters has changed.
- */
- void changed();
-
- private:
- void setProfileSectionsAutoDelete( bool on ) const
- {
- ((KDFrame*)this)->_profileSections.setAutoDelete( on );
- }
-
- /**
- Stores the width of the shadow.
- */
- int _shadowWidth;
-
- /**
- Stores the position of the sun.
- */
- CornerName _sunPos;
-
- /**
- Stores the brush to be used to fill the inner area.
- */
- QBrush _background;
-
- /**
- Stores the pixmap to be painted into the inner area.
- */
- QPixmap _backPixmap;
-
- /**
- Stores the way how to display the pixmap that is
- to be painted into the inner area.
- */
- BackPixmapMode _backPixmapMode;
-
- /**
- Stores the position and size of the frame.
- */
- QRect _innerRect;
-
- /**
- Stores all currently used profile settings for a controlled deletion.
-
- \note The other pointer lists (like _topProfile or _rightProfile)
- do NOT delete the objects that belong to their pointers,
- but all sections will be deleted via this extra _profileSections list:
- this allows for using the same KDFrameProfileSection* to be used
- by several lists - typically done for simple frames where all 4 sides
- are composed the same way.
- */
- KDFrameProfile _profileSections;
-
- /**
- Stores the profile settings for the top side of the frame.
- */
- KDFrameProfile _topProfile;
- /**
- Stores the profile settings for the right side of the frame.
- */
- KDFrameProfile _rightProfile;
- /**
- Stores the profile settings for the bottom side of the frame.
- */
- KDFrameProfile _bottomProfile;
- /**
- Stores the profile settings for the left side of the frame.
- */
- KDFrameProfile _leftProfile;
-
- /**
- Stores the settings for the top left corner of the frame.
- */
- KDFrameCorner _cornerTL;
- /**
- Stores the settings for the top right corner of the frame.
- */
- KDFrameCorner _cornerTR;
- /**
- Stores the settings for the bottom left corner of the frame.
- */
- KDFrameCorner _cornerBL;
- /**
- Stores the settings for the bottom right corner of the frame.
- */
- KDFrameCorner _cornerBR;
- };
-
-
- /**
- Writes the KDFrame object p as an XML document to the text stream s.
-
- \param s the text stream to write to
- \param p the KDFrame object to write
- \return the text stream after the write operation
- */
- QTextStream& operator<<( QTextStream& s, const KDFrame& p );
-
-
- /**
- Reads the an XML document from the text stream s into the
- KDFrame object p
-
- \param s the text stream to read from
- \param p the KDFrame object to read into
- \return the text stream after the read operation
- */
- QTextStream& operator>>( QTextStream& s, KDFrame& p );
-
-
- #endif
-