]> git.mxchange.org Git - flightgear.git/blob - src/GUI/WaypointList.hxx
Launcher: Maintain aircraft selection better
[flightgear.git] / src / GUI / WaypointList.hxx
1 /**
2  * WaypointList.hxx - scrolling list of waypoints, with special formatting
3  */
4
5 #ifndef GUI_WAYPOINT_LIST_HXX
6 #define GUI_WAYPOINT_LIST_HXX
7
8 #include <simgear/compiler.h>
9 #include <simgear/timing/timestamp.hxx>
10
11 #include <plib/pu.h>
12
13 #include "FGPUIDialog.hxx" // for GUI_ID
14
15 // forward decls
16 class puaScrollBar;
17 class SGCallback;
18 class RoutePath;
19
20 namespace flightgear {
21   class Waypt;
22   class FlightPlan;
23 }
24
25 class WaypointList : public puFrame, public GUI_ID
26 {
27 public:
28   WaypointList(int x, int y, int width, int height);
29   virtual ~WaypointList();
30
31   virtual void setSize(int width, int height);
32   virtual int checkHit ( int button, int updown, int x, int y);
33   virtual void doHit( int button, int updown, int x, int y ) ;
34   virtual void draw( int dx, int dy ) ;
35   virtual int checkKey(int key, int updown);
36   virtual void invokeDownCallback (void);
37   
38   void setSelected(int rowIndex);
39   int getSelected();
40   
41   /**
42    * Do we want a vertical scrollbar (or similar)
43    */
44   bool wantsVScroll() const;
45   
46   /**
47    * Get scrollbar position as a percentage of total range.
48    * returns negative number if scrolling is not possible
49    */
50   float getVScrollPercent() const;
51   
52   /**
53    *
54    */
55   void setVScrollPercent(float perc);
56   
57   /**
58    * Get required thumb size as percentage of total height
59    */
60   float getVScrollThumbPercent() const;
61   
62   int numVisibleRows() const;
63   
64   void ensureRowVisible(int row);
65   
66   void setUpdateCallback(SGCallback* cb);
67   void setScrollCallback(SGCallback* cb);
68   
69   /**
70    * Abstract interface for waypoint source
71    */
72   class Model
73   {
74   public:
75     virtual ~Model() { }
76     
77     virtual unsigned int numWaypoints() const = 0;
78     virtual int currentWaypoint() const = 0;
79     virtual flightgear::Waypt* waypointAt(unsigned int index) const = 0;
80   
81     virtual flightgear::FlightPlan* flightplan() const = 0;
82     
83   // update notifications
84     virtual void setUpdateCallback(SGCallback* cb) = 0;
85   
86   // editing operations
87     virtual void deleteAt(unsigned int index) = 0;
88     virtual void moveWaypointToIndex(unsigned int srcIndex, unsigned int dstIndex) = 0;
89   };
90   
91   void setModel(Model* model);
92   
93   unsigned int numWaypoints() const;
94 protected:
95
96 private:
97   void drawRow(int dx, int dy, int rowIndex, int yOrigin, const RoutePath& path);
98   void drawRowText(int x, int baseline, int rowIndex, const RoutePath &path);
99
100   void handleDrag(int x, int y);
101   void doDrop(int x, int y);
102   void doDragScroll();
103   
104   /**
105    * Pixel height of a row, including padding
106    */
107   int rowHeightPx() const;
108   
109   /**
110    * model row corresponding to an on-screen y-value
111    */
112   int rowForY(int y) const;
113   
114   /**
115    * reutrn rowheight * total number of rows, i.e the height we'd
116    * need to be to show every row without scrolling
117    */
118   int totalHeightPx() const;
119   
120   /**
121    * Pixel scroll range, based on widget height and number of rows
122    */
123   int scrollRangePx() const;
124   
125   int firstVisibleRow() const;
126   int lastVisibleRow() const;
127
128   int numFullyVisibleRows() const;
129   int firstFullyVisibleRow() const;
130   int lastFullyVisibleRow() const;
131     
132   void modelUpdateCallback();
133   
134   int _scrollPx; // scroll ammount (in pixels)
135   int _heightPx;
136   
137   bool _dragging;
138   int _dragSourceRow;
139   int _dragTargetRow;
140   int _mouseDownX, _mouseDownY;
141   
142   int _dragScroll;
143   SGTimeStamp _dragScrollTime;
144
145   bool _showLatLon;
146   Model* _model;
147   SGCallback* _updateCallback;
148   SGCallback* _scrollCallback;
149  
150   SGTimeStamp _blinkTimer;
151   bool _blink;
152   int _arrowWidth;
153 };
154
155 class ScrolledWaypointList : public puGroup
156 {
157 public:
158   ScrolledWaypointList(int x, int y, int width, int height);
159   
160   virtual void setSize(int width, int height);
161   
162   void setScrollPercent(float v);
163   
164   virtual void setValue(float v);
165   virtual void setValue(int v);
166 private:  
167   void init(int w, int h);
168   
169   void updateScroll();
170   void updateWantsScroll(int w, int h);
171   
172   void modelUpdated();
173   
174   puaScrollBar* _scrollbar;
175   WaypointList* _list;
176   int _scrollWidth;
177   bool _hasVScroll;
178 };
179
180 #endif // GUI_WAYPOINT_LIST_HXX