// =========================================================================== // method definitions // =========================================================================== GUIDialog_GLObjChooser::GUIDialog_GLObjChooser( GUIGlChildWindow* parent, FXIcon* icon, const FXString& title, const std::vector<GUIGlID>& ids, GUIGlObjectStorage& glStorage): FXMainWindow(parent->getApp(), title, icon, NULL, DECOR_ALL, 20, 20, 300, 300), myParent(parent) { FXHorizontalFrame* hbox = new FXHorizontalFrame(this, LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0); // build the list FXVerticalFrame* layout1 = new FXVerticalFrame(hbox, LAYOUT_FILL_X | LAYOUT_FILL_Y | LAYOUT_TOP, 0, 0, 0, 0, 4, 4, 4, 4); myTextEntry = new FXTextField(layout1, 0, this, MID_CHOOSER_TEXT, LAYOUT_FILL_X | FRAME_THICK | FRAME_SUNKEN); FXVerticalFrame* style1 = new FXVerticalFrame(layout1, LAYOUT_FILL_X | LAYOUT_FILL_Y | LAYOUT_TOP | FRAME_THICK | FRAME_SUNKEN, 0, 0, 0, 0, 0, 0, 0, 0); myList = new FXList(style1, this, MID_CHOOSER_LIST, LAYOUT_FILL_X | LAYOUT_FILL_Y | LIST_SINGLESELECT | FRAME_SUNKEN | FRAME_THICK); for (std::vector<GUIGlID>::const_iterator i = ids.begin(); i != ids.end(); ++i) { GUIGlObject* o = glStorage.getObjectBlocking(*i); if (o == 0) { continue; } const std::string& name = o->getMicrosimID(); bool selected = myParent->isSelected(o); FXIcon* icon = selected ? GUIIconSubSys::getIcon(ICON_FLAG) : 0; myIDs.insert(o->getGlID()); myList->appendItem(name.c_str(), icon, (void*) & (*myIDs.find(o->getGlID()))); glStorage.unblockObject(*i); } // build the buttons FXVerticalFrame* layout = new FXVerticalFrame(hbox, LAYOUT_TOP, 0, 0, 0, 0, 4, 4, 4, 4); myCenterButton = new FXButton(layout, "Center\t\t", GUIIconSubSys::getIcon(ICON_RECENTERVIEW), this, MID_CHOOSER_CENTER, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 4, 4, 4, 4); new FXHorizontalSeparator(layout, GUIDesignHorizontalSeparator); new FXButton(layout, "&Hide Unselected\t\t", GUIIconSubSys::getIcon(ICON_FLAG), this, MID_CHOOSER_FILTER, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 4, 4, 4, 4); new FXButton(layout, "&Select/deselect\tSelect/deselect current object\t", GUIIconSubSys::getIcon(ICON_FLAG), this, MID_CHOOSEN_INVERT, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 4, 4, 4, 4); new FXHorizontalSeparator(layout, GUIDesignHorizontalSeparator); new FXButton(layout, "&Close\t\t", GUIIconSubSys::getIcon(ICON_NO), this, MID_CANCEL, ICON_BEFORE_TEXT | LAYOUT_FILL_X | FRAME_THICK | FRAME_RAISED, 0, 0, 0, 0, 4, 4, 4, 4); myParent->getParent()->addChild(this); }
// =========================================================================== // method definitions // =========================================================================== GUIDialog_GLObjChooser::GUIDialog_GLObjChooser(GUISUMOViewParent *parent, FXIcon *icon, const FXString &title, GUIGlObjectType type, GUIGlObjectStorage &glStorage) throw() : FXMainWindow(parent->getApp(), title, icon, NULL, DECOR_ALL, 20,20,300, 300), myObjectType(type), myParent(parent), mySelected(0) { FXHorizontalFrame *hbox = new FXHorizontalFrame(this, LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 0,0,0,0); // build the list FXVerticalFrame *layout1 = new FXVerticalFrame(hbox, LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP, 0,0,0,0, 4,4,4,4); myTextEntry = new FXTextField(layout1, 0, this, MID_CHOOSER_TEXT, LAYOUT_FILL_X|FRAME_THICK|FRAME_SUNKEN); FXVerticalFrame *style1 = new FXVerticalFrame(layout1, LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|FRAME_THICK|FRAME_SUNKEN, 0,0,0,0, 0,0,0,0); myList = new FXList(style1, this, MID_CHOOSER_LIST, LAYOUT_FILL_X|LAYOUT_FILL_Y|LIST_SINGLESELECT|FRAME_SUNKEN|FRAME_THICK); // get the ids std::vector<GLuint> ids; switch (type) { case GLO_JUNCTION: ids = static_cast<GUINet*>(GUINet::getInstance())->getJunctionIDs(); break; case GLO_EDGE: ids = GUIEdge::getIDs(); break; case GLO_VEHICLE: static_cast<GUIVehicleControl&>(MSNet::getInstance()->getVehicleControl()).insertVehicleIDs(ids); break; case GLO_TLLOGIC: ids = static_cast<GUINet*>(GUINet::getInstance())->getTLSIDs(); break; case GLO_ADDITIONAL: ids = GUIGlObject_AbstractAdd::getIDList(); break; case GLO_SHAPE: ids = static_cast<GUINet*>(GUINet::getInstance())->getShapeIDs(); break; default: break; } for (std::vector<GLuint>::iterator i=ids.begin(); i!=ids.end(); ++i) { GUIGlObject *o = glStorage.getObjectBlocking(*i); if (o==0) { continue; } const std::string &name = o->getMicrosimID(); bool selected = false; if (type==GLO_EDGE) { size_t noLanes = static_cast<GUIEdge*>(o)->getLanes().size(); for (size_t j=0; j<noLanes; ++j) { const GUILaneWrapper &l = static_cast<GUIEdge*>(o)->getLaneGeometry(j); if (gSelected.isSelected(GLO_LANE, l.getGlID())) { selected = true; } } } else { selected = gSelected.isSelected(type, *i); } if (selected) { myList->appendItem(name.c_str(), GUIIconSubSys::getIcon(ICON_FLAG), (void*) o); } else { myList->appendItem(name.c_str(), 0, (void*) o); } glStorage.unblockObject(*i); } // build the buttons FXVerticalFrame *layout = new FXVerticalFrame(hbox, LAYOUT_TOP, 0,0,0,0, 4,4,4,4); new FXButton(layout, "Center\t\t", GUIIconSubSys::getIcon(ICON_RECENTERVIEW), this, MID_CHOOSER_CENTER, ICON_BEFORE_TEXT|LAYOUT_FILL_X|FRAME_THICK|FRAME_RAISED, 0, 0, 0, 0, 4, 4, 4, 4); new FXHorizontalSeparator(layout,SEPARATOR_GROOVE|LAYOUT_FILL_X); new FXButton(layout, "Close\t\t", GUIIconSubSys::getIcon(ICON_NO), this, MID_CANCEL, ICON_BEFORE_TEXT|LAYOUT_FILL_X|FRAME_THICK|FRAME_RAISED, 0, 0, 0, 0, 4, 4, 4, 4); myParent->getParent()->addChild(this); myTextEntry->setFocus(); }