[324] | 1 | // %flair:license{
|
---|
| 2 | // This file is part of the Flair framework distributed under the
|
---|
| 3 | // CECILL-C License, Version 1.0.
|
---|
| 4 | // %flair:license}
|
---|
| 5 | #include "Layout.h"
|
---|
| 6 | #include "TabWidget.h"
|
---|
| 7 | #include "GroupBox.h"
|
---|
| 8 | #include "GridLayout.h"
|
---|
| 9 | #include "SpinBox.h"
|
---|
| 10 | #include "DoubleSpinBox.h"
|
---|
| 11 | #include "Vector3DSpinBox.h"
|
---|
| 12 | #include "CheckBox.h"
|
---|
| 13 | #include "ComboBox.h"
|
---|
| 14 | #include "PushButton.h"
|
---|
| 15 | #include "TextEdit.h"
|
---|
| 16 | #include "Label.h"
|
---|
| 17 | #include "DataPlot1D.h"
|
---|
| 18 | #include "DataPlot2D.h"
|
---|
| 19 | #include "RangeFinderPlot.h"
|
---|
| 20 | #include "UsSensorPlot.h"
|
---|
| 21 | #include "Picture.h"
|
---|
| 22 | #include "Map.h"
|
---|
| 23 | #include <QGeoCoordinate>
|
---|
| 24 | #include <QGridLayout>
|
---|
| 25 | #include "ListWidget.h"
|
---|
| 26 | #include <QStringList>
|
---|
| 27 |
|
---|
| 28 | Layout::Layout(QWidget *parent, XmlWidget *xml, QString name, QString type)
|
---|
| 29 | : XmlWidget(name, type, xml) {
|
---|
| 30 | qgridlayout = new QGridLayout(parent);
|
---|
| 31 | Constructor(name);
|
---|
| 32 | }
|
---|
| 33 |
|
---|
| 34 | Layout::Layout(Layout *parent, QString name, QString type)
|
---|
| 35 | : XmlWidget(name, type, parent) {
|
---|
| 36 | qgridlayout = new QGridLayout(new QWidget());
|
---|
| 37 | Constructor(name);
|
---|
| 38 | }
|
---|
| 39 |
|
---|
| 40 | void Layout::Constructor(QString name) {
|
---|
| 41 | visible_widget = qgridlayout->parentWidget();
|
---|
| 42 | // if(visible_widget==NULL) fprintf(stderr,"null\n");
|
---|
| 43 | qgridlayout->setObjectName(name);
|
---|
| 44 | // fprintf(stderr,"layout\n%s\n",XmlDoc().toString().toLocal8Bit().constData());
|
---|
| 45 | SetIsContainer(true);
|
---|
| 46 | SetIsExpandable(true);
|
---|
| 47 |
|
---|
| 48 | qgridlayout->setHorizontalSpacing(2);
|
---|
| 49 | qgridlayout->setVerticalSpacing(2);
|
---|
| 50 | qgridlayout->setContentsMargins(2, 2, 2, 2);
|
---|
| 51 |
|
---|
| 52 | // splitter = new QSplitter();
|
---|
| 53 | // addWidget(splitter);
|
---|
| 54 | /*
|
---|
| 55 | QWidget *widget = new QWidget();
|
---|
| 56 | //QHBoxLayout *parentLayout = new QHBoxLayout();
|
---|
| 57 | widget->setLayout(this);
|
---|
| 58 | parent->addWidget(widget);
|
---|
| 59 | //QTabWidget *tabWidget = new QTabWidget();
|
---|
| 60 | //parentLayout->addWidget(tabWidget);*/
|
---|
| 61 | }
|
---|
| 62 |
|
---|
| 63 | Layout::~Layout() { delete qgridlayout; }
|
---|
| 64 |
|
---|
| 65 | void Layout::addWidget(QWidget *widget, int row, int column) {
|
---|
| 66 | qgridlayout->addWidget(widget, row, column);
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | QGridLayout *Layout::getQGridLayout() { return qgridlayout; }
|
---|
| 70 |
|
---|
| 71 | void Layout::XmlEvent(QDomElement *dom) {
|
---|
| 72 | XmlWidget *widget = NULL;
|
---|
| 73 | QString type = dom->tagName();
|
---|
| 74 | QString name = dom->attribute("name");
|
---|
| 75 | QString old_name = dom->attribute("old_name");
|
---|
| 76 | int row = dom->attribute("row").toInt();
|
---|
| 77 | int col = dom->attribute("col").toInt();
|
---|
| 78 |
|
---|
| 79 | // initially rowCount()=1 and columnCount()=1 but count()=0 !
|
---|
| 80 | // new row
|
---|
| 81 | if (row == -1 && col == -1) {
|
---|
| 82 | row = qgridlayout->rowCount();
|
---|
| 83 | if (qgridlayout->count() == 0)
|
---|
| 84 | row = 0;
|
---|
| 85 | col = 0;
|
---|
| 86 | }
|
---|
| 87 | // last row last col
|
---|
| 88 | if (row == -1 && col == 0) {
|
---|
| 89 | row = qgridlayout->rowCount() - 1;
|
---|
| 90 | int i;
|
---|
| 91 | for (i = 0; i <= qgridlayout->columnCount(); i++) {
|
---|
| 92 | if (qgridlayout->itemAtPosition(row, i) == NULL)
|
---|
| 93 | break;
|
---|
| 94 | }
|
---|
| 95 | col = i;
|
---|
| 96 | }
|
---|
| 97 | // if an item already exists at this position, put it on a new row
|
---|
| 98 | if (qgridlayout->itemAtPosition(row, col) != NULL) {
|
---|
| 99 | fprintf(stderr,"widget %s: (%i,%i) already exists\n", name.toLocal8Bit().constData(),row, col);
|
---|
| 100 | row = qgridlayout->rowCount();
|
---|
| 101 | fprintf(stderr,"using (%i,%i) for %s\n", row, col,name.toLocal8Bit().constData());
|
---|
| 102 | }
|
---|
| 103 |
|
---|
| 104 | if (type == "TabWidget") {
|
---|
| 105 | int position = dom->attribute("position").toInt();
|
---|
| 106 | widget =
|
---|
| 107 | new TabWidget(this, row, col, name, (QTabWidget::TabPosition)position);
|
---|
| 108 | }
|
---|
| 109 | if (type == "GroupBox") {
|
---|
| 110 | widget = new GroupBox(this, row, col, name);
|
---|
| 111 | }
|
---|
| 112 | if (type == "GridLayout") {
|
---|
| 113 | widget = new GridLayout(this, row, col, name);
|
---|
| 114 | }
|
---|
| 115 | if (type == "SpinBox") {
|
---|
| 116 | int value = dom->attribute("value").toInt();
|
---|
| 117 | QString suffix = dom->attribute("suffix");
|
---|
| 118 | int min = dom->attribute("min").toInt();
|
---|
| 119 | int max = dom->attribute("max").toInt();
|
---|
| 120 | int step = dom->attribute("step").toInt();
|
---|
| 121 | widget = new SpinBox(this, row, col, name, suffix, value, min, max, step);
|
---|
| 122 | }
|
---|
| 123 | if (type == "DoubleSpinBox") {
|
---|
| 124 | QString value = dom->attribute("value");
|
---|
| 125 | QString suffix = dom->attribute("suffix");
|
---|
| 126 | double min = dom->attribute("min").toDouble();
|
---|
| 127 | double max = dom->attribute("max").toDouble();
|
---|
| 128 | double step = dom->attribute("step").toDouble();
|
---|
| 129 | int decimals = dom->attribute("decimals").toInt();
|
---|
| 130 | widget = new DoubleSpinBox(this, row, col, name, suffix, value, min, max,
|
---|
| 131 | step, decimals);
|
---|
| 132 | }
|
---|
| 133 | if (type == "Vector3DSpinBox") {
|
---|
| 134 | QString value[3];
|
---|
| 135 | value[0] = dom->attribute("value_x");
|
---|
| 136 | value[1] = dom->attribute("value_y");
|
---|
| 137 | value[2] = dom->attribute("value_z");
|
---|
| 138 | double min = dom->attribute("min").toDouble();
|
---|
| 139 | double max = dom->attribute("max").toDouble();
|
---|
| 140 | double step = dom->attribute("step").toDouble();
|
---|
| 141 | int decimals = dom->attribute("decimals").toInt();
|
---|
| 142 | widget = new Vector3DSpinBox(this, row, col, name, value, min, max, step,
|
---|
| 143 | decimals);
|
---|
| 144 | }
|
---|
| 145 | if (type == "CheckBox") {
|
---|
| 146 | int value = dom->attribute("value").toInt();
|
---|
| 147 | widget = new CheckBox(this, row, col, name, value);
|
---|
| 148 | }
|
---|
| 149 | if (type == "ComboBox") {
|
---|
| 150 | int value = dom->attribute("value").toInt();
|
---|
| 151 | widget = new ComboBox(this, row, col, name, value);
|
---|
| 152 | }
|
---|
| 153 | if (type == "PushButton") {
|
---|
| 154 | widget = new PushButton(this, row, col, name);
|
---|
| 155 | }
|
---|
| 156 | if (type == "DataPlot1D") {
|
---|
| 157 | float ymin = dom->attribute("min").toFloat();
|
---|
| 158 | float ymax = dom->attribute("max").toFloat();
|
---|
| 159 | int enabled = dom->attribute("enabled").toInt();
|
---|
| 160 | int period = dom->attribute("period").toInt();
|
---|
| 161 | if (enabled == 1) {
|
---|
| 162 | widget = new DataPlot1D(this, row, col, name, ymin, ymax, true, period);
|
---|
| 163 | } else {
|
---|
| 164 | widget = new DataPlot1D(this, row, col, name, ymin, ymax, false, 100);
|
---|
| 165 | }
|
---|
| 166 | }
|
---|
| 167 | if (type == "DataPlot2D") {
|
---|
| 168 | float xmin = dom->attribute("xmin").toFloat();
|
---|
| 169 | float xmax = dom->attribute("xmax").toFloat();
|
---|
| 170 | float ymin = dom->attribute("ymin").toFloat();
|
---|
| 171 | float ymax = dom->attribute("ymax").toFloat();
|
---|
| 172 | QString x_name = dom->attribute("x_name");
|
---|
| 173 | QString y_name = dom->attribute("y_name");
|
---|
| 174 | int enabled = dom->attribute("enabled").toInt();
|
---|
| 175 | int period = dom->attribute("period").toInt();
|
---|
| 176 | if (enabled == 1) {
|
---|
| 177 | widget = new DataPlot2D(this, row, col, name, x_name, y_name, xmin, xmax,
|
---|
| 178 | ymin, ymax, true, period);
|
---|
| 179 | } else {
|
---|
| 180 | widget = new DataPlot2D(this, row, col, name, x_name, y_name, xmin, xmax,
|
---|
| 181 | ymin, ymax, false, 100);
|
---|
| 182 | }
|
---|
| 183 | }
|
---|
| 184 | if (type == "UsSensorPlot") {
|
---|
| 185 | float ymin = dom->attribute("ymin").toFloat();
|
---|
| 186 | float ymax = dom->attribute("ymax").toFloat();
|
---|
| 187 | QString y_name = dom->attribute("y_name");
|
---|
| 188 | int enabled = dom->attribute("enabled").toInt();
|
---|
| 189 | int period = dom->attribute("period").toInt();
|
---|
| 190 | QString type = dom->attribute("type");
|
---|
| 191 | int samples = dom->attribute("samples").toInt();
|
---|
| 192 | if (enabled == 1) {
|
---|
| 193 | widget = new UsSensorPlot(this, row, col, name, y_name,
|
---|
| 194 | ymin, ymax, samples,type,true, period);
|
---|
| 195 | } else {
|
---|
| 196 | widget = new UsSensorPlot(this, row, col, name, y_name,
|
---|
| 197 | ymin, ymax, samples,type,false, 100);
|
---|
| 198 | }
|
---|
| 199 | }
|
---|
| 200 | if (type == "RangeFinderPlot") {
|
---|
| 201 | float xmin = dom->attribute("xmin").toFloat();
|
---|
| 202 | float xmax = dom->attribute("xmax").toFloat();
|
---|
| 203 | float ymin = dom->attribute("ymin").toFloat();
|
---|
| 204 | float ymax = dom->attribute("ymax").toFloat();
|
---|
| 205 | QString x_name = dom->attribute("x_name");
|
---|
| 206 | QString y_name = dom->attribute("y_name");
|
---|
| 207 | QString data_type = dom->attribute("type");
|
---|
| 208 | float start_angle = dom->attribute("start_angle").toFloat();
|
---|
| 209 | float end_angle = dom->attribute("end_angle").toFloat();
|
---|
| 210 | uint32_t nb_samples = dom->attribute("nb_samples").toUInt();
|
---|
| 211 | int enabled = dom->attribute("enabled").toInt();
|
---|
| 212 | int period = dom->attribute("period").toInt();
|
---|
| 213 | int invert_axis = dom->attribute("invert_axis").toInt();
|
---|
| 214 | bool invert_axis_bool;
|
---|
| 215 | if (invert_axis == 0) {
|
---|
| 216 | invert_axis_bool = false;
|
---|
| 217 | } else {
|
---|
| 218 | invert_axis_bool = true;
|
---|
| 219 | }
|
---|
| 220 | if (enabled == 1) {
|
---|
| 221 | widget =
|
---|
| 222 | new RangeFinderPlot(this, row, col, name, x_name, y_name, xmin, xmax,
|
---|
| 223 | ymin, ymax, start_angle, end_angle, nb_samples,
|
---|
| 224 | data_type, invert_axis, true, period);
|
---|
| 225 | } else {
|
---|
| 226 | widget =
|
---|
| 227 | new RangeFinderPlot(this, row, col, name, x_name, y_name, xmin, xmax,
|
---|
| 228 | ymin, ymax, start_angle, end_angle, nb_samples,
|
---|
| 229 | data_type, invert_axis, false, 100);
|
---|
| 230 | }
|
---|
| 231 | }
|
---|
| 232 | if (type == "Picture") {
|
---|
| 233 | int width = dom->attribute("width").toInt();
|
---|
| 234 | int height = dom->attribute("height").toInt();
|
---|
| 235 | int enabled = dom->attribute("enabled").toInt();
|
---|
| 236 | int period = dom->attribute("period").toInt();
|
---|
| 237 | if (enabled == 1) {
|
---|
| 238 | widget = new Picture(this, row, col, name, width, height, true, period);
|
---|
| 239 | } else {
|
---|
| 240 | widget = new Picture(this, row, col, name, width, height, false, period);
|
---|
| 241 | }
|
---|
| 242 | }
|
---|
| 243 | if (type == "Map") {
|
---|
| 244 | int period = dom->attribute("period").toInt();
|
---|
| 245 | int enabled = dom->attribute("enabled").toInt();
|
---|
| 246 | int i = 0;
|
---|
| 247 | QList<QtMobility::QGeoCoordinate> coordinates;
|
---|
| 248 | while (dom->hasAttribute("lat" + QString::number(i))) {
|
---|
| 249 | double latitude = dom->attribute("lat" + QString::number(i)).toDouble();
|
---|
| 250 | double longitude = dom->attribute("long" + QString::number(i)).toDouble();
|
---|
| 251 | double alt = dom->attribute("alt" + QString::number(i)).toDouble();
|
---|
| 252 | QtMobility::QGeoCoordinate coordinate =
|
---|
| 253 | QtMobility::QGeoCoordinate(latitude, longitude, alt);
|
---|
| 254 | coordinates.append(coordinate);
|
---|
| 255 | i++;
|
---|
| 256 | }
|
---|
| 257 |
|
---|
| 258 | if (enabled == 1) {
|
---|
| 259 | widget = new Map(this, row, col, name, coordinates, true, period);
|
---|
| 260 | } else {
|
---|
| 261 | widget = new Map(this, row, col, name, coordinates, false, period);
|
---|
| 262 | }
|
---|
| 263 | }
|
---|
| 264 | if (type == "TextEdit") {
|
---|
| 265 | widget = new TextEdit(this, row, col, name);
|
---|
| 266 | }
|
---|
| 267 | if (type == "Label") {
|
---|
| 268 | widget = new Label(this, row, col, name);
|
---|
| 269 | }
|
---|
| 270 | if (type == "ListWidget") {
|
---|
| 271 | // Parse the item list
|
---|
| 272 | QStringList items;
|
---|
| 273 | int count = 0;
|
---|
| 274 | while (dom->hasAttribute("item" + QString::number(count))) {
|
---|
| 275 | QString item = dom->attribute("item" + QString::number(count));
|
---|
| 276 | items.append(item);
|
---|
| 277 | count++;
|
---|
| 278 | }
|
---|
| 279 | widget = new ListWidget(this, row, col, name, items);
|
---|
| 280 | }
|
---|
| 281 |
|
---|
| 282 | if (widget != NULL) {
|
---|
| 283 | if (old_name != "") {
|
---|
| 284 | widget->RenamedFrom(old_name);
|
---|
| 285 | }
|
---|
| 286 | }
|
---|
| 287 | }
|
---|
| 288 |
|
---|
| 289 | bool Layout::IsUptodate(void) {
|
---|
| 290 | for (int i = 0; i < childs->count(); i++) {
|
---|
| 291 | if (childs->at(i)->IsUptodate() == false)
|
---|
| 292 | return false;
|
---|
| 293 | }
|
---|
| 294 | return true;
|
---|
| 295 | }
|
---|