PieDock  1.6.3
PieMenu.h
1 /*
2  * O ,-
3  * o . - ' ,-
4  * . ` . ,
5  * ( )) . (
6  * `-;_ . - `.`.
7  * `._'
8  *
9  * Copyright (c) 2007-2010 Markus Fisch <mf@markusfisch.de>
10  *
11  * Licensed under the MIT license:
12  * http://www.opensource.org/licenses/mit-license.php
13  */
14 #ifndef _PieDock_PieMenu_
15 #define _PieDock_PieMenu_
16 
17 #include "Application.h"
18 #include "Surface.h"
19 #include "Blender.h"
20 #include "Icon.h"
21 #include "Menu.h"
22 
23 #include <vector>
24 #include <math.h>
25 
26 namespace PieDock
27 {
33  class PieMenu : public Menu
34  {
35  public:
36  PieMenu( Application *, Surface & );
37  virtual ~PieMenu() {}
38  inline const bool cursorInCenter() const {
39  return (getSelected() == 0); }
40  inline const int &getRadius() const { return maxRadius; }
41  inline Blender *getBlender() { return &blender; }
42  inline void invalidate() { lastX = lastY = -1; }
43  virtual bool update( std::string = "", Window = 0 );
44  virtual bool isObsolete( int, int );
45  virtual void draw( int, int );
46  virtual void turn( double );
47  virtual void turn( int );
48  virtual void setTwistForSelection();
49 
50  protected:
58  inline virtual double getAngleDifference( double a, double b )
59  {
60  double c = a-b;
61  double d;
62 
63  if( a > b )
64  d = a-(b+radiansPerCircle);
65  else
66  d = a-(b-radiansPerCircle);
67 
68  if( fabs( c ) < fabs( d ) )
69  return c;
70 
71  return d;
72  }
73 
80  inline virtual double getValidAngle( double a )
81  {
82  if( a < -M_PI )
83  a += radiansPerCircle;
84  else if( a > M_PI )
85  a -= radiansPerCircle;
86 
87  return a;
88  }
89 
90  private:
91  static const double radiansPerCircle;
92  static const double turnSteps[];
93 
94  Blender blender;
95  int size;
96  int maxRadius;
97  int radius;
98  double twist;
99  int centerX;
100  int centerY;
101  int lastX;
102  int lastY;
103  double *turnStack;
104  double *turnBy;
105  };
106 }
107 
108 #endif