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