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:
15:e69fd74d42e4
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 12:63db16fea709 1 #ifndef SIMPLEGUI_LINKED_LIST_H
duncanFrance 12:63db16fea709 2 #define SIMPLEGUI_LINKED_LIST_H
duncanFrance 12:63db16fea709 3
duncanFrance 12:63db16fea709 4 #include "mbed.h"
duncanFrance 12:63db16fea709 5
duncanFrance 12:63db16fea709 6 template<class T>
duncanFrance 12:63db16fea709 7 class LinkedListNode
duncanFrance 12:63db16fea709 8 {
duncanFrance 12:63db16fea709 9
duncanFrance 12:63db16fea709 10 public:
duncanFrance 12:63db16fea709 11
duncanFrance 12:63db16fea709 12 LinkedListNode(T* nodeData) : data(nodeData), next(NULL) {}
duncanFrance 12:63db16fea709 13 ~LinkedListNode() {}
duncanFrance 12:63db16fea709 14
duncanFrance 12:63db16fea709 15 T* data;
duncanFrance 12:63db16fea709 16 LinkedListNode<T>* next;
duncanFrance 12:63db16fea709 17 };
duncanFrance 12:63db16fea709 18
duncanFrance 12:63db16fea709 19 template<class T>
duncanFrance 18:d849f3ada858 20 class LinkedListIterator {
duncanFrance 18:d849f3ada858 21 public:
duncanFrance 18:d849f3ada858 22 LinkedListIterator(LinkedListNode<T> *first) {
duncanFrance 18:d849f3ada858 23 _current = first;
duncanFrance 18:d849f3ada858 24 }
duncanFrance 18:d849f3ada858 25
duncanFrance 18:d849f3ada858 26 ~LinkedListIterator() {}
duncanFrance 18:d849f3ada858 27
duncanFrance 18:d849f3ada858 28 T* next() {
duncanFrance 18:d849f3ada858 29
duncanFrance 18:d849f3ada858 30 LinkedListNode<T>* p = _current;
duncanFrance 18:d849f3ada858 31 if(p != NULL) {
duncanFrance 18:d849f3ada858 32 _current = _current->next;
duncanFrance 18:d849f3ada858 33 return p->data;
duncanFrance 18:d849f3ada858 34 }
duncanFrance 18:d849f3ada858 35
duncanFrance 18:d849f3ada858 36 return NULL;
duncanFrance 18:d849f3ada858 37 }
duncanFrance 18:d849f3ada858 38
duncanFrance 18:d849f3ada858 39 private:
duncanFrance 18:d849f3ada858 40 LinkedListNode<T>* _current;
duncanFrance 18:d849f3ada858 41 };
duncanFrance 18:d849f3ada858 42
duncanFrance 18:d849f3ada858 43 template<class T>
duncanFrance 12:63db16fea709 44 class LinkedList
duncanFrance 12:63db16fea709 45 {
duncanFrance 12:63db16fea709 46
duncanFrance 12:63db16fea709 47 public:
duncanFrance 12:63db16fea709 48
duncanFrance 15:e69fd74d42e4 49 LinkedList() : _first(NULL), _next(NULL), _current(NULL), _size(0) {}
duncanFrance 12:63db16fea709 50 ~LinkedList() {}
duncanFrance 18:d849f3ada858 51
duncanFrance 18:d849f3ada858 52 LinkedListIterator<T> getIterator() {
duncanFrance 18:d849f3ada858 53 LinkedListIterator<T> iterator(_first);
duncanFrance 18:d849f3ada858 54 return iterator;
duncanFrance 18:d849f3ada858 55 }
duncanFrance 12:63db16fea709 56
duncanFrance 12:63db16fea709 57 void append(T* data) {
duncanFrance 12:63db16fea709 58
duncanFrance 12:63db16fea709 59 if(_first == NULL) {
duncanFrance 12:63db16fea709 60
duncanFrance 12:63db16fea709 61 _first = new LinkedListNode<T>(data);
duncanFrance 12:63db16fea709 62
duncanFrance 12:63db16fea709 63 } else {
duncanFrance 12:63db16fea709 64
duncanFrance 12:63db16fea709 65 LinkedListNode<T>* p = _first;
duncanFrance 12:63db16fea709 66 LinkedListNode<T>* d = new LinkedListNode<T>(data);
duncanFrance 12:63db16fea709 67
duncanFrance 12:63db16fea709 68 while(p->next != NULL) {
duncanFrance 12:63db16fea709 69 p = p->next;
duncanFrance 12:63db16fea709 70 }
duncanFrance 12:63db16fea709 71
duncanFrance 12:63db16fea709 72 p->next = d;
duncanFrance 12:63db16fea709 73 }
duncanFrance 15:e69fd74d42e4 74 _size++;
duncanFrance 12:63db16fea709 75 }
duncanFrance 12:63db16fea709 76
duncanFrance 12:63db16fea709 77 void appendOnce(T* data) {
duncanFrance 12:63db16fea709 78
duncanFrance 12:63db16fea709 79 if(_first == NULL) {
duncanFrance 12:63db16fea709 80
duncanFrance 12:63db16fea709 81 _first = new LinkedListNode<T>(data);
duncanFrance 15:e69fd74d42e4 82 _size++;
duncanFrance 12:63db16fea709 83
duncanFrance 12:63db16fea709 84 } else {
duncanFrance 12:63db16fea709 85
duncanFrance 12:63db16fea709 86 LinkedListNode<T>* p = _first;
duncanFrance 12:63db16fea709 87 LinkedListNode<T>* d = new LinkedListNode<T>(data);
duncanFrance 12:63db16fea709 88
duncanFrance 12:63db16fea709 89 while(p->next != NULL) {
duncanFrance 12:63db16fea709 90
duncanFrance 12:63db16fea709 91 if(p->data == data) {
duncanFrance 12:63db16fea709 92 return;
duncanFrance 12:63db16fea709 93 }
duncanFrance 12:63db16fea709 94
duncanFrance 12:63db16fea709 95 p = p->next;
duncanFrance 12:63db16fea709 96 }
duncanFrance 12:63db16fea709 97
duncanFrance 12:63db16fea709 98 p->next = d;
duncanFrance 15:e69fd74d42e4 99 _size++;
duncanFrance 12:63db16fea709 100 }
duncanFrance 12:63db16fea709 101 }
duncanFrance 12:63db16fea709 102 void remove(T* data) {
duncanFrance 12:63db16fea709 103
duncanFrance 12:63db16fea709 104 if(_first == NULL) {
duncanFrance 12:63db16fea709 105 return;
duncanFrance 12:63db16fea709 106 }
duncanFrance 12:63db16fea709 107
duncanFrance 12:63db16fea709 108 LinkedListNode<T>* next = _first;
duncanFrance 12:63db16fea709 109 LinkedListNode<T>* prev = _first;
duncanFrance 12:63db16fea709 110
duncanFrance 12:63db16fea709 111 if(_first->data == data) {
duncanFrance 12:63db16fea709 112 _first = _first->next;
duncanFrance 12:63db16fea709 113 delete next;
duncanFrance 15:e69fd74d42e4 114 _size--;
duncanFrance 12:63db16fea709 115 } else {
duncanFrance 12:63db16fea709 116 next = _first->next;
duncanFrance 12:63db16fea709 117 while(next) {
duncanFrance 12:63db16fea709 118 if(next->data == data) {
duncanFrance 12:63db16fea709 119 prev->next = next->next;
duncanFrance 12:63db16fea709 120 delete next;
duncanFrance 15:e69fd74d42e4 121 _size--;
duncanFrance 12:63db16fea709 122 return;
duncanFrance 12:63db16fea709 123 }
duncanFrance 12:63db16fea709 124 prev = next;
duncanFrance 12:63db16fea709 125 next = next->next;
duncanFrance 12:63db16fea709 126 }
duncanFrance 12:63db16fea709 127 }
duncanFrance 12:63db16fea709 128 }
duncanFrance 12:63db16fea709 129
duncanFrance 12:63db16fea709 130 void clear() {
duncanFrance 12:63db16fea709 131 LinkedListNode<T>* here = _first;
duncanFrance 12:63db16fea709 132 LinkedListNode<T>* next;
duncanFrance 12:63db16fea709 133 while(here != NULL) {
duncanFrance 12:63db16fea709 134 next = here->next;
duncanFrance 12:63db16fea709 135 delete here;
duncanFrance 12:63db16fea709 136 here = next;
duncanFrance 12:63db16fea709 137 }
duncanFrance 12:63db16fea709 138 _first = NULL;
duncanFrance 15:e69fd74d42e4 139 _size = 0;
duncanFrance 12:63db16fea709 140 }
duncanFrance 12:63db16fea709 141
duncanFrance 12:63db16fea709 142 void reset() {
duncanFrance 12:63db16fea709 143 _current = _first;
duncanFrance 12:63db16fea709 144 }
duncanFrance 12:63db16fea709 145
duncanFrance 12:63db16fea709 146 T* next() {
duncanFrance 12:63db16fea709 147
duncanFrance 12:63db16fea709 148 LinkedListNode<T>* p = _current;
duncanFrance 12:63db16fea709 149 if(p != NULL) {
duncanFrance 12:63db16fea709 150 _current = _current->next;
duncanFrance 12:63db16fea709 151 return p->data;
duncanFrance 12:63db16fea709 152 }
duncanFrance 12:63db16fea709 153
duncanFrance 12:63db16fea709 154 return NULL;
duncanFrance 12:63db16fea709 155 }
duncanFrance 12:63db16fea709 156
duncanFrance 12:63db16fea709 157 bool contains(T *thing) {
duncanFrance 12:63db16fea709 158 LinkedListNode<T>* here = _first;
duncanFrance 12:63db16fea709 159 while(here != NULL) {
duncanFrance 12:63db16fea709 160 if(here->data == thing) {
duncanFrance 12:63db16fea709 161 return true;
duncanFrance 12:63db16fea709 162 }
duncanFrance 12:63db16fea709 163 here = here->next;
duncanFrance 12:63db16fea709 164 }
duncanFrance 12:63db16fea709 165 return false;
duncanFrance 12:63db16fea709 166 }
duncanFrance 15:e69fd74d42e4 167
duncanFrance 15:e69fd74d42e4 168 int size() {
duncanFrance 15:e69fd74d42e4 169 return _size;
duncanFrance 15:e69fd74d42e4 170 }
duncanFrance 12:63db16fea709 171
duncanFrance 12:63db16fea709 172
duncanFrance 12:63db16fea709 173 protected:
duncanFrance 12:63db16fea709 174
duncanFrance 12:63db16fea709 175 LinkedListNode<T>* _first;
duncanFrance 12:63db16fea709 176 LinkedListNode<T>* _next;
duncanFrance 12:63db16fea709 177 LinkedListNode<T>* _current;
duncanFrance 15:e69fd74d42e4 178 int _size;
duncanFrance 12:63db16fea709 179
duncanFrance 12:63db16fea709 180 };
duncanFrance 12:63db16fea709 181
duncanFrance 12:63db16fea709 182 #endif