Skip to content
Snippets Groups Projects
FXGradientBar.h 11.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • /********************************************************************************
    *                                                                               *
    *                      G r a d i e n t B a r   W i d g e t                      *
    *                                                                               *
    *********************************************************************************
    * Copyright (C) 2002,2005 by Jeroen van der Zijp.   All Rights Reserved.        *
    *********************************************************************************
    * This library is free software; you can redistribute it and/or                 *
    * modify it under the terms of the GNU Lesser General Public                    *
    * License as published by the Free Software Foundation; either                  *
    * version 2.1 of the License, or (at your option) any later version.            *
    *                                                                               *
    * This library is distributed in the hope that it will be useful,               *
    * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             *
    * Lesser General Public License for more details.                               *
    *                                                                               *
    * You should have received a copy of the GNU Lesser General Public              *
    * License along with this library; if not, write to the Free Software           *
    * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *
    *********************************************************************************
    * $Id: FXGradientBar.h 2127 2005-08-07 20:21:35Z lyle $                     *
    ********************************************************************************/
    #ifndef FXGRADIENTBAR_H
    #define FXGRADIENTBAR_H
    
    #ifndef FXFRAME_H
    #include "FXFrame.h"
    #endif
    
    
    namespace FX {
    
    
    
    /// Gradient bar orientation
    enum {
      GRADIENTBAR_HORIZONTAL      = 0,                          /// Gradient bar shown horizontally
      GRADIENTBAR_VERTICAL        = 0x00008000,                 /// Gradient bar shown vertically
      GRADIENTBAR_NO_CONTROLS     = 0,                          /// No controls shown
      GRADIENTBAR_CONTROLS_TOP    = 0x00010000,                 /// Controls on top
      GRADIENTBAR_CONTROLS_BOTTOM = 0x00020000,                 /// Controls on bottom
      GRADIENTBAR_CONTROLS_LEFT   = GRADIENTBAR_CONTROLS_TOP,   /// Controls on left
      GRADIENTBAR_CONTROLS_RIGHT  = GRADIENTBAR_CONTROLS_BOTTOM /// Controls on right
      };
    
    
    /// Blend modes
    enum {
      GRADIENT_BLEND_LINEAR,                /// Linear blend
      GRADIENT_BLEND_POWER,                 /// Power law blend
      GRADIENT_BLEND_SINE,                  /// Sine blend
      GRADIENT_BLEND_INCREASING,            /// Quadratic increasing blend
      GRADIENT_BLEND_DECREASING             /// Quadratic decreasing blend
      };
    
    
    
    // Gradient segment
    struct FXGradient {
      FXdouble lower;                     /// Lower value
      FXdouble middle;                    /// Middle value
      FXdouble upper;                     /// Upper value
      FXColor  lowerColor;                /// Lower color
      FXColor  upperColor;                /// Upper color
      FXuchar  blend;                     /// Blend method
      };
    
    
    class FXImage;
    
    
    /**
    * The gradient bar is a control that is used to edit color gradient,
    * such as used in texture mapping and shape filling.
    */
    class FXAPI FXGradientBar : public FXFrame {
      FXDECLARE(FXGradientBar)
    protected:
      FXImage     *bar;                     // Image containing colors
      FXGradient  *seg;                     // Segments
      FXint        nsegs;                   // Number of segments
      FXint        sellower;                // Lower selected segment
      FXint        selupper;                // Upper selected segment
      FXint        dropped;                 // Dropped segment
      FXint        current;                 // Current segment
      FXint        anchor;                  // Anchor segment
      FXint        grip;                    // Grip being dragged, if any
      FXint        where;                   // Where dropped in segment
      FXString     tip;                     // Tooltip value
      FXString     help;                    // Help value
      FXColor      selectColor;             // Select color
      FXint        offset;                  // Offset
    protected:
      FXGradientBar();
      void updatebar();
      FXdouble getValue(FXint x,FXint y) const;
      FXint getSegmentLowerPos(FXint sg) const;
      FXint getSegmentUpperPos(FXint sg) const;
      FXint getSegmentMiddlePos(FXint sg) const;
      void drawUpArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr);
      void drawDnArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr);
      void drawRtArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr);
      void drawLtArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr);
      void drawBottomArrows(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h);
      void drawTopArrows(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h);
      void drawLeftArrows(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h);
      void drawRightArrows(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h);
      static FXdouble blendlinear(FXdouble middle,FXdouble pos);
      static FXdouble blendpower(FXdouble middle,FXdouble pos);
      static FXdouble blendsine(FXdouble middle,FXdouble pos);
      static FXdouble blendincreasing(FXdouble middle,FXdouble pos);
      static FXdouble blenddecreasing(FXdouble middle,FXdouble pos);
    private:
      FXGradientBar(const FXGradientBar&);
      FXGradientBar &operator=(const FXGradientBar&);
    public:
      enum {
        GRIP_NONE,
        GRIP_LOWER,
        GRIP_SEG_LOWER,
        GRIP_MIDDLE,
        GRIP_SEG_UPPER,
        GRIP_UPPER
        };
    public:
      long onPaint(FXObject*,FXSelector,void*);
      long onLeftBtnPress(FXObject*,FXSelector,void*);
      long onLeftBtnRelease(FXObject*,FXSelector,void*);
      long onMotion(FXObject*,FXSelector,void*);
      long onDNDEnter(FXObject*,FXSelector,void*);
      long onDNDLeave(FXObject*,FXSelector,void*);
      long onDNDMotion(FXObject*,FXSelector,void*);
      long onDNDDrop(FXObject*,FXSelector,void*);
      long onCmdBlending(FXObject*,FXSelector,void*);
      long onUpdBlending(FXObject*,FXSelector,void*);
      long onUpdSegColor(FXObject*,FXSelector,void*);
      long onCmdSegColor(FXObject*,FXSelector,void*);
      long onUpdRecenter(FXObject*,FXSelector,void*);
      long onCmdRecenter(FXObject*,FXSelector,void*);
      long onUpdSplit(FXObject*,FXSelector,void*);
      long onCmdSplit(FXObject*,FXSelector,void*);
      long onUpdMerge(FXObject*,FXSelector,void*);
      long onCmdMerge(FXObject*,FXSelector,void*);
      long onUpdUniform(FXObject*,FXSelector,void*);
      long onCmdUniform(FXObject*,FXSelector,void*);
      long onCmdSetHelp(FXObject*,FXSelector,void*);
      long onCmdGetHelp(FXObject*,FXSelector,void*);
      long onCmdSetTip(FXObject*,FXSelector,void*);
      long onCmdGetTip(FXObject*,FXSelector,void*);
      long onQueryHelp(FXObject*,FXSelector,void*);
      long onQueryTip(FXObject*,FXSelector,void*);
    public:
      enum{
        ID_LOWER_COLOR=FXFrame::ID_LAST,
        ID_UPPER_COLOR,
        ID_BLEND_LINEAR,
        ID_BLEND_POWER,
        ID_BLEND_SINE,
        ID_BLEND_INCREASING,
        ID_BLEND_DECREASING,
        ID_RECENTER,
        ID_SPLIT,
        ID_MERGE,
        ID_UNIFORM,
        ID_LAST
        };
    public:
    
      /// Construct a gradient bar
      FXGradientBar(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD);
    
      /// Create server-side resources
      virtual void create();
    
      /// Perform layout
      virtual void layout();
    
      /// Return default width
      virtual FXint getDefaultWidth();
    
      /// Return default height
      virtual FXint getDefaultHeight();
    
      /**
       * Obtain segment containing location x, y.
       * Returns -1 if no matching segment was found.
       */
      FXint getSegment(FXint x,FXint y) const;
    
      /**
       * Get the grip in segment sg which is closest to location (x, y),
       * one of GRIP_LOWER, GRIP_SEG_LOWER, GRIP_MIDDLE, GRIP_SEG_UPPER,
       * GRIP_UPPER or GRIP_NONE.
       */
      FXint getGrip(FXint sg,FXint x,FXint y) const;
    
      /// Return the number of segments
      FXint getNumSegments() const { return nsegs; }
    
      /**
       * Replace the current gradient segments.
       * The gradient bar makes a copy of the input segments array.
       */
      void setGradients(const FXGradient *segments,FXint nsegments);
    
      /**
       * Return a copy of the gradient segments.
       * The array of segments is allocated using FXMALLOC and should be freed
       * by the caller using FXFREE.
       */
      void getGradients(FXGradient*& segments,FXint& nsegments) const;
    
      /// Change current segment
      void setCurrentSegment(FXint index,FXbool notify=FALSE);
    
      /// Return current segment, or -1 if there is no current segment
      FXint getCurrentSegment() const { return current; }
    
      /// Change anchor segment
      void setAnchorSegment(FXint index);
    
      /// Return anchor segment, or -1 if there is no anchor segment
      FXint getAnchorSegment() const { return anchor; }
    
      /// Select segment(s)
      FXbool selectSegments(FXint fm,FXint to,FXbool notify=FALSE);
    
      /// Deselect all segments
      FXbool deselectSegments(FXbool notify);
    
      /// Returns TRUE if the specified segment is selected
      FXbool isSegmentSelected(FXint s) const;
    
      /// Set lower color of a segment
      void setSegmentLowerColor(FXint s,FXColor clr,FXbool notify=FALSE);
    
      /// Set upper color of a segment
      void setSegmentUpperColor(FXint s,FXColor clr,FXbool notify=FALSE);
    
      /// Get lower color of a segment
      FXColor getSegmentLowerColor(FXint s) const;
    
      /// Get upper color of a segment
      FXColor getSegmentUpperColor(FXint s) const;
    
      /// Move lower point of segment sg
      void moveSegmentLower(FXint sg,FXdouble val,FXbool notify=FALSE);
    
      /// Move middle point of segment sg
      void moveSegmentMiddle(FXint sg,FXdouble val,FXbool notify=FALSE);
    
      /// Move upper point of segment sg
      void moveSegmentUpper(FXint sg,FXdouble val,FXbool notify=FALSE);
    
      /// Move segments sglo to sghi to new position val
      void moveSegments(FXint sglo,FXint sghi,FXdouble val,FXbool notify=FALSE);
    
      /// Get lower value of segment sg
      FXdouble getSegmentLower(FXint sg) const;
    
      /// Get middle value of segment sg
      FXdouble getSegmentMiddle(FXint sg) const;
    
      /// Get upper value of segment sg
      FXdouble getSegmentUpper(FXint sg) const;
    
      /**
       * Get gradient ramp.
       * The ramp argument should be an array of size nramp, which will be
       * filled with the appropriate color values.
       */
      void gradient(FXColor *ramp,FXint nramp);
    
      /**
       * Get blend mode of segment, one of GRADIENT_BLEND_LINEAR,
       * GRADIENT_BLEND_POWER, GRADIENT_BLEND_SINE, GRADIENT_BLEND_INCREASING,
       * or GRADIENT_BLEND_DECREASING.
       */
      FXuint getSegmentBlend(FXint s) const;
    
      /// Split segment at the midpoint
      void splitSegments(FXint sglo,FXint sghi,FXbool notify=FALSE);
    
      /// Merge segments
      void mergeSegments(FXint sglo,FXint sghi,FXbool notify=FALSE);
    
      /// Make segments uniformly distributed
      void uniformSegments(FXint sglo,FXint sghi,FXbool notify=FALSE);
    
      /// Change blend mode of segment
      void blendSegments(FXint sglo,FXint sghi,FXuint blend=GRADIENT_BLEND_LINEAR,FXbool notify=FALSE);
    
      /// Get the gradient bar style
      FXuint getBarStyle() const;
    
      /// Change the gradient bar style
      void setBarStyle(FXuint style);
    
      /// Set color
      void setSelectColor(FXColor clr);
    
      /// Get color
      FXColor getSelectColor() const { return selectColor; }
    
      /// Set status line help text for this gradient bar
      void setHelpText(const FXString& text){ help=text; }
    
      /// Get status line help text for this gradient bar
      const FXString& getHelpText() const { return help; }
    
      /// Set tool tip message for this gradient bar
      void setTipText(const FXString& text){ tip=text; }
    
      /// Get tool tip message for this gradient bar
      const FXString& getTipText() const { return tip; }
    
      /// Save gradient bar to a stream
      virtual void save(FXStream& store) const;
    
      /// Load gradient bar from a stream
      virtual void load(FXStream& store);
    
      /// Destructor
      virtual ~FXGradientBar();
      };
    
    
    }
    
    #endif