Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MFXDecalsTable.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2023 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
18// Table used for show and edit decal values
19/****************************************************************************/
20#include <config.h>
21
22#include "MFXDecalsTable.h"
23
24#include <netedit/GNEViewNet.h>
31
32
33#define EXTRAMARGING 4
34
35#define MAXROWS 100
36
37// ===========================================================================
38// FOX callback mapping
39// ===========================================================================
40
53
54// Object implementation
55FXIMPLEMENT(MFXDecalsTable, FXVerticalFrame, MFXDecalsTableMap, ARRAYNUMBER(MFXDecalsTableMap))
56
57// ===========================================================================
58// method definitions
59// ===========================================================================
60
61// ---------------------------------------------------------------------------
62// MFXDecalsTable - public methods
63// ---------------------------------------------------------------------------
64
65MFXDecalsTable::MFXDecalsTable(GUIDialog_ViewSettings* dialogViewSettingsParent, FXComposite* parent) :
66 FXVerticalFrame(parent, GUIDesignAuxiliarFrameFixHeight),
67 myIndexFont(new FXFont(getApp(), "Segoe UI", 9)),
68 myIndexSelectedFont(new FXFont(getApp(), "Segoe UI", 9, FXFont::Bold)),
69 myDialogViewSettings(dialogViewSettingsParent) {
70 // create vertical frame for rows
71 myColumnsFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarFrame);
72 // create add button
73 myAddButton = new FXButton(this,
74 (std::string("\t") + TL("Add decal") + std::string("\t") + TL("Add decal.")).c_str(),
76}
77
78
80 // delete fonts
81 delete myIndexFont;
83}
84
85
86void
88 // clear rows (always before columns, because delete row delete also all cells)
89 for (const auto& row : myRows) {
90 delete row;
91 }
92 // clear columns
93 for (const auto& column : myColumns) {
94 delete column;
95 }
96 // drop rows and columns
97 myRows.clear();
98 myColumns.clear();
99}
100
101
102void
104 // first clear table
105 clearTable();
106 // get decals
107 const auto decals = myDialogViewSettings->getSUMOAbstractView()->getDecals();
108 // create columns
109 std::string columnsType = "ibfsssspscd";
110 for (int i = 0; i < (FXint)columnsType.size(); i++) {
111 myColumns.push_back(new Column(this, i, columnsType.at(i)));
112 }
113 // get num decals
114 const int numDecals = decals.size() < MAXROWS ? (int)decals.size() : MAXROWS;
115 // create rows
116 for (int i = 0; i < numDecals; i++) {
117 // get decal
118 const auto& decal = decals.at(i);
119 // create row
120 auto row = new Row(this);
121 // fill cells
122 row->getCells().at(2)->getTextField()->setText(decal.filename.c_str());
123 row->getCells().at(3)->getTextField()->setText(toString(decal.centerX).c_str());
124 row->getCells().at(4)->getTextField()->setText(toString(decal.centerY).c_str());
125 row->getCells().at(5)->getTextField()->setText(toString(decal.width).c_str());
126 row->getCells().at(6)->getTextField()->setText(toString(decal.height).c_str());
127 row->getCells().at(7)->getSpinner()->setValue(decal.rot);
128 row->getCells().at(8)->getTextField()->setText(toString(decal.layer).c_str());
129 if (decal.screenRelative) {
130 row->getCells().at(9)->getCheckButton()->setCheck(true);
131 row->getCells().at(9)->getCheckButton()->setText("true");
132 } else {
133 row->getCells().at(9)->getCheckButton()->setCheck(false);
134 row->getCells().at(9)->getCheckButton()->setText("false");
135 }
136 myRows.push_back(row);
137 }
138 // set headers
139 myColumns.at(2)->setColumnLabel("filename", "");
140 myColumns.at(3)->setColumnLabel("centerX", "");
141 myColumns.at(4)->setColumnLabel("centerY", "");
142 myColumns.at(5)->setColumnLabel("width", "");
143 myColumns.at(6)->setColumnLabel("height", "");
144 myColumns.at(7)->setColumnLabel("rotation", "");
145 myColumns.at(8)->setColumnLabel("layer", "");
146 myColumns.at(9)->setColumnLabel("sRel", "screen relative");
147 // adjust height (header + rows + add button)
148 setHeight((numDecals + 2) * GUIDesignHeight);
149 // call create to create all row's elements
150 create();
151}
152
153
154void
155MFXDecalsTable::setItemText(FXint row, FXint column, const std::string& text) {
156 if ((row >= 0) && (row < (FXint)myRows.size()) &&
157 (column >= 0) && (column < (FXint)myColumns.size())) {
158 myRows.at(row)->setText(column, text);
159 } else {
160 throw ProcessError(TL("Invalid row or column"));
161 }
162}
163
164
165std::string
166MFXDecalsTable::getItemText(const int row, const int column) const {
167 if ((row >= 0) && (row < (FXint)myRows.size()) &&
168 (column >= 0) && (column < (FXint)myColumns.size())) {
169 return myRows.at(row)->getText(column);
170 }
171 throw ProcessError(TL("Invalid row or column"));
172}
173
174
175int
177 return (int)myRows.size();
178}
179
180
181int
185
186
187void
189 if ((row >= 0) && (row < (FXint)myRows.size())) {
190 // update current selected row
192 // update index label
194 } else {
195 throw ProcessError(TL("Invalid row"));
196 }
197}
198
199
200void
201MFXDecalsTable::setColumnLabel(const int column, const std::string& text, const std::string& tooltip) {
202 if ((column >= 0) && (column < (int)myColumns.size())) {
203 myColumns.at(column)->setColumnLabel(text, tooltip);
204 } else {
205 throw ProcessError(TL("Invalid column"));
206 }
207}
208
209
210long
211MFXDecalsTable::onFocusRow(FXObject* sender, FXSelector, void*) {
212 int selectedRow = -1;
213 // search selected text field
214 for (int rowIndex = 0; rowIndex < (int)myRows.size(); rowIndex++) {
215 // iterate over every cell
216 for (const auto& cell : myRows.at(rowIndex)->getCells()) {
217 if ((cell->getTextField() == sender) || (cell->getButton() == sender)) {
218 selectedRow = rowIndex;
219 }
220 }
221 }
222 // update index label
224 // set new row
225 if (myCurrentSelectedRow != selectedRow) {
226 myCurrentSelectedRow = selectedRow;
228 }
229 return 0;
230}
231
232
233long
234MFXDecalsTable::onCmdKeyPress(FXObject* sender, FXSelector sel, void* ptr) {
235 // get FXEvent
236 FXEvent* eventInfo = (FXEvent*)ptr;
237 // check code
238 if (eventInfo->code == 65362) {
239 // move up
240 if (myCurrentSelectedRow > 0) {
242 } else {
243 // we're in the first, then select last
244 myCurrentSelectedRow = ((int)myRows.size() - 1);
245 }
246 // update index label
248 // move focus
249 moveFocus();
250 return 1;
251 } else if (eventInfo->code == 65364) {
252 // move down
253 if (myCurrentSelectedRow < ((int)myRows.size() - 1)) {
255 } else {
256 // we're in the last, then select first
258 }
259 // update index label
261 // move focus
262 moveFocus();
263 return 1;
264 } else {
265 // continue handling key pres
266 return sender->handle(sender, sel, ptr);
267 }
268}
269
270
271long
272MFXDecalsTable::onCmdEditRowString(FXObject* sender, FXSelector, void*) {
273 // get decals
275 // get value
276 const std::string value = dynamic_cast<FXTextField*>(sender)->getText().text();
277 // set filename
278 for (int rowIndex = 0; rowIndex < (int)myRows.size(); rowIndex++) {
279 // continue depending of string
280 if (myRows.at(rowIndex)->getCells().at(2)->getTextField() == sender) {
281 decals.at(rowIndex).filename = value;
282 } else if (myRows.at(rowIndex)->getCells().at(3)->getTextField() == sender) {
283 decals.at(rowIndex).centerX = StringUtils::toDouble(value);
284 } else if (myRows.at(rowIndex)->getCells().at(4)->getTextField() == sender) {
285 decals.at(rowIndex).centerY = StringUtils::toDouble(value);
286 } else if (myRows.at(rowIndex)->getCells().at(5)->getTextField() == sender) {
287 decals.at(rowIndex).width = StringUtils::toDouble(value);
288 } else if (myRows.at(rowIndex)->getCells().at(6)->getTextField() == sender) {
289 decals.at(rowIndex).height = StringUtils::toDouble(value);
290 } else if (myRows.at(rowIndex)->getCells().at(8)->getTextField() == sender) {
291 decals.at(rowIndex).layer = StringUtils::toDouble(value);
292 }
293 }
294 // update view
296 return 1;
297}
298
299
300long
301MFXDecalsTable::onCmdEditRowSpinner(FXObject* sender, FXSelector, void*) {
302 // get decals
304 // get value
305 const auto value = dynamic_cast<FXRealSpinner*>(sender)->getValue();
306 // set filename
307 for (int rowIndex = 0; rowIndex < (int)myRows.size(); rowIndex++) {
308 if (myRows.at(rowIndex)->getCells().at(7)->getSpinner() == sender) {
309 decals.at(rowIndex).rot = value;
310 }
311 }
312 // update view
314 return 1;
315}
316
317
318long
319MFXDecalsTable::onCmdEditRowCheckBox(FXObject* sender, FXSelector, void*) {
320 // get decals
322 // get check buton
323 auto checkButton = dynamic_cast<FXCheckButton*>(sender);
324 // update text
325 checkButton->setText((checkButton->getCheck() == TRUE) ? "true" : "false");
326 // set filename
327 for (int rowIndex = 0; rowIndex < (int)myRows.size(); rowIndex++) {
328 if (myRows.at(rowIndex)->getCells().at(9)->getCheckButton() == sender) {
329 decals.at(rowIndex).screenRelative = (checkButton->getCheck() == TRUE) ? true : false;
330 }
331 }
332 // update view
334 return 1;
335}
336
337
338long
339MFXDecalsTable::onCmdOpenDecal(FXObject* sender, FXSelector, void*) {
340 // configure open dialog
341 FXFileDialog opendialog(this, TL("Open decal"));
342 // select existing file
343 opendialog.setSelectMode(SELECTFILE_EXISTING);
344 // set icon and pattern list
345 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN));
346 opendialog.setPatternList(TL("All files (*)"));
347 // set current folder
348 if (gCurrentFolder.length() != 0) {
349 opendialog.setDirectory(gCurrentFolder);
350 }
351 // open dialog
352 opendialog.execute();
353 // check if file exist
354 if (!opendialog.getFilename().empty()) {
355 // get decals
357 // set filename
358 for (int rowIndex = 0; rowIndex < (int)myRows.size(); rowIndex++) {
359 if (myRows.at(rowIndex)->getCells().at(1)->getButton() == sender) {
360 // set text in filename
361 myRows.at(rowIndex)->getCells().at(2)->getTextField()->setText(opendialog.getFilename());
362 // update filename in decal
363 decals.at(rowIndex).filename = opendialog.getFilename().text();
364 // update view
366 return 1;
367 }
368 }
369 }
370 return 1;
371}
372
373
374long
375MFXDecalsTable::onCmdAddRow(FXObject*, FXSelector, void*) {
376 // add a new decal
378 // refill table
379 fillTable();
380 return 1;
381}
382
383
384long
385MFXDecalsTable::onUpdAddRow(FXObject* sender, FXSelector, void* ptr) {
387 return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), ptr);
388 } else {
389 return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
390 }
391}
392
393
394long
395MFXDecalsTable::onCmdRemoveRow(FXObject* sender, FXSelector, void*) {
396 // get decals
398 // search row
399 for (int rowIndex = 0; rowIndex < (int)myRows.size(); rowIndex++) {
400 if (myRows.at(rowIndex)->getCells().back()->getButton() == sender) {
401 // remove row
402 decals.erase(decals.begin() + rowIndex);
403 // update view
405 // refill table
406 fillTable();
407 return 1;
408 }
409 }
410 return 1;
411}
412
413
414void
416 // update radio buttons checks
417 for (int rowIndex = 0; rowIndex < (int)myRows.size(); rowIndex++) {
418 // iterate over every cell
419 for (const auto& cell : myRows.at(rowIndex)->getCells()) {
420 if (cell->getIndexLabel()) {
421 if (myCurrentSelectedRow == rowIndex) {
422 cell->showIndexLabelBold();
423 } else {
424 cell->showIndexLabelNormal();
425 }
426 }
427 }
428 }
429}
430
431
432bool
434 // first find focus
435 // update radio buttons checks
436 for (int rowIndex = 0; rowIndex < (int)myRows.size(); rowIndex++) {
437 for (int cellIndex = 0; cellIndex < (int)myRows.at(rowIndex)->getCells().size(); cellIndex++) {
438 if (myRows.at(rowIndex)->getCells().at(cellIndex)->hasFocus()) {
439 // set focus in current row
440 myRows.at(myCurrentSelectedRow)->getCells().at(cellIndex)->setFocus();
441 return true;
442 }
443 }
444 }
445 return false;
446}
447
448// ---------------------------------------------------------------------------
449// MFXDecalsTable::Cell - methods
450// ---------------------------------------------------------------------------
451
452MFXDecalsTable::Cell::Cell(MFXDecalsTable* decalsTable, FXTextField* textField, int col, int row) :
453 myDecalsTable(decalsTable),
454 myTextField(textField),
455 myCol(col),
456 myRow(row) {
457}
458
459
460MFXDecalsTable::Cell::Cell(MFXDecalsTable* decalsTable, FXLabel* indexLabel, FXLabel* indexLabelBold, int col, int row) :
461 myDecalsTable(decalsTable),
462 myIndexLabel(indexLabel),
463 myIndexLabelBold(indexLabelBold),
464 myCol(col),
465 myRow(row) {
466 // hide bold and set background
467 indexLabelBold->hide();
468 indexLabelBold->setBackColor(FXRGBA(210, 233, 255, 255));
469}
470
471
472MFXDecalsTable::Cell::Cell(MFXDecalsTable* decalsTable, FXButton* button, int col, int row) :
473 myDecalsTable(decalsTable),
474 myButton(button),
475 myCol(col),
476 myRow(row) {
477}
478
479
480MFXDecalsTable::Cell::Cell(MFXDecalsTable* decalsTable, FXCheckButton* checkButton, int col, int row) :
481 myDecalsTable(decalsTable),
482 myCheckButton(checkButton),
483 myCol(col),
484 myRow(row) {
485}
486
487
488MFXDecalsTable::Cell::Cell(MFXDecalsTable* decalsTable, FXRealSpinner* spinner, int col, int row) :
489 myDecalsTable(decalsTable),
490 mySpinner(spinner),
491 myCol(col),
492 myRow(row) {
493}
494
495
497 // delete all elements
498 if (myTextField) {
499 delete myTextField;
500 }
501 if (myIndexLabel) {
502 delete myIndexLabel;
503 }
504 if (myIndexLabelBold) {
505 delete myIndexLabelBold;
506 }
507 if (myButton) {
508 delete myButton;
509 }
510 if (myCheckButton) {
511 delete myCheckButton;
512 }
513}
514
515
516bool
518 // check if one of the cell elements has the focus
519 if (myTextField && myTextField->hasFocus()) {
520 return true;
521 } else if (myButton && myButton->hasFocus()) {
522 return true;
523 } else if (myCheckButton && myCheckButton->hasFocus()) {
524 return true;
525 } else {
526 return false;
527 }
528}
529
530
531void
533 // set focus
534 if (myTextField) {
535 myTextField->setFocus();
536 } else if (myButton) {
537 myButton->setFocus();
538 } else if (myCheckButton) {
539 myCheckButton->setFocus();
540 }
541}
542
543
544FXTextField*
546 return myTextField;
547}
548
549
550FXLabel*
552 return myIndexLabel;
553}
554
555
556FXButton*
558 return myButton;
559}
560
561
562FXCheckButton*
564 return myCheckButton;
565}
566
567
568FXRealSpinner*
570 return mySpinner;
571}
572
573
574void
576 myIndexLabel->show();
577 myIndexLabelBold->hide();
578 // recalc both
579 myIndexLabel->recalc();
580 myIndexLabelBold->recalc();
581}
582
583
584void
586 myIndexLabel->hide();
587 myIndexLabelBold->show();
588 // recalc both
589 myIndexLabel->recalc();
590 myIndexLabelBold->recalc();
591}
592
593
594int
596 return myCol;
597}
598
599
600int
602 return myRow;
603}
604
605
606char
608 return myDecalsTable->myColumns.at(myCol)->getType();
609}
610
611
613 myCol(-1),
614 myRow(-1) {
615}
616
617// ---------------------------------------------------------------------------
618// MFXDecalsTable::Column - methods
619// ---------------------------------------------------------------------------
620
621MFXDecalsTable::Column::Column(MFXDecalsTable* table, const int index, const char type) :
622 myTable(table),
623 myIndex(index),
624 myType(type) {
625 // get static tooltip
627 // create vertical frame
628 if (myType == 'f') {
629 myVerticalFrame = new FXVerticalFrame(table->myColumnsFrame, GUIDesignAuxiliarFrame);
630 } else {
632 }
633 // create top label
634 switch (myType) {
635 case ('f'): {
636 // ticked label extended
637 myTopLabel = new MFXLabelTooltip(myVerticalFrame, staticTooltip, "", nullptr, GUIDesignLabelThick(JUSTIFY_NORMAL));
638 break;
639 }
640 case ('p'):
641 case ('s'): {
642 // ticked label fixed
643 myTopLabel = new MFXLabelTooltip(myVerticalFrame, staticTooltip, "", nullptr, GUIDesignLabelThickedFixed(0));
644 break;
645 }
646 case ('c'): {
647 // ticked label for checkbox
648 myTopLabel = new MFXLabelTooltip(myVerticalFrame, staticTooltip, "", nullptr, GUIDesignLabelThickedFixed(30));
649 break;
650 }
651 case ('i'): {
652 // ticked label for index
653 myTopLabel = new MFXLabelTooltip(myVerticalFrame, staticTooltip, "", nullptr, GUIDesignLabelFixed(30));
654 break;
655 }
656 default: {
657 // empty label (for buttons)
658 myTopLabel = new MFXLabelTooltip(myVerticalFrame, staticTooltip, "", nullptr, GUIDesignLabelFixed(0));
659 break;
660 }
661 }
662 // create vertical frame for cells
663 if (myType == 'f') {
665 } else {
667 }
668 // create elements
669 myVerticalFrame->create();
670 myTopLabel->create();
671 myVerticalCellFrame->create();
672 // adjust column width
674}
675
676
678 // delete vertical frame (this also delete all childrens)
679 delete myVerticalFrame;
680}
681
682
683FXVerticalFrame*
685 return myVerticalCellFrame;
686}
687
688
689char
691 return myType;
692}
693
694
695FXString
697 return myTopLabel->getText();
698}
699
700
701void
702MFXDecalsTable::Column::setColumnLabel(const std::string& text, const std::string& tooltip) {
703 myTopLabel->setText(text.c_str());
704 myTopLabel->setTipText(tooltip.c_str());
705 // adjust column width
706 adjustColumnWidth();
707}
708
709
710void
712 // filename always extended
713 if (myType != 'f') {
714 // declare columnWidth
715 int columnWidth = GUIDesignHeight;
716 // adjust depending of label
717 if ((myType == 's') || (myType == 'p') || (myType == 'c')) {
718 // calculate top label width
719 columnWidth = myTopLabel->getFont()->getTextWidth(myTopLabel->getText().text(), myTopLabel->getText().length() + EXTRAMARGING);
720 }
721 // adjust width in all rows
722 for (const auto& row : myTable->myRows) {
723 if (row->getCells().at(myIndex)->getTextField()) {
724 row->getCells().at(myIndex)->getTextField()->setWidth(columnWidth);
725 } else if (row->getCells().at(myIndex)->getButton()) {
726 row->getCells().at(myIndex)->getButton()->setWidth(columnWidth);
727 } else if (row->getCells().at(myIndex)->getSpinner()) {
728 row->getCells().at(myIndex)->getSpinner()->setWidth(columnWidth);
729 }
730 }
731 // adjust labels and vertical frames
732 myVerticalFrame->setWidth(columnWidth);
733 myTopLabel->setWidth(columnWidth);
734 myVerticalCellFrame->setWidth(columnWidth);
735 }
736}
737
738
740 myIndex(0),
741 myType('-') {}
742
743// ---------------------------------------------------------------------------
744// MFXDecalsTable::Row - methods
745// ---------------------------------------------------------------------------
746
748 myTable(table) {
749 // build textFields
750 for (int columnIndex = 0; columnIndex < (FXint)table->myColumns.size(); columnIndex++) {
751 // get number of cells
752 const int numCells = (int)myCells.size();
753 // continue depending of type
754 switch (table->myColumns.at(columnIndex)->getType()) {
755 case ('f'): {
756 // create textField for filenames
757 auto textField = new FXTextField(table->myColumns.at(columnIndex)->getVerticalCellFrame(),
759 myCells.push_back(new Cell(table, textField, columnIndex, numCells));
760 break;
761 }
762 case ('s'): {
763 // create textField for textfiedl real values
764 auto textField = new FXTextField(table->myColumns.at(columnIndex)->getVerticalCellFrame(),
766 myCells.push_back(new Cell(table, textField, columnIndex, numCells));
767 break;
768 }
769 case ('p'): {
770 // create spinner for real values
771 auto spinner = new FXRealSpinner(table->myColumns.at(columnIndex)->getVerticalCellFrame(), GUIDesignTextFieldNCol,
773 myCells.push_back(new Cell(table, spinner, columnIndex, numCells));
774 break;
775 }
776 case ('i'): {
777 // create labels for index
778 auto indexLabel = new FXLabel(table->myColumns.at(columnIndex)->getVerticalCellFrame(),
779 toString(myTable->myRows.size()).c_str(), nullptr, GUIDesignLabelThickedFixed(30));
780 auto indexLabelBold = new FXLabel(table->myColumns.at(columnIndex)->getVerticalCellFrame(),
781 toString(myTable->myRows.size()).c_str(), nullptr, GUIDesignLabelThickedFixed(30));
782 // set fonts
783 indexLabel->setFont(myTable->myIndexFont);
784 indexLabelBold->setFont(myTable->myIndexSelectedFont);
785 myCells.push_back(new Cell(table, indexLabel, indexLabelBold, columnIndex, numCells));
786 break;
787 }
788 case ('c'): {
789 // create checkbox for
790 auto checkableButton = new FXCheckButton(table->myColumns.at(columnIndex)->getVerticalCellFrame(),
792 myCells.push_back(new Cell(table, checkableButton, columnIndex, numCells));
793 break;
794 }
795 case ('b'): {
796 // create button for open decal
797 auto button = new FXButton(table->myColumns.at(columnIndex)->getVerticalCellFrame(),
798 (std::string("\t") + TL("Open decal") + std::string("\t") + TL("Open decal.")).c_str(),
800 myCells.push_back(new Cell(table, button, columnIndex, numCells));
801 break;
802 }
803 case ('d'): {
804 // create button for delete decal
805 auto button = new FXButton(table->myColumns.at(columnIndex)->getVerticalCellFrame(),
806 (std::string("\t") + TL("Remove decal") + std::string("\t") + TL("Remove decal.")).c_str(),
808 myCells.push_back(new Cell(table, button, columnIndex, numCells));
809 break;
810 }
811 default:
812 throw ProcessError("Invalid Cell type");
813 }
814 }
815}
816
817
819 // delete all cells
820 for (const auto& cell : myCells) {
821 delete cell;
822 }
823}
824
825
826std::string
828 if (myCells.at(index)->getTextField()) {
829 return myCells.at(index)->getTextField()->getText().text();
830 } else {
831 throw ProcessError("Cell doesn't have a textField");
832 }
833}
834
835
836void
837MFXDecalsTable::Row::setText(int index, const std::string& text) const {
838 // set text
839 myCells.at(index)->getTextField()->setText(text.c_str());
840}
841
842
843const std::vector<MFXDecalsTable::Cell*>&
845 return myCells;
846}
847
848
850
851/****************************************************************************/
#define EXTRAMARGING
@ MID_DECALSTABLE_CHECKBOX
checkbox
@ MID_DECALSTABLE_ADD
add row
@ MID_MBTTIP_FOCUS
callback for MFXMenuButtonTooltip
@ MID_DECALSTABLE_TEXTFIELD
textField
@ MID_DECALSTABLE_OPEN
open decal
@ MID_DECALSTABLE_REMOVE
add row
@ MID_DECALSTABLE_SPINNER
spinner
#define GUIDesignMFXCheckableButton
checkable button extended over frame
Definition GUIDesigns.h:138
#define GUIDesignAuxiliarFrameFixHeight
design for auxiliar vertical frames with fixed height (DecalsTable)
Definition GUIDesigns.h:412
#define GUIDesignLabelFixed(width)
label, icon before text, text centered and custom width
Definition GUIDesigns.h:241
#define GUIDesignButtonIcon
button only with icon
Definition GUIDesigns.h:83
#define GUIDesignHeight
define a standard height for all elements (Change it carefully)
Definition GUIDesigns.h:37
#define GUIDesignTextField
Definition GUIDesigns.h:51
#define GUIDesignSpinDialDecalsTable
design for standard spin dial
Definition GUIDesigns.h:486
#define GUIDesignTextFieldNCol
Num of column of text field.
Definition GUIDesigns.h:66
#define GUIDesignAuxiliarFrameFixWidth
design for auxiliar vertical frames with fixed width (used in TLSTable and DecalsTable)
Definition GUIDesigns.h:409
#define GUIDesignLabelThick(justify)
label extended over frame with thick and with text justify to left
Definition GUIDesigns.h:244
#define GUIDesignTextFieldFixedRestricted(width, type)
text field with fixed width
Definition GUIDesigns.h:60
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frame extended in all directions
Definition GUIDesigns.h:385
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
Definition GUIDesigns.h:247
FXString gCurrentFolder
The folder used as last.
@ OPEN
open icons
FXDEFMAP(MFXDecalsTable) MFXDecalsTableMap[]
#define MAXROWS
#define TL(string)
Definition MsgHandler.h:287
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
The dialog to change the view (gui) settings.
GUISUMOAbstractView * getSUMOAbstractView()
get GUISUMOAbstractView parent
GUIMainWindow * getGUIMainWindowParent()
Returns the GUIMainWindow parent.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
MFXStaticToolTip * getStaticTooltipMenu() const
get static toolTip for menus
std::vector< Decal > & getDecals()
The list of decals to show.
GUIGlChildWindow * getGUIGlChildWindow()
get GUIGlChildWindow
char getType() const
get column type
Cell()
default constructor
FXRealSpinner * getSpinner()
get spinner
FXButton * getButton()
get open button
int getRow() const
row index
void showIndexLabelBold()
show label index bold
void setFocus()
set focus in the current cell
FXTextField * getTextField() const
get textField
void showIndexLabelNormal()
show label index normal
bool hasFocus() const
check if current cell has focus
FXCheckButton * getCheckButton()
get check button
FXLabel * getIndexLabel() const
get index label
int getCol() const
column index
char getType() const
get column type
MFXLabelTooltip * myTopLabel
column top tooltip label
FXVerticalFrame * myVerticalCellFrame
vertical frame
const char myType
column type
FXVerticalFrame * getVerticalCellFrame() const
get vertical cell frame
void setColumnLabel(const std::string &text, const std::string &tooltip)
set column label
void adjustColumnWidth()
adjust column width
Column()
default constructor
FXVerticalFrame * myVerticalFrame
vertical frame
FXString getColumnLabel() const
get column label
Row()
default constructor
std::vector< Cell * > myCells
list wtih cells
MFXDecalsTable * myTable
poiner to table parent
void setText(int index, const std::string &text) const
set text
const std::vector< Cell * > & getCells() const
get cells
std::string getText(int index) const
get text
bool moveFocus()
move focus to current row
long onCmdAddRow(FXObject *, FXSelector, void *)
called when add row button is pressed
std::vector< Column * > myColumns
columns
int getCurrentSelectedRow() const
Get current selected row.
FXHorizontalFrame * myColumnsFrame
horizontal columns frame
int getNumRows() const
Get number of rows.
long onFocusRow(FXObject *, FXSelector, void *)
called when a row is focused
~MFXDecalsTable()
destructor (Called automatically)
long onCmdRemoveRow(FXObject *, FXSelector, void *)
called when remove row button is pressed
int myCurrentSelectedRow
current selected row
void selectRow(const int rowIndex)
Select a row.
long onCmdEditRowSpinner(FXObject *, FXSelector, void *)
called when a spinner is updated
void setItemText(FXint row, FXint column, const std::string &text)
Modify cell text.
long onCmdEditRowCheckBox(FXObject *, FXSelector, void *)
called when a checkBox is updated
FXFont * myIndexSelectedFont
font for index selected
void fillTable()
fill table
long onCmdEditRowString(FXObject *, FXSelector, void *)
called when a string is updated
void setColumnLabel(const int column, const std::string &text, const std::string &tooltip="")
Change column header text.
FXFont * myIndexFont
font for index
std::vector< Row * > myRows
rows
std::string getItemText(const int row, const int column) const
Return cell text.
void clearTable()
clear table
void updateIndexLabel()
update index labels
long onCmdKeyPress(FXObject *, FXSelector, void *)
called when a key is pressed
GUIDialog_ViewSettings * myDialogViewSettings
@frame pointer to GUIDialog_ViewSettings parent
long onCmdOpenDecal(FXObject *, FXSelector, void *)
called when open decal button is pressed
long onUpdAddRow(FXObject *, FXSelector, void *)
update add row button
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
A decal (an image) that can be shown.