SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00010 // The dialog to change the view (gui) settings. 00011 /****************************************************************************/ 00012 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00013 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors 00014 /****************************************************************************/ 00015 // 00016 // This file is part of SUMO. 00017 // SUMO is free software: you can redistribute it and/or modify 00018 // it under the terms of the GNU General Public License as published by 00019 // the Free Software Foundation, either version 3 of the License, or 00020 // (at your option) any later version. 00021 // 00022 /****************************************************************************/ 00023 00024 00025 // =========================================================================== 00026 // included modules 00027 // =========================================================================== 00028 #ifdef _MSC_VER 00029 #include <windows_config.h> 00030 #else 00031 #include <config.h> 00032 #endif 00033 00034 #include <fstream> 00035 #include <utils/gui/windows/GUIAppEnum.h> 00036 #include <utils/gui/windows/GUISUMOAbstractView.h> 00037 #include <utils/foxtools/MFXUtils.h> 00038 #include <utils/common/RGBColor.h> 00039 #include <utils/foxtools/MFXAddEditTypedTable.h> 00040 #include <utils/common/ToString.h> 00041 #include <utils/common/StringUtils.h> 00042 #include <utils/common/TplConvert.h> 00043 #include <utils/gui/settings/GUICompleteSchemeStorage.h> 00044 #include <utils/gui/images/GUIIconSubSys.h> 00045 #include <utils/gui/div/GUIIOGlobals.h> 00046 #include <utils/importio/LineReader.h> 00047 #include <utils/iodevices/OutputDevice.h> 00048 #include <utils/gui/settings/GUISettingsHandler.h> 00049 #include "GUIDialog_ViewSettings.h" 00050 00051 #ifdef CHECK_MEMORY_LEAKS 00052 #include <foreign/nvwa/debug_new.h> 00053 #endif // CHECK_MEMORY_LEAKS 00054 00055 00056 // =========================================================================== 00057 // FOX callback mapping 00058 // =========================================================================== 00059 FXDEFMAP(GUIDialog_ViewSettings) GUIDialog_ViewSettingsMap[] = { 00060 FXMAPFUNC(SEL_CHANGED, MID_SIMPLE_VIEW_COLORCHANGE, GUIDialog_ViewSettings::onCmdColorChange), 00061 FXMAPFUNC(SEL_COMMAND, MID_SIMPLE_VIEW_COLORCHANGE, GUIDialog_ViewSettings::onCmdColorChange), 00062 FXMAPFUNC(SEL_COMMAND, MID_SIMPLE_VIEW_NAMECHANGE, GUIDialog_ViewSettings::onCmdNameChange), 00063 FXMAPFUNC(SEL_COMMAND, MID_SETTINGS_OK, GUIDialog_ViewSettings::onCmdOk), 00064 FXMAPFUNC(SEL_COMMAND, MID_SETTINGS_CANCEL, GUIDialog_ViewSettings::onCmdCancel), 00065 FXMAPFUNC(SEL_CHANGED, MFXAddEditTypedTable::ID_TEXT_CHANGED, GUIDialog_ViewSettings::onCmdEditTable), 00066 00067 FXMAPFUNC(SEL_COMMAND, MID_SIMPLE_VIEW_SAVE, GUIDialog_ViewSettings::onCmdSaveSetting), 00068 FXMAPFUNC(SEL_UPDATE, MID_SIMPLE_VIEW_SAVE, GUIDialog_ViewSettings::onUpdSaveSetting), 00069 FXMAPFUNC(SEL_COMMAND, MID_SIMPLE_VIEW_DELETE, GUIDialog_ViewSettings::onCmdDeleteSetting), 00070 FXMAPFUNC(SEL_UPDATE, MID_SIMPLE_VIEW_DELETE, GUIDialog_ViewSettings::onUpdDeleteSetting), 00071 FXMAPFUNC(SEL_COMMAND, MID_SIMPLE_VIEW_EXPORT, GUIDialog_ViewSettings::onCmdExportSetting), 00072 FXMAPFUNC(SEL_UPDATE, MID_SIMPLE_VIEW_EXPORT, GUIDialog_ViewSettings::onUpdExportSetting), 00073 FXMAPFUNC(SEL_COMMAND, MID_SIMPLE_VIEW_IMPORT, GUIDialog_ViewSettings::onCmdImportSetting), 00074 FXMAPFUNC(SEL_UPDATE, MID_SIMPLE_VIEW_IMPORT, GUIDialog_ViewSettings::onUpdImportSetting), 00075 00076 FXMAPFUNC(SEL_COMMAND, MID_SIMPLE_VIEW_LOAD_DECALS, GUIDialog_ViewSettings::onCmdLoadDecals), 00077 FXMAPFUNC(SEL_COMMAND, MID_SIMPLE_VIEW_SAVE_DECALS, GUIDialog_ViewSettings::onCmdSaveDecals), 00078 00079 }; 00080 00081 00082 FXIMPLEMENT(GUIDialog_ViewSettings, FXDialogBox, GUIDialog_ViewSettingsMap, ARRAYNUMBER(GUIDialog_ViewSettingsMap)) 00083 00084 00085 // =========================================================================== 00086 // method definitions 00087 // =========================================================================== 00088 GUIDialog_ViewSettings::GUIDialog_ViewSettings( 00089 GUISUMOAbstractView* parent, 00090 GUIVisualizationSettings* settings, 00091 std::vector<GUISUMOAbstractView::Decal> *decals, 00092 MFXMutex* decalsLock) 00093 : FXDialogBox(parent, "View Settings", DECOR_TITLE | DECOR_BORDER, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 00094 myParent(parent), mySettings(settings), 00095 myDecals(decals), myDecalsLock(decalsLock), myDecalsTable(0) { 00096 myBackup = (*mySettings); 00097 00098 FXVerticalFrame* contentFrame = 00099 new FXVerticalFrame(this, LAYOUT_SIDE_TOP | LAYOUT_FILL_X | LAYOUT_FILL_Y, 00100 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00101 // 00102 { 00103 FXHorizontalFrame* frame0 = 00104 new FXHorizontalFrame(contentFrame, FRAME_THICK, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00105 mySchemeName = new FXComboBox(frame0, 20, this, MID_SIMPLE_VIEW_NAMECHANGE, COMBOBOX_INSERT_LAST | FRAME_SUNKEN | LAYOUT_LEFT | LAYOUT_CENTER_Y | COMBOBOX_STATIC); 00106 const std::vector<std::string> &names = gSchemeStorage.getNames(); 00107 for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i) { 00108 size_t index = mySchemeName->appendItem((*i).c_str()); 00109 if ((*i) == mySettings->name) { 00110 mySchemeName->setCurrentItem((FXint) index); 00111 } 00112 } 00113 mySchemeName->setNumVisible(5); 00114 00115 new FXButton(frame0, "\t\tSave the setting to registry", 00116 GUIIconSubSys::getIcon(ICON_SAVEDB), this, MID_SIMPLE_VIEW_SAVE, 00117 ICON_ABOVE_TEXT | BUTTON_TOOLBAR | FRAME_RAISED | LAYOUT_TOP | LAYOUT_LEFT); 00118 new FXButton(frame0, "\t\tRemove the setting from registry", 00119 GUIIconSubSys::getIcon(ICON_REMOVEDB), this, MID_SIMPLE_VIEW_DELETE, 00120 ICON_ABOVE_TEXT | BUTTON_TOOLBAR | FRAME_RAISED | LAYOUT_TOP | LAYOUT_LEFT); 00121 new FXButton(frame0, "\t\tExport setting to file", 00122 GUIIconSubSys::getIcon(ICON_SAVE), this, MID_SIMPLE_VIEW_EXPORT, 00123 ICON_ABOVE_TEXT | BUTTON_TOOLBAR | FRAME_RAISED | LAYOUT_TOP | LAYOUT_LEFT); 00124 new FXButton(frame0, "\t\tLoad setting from file", 00125 GUIIconSubSys::getIcon(ICON_OPEN_CONFIG), this, MID_SIMPLE_VIEW_IMPORT, 00126 ICON_ABOVE_TEXT | BUTTON_TOOLBAR | FRAME_RAISED | LAYOUT_TOP | LAYOUT_LEFT); 00127 00128 } 00129 // 00130 FXTabBook* tabbook = 00131 new FXTabBook(contentFrame, 0, 0, TABBOOK_LEFTTABS | PACK_UNIFORM_WIDTH | PACK_UNIFORM_HEIGHT | LAYOUT_FILL_X | LAYOUT_FILL_Y | LAYOUT_RIGHT, 00132 0, 0, 0, 0, 0, 0, 0, 0); 00133 { 00134 // tab for the background 00135 new FXTabItem(tabbook, "Background", NULL, TAB_LEFT_NORMAL, 0, 0, 0, 0, 4, 8, 4, 4); 00136 FXVerticalFrame* frame1 = 00137 new FXVerticalFrame(tabbook, FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00138 00139 FXMatrix* m11 = 00140 new FXMatrix(frame1, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00141 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00142 new FXLabel(m11, "Color", 0, LAYOUT_CENTER_Y); 00143 myBackgroundColor = new FXColorWell(m11, convert(settings->backgroundColor), 00144 this, MID_SIMPLE_VIEW_COLORCHANGE, 00145 LAYOUT_FIX_WIDTH | LAYOUT_CENTER_Y | LAYOUT_SIDE_TOP | FRAME_SUNKEN | FRAME_THICK | ICON_AFTER_TEXT, 00146 0, 0, 100, 0, 0, 0, 0, 0); 00147 00148 new FXHorizontalSeparator(frame1, SEPARATOR_GROOVE | LAYOUT_FILL_X); 00149 00150 FXVerticalFrame* frame11 = 00151 new FXVerticalFrame(frame1, LAYOUT_FILL_Y, 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00152 new FXLabel(frame11, "Decals:"); 00153 myDecalsFrame = new FXVerticalFrame(frame11); 00154 FXHorizontalFrame* frame111 = new FXHorizontalFrame(frame11, LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_FILL_X | PACK_UNIFORM_WIDTH, 0, 0, 0, 0, 10, 10, 5, 5); 00155 new FXButton(frame111, "&Load Decals", NULL, this, MID_SIMPLE_VIEW_LOAD_DECALS, BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 20, 20, 4, 4); 00156 new FXButton(frame111, "&Save Decals", NULL, this, MID_SIMPLE_VIEW_SAVE_DECALS, BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 20, 20, 4, 4); 00157 00158 new FXHorizontalSeparator(frame1, SEPARATOR_GROOVE | LAYOUT_FILL_X); 00159 00160 FXMatrix* m12 = 00161 new FXMatrix(frame1, 2, LAYOUT_FILL_X | LAYOUT_BOTTOM | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00162 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00163 myShowGrid = 00164 new FXCheckButton(m12, "Show grid", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y | CHECKBUTTON_NORMAL); 00165 myShowGrid->setCheck(mySettings->showGrid); 00166 new FXLabel(m12, ""); 00167 FXMatrix* m121 = 00168 new FXMatrix(m12, 2, LAYOUT_CENTER_Y | LAYOUT_FILL_X | LAYOUT_BOTTOM | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00169 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 00170 new FXLabel(m121, "x-spacing", 0, LAYOUT_CENTER_Y); 00171 myGridXSizeDialer = 00172 new FXRealSpinDial(m121, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, 00173 LAYOUT_CENTER_Y | LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); 00174 myGridXSizeDialer->setRange(1, 10000); 00175 myGridXSizeDialer->setValue(mySettings->gridXSize); 00176 FXMatrix* m122 = 00177 new FXMatrix(m12, 2, LAYOUT_CENTER_Y | LAYOUT_FILL_X | LAYOUT_BOTTOM | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00178 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 00179 new FXLabel(m122, "y-spacing", 0, LAYOUT_CENTER_Y); 00180 myGridYSizeDialer = 00181 new FXRealSpinDial(m122, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, 00182 LAYOUT_CENTER_Y | LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); 00183 myGridYSizeDialer->setRange(1, 10000); 00184 myGridYSizeDialer->setValue(mySettings->gridXSize); 00185 } 00186 { 00187 // tab for the streets 00188 new FXTabItem(tabbook, "Streets", NULL, TAB_LEFT_NORMAL, 0, 0, 0, 0, 4, 8, 4, 4); 00189 00190 FXVerticalFrame* frame2 = 00191 new FXVerticalFrame(tabbook, FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00192 FXMatrix* m21 = 00193 new FXMatrix(frame2, 3, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00194 0, 0, 0, 0, 10, 10, 10, 2, 5, 5); 00195 new FXLabel(m21, "Color by", 0, LAYOUT_CENTER_Y); 00196 myLaneEdgeColorMode = new FXComboBox(m21, 30, this, MID_SIMPLE_VIEW_COLORCHANGE, FRAME_SUNKEN | LAYOUT_LEFT | LAYOUT_TOP | COMBOBOX_STATIC); 00197 myLaneEdgeColorMode->setNumVisible(10); 00198 myLaneColorInterpolation = new FXCheckButton(m21, "Interpolate", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y | CHECKBUTTON_NORMAL); 00199 FXScrollWindow* genScroll = new FXScrollWindow(frame2, LAYOUT_FILL_X | LAYOUT_SIDE_TOP | FRAME_RAISED | FRAME_THICK | LAYOUT_FIX_HEIGHT, 0, 0, 0, 80); 00200 myLaneColorSettingFrame = 00201 new FXVerticalFrame(genScroll, LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 10, 10, 2, 8, 5, 2); 00202 //we should insert a FXScrollWindow around the frame2 00203 #ifdef HAVE_MESOSIM 00204 if (GUIVisualizationSettings::UseMesoSim) { 00205 mySettings->edgeColorer.fill(*myLaneEdgeColorMode); 00206 } else { 00207 #endif 00208 mySettings->laneColorer.fill(*myLaneEdgeColorMode); 00209 #ifdef HAVE_MESOSIM 00210 } 00211 #endif 00212 00213 new FXHorizontalSeparator(frame2, SEPARATOR_GROOVE | LAYOUT_FILL_X); 00214 FXMatrix* m22 = 00215 new FXMatrix(frame2, 2, LAYOUT_FILL_X | LAYOUT_BOTTOM | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00216 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00217 myShowLaneBorders = new FXCheckButton(m22, "Show lane borders", this, MID_SIMPLE_VIEW_COLORCHANGE); 00218 myShowLaneBorders->setCheck(mySettings->laneShowBorders); 00219 new FXLabel(m22, " ", 0, LAYOUT_CENTER_Y); 00220 myShowLaneDecals = new FXCheckButton(m22, "Show link decals", this, MID_SIMPLE_VIEW_COLORCHANGE); 00221 myShowLaneDecals->setCheck(mySettings->showLinkDecals); 00222 new FXLabel(m22, " ", 0, LAYOUT_CENTER_Y); 00223 myShowRails = new FXCheckButton(m22, "Show rails", this, MID_SIMPLE_VIEW_COLORCHANGE); 00224 myShowRails->setCheck(mySettings->showRails); 00225 new FXLabel(m22, " ", 0, LAYOUT_CENTER_Y); 00226 myHideMacroConnectors = new FXCheckButton(m22, "Hide macro connectors", this, MID_SIMPLE_VIEW_COLORCHANGE); 00227 myHideMacroConnectors->setCheck(mySettings->hideConnectors); 00228 new FXLabel(m22, " ", 0, LAYOUT_CENTER_Y); 00229 // edge name 00230 myEdgeNamePanel = new NamePanel(m22, this, "Show edge name", mySettings->edgeName); 00231 myStreetNamePanel = new NamePanel(m22, this, "Show street name", mySettings->streetName); 00232 myInternalEdgeNamePanel = new NamePanel(m22, this, "Show internal edge name", mySettings->internalEdgeName); 00233 } 00234 { 00235 new FXTabItem(tabbook, "Vehicles", NULL, TAB_LEFT_NORMAL, 0, 0, 0, 0, 4, 8, 4, 4); 00236 FXVerticalFrame* frame3 = 00237 new FXVerticalFrame(tabbook, FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00238 00239 FXMatrix* m31 = 00240 new FXMatrix(frame3, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00241 0, 0, 0, 0, 10, 10, 10, 2, 5, 5); 00242 new FXLabel(m31, "Show As", 0, LAYOUT_CENTER_Y); 00243 myVehicleShapeDetail = new FXComboBox(m31, 20, this, MID_SIMPLE_VIEW_COLORCHANGE, FRAME_SUNKEN | LAYOUT_LEFT | LAYOUT_TOP | COMBOBOX_STATIC); 00244 myVehicleShapeDetail->appendItem("'triangles'"); 00245 myVehicleShapeDetail->appendItem("'boxes'"); 00246 myVehicleShapeDetail->appendItem("'simple shapes'"); 00247 myVehicleShapeDetail->setNumVisible(3); 00248 myVehicleShapeDetail->setCurrentItem(settings->vehicleQuality); 00249 00250 new FXHorizontalSeparator(frame3, SEPARATOR_GROOVE | LAYOUT_FILL_X); 00251 00252 FXMatrix* m32 = 00253 new FXMatrix(frame3, 3, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00254 0, 0, 0, 0, 10, 10, 10, 2, 5, 5); 00255 new FXLabel(m32, "Color by", 0, LAYOUT_CENTER_Y); 00256 myVehicleColorMode = new FXComboBox(m32, 20, this, MID_SIMPLE_VIEW_COLORCHANGE, FRAME_SUNKEN | LAYOUT_LEFT | LAYOUT_TOP | COMBOBOX_STATIC); 00257 mySettings->vehicleColorer.fill(*myVehicleColorMode); 00258 myVehicleColorMode->setNumVisible(10); 00259 myVehicleColorInterpolation = new FXCheckButton(m32, "Interpolate", this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y | CHECKBUTTON_NORMAL); 00260 00261 FXScrollWindow* genScroll = new FXScrollWindow(frame3, LAYOUT_FILL_X | LAYOUT_SIDE_TOP | FRAME_RAISED | FRAME_THICK | LAYOUT_FIX_HEIGHT, 0, 0, 0, 80); 00262 myVehicleColorSettingFrame = 00263 new FXVerticalFrame(genScroll, LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 10, 10, 2, 8, 5, 2); 00264 00265 new FXHorizontalSeparator(frame3, SEPARATOR_GROOVE | LAYOUT_FILL_X); 00266 00267 FXMatrix* m33 = 00268 new FXMatrix(frame3, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00269 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00270 myShowBlinker = new FXCheckButton(m33, "Show blinker / brake lights", this, MID_SIMPLE_VIEW_COLORCHANGE); 00271 myShowBlinker->setCheck(mySettings->showBlinker); 00272 new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y); 00273 myShowMinGap = new FXCheckButton(m33, "Show minimum gap", this, MID_SIMPLE_VIEW_COLORCHANGE); 00274 myShowMinGap->setCheck(mySettings->drawMinGap); 00275 new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y); 00276 /* 00277 myShowLaneChangePreference = new FXCheckButton(m33, "Show lane change preference", this, MID_SIMPLE_VIEW_COLORCHANGE); 00278 myShowLaneChangePreference->setCheck(mySettings->drawLaneChangePreference); 00279 new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y); 00280 */ 00281 myVehicleNamePanel = new NamePanel(m33, this, "Show vehicle name", mySettings->vehicleName); 00282 /* 00283 FXCheckButton *tmpc = new FXCheckButton(m33, "Show braking lights", 0 ,0); 00284 tmpc->disable(); 00285 tmpc = new FXCheckButton(m33, "Show needed headway", 0 ,0); 00286 tmpc->disable(); 00287 */ 00288 00289 new FXHorizontalSeparator(frame3, SEPARATOR_GROOVE | LAYOUT_FILL_X); 00290 00291 FXMatrix* m34 = 00292 new FXMatrix(frame3, 2, LAYOUT_FILL_X | LAYOUT_BOTTOM | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00293 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00294 FXMatrix* m341 = 00295 new FXMatrix(m34, 2, LAYOUT_FILL_X | LAYOUT_BOTTOM | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00296 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 00297 new FXLabel(m341, "Minimum size", 0, LAYOUT_CENTER_Y); 00298 myVehicleMinSizeDialer = 00299 new FXRealSpinDial(m341, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, 00300 LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); 00301 myVehicleMinSizeDialer->setValue(mySettings->minVehicleSize); 00302 FXMatrix* m342 = 00303 new FXMatrix(m34, 2, LAYOUT_FILL_X | LAYOUT_BOTTOM | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00304 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 00305 new FXLabel(m342, "Exaggerate by", 0, LAYOUT_CENTER_Y); 00306 myVehicleUpscaleDialer = 00307 new FXRealSpinDial(m342, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, 00308 LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); 00309 myVehicleUpscaleDialer->setRange(1, 100); 00310 myVehicleUpscaleDialer->setValue(mySettings->vehicleExaggeration); 00311 } { 00312 new FXTabItem(tabbook, "Nodes", NULL, TAB_LEFT_NORMAL, 0, 0, 0, 0, 4, 8, 4, 4); 00313 FXVerticalFrame* frame4 = 00314 new FXVerticalFrame(tabbook, FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00315 00316 FXMatrix* m33 = 00317 new FXMatrix(frame4, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00318 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00319 myShowTLIndex = new FXCheckButton(m33, "Show link tls index", this, MID_SIMPLE_VIEW_COLORCHANGE); 00320 myShowTLIndex->setCheck(mySettings->drawLinkTLIndex); 00321 new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y); 00322 myShowJunctionIndex = new FXCheckButton(m33, "Show link junction index", this, MID_SIMPLE_VIEW_COLORCHANGE); 00323 myShowJunctionIndex->setCheck(mySettings->drawLinkJunctionIndex); 00324 new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y); 00325 myShowLane2Lane = new FXCheckButton(m33, "Show lane to lane connections", this, MID_SIMPLE_VIEW_COLORCHANGE); 00326 myShowLane2Lane->setCheck(mySettings->showLane2Lane); 00327 new FXLabel(m33, " ", 0, LAYOUT_CENTER_Y); 00328 myJunctionNamePanel = new NamePanel(m33, this, "Show junction name", mySettings->junctionName); 00329 myInternalJunctionNamePanel = new NamePanel(m33, this, "Show internal junction name", mySettings->internalJunctionName); 00330 } { 00331 new FXTabItem(tabbook, "Detectors/Trigger", NULL, TAB_LEFT_NORMAL, 0, 0, 0, 0, 4, 8, 4, 4); 00332 FXVerticalFrame* frame5 = 00333 new FXVerticalFrame(tabbook, FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00334 00335 FXMatrix* m51 = 00336 new FXMatrix(frame5, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00337 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00338 myAddNamePanel = new NamePanel(m51, this, "Show detector name", mySettings->addName); 00339 new FXHorizontalSeparator(frame5 , SEPARATOR_GROOVE | LAYOUT_FILL_X); 00340 00341 FXMatrix* m52 = 00342 new FXMatrix(frame5, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00343 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00344 FXMatrix* m521 = 00345 new FXMatrix(m52, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00346 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 00347 new FXLabel(m521, "Minimum size", 0, LAYOUT_CENTER_Y); 00348 myDetectorMinSizeDialer = 00349 new FXRealSpinDial(m521, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, 00350 LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); 00351 FXMatrix* m522 = 00352 new FXMatrix(m52, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00353 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 00354 myDetectorMinSizeDialer->setValue(mySettings->minAddSize); 00355 new FXLabel(m522, "Exaggerate by", 0, LAYOUT_CENTER_Y); 00356 myDetectorUpscaleDialer = 00357 new FXRealSpinDial(m522, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, 00358 LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); 00359 myDetectorUpscaleDialer->setRange(1, 100); 00360 myDetectorUpscaleDialer->setValue(mySettings->addExaggeration); 00361 00362 00363 /* 00364 new FXLabel(m522, "Color", 0, LAYOUT_CENTER_Y); 00365 myDetectorNameColor = new FXColorWell(m522, convert(settings->addNameColor), 00366 this, MID_SIMPLE_VIEW_COLORCHANGE, 00367 LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y|LAYOUT_SIDE_TOP|FRAME_SUNKEN|FRAME_THICK|ICON_AFTER_TEXT, 00368 0, 0, 100, 0, 0, 0, 0, 0); 00369 */ 00370 } { 00371 new FXTabItem(tabbook, "POIs", NULL, TAB_LEFT_NORMAL, 0, 0, 0, 0, 4, 8, 4, 4); 00372 FXVerticalFrame* frame6 = 00373 new FXVerticalFrame(tabbook, FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00374 00375 FXMatrix* m61 = 00376 new FXMatrix(frame6, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00377 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00378 myPoiNamePanel = new NamePanel(m61, this, "Show poi name", mySettings->poiName); 00379 new FXHorizontalSeparator(frame6 , SEPARATOR_GROOVE | LAYOUT_FILL_X); 00380 00381 FXMatrix* m62 = 00382 new FXMatrix(frame6, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00383 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00384 FXMatrix* m621 = 00385 new FXMatrix(m62, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00386 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 00387 new FXLabel(m621, "Minimum size to show", 0, LAYOUT_CENTER_Y); 00388 myPOIMinSizeDialer = 00389 new FXRealSpinDial(m621, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, 00390 LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); 00391 FXMatrix* m622 = 00392 new FXMatrix(m62, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00393 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 00394 myPOIMinSizeDialer->setValue(mySettings->minPOISize); 00395 new FXLabel(m622, "Exaggerate by", 0, LAYOUT_CENTER_Y); 00396 myPOIUpscaleDialer = 00397 new FXRealSpinDial(m622, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, 00398 LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); 00399 myPOIUpscaleDialer->setRange(1, 1000); 00400 myPOIUpscaleDialer->setValue(mySettings->addExaggeration); 00401 00402 00403 } { 00404 new FXTabItem(tabbook, "Legend", NULL, TAB_LEFT_NORMAL, 0, 0, 0, 0, 4, 8, 4, 4); 00405 FXVerticalFrame* frame7 = 00406 new FXVerticalFrame(tabbook, FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00407 00408 FXMatrix* m72 = 00409 new FXMatrix(frame7, 2, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00410 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00411 myShowSizeLegend = new FXCheckButton(m72, "Show Size Legend", this, MID_SIMPLE_VIEW_COLORCHANGE); 00412 myShowSizeLegend->setCheck(mySettings->showSizeLegend); 00413 new FXLabel(m72, ""); 00414 } { 00415 new FXTabItem(tabbook, "openGL", NULL, TAB_LEFT_NORMAL, 0, 0, 0, 0, 4, 8, 4, 4); 00416 FXVerticalFrame* frame8 = 00417 new FXVerticalFrame(tabbook, FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2); 00418 00419 FXMatrix* m82 = 00420 new FXMatrix(frame8, 1, LAYOUT_FILL_X | LAYOUT_TOP | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 00421 0, 0, 0, 0, 10, 10, 10, 10, 5, 5); 00422 myAntialiase = new FXCheckButton(m82, "Antialiase", this, MID_SIMPLE_VIEW_COLORCHANGE); 00423 myAntialiase->setCheck(mySettings->antialiase); 00424 myDither = new FXCheckButton(m82, "Dither", this, MID_SIMPLE_VIEW_COLORCHANGE); 00425 myDither->setCheck(mySettings->dither); 00426 } 00427 FXHorizontalFrame* f2 = new FXHorizontalFrame(contentFrame, LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_FILL_X | PACK_UNIFORM_WIDTH, 0, 0, 0, 0, 10, 10, 5, 5); 00428 FXButton* initial = new FXButton(f2, "&Use", NULL, this, MID_SETTINGS_OK, BUTTON_INITIAL | BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 30, 30, 4, 4); 00429 new FXButton(f2, "&Discard", NULL, this, MID_SETTINGS_CANCEL, BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 30, 30, 4, 4); 00430 initial->setFocus(); 00431 00432 rebuildColorMatrices(false); 00433 setIcon(GUIIconSubSys::getIcon(ICON_EMPTY)); 00434 } 00435 00436 00437 GUIDialog_ViewSettings::~GUIDialog_ViewSettings() { 00438 myParent->remove(this); 00439 delete myEdgeNamePanel; 00440 delete myInternalEdgeNamePanel; 00441 delete myStreetNamePanel; 00442 delete myJunctionNamePanel; 00443 delete myInternalJunctionNamePanel; 00444 delete myVehicleNamePanel; 00445 delete myAddNamePanel; 00446 delete myPoiNamePanel; 00447 } 00448 00449 00450 void 00451 GUIDialog_ViewSettings::setCurrent(GUIVisualizationSettings* settings) { 00452 mySettings = settings; 00453 myBackup = (*settings); 00454 onCmdNameChange(0, 0, 0); 00455 } 00456 00457 00458 long 00459 GUIDialog_ViewSettings::onCmdOk(FXObject*, FXSelector, void*) { 00460 hide(); 00461 return 1; 00462 } 00463 00464 00465 long 00466 GUIDialog_ViewSettings::onCmdCancel(FXObject*, FXSelector, void*) { 00467 hide(); 00468 (*mySettings) = myBackup; 00469 return 1; 00470 } 00471 00472 00473 long 00474 GUIDialog_ViewSettings::onCmdNameChange(FXObject*, FXSelector, void* data) { 00475 if (data != 0) { 00476 FXString dataS = (char*) data; // !!!unicode 00477 // check whether this item has been added twice 00478 if (dataS == mySchemeName->getItemText(mySchemeName->getNumItems() - 1)) { 00479 for (int i = 0; i < mySchemeName->getNumItems() - 1; ++i) { 00480 if (dataS == mySchemeName->getItemText(i)) { 00481 mySchemeName->removeItem(i); 00482 } 00483 } 00484 } 00485 myBackup = gSchemeStorage.get(dataS.text()); 00486 mySettings = &gSchemeStorage.get(dataS.text()); 00487 } 00488 rebuildColorMatrices(true); 00489 00490 myBackgroundColor->setRGBA(convert(mySettings->backgroundColor)); 00491 00492 myLaneEdgeColorMode->setCurrentItem((FXint) mySettings->getLaneEdgeMode()); 00493 myShowLaneBorders->setCheck(mySettings->laneShowBorders); 00494 myShowLaneDecals->setCheck(mySettings->showLinkDecals); 00495 myShowRails->setCheck(mySettings->showRails); 00496 myEdgeNamePanel->update(mySettings->edgeName); 00497 myInternalEdgeNamePanel->update(mySettings->internalEdgeName); 00498 myStreetNamePanel->update(mySettings->streetName); 00499 myHideMacroConnectors->setCheck(mySettings->hideConnectors); 00500 00501 myVehicleColorMode->setCurrentItem((FXint) mySettings->vehicleColorer.getActive()); 00502 myVehicleShapeDetail->setCurrentItem(mySettings->vehicleQuality); 00503 myVehicleUpscaleDialer->setValue(mySettings->vehicleExaggeration); 00504 myVehicleMinSizeDialer->setValue(mySettings->minVehicleSize); 00505 myShowBlinker->setCheck(mySettings->showBlinker); 00506 myShowMinGap->setCheck(mySettings->drawMinGap); 00507 /* 00508 myShowLaneChangePreference->setCheck(mySettings->drawLaneChangePreference); 00509 */ 00510 myVehicleNamePanel->update(mySettings->vehicleName); 00511 00512 myShowTLIndex->setCheck(mySettings->drawLinkTLIndex); 00513 myShowJunctionIndex->setCheck(mySettings->drawLinkJunctionIndex); 00514 myJunctionNamePanel->update(mySettings->junctionName); 00515 myInternalJunctionNamePanel->update(mySettings->internalJunctionName); 00516 00517 myDetectorUpscaleDialer->setValue(mySettings->addExaggeration); 00518 myDetectorMinSizeDialer->setValue(mySettings->minAddSize); 00519 myAddNamePanel->update(mySettings->addName); 00520 00521 myPOIUpscaleDialer->setValue(mySettings->poiExaggeration); 00522 myPOIMinSizeDialer->setValue(mySettings->minPOISize); 00523 myPoiNamePanel->update(mySettings->poiName); 00524 00525 myShowLane2Lane->setCheck(mySettings->showLane2Lane); 00526 myAntialiase->setCheck(mySettings->antialiase); 00527 myDither->setCheck(mySettings->dither); 00528 myShowSizeLegend->setCheck(mySettings->showSizeLegend); 00529 00530 myParent->setColorScheme(mySettings->name); 00531 update(); 00532 myParent->update(); 00533 return 1; 00534 } 00535 00536 00537 long 00538 GUIDialog_ViewSettings::onCmdColorChange(FXObject* sender, FXSelector, void* /*val*/) { 00539 GUIVisualizationSettings tmpSettings = *mySettings; 00540 size_t prevLaneMode = mySettings->getLaneEdgeMode(); 00541 size_t prevVehicleMode = mySettings->vehicleColorer.getActive(); 00542 bool doRebuildColorMatrices = false; 00543 00544 tmpSettings.name = mySettings->name; 00545 tmpSettings.backgroundColor = convert(myBackgroundColor->getRGBA()); 00546 tmpSettings.showGrid = (myShowGrid->getCheck() != FALSE); 00547 tmpSettings.gridXSize = (SUMOReal) myGridXSizeDialer->getValue(); 00548 tmpSettings.gridYSize = (SUMOReal) myGridYSizeDialer->getValue(); 00549 00550 #ifdef HAVE_MESOSIM 00551 if (GUIVisualizationSettings::UseMesoSim) { 00552 tmpSettings.edgeColorer.setActive(myLaneEdgeColorMode->getCurrentItem()); 00553 } else { 00554 #endif 00555 tmpSettings.laneColorer.setActive(myLaneEdgeColorMode->getCurrentItem()); 00556 #ifdef HAVE_MESOSIM 00557 } 00558 #endif 00559 tmpSettings.laneShowBorders = (myShowLaneBorders->getCheck() != FALSE); 00560 tmpSettings.showLinkDecals = (myShowLaneDecals->getCheck() != FALSE); 00561 tmpSettings.showRails = (myShowRails->getCheck() != FALSE); 00562 tmpSettings.edgeName = myEdgeNamePanel->getSettings(); 00563 tmpSettings.internalEdgeName = myInternalEdgeNamePanel->getSettings(); 00564 tmpSettings.streetName = myStreetNamePanel->getSettings(); 00565 tmpSettings.hideConnectors = (myHideMacroConnectors->getCheck() != FALSE); 00566 00567 tmpSettings.vehicleColorer.setActive(myVehicleColorMode->getCurrentItem()); 00568 tmpSettings.vehicleQuality = myVehicleShapeDetail->getCurrentItem(); 00569 tmpSettings.vehicleExaggeration = (SUMOReal) myVehicleUpscaleDialer->getValue(); 00570 tmpSettings.minVehicleSize = (SUMOReal) myVehicleMinSizeDialer->getValue(); 00571 tmpSettings.showBlinker = (myShowBlinker->getCheck() != FALSE); 00572 tmpSettings.drawMinGap = (myShowMinGap->getCheck() != FALSE); 00573 /* 00574 tmpSettings.drawLaneChangePreference = (myShowLaneChangePreference->getCheck() != FALSE); 00575 */ 00576 tmpSettings.vehicleName = myVehicleNamePanel->getSettings(); 00577 00578 tmpSettings.drawLinkTLIndex = (myShowTLIndex->getCheck() != FALSE); 00579 tmpSettings.drawLinkJunctionIndex = (myShowJunctionIndex->getCheck() != FALSE); 00580 tmpSettings.junctionName = myJunctionNamePanel->getSettings(); 00581 tmpSettings.internalJunctionName = myInternalJunctionNamePanel->getSettings(); 00582 00583 tmpSettings.addExaggeration = (SUMOReal) myDetectorUpscaleDialer->getValue(); 00584 tmpSettings.minAddSize = (SUMOReal) myDetectorMinSizeDialer->getValue(); 00585 tmpSettings.addName = myAddNamePanel->getSettings(); 00586 00587 tmpSettings.poiExaggeration = (SUMOReal) myPOIUpscaleDialer->getValue(); 00588 tmpSettings.minPOISize = (SUMOReal) myPOIMinSizeDialer->getValue(); 00589 tmpSettings.poiName = myPoiNamePanel->getSettings(); 00590 00591 tmpSettings.showLane2Lane = (myShowLane2Lane->getCheck() != FALSE); 00592 tmpSettings.antialiase = (myAntialiase->getCheck() != FALSE); 00593 tmpSettings.dither = (myDither->getCheck() != FALSE); 00594 tmpSettings.showSizeLegend = (myShowSizeLegend->getCheck() != FALSE); 00595 00596 // lanes 00597 if (tmpSettings.getLaneEdgeMode() == prevLaneMode) { 00598 std::vector<FXColorWell*>::const_iterator colIt = myLaneColors.begin(); 00599 std::vector<FXRealSpinDial*>::const_iterator threshIt = myLaneThresholds.begin(); 00600 std::vector<FXButton*>::const_iterator buttonIt = myLaneButtons.begin(); 00601 GUIColorScheme& scheme = tmpSettings.getLaneEdgeScheme(); 00602 size_t pos = 0; 00603 while (colIt != myLaneColors.end()) { 00604 if (scheme.isFixed()) { 00605 if (sender == *colIt) { 00606 scheme.setColor(pos, convert((*colIt)->getRGBA())); 00607 } 00608 } else { 00609 if (sender == *threshIt) { 00610 const SUMOReal val = (*threshIt)->getValue(); 00611 double lo, hi; 00612 if (pos != 0) { 00613 threshIt--; 00614 (*threshIt)->getRange(lo, hi); 00615 (*threshIt)->setRange(lo, val); 00616 threshIt++; 00617 } 00618 threshIt++; 00619 if (threshIt != myLaneThresholds.end()) { 00620 (*threshIt)->getRange(lo, hi); 00621 (*threshIt)->setRange(val, hi); 00622 } 00623 scheme.setThreshold(pos, val); 00624 break; 00625 } 00626 if (sender == *colIt) { 00627 scheme.setColor(pos, convert((*colIt)->getRGBA())); 00628 break; 00629 } 00630 if (sender == *buttonIt) { 00631 if (pos == 0) { 00632 scheme.addColor(convert((*colIt)->getRGBA()), (*threshIt)->getValue()); 00633 } else { 00634 scheme.removeColor(pos); 00635 } 00636 doRebuildColorMatrices = true; 00637 break; 00638 } 00639 ++threshIt; 00640 ++buttonIt; 00641 } 00642 ++colIt; 00643 pos++; 00644 } 00645 if (sender == myLaneColorInterpolation) { 00646 scheme.setInterpolated(myLaneColorInterpolation->getCheck() != FALSE); 00647 doRebuildColorMatrices = true; 00648 } 00649 } else { 00650 doRebuildColorMatrices = true; 00651 } 00652 // vehicles 00653 if (tmpSettings.vehicleColorer.getActive() == prevVehicleMode) { 00654 std::vector<FXColorWell*>::const_iterator colIt = myVehicleColors.begin(); 00655 std::vector<FXRealSpinDial*>::const_iterator threshIt = myVehicleThresholds.begin(); 00656 std::vector<FXButton*>::const_iterator buttonIt = myVehicleButtons.begin(); 00657 GUIColorScheme& scheme = tmpSettings.vehicleColorer.getScheme(); 00658 size_t pos = 0; 00659 while (colIt != myVehicleColors.end()) { 00660 if (scheme.isFixed()) { 00661 if (sender == *colIt) { 00662 scheme.setColor(pos, convert((*colIt)->getRGBA())); 00663 } 00664 } else { 00665 if (sender == *threshIt) { 00666 const SUMOReal val = (*threshIt)->getValue(); 00667 double lo, hi; 00668 if (pos != 0) { 00669 threshIt--; 00670 (*threshIt)->getRange(lo, hi); 00671 (*threshIt)->setRange(lo, val); 00672 threshIt++; 00673 } 00674 threshIt++; 00675 if (threshIt != myVehicleThresholds.end()) { 00676 (*threshIt)->getRange(lo, hi); 00677 (*threshIt)->setRange(val, hi); 00678 } 00679 scheme.setThreshold(pos, val); 00680 break; 00681 } 00682 if (sender == *colIt) { 00683 scheme.setColor(pos, convert((*colIt)->getRGBA())); 00684 break; 00685 } 00686 if (sender == *buttonIt) { 00687 if (pos == 0) { 00688 scheme.addColor(convert((*colIt)->getRGBA()), (*threshIt)->getValue()); 00689 } else { 00690 scheme.removeColor(pos); 00691 } 00692 doRebuildColorMatrices = true; 00693 break; 00694 } 00695 ++threshIt; 00696 ++buttonIt; 00697 } 00698 ++colIt; 00699 pos++; 00700 } 00701 if (sender == myVehicleColorInterpolation) { 00702 scheme.setInterpolated(myVehicleColorInterpolation->getCheck() != FALSE); 00703 doRebuildColorMatrices = true; 00704 } 00705 } else { 00706 doRebuildColorMatrices = true; 00707 } 00708 00709 if (tmpSettings == *mySettings) { 00710 return 1; 00711 } 00712 00713 if (tmpSettings.name[0] != '*') { 00714 tmpSettings.name = '*' + tmpSettings.name; 00715 } 00716 gSchemeStorage.add(tmpSettings); 00717 int index = mySchemeName->getCurrentItem(); 00718 if (index < (int) gSchemeStorage.getNumInitialSettings()) { 00719 index = mySchemeName->appendItem(tmpSettings.name.c_str()); 00720 gSchemeStorage.add(tmpSettings); 00721 mySchemeName->setCurrentItem(index); 00722 myParent->getColoringSchemesCombo().appendItem(tmpSettings.name.c_str()); 00723 myParent->getColoringSchemesCombo().setCurrentItem(index); 00724 myParent->setColorScheme(tmpSettings.name); 00725 } else { 00726 mySchemeName->setItemText(index, tmpSettings.name.c_str()); 00727 myParent->getColoringSchemesCombo().setItemText(index, tmpSettings.name.c_str()); 00728 myParent->setColorScheme(tmpSettings.name); 00729 } 00730 mySettings = &gSchemeStorage.get(tmpSettings.name); 00731 00732 if (doRebuildColorMatrices) { 00733 rebuildColorMatrices(true); 00734 } 00735 myParent->forceRefresh(); 00736 getApp()->forceRefresh(); 00737 return 1; 00738 } 00739 00740 00741 void 00742 GUIDialog_ViewSettings::loadSettings(const std::string& file) { 00743 GUISettingsHandler handler(file); 00744 std::string settingsName = handler.addSettings(myParent); 00745 if (settingsName != "") { 00746 FXint index = mySchemeName->appendItem(settingsName.c_str()); 00747 mySchemeName->setCurrentItem(index); 00748 mySettings = &gSchemeStorage.get(settingsName); 00749 } 00750 } 00751 00752 00753 void 00754 GUIDialog_ViewSettings::saveDecals(const std::string& file) const { 00755 try { 00756 OutputDevice& dev = OutputDevice::getDevice(file); 00757 dev << "<decals>\n"; 00758 std::vector<GUISUMOAbstractView::Decal>::iterator j; 00759 for (j = myDecals->begin(); j != myDecals->end(); ++j) { 00760 GUISUMOAbstractView::Decal& d = *j; 00761 dev << " <decal filename=\"" << d.filename 00762 << "\" centerX=\"" << d.centerX 00763 << "\" centerY=\"" << d.centerY 00764 << "\" width=\"" << d.width 00765 << "\" height=\"" << d.height 00766 << "\" rotation=\"" << d.rot 00767 << "\"/>\n"; 00768 } 00769 dev << "</decals>\n"; 00770 dev.close(); 00771 } catch (IOError& e) { 00772 FXMessageBox::error(myParent, MBOX_OK, "Storing failed!", "%s", e.what()); 00773 } 00774 } 00775 00776 00777 void 00778 GUIDialog_ViewSettings::loadDecals(const std::string& file) { 00779 myDecalsLock->lock(); 00780 GUISettingsHandler handler(file); 00781 if (handler.hasDecals()) { 00782 (*myDecals) = handler.getDecals(); 00783 } 00784 rebuildList(); 00785 myParent->update(); 00786 myDecalsLock->unlock(); 00787 } 00788 00789 00790 long 00791 GUIDialog_ViewSettings::onCmdSaveSetting(FXObject*, FXSelector, void* /*data*/) { 00792 int index = mySchemeName->getCurrentItem(); 00793 if (index < (int) gSchemeStorage.getNumInitialSettings()) { 00794 return 1; 00795 } 00796 // get the name 00797 while (true) { 00798 FXDialogBox dialog(this, "Enter a name", DECOR_TITLE | DECOR_BORDER); 00799 FXVerticalFrame* content = new FXVerticalFrame(&dialog, LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10); 00800 new FXLabel(content, "Please enter an alphanumeric name: ", NULL, LAYOUT_FILL_X | JUSTIFY_LEFT); 00801 FXTextField* text = new FXTextField(content, 40, &dialog, FXDialogBox::ID_ACCEPT, TEXTFIELD_ENTER_ONLY | FRAME_SUNKEN | FRAME_THICK | LAYOUT_FILL_X); 00802 new FXHorizontalSeparator(content, SEPARATOR_GROOVE | LAYOUT_FILL_X); 00803 FXHorizontalFrame* buttons = new FXHorizontalFrame(content, LAYOUT_FILL_X | PACK_UNIFORM_WIDTH, 0, 0, 0, 0, 0, 0, 0, 0); 00804 new FXButton(buttons, "&OK", NULL, &dialog, FXDialogBox::ID_ACCEPT, BUTTON_INITIAL | BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_RIGHT); 00805 new FXButton(buttons, "&Cancel", NULL, &dialog, FXDialogBox::ID_CANCEL, BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_RIGHT, 0, 0, 0, 0, 20, 20); 00806 dialog.create(); 00807 text->setFocus(); 00808 if (dialog.execute()) { 00809 std::string name = text->getText().text(); 00810 bool isAlphaNum = true; 00811 for (size_t i = 0; i < name.length(); ++i) { 00812 if (name[i] == '_' || (name[i] >= 'a' && name[i] <= 'z') || (name[i] >= 'A' && name[i] <= 'Z') || (name[i] >= '0' && name[i] <= '9')) { 00813 continue; 00814 } 00815 isAlphaNum = false; 00816 } 00817 isAlphaNum = isAlphaNum & (name.length() > 0); 00818 if (isAlphaNum) { 00819 GUIVisualizationSettings tmpSettings = *mySettings; 00820 gSchemeStorage.remove(mySettings->name); 00821 tmpSettings.name = name; 00822 gSchemeStorage.add(tmpSettings); 00823 mySchemeName->setItemText(index, tmpSettings.name.c_str()); 00824 myParent->getColoringSchemesCombo().setItemText(index, tmpSettings.name.c_str()); 00825 myParent->setColorScheme(tmpSettings.name); 00826 mySettings = &gSchemeStorage.get(name); 00827 myBackup = *mySettings; 00828 gSchemeStorage.writeSettings(getApp()); 00829 return 1; 00830 } 00831 } else { 00832 return 1; 00833 } 00834 } 00835 // save 00836 return 1; 00837 } 00838 00839 00840 long 00841 GUIDialog_ViewSettings::onUpdSaveSetting(FXObject* sender, FXSelector, void* ptr) { 00842 sender->handle(this, 00843 mySchemeName->getCurrentItem() < (int) gSchemeStorage.getNumInitialSettings() 00844 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), 00845 ptr); 00846 return 1; 00847 } 00848 00849 00850 long 00851 GUIDialog_ViewSettings::onCmdDeleteSetting(FXObject*, FXSelector, void* /*data*/) { 00852 int index = mySchemeName->getCurrentItem(); 00853 if (index < (int) gSchemeStorage.getNumInitialSettings()) { 00854 return 1; 00855 } 00856 std::string name = mySchemeName->getItem(index).text(); 00857 gSchemeStorage.remove(name); 00858 mySchemeName->removeItem(index); 00859 onCmdNameChange(0, 0, (void*) mySchemeName->getItem(0).text()); 00860 gSchemeStorage.writeSettings(getApp()); 00861 return 1; 00862 } 00863 00864 00865 long 00866 GUIDialog_ViewSettings::onUpdDeleteSetting(FXObject* sender, FXSelector, void* ptr) { 00867 sender->handle(this, 00868 mySchemeName->getCurrentItem() < (int) gSchemeStorage.getNumInitialSettings() 00869 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), 00870 ptr); 00871 return 1; 00872 } 00873 00874 00875 long 00876 GUIDialog_ViewSettings::onCmdExportSetting(FXObject*, FXSelector, void* /*data*/) { 00877 FXFileDialog opendialog(this, "Export view settings"); 00878 opendialog.setIcon(GUIIconSubSys::getIcon(ICON_EMPTY)); 00879 opendialog.setSelectMode(SELECTFILE_ANY); 00880 opendialog.setPatternList("*.xml"); 00881 if (gCurrentFolder.length() != 0) { 00882 opendialog.setDirectory(gCurrentFolder); 00883 } 00884 if (!opendialog.execute() || !MFXUtils::userPermitsOverwritingWhenFileExists(this, opendialog.getFilename())) { 00885 return 1; 00886 } 00887 try { 00888 OutputDevice& dev = OutputDevice::getDevice(opendialog.getFilename().text()); 00889 mySettings->save(dev); 00890 dev.close(); 00891 } catch (IOError& e) { 00892 FXMessageBox::error(this, MBOX_OK, "Storing failed!", "%s", e.what()); 00893 } 00894 return 1; 00895 } 00896 00897 00898 long 00899 GUIDialog_ViewSettings::onUpdExportSetting(FXObject* sender, FXSelector, void* ptr) { 00900 sender->handle(this, 00901 mySchemeName->getCurrentItem() < (int) gSchemeStorage.getNumInitialSettings() 00902 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), 00903 ptr); 00904 return 1; 00905 } 00906 00907 00908 long 00909 GUIDialog_ViewSettings::onCmdImportSetting(FXObject*, FXSelector, void* /*data*/) { 00910 FXFileDialog opendialog(this, "Import view settings"); 00911 opendialog.setIcon(GUIIconSubSys::getIcon(ICON_EMPTY)); 00912 opendialog.setSelectMode(SELECTFILE_ANY); 00913 opendialog.setPatternList("*.xml"); 00914 if (gCurrentFolder.length() != 0) { 00915 opendialog.setDirectory(gCurrentFolder); 00916 } 00917 if (opendialog.execute()) { 00918 gCurrentFolder = opendialog.getDirectory(); 00919 loadSettings(opendialog.getFilename().text()); 00920 } 00921 return 1; 00922 } 00923 00924 00925 long 00926 GUIDialog_ViewSettings::onCmdLoadDecals(FXObject*, FXSelector, void* /*data*/) { 00927 FXFileDialog opendialog(this, "Load Decals"); 00928 opendialog.setIcon(GUIIconSubSys::getIcon(ICON_EMPTY)); 00929 opendialog.setSelectMode(SELECTFILE_ANY); 00930 opendialog.setPatternList("*.xml"); 00931 if (gCurrentFolder.length() != 0) { 00932 opendialog.setDirectory(gCurrentFolder); 00933 } 00934 if (opendialog.execute()) { 00935 gCurrentFolder = opendialog.getDirectory(); 00936 loadDecals(opendialog.getFilename().text()); 00937 } 00938 return 1; 00939 } 00940 00941 00942 long 00943 GUIDialog_ViewSettings::onCmdSaveDecals(FXObject*, FXSelector, void* /*data*/) { 00944 FXFileDialog opendialog(this, "Save Decals"); 00945 opendialog.setIcon(GUIIconSubSys::getIcon(ICON_EMPTY)); 00946 opendialog.setSelectMode(SELECTFILE_ANY); 00947 opendialog.setPatternList("*.xml"); 00948 if (gCurrentFolder.length() != 0) { 00949 opendialog.setDirectory(gCurrentFolder); 00950 } 00951 if (!opendialog.execute() || !MFXUtils::userPermitsOverwritingWhenFileExists(this, opendialog.getFilename())) { 00952 return 1; 00953 } 00954 saveDecals(opendialog.getFilename().text()); 00955 return 1; 00956 } 00957 00958 00959 00960 00961 long 00962 GUIDialog_ViewSettings::onUpdImportSetting(FXObject* sender, FXSelector, void* ptr) { 00963 sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), ptr); 00964 return 1; 00965 } 00966 00967 00968 RGBColor 00969 GUIDialog_ViewSettings::convert(const FXColor c) { 00970 return RGBColor( 00971 (SUMOReal) FXREDVAL(c) / (SUMOReal) 255., 00972 (SUMOReal) FXGREENVAL(c) / (SUMOReal) 255., 00973 (SUMOReal) FXBLUEVAL(c) / (SUMOReal) 255.); 00974 } 00975 00976 00977 FXColor 00978 GUIDialog_ViewSettings::convert(const RGBColor& c) { 00979 return FXRGB(c.red() * 255., c.green() * 255., c.blue() * 255.); 00980 } 00981 00982 00983 void 00984 GUIDialog_ViewSettings::rebuildList() { 00985 myDecalsTable->clearItems(); 00986 // set table attributes 00987 myDecalsTable->setTableSize(10, 6); 00988 myDecalsTable->setColumnText(0, "picture file"); 00989 myDecalsTable->setColumnText(1, "center x"); 00990 myDecalsTable->setColumnText(2, "center y"); 00991 myDecalsTable->setColumnText(3, "width"); 00992 myDecalsTable->setColumnText(4, "height"); 00993 myDecalsTable->setColumnText(5, "rotation"); 00994 FXHeader* header = myDecalsTable->getColumnHeader(); 00995 header->setHeight(getApp()->getNormalFont()->getFontHeight() + getApp()->getNormalFont()->getFontAscent()); 00996 int k; 00997 for (k = 0; k < 6; k++) { 00998 header->setItemJustify(k, JUSTIFY_CENTER_X | JUSTIFY_TOP); 00999 header->setItemSize(k, 60); 01000 } 01001 header->setItemSize(0, 150); 01002 // insert already known decals information into table 01003 FXint row = 0; 01004 std::vector<GUISUMOAbstractView::Decal>::iterator j; 01005 for (j = myDecals->begin(); j != myDecals->end(); ++j) { 01006 GUISUMOAbstractView::Decal& d = *j; 01007 myDecalsTable->setItemText(row, 0, d.filename.c_str()); 01008 myDecalsTable->setItemText(row, 1, toString<SUMOReal>(d.centerX).c_str()); 01009 myDecalsTable->setItemText(row, 2, toString<SUMOReal>(d.centerY).c_str()); 01010 myDecalsTable->setItemText(row, 3, toString<SUMOReal>(d.width).c_str()); 01011 myDecalsTable->setItemText(row, 4, toString<SUMOReal>(d.height).c_str()); 01012 myDecalsTable->setItemText(row, 5, toString<SUMOReal>(d.rot).c_str()); 01013 row++; 01014 } 01015 // insert dummy last field 01016 for (k = 0; k < 6; k++) { 01017 myDecalsTable->setItemText(row, k, " "); 01018 } 01019 } 01020 01021 01022 void 01023 GUIDialog_ViewSettings::rebuildColorMatrices(bool doCreate) { 01024 // decals 01025 delete myDecalsTable; 01026 myDecalsTable = new MFXAddEditTypedTable(myDecalsFrame, this, MID_TABLE, 01027 LAYOUT_FILL_Y | LAYOUT_FIX_WIDTH/*|LAYOUT_FIX_HEIGHT*/, 0, 0, 470, 0); 01028 myDecalsTable->setVisibleRows(5); 01029 myDecalsTable->setVisibleColumns(6); 01030 myDecalsTable->setTableSize(5, 6); 01031 myDecalsTable->setBackColor(FXRGB(255, 255, 255)); 01032 myDecalsTable->getRowHeader()->setWidth(0); 01033 for (int i = 1; i < 5; ++i) { 01034 myDecalsTable->setCellType(i, CT_REAL); 01035 myDecalsTable->setNumberCellParams(i, -10000000, 10000000, 1, 10, 100, "%.2f"); 01036 } 01037 myDecalsTable->setCellType(5, CT_REAL); 01038 myDecalsTable->setNumberCellParams(5, -10000000, 10000000, .1, 1, 10, "%.2f"); 01039 rebuildList(); 01040 if (doCreate) { 01041 myDecalsTable->create(); 01042 } 01043 { 01044 // lane / edge 01045 MFXUtils::deleteChildren(myLaneColorSettingFrame); 01046 FXMatrix* m = new FXMatrix(myLaneColorSettingFrame, 3, 01047 LAYOUT_FILL_X | MATRIX_BY_COLUMNS, 01048 0, 0, 0, 0, 10, 10, 0, 0, 5, 3); 01049 myLaneColors.clear(); 01050 myLaneThresholds.clear(); 01051 myLaneButtons.clear(); 01052 GUIColorScheme& scheme = mySettings->getLaneEdgeScheme(); 01053 const bool fixed = scheme.isFixed(); 01054 const std::vector<RGBColor> &colors = scheme.getColors(); 01055 std::vector<RGBColor>::const_iterator colIt = colors.begin(); 01056 std::vector<SUMOReal>::const_iterator threshIt = scheme.getThresholds().begin(); 01057 std::vector<std::string>::const_iterator nameIt = scheme.getNames().begin(); 01058 FX::FXString buttonText = "Add"; 01059 while (colIt != colors.end()) { 01060 myLaneColors.push_back(new FXColorWell(m , convert(*colIt), 01061 this, MID_SIMPLE_VIEW_COLORCHANGE, 01062 LAYOUT_FIX_WIDTH | LAYOUT_CENTER_Y | FRAME_SUNKEN | FRAME_THICK | ICON_AFTER_TEXT, 01063 0, 0, 100, 0, 0, 0, 0, 0)); 01064 if (fixed) { 01065 new FXLabel(m, nameIt->c_str()); 01066 new FXLabel(m, ""); 01067 } else { 01068 int dialerOptions = scheme.allowsNegativeValues() ? SPINDIAL_NOMIN : 0; 01069 FXRealSpinDial* threshDialer = new FXRealSpinDial(m, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y | LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK | SPINDIAL_NOMAX | dialerOptions); 01070 threshDialer->setValue(*threshIt); 01071 myLaneThresholds.push_back(threshDialer); 01072 myLaneButtons.push_back(new FXButton(m, buttonText, NULL, this, MID_SIMPLE_VIEW_COLORCHANGE, BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 20, 20, 4, 4)); 01073 buttonText = "Remove"; 01074 } 01075 colIt++; 01076 threshIt++; 01077 nameIt++; 01078 } 01079 myLaneColorInterpolation->setCheck(scheme.isInterpolated()); 01080 if (fixed) { 01081 myLaneColorInterpolation->disable(); 01082 } else { 01083 if (colors.size() > 1) { 01084 myLaneColorInterpolation->enable(); 01085 if (myLaneColorInterpolation->getCheck() != FALSE) { 01086 myLaneThresholds.front()->enable(); 01087 } else { 01088 myLaneThresholds.front()->disable(); 01089 } 01090 } else { 01091 myLaneColorInterpolation->disable(); 01092 myLaneThresholds.front()->disable(); 01093 } 01094 } 01095 if (doCreate) { 01096 m->create(); 01097 } 01098 myLaneColorSettingFrame->getParent()->recalc(); 01099 } 01100 { 01101 // vehicles 01102 MFXUtils::deleteChildren(myVehicleColorSettingFrame); 01103 FXMatrix* m = new FXMatrix(myVehicleColorSettingFrame, 3, 01104 LAYOUT_FILL_X | MATRIX_BY_COLUMNS, 01105 0, 0, 0, 0, 10, 10, 0, 0, 5, 3); 01106 myVehicleColors.clear(); 01107 myVehicleThresholds.clear(); 01108 myVehicleButtons.clear(); 01109 const bool fixed = mySettings->vehicleColorer.getScheme().isFixed(); 01110 const std::vector<RGBColor> &colors = mySettings->vehicleColorer.getScheme().getColors(); 01111 std::vector<RGBColor>::const_iterator colIt = colors.begin(); 01112 std::vector<SUMOReal>::const_iterator threshIt = mySettings->vehicleColorer.getScheme().getThresholds().begin(); 01113 std::vector<std::string>::const_iterator nameIt = mySettings->vehicleColorer.getScheme().getNames().begin(); 01114 FX::FXString buttonText = "Add"; 01115 while (colIt != colors.end()) { 01116 myVehicleColors.push_back(new FXColorWell(m , convert(*colIt), 01117 this, MID_SIMPLE_VIEW_COLORCHANGE, 01118 LAYOUT_FIX_WIDTH | LAYOUT_CENTER_Y | FRAME_SUNKEN | FRAME_THICK | ICON_AFTER_TEXT, 01119 0, 0, 100, 0, 0, 0, 0, 0)); 01120 if (fixed) { 01121 new FXLabel(m, nameIt->c_str()); 01122 new FXLabel(m, ""); 01123 } else { 01124 FXRealSpinDial* threshDialer = 01125 new FXRealSpinDial(m, 10, this, MID_SIMPLE_VIEW_COLORCHANGE, 01126 LAYOUT_CENTER_Y | LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK | SPINDIAL_NOMAX); 01127 threshDialer->setValue(*threshIt); 01128 myVehicleThresholds.push_back(threshDialer); 01129 myVehicleButtons.push_back(new FXButton(m, buttonText, NULL, this, MID_SIMPLE_VIEW_COLORCHANGE, BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 20, 20, 4, 4)); 01130 buttonText = "Remove"; 01131 } 01132 colIt++; 01133 threshIt++; 01134 nameIt++; 01135 } 01136 myVehicleColorInterpolation->setCheck(mySettings->vehicleColorer.getScheme().isInterpolated()); 01137 if (fixed) { 01138 myVehicleColorInterpolation->disable(); 01139 } else { 01140 if (colors.size() > 1) { 01141 myVehicleColorInterpolation->enable(); 01142 if (myVehicleColorInterpolation->getCheck() != FALSE) { 01143 myVehicleThresholds.front()->enable(); 01144 } else { 01145 myVehicleThresholds.front()->disable(); 01146 } 01147 } else { 01148 myVehicleColorInterpolation->disable(); 01149 myVehicleThresholds.front()->disable(); 01150 } 01151 } 01152 if (doCreate) { 01153 m->create(); 01154 } 01155 myVehicleColorSettingFrame->getParent()->recalc(); 01156 } 01157 layout(); 01158 update(); 01159 } 01160 01161 01162 long 01163 GUIDialog_ViewSettings::onCmdEditTable(FXObject*, FXSelector, void* data) { 01164 MFXEditedTableItem* i = (MFXEditedTableItem*) data; 01165 std::string value = i->item->getText().text(); 01166 // check whether the inserted value is empty 01167 if (value.find_first_not_of(" ") == std::string::npos) { 01168 return 1; 01169 } 01170 GUISUMOAbstractView::Decal d; 01171 int row = i->row; 01172 // check whether we add a new entry or edit an existing entry 01173 if (row == static_cast<int>(myDecals->size())) { 01174 d.filename = ""; 01175 d.centerX = SUMOReal(myParent->getGridWidth() / 2.); 01176 d.centerY = SUMOReal(myParent->getGridHeight() / 2.); 01177 d.width = SUMOReal(myParent->getGridWidth()); 01178 d.height = SUMOReal(myParent->getGridHeight()); 01179 d.initialised = false; 01180 d.rot = 0; 01181 myDecalsLock->lock(); 01182 myDecals->push_back(d); 01183 myDecalsLock->unlock(); 01184 } else if (row > static_cast<int>(myDecals->size())) { 01185 // ignore clicks two lines below existing entries 01186 return 1; 01187 } else { 01188 d = (*myDecals)[row]; 01189 } 01190 01191 switch (i->col) { 01192 case 0: 01193 if (d.initialised && d.filename != value) { 01194 d.initialised = false; 01195 } 01196 d.filename = value; 01197 break; 01198 case 1: 01199 try { 01200 d.centerX = TplConvert<char>::_2SUMOReal(value.c_str()); 01201 } catch (NumberFormatException&) { 01202 std::string msg = "The value must be a float, is:" + value; 01203 FXMessageBox::error(this, MBOX_OK, "Number format error", "%s", msg.c_str()); 01204 } 01205 break; 01206 case 2: 01207 try { 01208 d.centerY = TplConvert<char>::_2SUMOReal(value.c_str()); 01209 } catch (NumberFormatException&) { 01210 std::string msg = "The value must be a float, is:" + value; 01211 FXMessageBox::error(this, MBOX_OK, "Number format error", "%s", msg.c_str()); 01212 } 01213 break; 01214 case 3: 01215 try { 01216 d.width = TplConvert<char>::_2SUMOReal(value.c_str()); 01217 } catch (NumberFormatException&) { 01218 std::string msg = "The value must be a float, is:" + value; 01219 FXMessageBox::error(this, MBOX_OK, "Number format error", "%s", msg.c_str()); 01220 } 01221 break; 01222 case 4: 01223 try { 01224 d.height = TplConvert<char>::_2SUMOReal(value.c_str()); 01225 } catch (NumberFormatException&) { 01226 std::string msg = "The value must be a float, is:" + value; 01227 FXMessageBox::error(this, MBOX_OK, "Number format error", "%s", msg.c_str()); 01228 } 01229 break; 01230 case 5: 01231 try { 01232 d.rot = TplConvert<char>::_2SUMOReal(value.c_str()); 01233 } catch (NumberFormatException&) { 01234 std::string msg = "The value must be a float, is:" + value; 01235 FXMessageBox::error(this, MBOX_OK, "Number format error", "%s", msg.c_str()); 01236 } 01237 break; 01238 default: 01239 throw 1; 01240 } 01241 (*myDecals)[row] = d; 01242 if (!i->updateOnly) { 01243 rebuildList(); 01244 } 01245 myParent->update(); 01246 return 1; 01247 } 01248 01249 01250 std::string 01251 GUIDialog_ViewSettings::getCurrentScheme() const { 01252 return mySchemeName->getItem(mySchemeName->getCurrentItem()).text(); 01253 } 01254 01255 01256 void 01257 GUIDialog_ViewSettings::setCurrentScheme(const std::string& name) { 01258 if (name.c_str() == mySchemeName->getItemText(mySchemeName->getCurrentItem())) { 01259 return; 01260 } 01261 for (int i = 0; i < mySchemeName->getNumItems(); ++i) { 01262 if (name.c_str() == mySchemeName->getItemText(i)) { 01263 mySchemeName->setCurrentItem(i); 01264 onCmdNameChange(0, 0, (void*)name.c_str()); 01265 return; 01266 } 01267 } 01268 } 01269 01270 GUIDialog_ViewSettings::NamePanel::NamePanel( 01271 FXMatrix* parent, 01272 GUIDialog_ViewSettings* target, 01273 const std::string& title, 01274 const GUIVisualizationTextSettings& settings) { 01275 myCheck = new FXCheckButton(parent, title.c_str(), target, MID_SIMPLE_VIEW_COLORCHANGE, LAYOUT_CENTER_Y | CHECKBUTTON_NORMAL); 01276 myCheck->setCheck(settings.show); 01277 new FXLabel(parent, ""); 01278 FXMatrix* m1 = new FXMatrix(parent, 2, LAYOUT_FILL_X | LAYOUT_BOTTOM | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 01279 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 01280 new FXLabel(m1, "Size", 0, LAYOUT_CENTER_Y); 01281 mySizeDial = new FXRealSpinDial(m1, 10, target, MID_SIMPLE_VIEW_COLORCHANGE, 01282 LAYOUT_CENTER_Y | LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); 01283 mySizeDial->setRange(10, 1000); 01284 mySizeDial->setValue(settings.size); 01285 FXMatrix* m2 = new FXMatrix(parent, 2, LAYOUT_FILL_X | LAYOUT_BOTTOM | LAYOUT_LEFT | MATRIX_BY_COLUMNS, 01286 0, 0, 0, 0, 10, 10, 0, 0, 5, 5); 01287 FXLabel(m2, "Color", 0, LAYOUT_CENTER_Y); 01288 myColorWell = new FXColorWell(m2, convert(settings.color), 01289 target, MID_SIMPLE_VIEW_COLORCHANGE, 01290 LAYOUT_FIX_WIDTH | LAYOUT_CENTER_Y | LAYOUT_SIDE_TOP | FRAME_SUNKEN | FRAME_THICK | ICON_AFTER_TEXT, 01291 0, 0, 100, 0, 0, 0, 0, 0); 01292 } 01293 01294 GUIVisualizationTextSettings 01295 GUIDialog_ViewSettings::NamePanel::getSettings() { 01296 return GUIVisualizationTextSettings(myCheck->getCheck() != FALSE, 01297 mySizeDial->getValue(), convert(myColorWell->getRGBA())); 01298 } 01299 01300 01301 void 01302 GUIDialog_ViewSettings::NamePanel::update(const GUIVisualizationTextSettings& settings) { 01303 myCheck->setCheck(settings.show); 01304 mySizeDial->setValue(settings.size); 01305 myColorWell->setRGBA(convert(settings.color)); 01306 } 01307 /****************************************************************************/ 01308