Foundation classes for a basic GUI implementing simple widgets and events

Dependents:   TouchScreenGUIDemo

Committer:
duncanFrance
Date:
Sat May 28 14:50:14 2016 +0000
Revision:
18:d849f3ada858
Parent:
16:e9a771ecfdbe
Moved the event queue into the EventDispatcher; Improved event handling across Window/Widget

Who changed what in which revision?

UserRevisionLine numberNew contents of line
duncanFrance 0:0a590815d51c 1 #ifndef SIMPLEGUI_WIDGET_H
duncanFrance 0:0a590815d51c 2 #define SIMPLEGUI_WIDGET_H
duncanFrance 0:0a590815d51c 3
duncanFrance 12:63db16fea709 4 class Widget;
duncanFrance 12:63db16fea709 5
duncanFrance 12:63db16fea709 6 #include "GraphicsContext.h"
duncanFrance 12:63db16fea709 7 #include "EventListener.h"
duncanFrance 12:63db16fea709 8 #include "Rectangle.h"
duncanFrance 13:6714534e7974 9 #include "Point.h"
duncanFrance 0:0a590815d51c 10
duncanFrance 0:0a590815d51c 11 /**
duncanFrance 0:0a590815d51c 12 * A basic widget draws itself in a rectangular area
duncanFrance 0:0a590815d51c 13 **/
duncanFrance 0:0a590815d51c 14
duncanFrance 12:63db16fea709 15 class Widget : public EventListener
duncanFrance 12:63db16fea709 16 {
duncanFrance 12:63db16fea709 17
duncanFrance 12:63db16fea709 18 public:
duncanFrance 12:63db16fea709 19
duncanFrance 12:63db16fea709 20 Widget(GraphicsContext* context);
duncanFrance 12:63db16fea709 21
duncanFrance 12:63db16fea709 22 virtual void setParent(Widget* parent);
duncanFrance 16:e9a771ecfdbe 23 virtual Widget *getParent();
duncanFrance 12:63db16fea709 24
duncanFrance 12:63db16fea709 25 /********************************************************
duncanFrance 12:63db16fea709 26 * Methods relating to containment
duncanFrance 12:63db16fea709 27 * In the base class these methods do nothing.
duncanFrance 12:63db16fea709 28 * They are implemented in container classes
duncanFrance 12:63db16fea709 29 ********************************************************/
duncanFrance 12:63db16fea709 30 virtual void attach(Widget *widget) {}
duncanFrance 12:63db16fea709 31 virtual void detach(Widget *widget) {}
duncanFrance 12:63db16fea709 32
duncanFrance 12:63db16fea709 33 /********************************************************
duncanFrance 12:63db16fea709 34 * Common Widget methods
duncanFrance 18:d849f3ada858 35 ********************************************************/
duncanFrance 12:63db16fea709 36 virtual void setLocation(int x, int y);
duncanFrance 12:63db16fea709 37 virtual void setSize(int width, int height);
duncanFrance 12:63db16fea709 38 virtual void setWidth(int width);
duncanFrance 12:63db16fea709 39 virtual void setHeight(int height);
duncanFrance 12:63db16fea709 40 virtual int x();
duncanFrance 12:63db16fea709 41 virtual int y();
duncanFrance 12:63db16fea709 42 virtual int height();
duncanFrance 12:63db16fea709 43 virtual int width();
duncanFrance 13:6714534e7974 44
duncanFrance 13:6714534e7974 45 virtual void setOffset(int x, int y);
duncanFrance 13:6714534e7974 46 virtual int offsetX();
duncanFrance 13:6714534e7974 47 virtual int offsetY();
duncanFrance 12:63db16fea709 48
duncanFrance 12:63db16fea709 49 virtual void setForeground(uint16_t color);
duncanFrance 12:63db16fea709 50 virtual void setBackground(uint16_t color);
duncanFrance 12:63db16fea709 51
duncanFrance 16:e9a771ecfdbe 52 virtual void setPadding(int pixels);
duncanFrance 16:e9a771ecfdbe 53 virtual void setBorder(int width, uint16_t colour);
duncanFrance 12:63db16fea709 54
duncanFrance 12:63db16fea709 55 /**
duncanFrance 12:63db16fea709 56 * Cause the widget to redraw itself if is is dirty or damaged
duncanFrance 12:63db16fea709 57 **/
duncanFrance 12:63db16fea709 58 virtual void draw();
duncanFrance 12:63db16fea709 59 virtual void clear();
duncanFrance 12:63db16fea709 60
duncanFrance 12:63db16fea709 61 void show();
duncanFrance 12:63db16fea709 62 void hide();
duncanFrance 12:63db16fea709 63 bool isHidden();
duncanFrance 12:63db16fea709 64
duncanFrance 18:d849f3ada858 65 /**
duncanFrance 18:d849f3ada858 66 * Implementation of EventListener
duncanFrance 18:d849f3ada858 67 **/
duncanFrance 18:d849f3ada858 68 virtual void handleEvent(Event e);
duncanFrance 18:d849f3ada858 69 virtual void setEventHandler(EventHandler *handler);
duncanFrance 18:d849f3ada858 70 virtual void unsetEventHandler(EventHandler *handler);
duncanFrance 0:0a590815d51c 71
duncanFrance 12:63db16fea709 72 bool intersects(Widget *widget);
duncanFrance 12:63db16fea709 73
duncanFrance 12:63db16fea709 74 /**
duncanFrance 12:63db16fea709 75 * Mark the widget as needing to be redrawn
duncanFrance 12:63db16fea709 76 **/
duncanFrance 12:63db16fea709 77 void dirty();
duncanFrance 12:63db16fea709 78 bool isDirty();
duncanFrance 12:63db16fea709 79 /**
duncanFrance 12:63db16fea709 80 * Mark the widget and all its children as dirty
duncanFrance 12:63db16fea709 81 **/
duncanFrance 12:63db16fea709 82 virtual void dirtyAll();
duncanFrance 12:63db16fea709 83
duncanFrance 12:63db16fea709 84 /**
duncanFrance 12:63db16fea709 85 * Mark the widget as having changed dimensions or location
duncanFrance 12:63db16fea709 86 **/
duncanFrance 12:63db16fea709 87 void damage();
duncanFrance 12:63db16fea709 88 bool isDamaged();
duncanFrance 12:63db16fea709 89
duncanFrance 12:63db16fea709 90 void adjust();
duncanFrance 12:63db16fea709 91
duncanFrance 12:63db16fea709 92 /**
duncanFrance 12:63db16fea709 93 * Convenience method
duncanFrance 12:63db16fea709 94 **/
duncanFrance 12:63db16fea709 95 GraphicsDisplay *display();
duncanFrance 18:d849f3ada858 96 virtual void _reenumerateEvents();
duncanFrance 18:d849f3ada858 97 virtual void _reenumerateHandledEvents();
duncanFrance 18:d849f3ada858 98 virtual uint16_t _getHandledEvents();
duncanFrance 12:63db16fea709 99
duncanFrance 12:63db16fea709 100 protected:
duncanFrance 8:a460cabc85ac 101
duncanFrance 12:63db16fea709 102 virtual void _draw();
duncanFrance 12:63db16fea709 103 virtual void _clear();
duncanFrance 12:63db16fea709 104
duncanFrance 12:63db16fea709 105 virtual void _dirty();
duncanFrance 12:63db16fea709 106 virtual void _damage();
duncanFrance 12:63db16fea709 107 virtual void _adjust();
duncanFrance 12:63db16fea709 108
duncanFrance 18:d849f3ada858 109 /**
duncanFrance 18:d849f3ada858 110 * Methods to help with event handling
duncanFrance 18:d849f3ada858 111 **/
duncanFrance 18:d849f3ada858 112 bool _isEventTarget(Event e);
duncanFrance 18:d849f3ada858 113
duncanFrance 18:d849f3ada858 114 uint16_t _handledEvents;
duncanFrance 12:63db16fea709 115
duncanFrance 12:63db16fea709 116 Widget* _parent;
duncanFrance 12:63db16fea709 117 GraphicsContext* _context;
duncanFrance 12:63db16fea709 118 uint16_t _fg, _bg;
duncanFrance 12:63db16fea709 119
duncanFrance 13:6714534e7974 120 Point _offset;
duncanFrance 12:63db16fea709 121 Rectangle _outer;
duncanFrance 12:63db16fea709 122 Rectangle _inner;
duncanFrance 12:63db16fea709 123
duncanFrance 12:63db16fea709 124 bool _hidden;
duncanFrance 12:63db16fea709 125 int _padding;
duncanFrance 12:63db16fea709 126 int _borderWidth;
duncanFrance 12:63db16fea709 127 uint16_t _borderColour;
duncanFrance 8:a460cabc85ac 128
duncanFrance 12:63db16fea709 129 bool _adjusting;
duncanFrance 8:a460cabc85ac 130
duncanFrance 12:63db16fea709 131 bool _dirtied;
duncanFrance 12:63db16fea709 132 bool _dirtying;
duncanFrance 12:63db16fea709 133
duncanFrance 12:63db16fea709 134 bool _damaged;
duncanFrance 12:63db16fea709 135 bool _damaging;
duncanFrance 18:d849f3ada858 136
duncanFrance 18:d849f3ada858 137 LinkedList<EventHandler> _handlers;
duncanFrance 0:0a590815d51c 138 };
duncanFrance 0:0a590815d51c 139
duncanFrance 0:0a590815d51c 140 #endif