54FXIMPLEMENT(
MFXDecalsTable, FXVerticalFrame, MFXDecalsTableMap, ARRAYNUMBER(MFXDecalsTableMap))
66 myIndexFont(new FXFont(getApp(), "Segoe UI", 9)),
67 myIndexSelectedFont(new FXFont(getApp(), "Segoe UI", 9, FXFont::Bold)),
68 myDialogViewSettings(dialogViewSettingsParent) {
87 for (
const auto& row :
myRows) {
107 std::string columnsType =
"ibfppppppcd";
108 for (
int i = 0; i < (FXint)columnsType.size(); i++) {
112 const int numDecals = decals.size() <
MAXROWS ? (int)decals.size() :
MAXROWS;
114 for (
int i = 0; i < numDecals; i++) {
116 const auto& decal = decals.at(i);
118 auto row =
new Row(
this);
120 row->getCells().at(2)->getTextField()->setText(decal.filename.c_str());
121 row->getCells().at(3)->getSpinner()->setValue(decal.centerX);
122 row->getCells().at(4)->getSpinner()->setValue(decal.centerY);
123 row->getCells().at(5)->getSpinner()->setValue(decal.width);
124 row->getCells().at(6)->getSpinner()->setValue(decal.height);
125 row->getCells().at(7)->getSpinner()->setValue(decal.rot);
126 row->getCells().at(8)->getSpinner()->setValue(decal.layer);
127 if (decal.screenRelative) {
128 row->getCells().at(9)->getCheckButton()->setCheck(
true);
129 row->getCells().at(9)->getCheckButton()->setText(
"true");
131 row->getCells().at(9)->getCheckButton()->setCheck(
false);
132 row->getCells().at(9)->getCheckButton()->setText(
"false");
137 myColumns.at(2)->setColumnLabel(
"filename",
"");
138 myColumns.at(3)->setColumnLabel(
"centerX",
"");
139 myColumns.at(4)->setColumnLabel(
"centerY",
"");
140 myColumns.at(5)->setColumnLabel(
"width",
"");
141 myColumns.at(6)->setColumnLabel(
"height",
"");
142 myColumns.at(7)->setColumnLabel(
"rotation",
"");
143 myColumns.at(8)->setColumnLabel(
"layer",
"");
144 myColumns.at(9)->setColumnLabel(
"sRel",
"screen relative");
154 if ((row >= 0) && (row < (FXint)
myRows.size()) &&
155 (column >= 0) && (column < (FXint)
myColumns.size())) {
156 myRows.at(row)->setText(column, text);
165 if ((row >= 0) && (row < (FXint)
myRows.size()) &&
166 (column >= 0) && (column < (FXint)
myColumns.size())) {
167 return myRows.at(row)->getText(column);
175 return (
int)
myRows.size();
187 if ((row >= 0) && (row < (FXint)
myRows.size())) {
200 if ((column >= 0) && (column < (
int)
myColumns.size())) {
201 myColumns.at(column)->setColumnLabel(text, tooltip);
210 int selectedRow = -1;
212 for (
int rowIndex = 0; rowIndex < (int)
myRows.size(); rowIndex++) {
214 for (
const auto& cell :
myRows.at(rowIndex)->getCells()) {
215 if ((cell->getTextField() == sender) || (cell->getButton() == sender)) {
216 selectedRow = rowIndex;
234 FXEvent* eventInfo = (FXEvent*)ptr;
236 if (eventInfo->code == 65362) {
249 }
else if (eventInfo->code == 65364) {
264 return sender->handle(sender, sel, ptr);
274 const std::string value =
dynamic_cast<FXTextField*
>(sender)->getText().text();
276 for (
int rowIndex = 0; rowIndex < (int)
myRows.size(); rowIndex++) {
278 if (
myRows.at(rowIndex)->getCells().at(2)->getTextField() == sender) {
279 decals.at(rowIndex).filename = value;
293 const auto value =
dynamic_cast<FXRealSpinner*
>(sender)->getValue();
295 for (
int rowIndex = 0; rowIndex < (int)
myRows.size(); rowIndex++) {
296 if (
myRows.at(rowIndex)->getCells().at(3)->getSpinner() == sender) {
297 decals.at(rowIndex).centerX = value;
298 }
else if (
myRows.at(rowIndex)->getCells().at(4)->getSpinner() == sender) {
299 decals.at(rowIndex).centerY = value;
300 }
else if (
myRows.at(rowIndex)->getCells().at(5)->getSpinner() == sender) {
301 decals.at(rowIndex).width = value;
302 }
else if (
myRows.at(rowIndex)->getCells().at(6)->getSpinner() == sender) {
303 decals.at(rowIndex).height = value;
304 }
else if (
myRows.at(rowIndex)->getCells().at(7)->getSpinner() == sender) {
305 decals.at(rowIndex).rot = value;
306 }
else if (
myRows.at(rowIndex)->getCells().at(8)->getSpinner() == sender) {
307 decals.at(rowIndex).layer = value;
321 auto checkButton =
dynamic_cast<FXCheckButton*
>(sender);
323 checkButton->setText((checkButton->getCheck() == TRUE) ?
"true" :
"false");
325 for (
int rowIndex = 0; rowIndex < (int)
myRows.size(); rowIndex++) {
326 if (
myRows.at(rowIndex)->getCells().at(9)->getCheckButton() == sender) {
327 decals.at(rowIndex).screenRelative = (checkButton->getCheck() == TRUE) ?
true :
false;
339 FXFileDialog opendialog(
this,
TL(
"Open decal"));
341 opendialog.setSelectMode(SELECTFILE_EXISTING);
350 opendialog.execute();
352 if (!opendialog.getFilename().empty()) {
356 for (
int rowIndex = 0; rowIndex < (int)
myRows.size(); rowIndex++) {
357 if (
myRows.at(rowIndex)->getCells().at(1)->getButton() == sender) {
359 myRows.at(rowIndex)->getCells().at(2)->getTextField()->setText(opendialog.getFilename());
361 decals.at(rowIndex).filename = opendialog.getFilename().text();
385 return sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), ptr);
387 return sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
397 for (
int rowIndex = 0; rowIndex < (int)
myRows.size(); rowIndex++) {
398 if (
myRows.at(rowIndex)->getCells().back()->getButton() == sender) {
400 decals.erase(decals.begin() + rowIndex);
415 for (
int rowIndex = 0; rowIndex < (int)
myRows.size(); rowIndex++) {
417 for (
const auto& cell :
myRows.at(rowIndex)->getCells()) {
418 if (cell->getIndexLabel()) {
420 cell->showIndexLabelBold();
422 cell->showIndexLabelNormal();
434 for (
int rowIndex = 0; rowIndex < (int)
myRows.size(); rowIndex++) {
435 for (
int cellIndex = 0; cellIndex < (int)
myRows.at(rowIndex)->getCells().size(); cellIndex++) {
436 if (
myRows.at(rowIndex)->getCells().at(cellIndex)->hasFocus()) {
451 myDecalsTable(decalsTable),
452 myTextField(textField),
459 myDecalsTable(decalsTable),
460 myIndexLabel(indexLabel),
461 myIndexLabelBold(indexLabelBold),
465 indexLabelBold->hide();
466 indexLabelBold->setBackColor(FXRGBA(210, 233, 255, 255));
471 myDecalsTable(decalsTable),
479 myDecalsTable(decalsTable),
480 myCheckButton(checkButton),
487 myDecalsTable(decalsTable),
502 if (myIndexLabelBold) {
503 delete myIndexLabelBold;
509 delete myCheckButton;
517 if (myTextField && myTextField->hasFocus()) {
519 }
else if (myButton && myButton->hasFocus()) {
521 }
else if (myCheckButton && myCheckButton->hasFocus()) {
533 myTextField->setFocus();
534 }
else if (myButton) {
535 myButton->setFocus();
536 }
else if (myCheckButton) {
537 myCheckButton->setFocus();
562 return myCheckButton;
574 myIndexLabel->show();
575 myIndexLabelBold->hide();
577 myIndexLabel->recalc();
578 myIndexLabelBold->recalc();
584 myIndexLabel->hide();
585 myIndexLabelBold->show();
587 myIndexLabel->recalc();
588 myIndexLabelBold->recalc();
606 return myDecalsTable->myColumns.at(myCol)->getType();
677 delete myVerticalFrame;
683 return myVerticalCellFrame;
695 return myTopLabel->getText();
701 myTopLabel->setText(text.c_str());
702 myTopLabel->setTipText(tooltip.c_str());
715 if ((myType ==
's') || (myType ==
'p') || (myType ==
'c')) {
717 columnWidth = myTopLabel->getFont()->getTextWidth(myTopLabel->getText().text(), myTopLabel->getText().length() +
EXTRAMARGIN);
720 for (
const auto& row : myTable->myRows) {
721 if (row->getCells().at(myIndex)->getTextField()) {
722 row->getCells().at(myIndex)->getTextField()->setWidth(columnWidth);
723 }
else if (row->getCells().at(myIndex)->getButton()) {
724 row->getCells().at(myIndex)->getButton()->setWidth(columnWidth);
725 }
else if (row->getCells().at(myIndex)->getSpinner()) {
726 row->getCells().at(myIndex)->getSpinner()->setWidth(columnWidth);
730 myVerticalFrame->setWidth(columnWidth);
731 myTopLabel->setWidth(columnWidth);
732 myVerticalCellFrame->setWidth(columnWidth);
748 for (
int columnIndex = 0; columnIndex < (FXint)table->
myColumns.size(); columnIndex++) {
750 const int numCells = (int)
myCells.size();
752 switch (table->
myColumns.at(columnIndex)->getType()) {
755 auto textField =
new FXTextField(table->
myColumns.at(columnIndex)->getVerticalCellFrame(),
757 myCells.push_back(
new Cell(table, textField, columnIndex, numCells));
762 auto textField =
new FXTextField(table->
myColumns.at(columnIndex)->getVerticalCellFrame(),
764 myCells.push_back(
new Cell(table, textField, columnIndex, numCells));
771 myCells.push_back(
new Cell(table, spinner, columnIndex, numCells));
776 auto indexLabel =
new FXLabel(table->
myColumns.at(columnIndex)->getVerticalCellFrame(),
778 auto indexLabelBold =
new FXLabel(table->
myColumns.at(columnIndex)->getVerticalCellFrame(),
783 myCells.push_back(
new Cell(table, indexLabel, indexLabelBold, columnIndex, numCells));
788 auto checkableButton =
new FXCheckButton(table->
myColumns.at(columnIndex)->getVerticalCellFrame(),
790 myCells.push_back(
new Cell(table, checkableButton, columnIndex, numCells));
796 "",
TL(
"Open decal"),
TL(
"Open decal."),
798 myCells.push_back(
new Cell(table, button, columnIndex, numCells));
804 "",
TL(
"Remove decal"),
TL(
"Remove decal."),
806 myCells.push_back(
new Cell(table, button, columnIndex, numCells));
818 for (
const auto& cell : myCells) {
826 if (myCells.at(index)->getTextField()) {
827 return myCells.at(index)->getTextField()->getText().text();
837 myCells.at(index)->getTextField()->setText(text.c_str());
841const std::vector<MFXDecalsTable::Cell*>&
@ 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
#define GUIDesignAuxiliarFrameFixHeight
design for auxiliar vertical frames with fixed height (DecalsTable)
#define GUIDesignLabelFixed(width)
label, icon before text, text centered and custom width
#define GUIDesignButtonIcon
button only with icon
#define GUIDesignTextField
#define GUIDesignSpinDialDecalsTable
design for standard spin dial
#define GUIDesignTextFieldNCol
Num of column of text field.
#define GUIDesignAuxiliarFrameFixedWidth(width)
design for auxiliar (Without borders) frame with fixed width and extended height
#define GUIDesignLabelThick(justify)
label extended over frame with thick and with text justify to left
#define GUIDesignTextFieldFixedRestricted(width, type)
text field with fixed width
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frame extended in all directions
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
FXString gCurrentFolder
The folder used as last.
FXDEFMAP(MFXDecalsTable) MFXDecalsTableMap[]
int GUIDesignHeight
the default height for GUI elements
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
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
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 StringBijection< ImageFileExtension > ImageFileExtensions
image file extensions
A decal (an image) that can be shown.