void ModelerApplication::Init(ModelerViewCreator_f createView, const ModelerControl controls[], unsigned numControls) { int i; m_animating = false; m_numControls = numControls; // ******************************************************** // Create the FLTK user interface // ******************************************************** m_ui = new ModelerUserInterface(); // Store pointers to the controls for manipulation m_controlLabelBoxes = new Fl_Box*[numControls]; m_controlValueSliders = new Fl_Value_Slider*[numControls]; // Constants for user interface setup const int textHeight = 20; const int sliderHeight = 20; const int packWidth = m_ui->m_controlsPack->w(); m_ui->m_controlsPack->begin(); // For each control, add appropriate objects to the user interface for (i=0; i<m_numControls; i++) { // Add the entry to the selection box m_ui->m_controlsBrowser->add(controls[i].m_name); // Add the label (but make it invisible for now) Fl_Box *box = new Fl_Box(0, 0, packWidth, textHeight, controls[i].m_name); box->labelsize(10); box->hide(); box->box(FL_FLAT_BOX); // otherwise, Fl_Scroll messes up (ehsu) m_controlLabelBoxes[i] = box; // Add the slider (but make it invisible for now) Fl_Value_Slider *slider = new Fl_Value_Slider(0, 0, packWidth, sliderHeight,0); slider->type(1); slider->range(controls[i].m_minimum, controls[i].m_maximum); slider->step(controls[i].m_stepsize); slider->value(controls[i].m_value); slider->hide(); m_controlValueSliders[i] = slider; slider->callback((Fl_Callback*)ModelerApplication::SliderCallback); } m_ui->m_controlsPack->end(); // Make sure that we remove the view from the // Fl_Group, otherwise, it'll blow up // THIS BUG FIXED 04-18-01 ehsu m_ui->m_modelerWindow->remove(*(m_ui->m_modelerView)); delete m_ui->m_modelerView; m_ui->m_modelerWindow->begin(); m_ui->m_modelerView = createView(0, 0, m_ui->m_modelerWindow->w(), m_ui->m_modelerWindow->h() ,NULL); Fl_Group::current()->resizable(m_ui->m_modelerView); m_ui->m_modelerWindow->end(); }
int main(int argc, char **argv) { Fl_Window *w; {Fl_Window* o = new Fl_Window(365, 525); w = o; scroll = new Fl_Scroll(10,10,345,285); {Fl_Pack* o = new Fl_Pack(10, 10, 345, 285); pack = o; o->box(FL_DOWN_BOX); //o->box(FL_ENGRAVED_FRAME); (void) new Fl_Button(35, 35, 25, 25, "b1"); (void) new Fl_Button(45, 45, 25, 25, "b2"); (void) new Fl_Button(55, 55, 25, 25, "b3"); (void) new Fl_Button(65, 65, 25, 25, "b4"); (void) new Fl_Button(75, 75, 25, 25, "b5"); (void) new Fl_Button(85, 85, 25, 25, "b6"); (void) new Fl_Button(95, 95, 25, 25, "b7"); (void) new Fl_Button(105, 105, 25, 25, "b8"); (void) new Fl_Button(115, 115, 25, 25, "b9"); (void) new Fl_Button(125, 125, 25, 25, "b10"); (void) new Fl_Button(135, 135, 25, 25, "b11"); (void) new Fl_Button(145, 145, 25, 25, "b12"); (void) new Fl_Button(155, 155, 25, 25, "b13"); (void) new Fl_Button(165, 165, 25, 25, "b14"); (void) new Fl_Button(175, 175, 25, 25, "b15"); (void) new Fl_Button(185, 185, 25, 25, "b16"); (void) new Fl_Button(195, 195, 25, 25, "b17"); (void) new Fl_Button(205, 205, 25, 25, "b18"); (void) new Fl_Button(215, 215, 25, 25, "b19"); (void) new Fl_Button(225, 225, 25, 25, "b20"); (void) new Fl_Button(235, 235, 25, 25, "b21"); (void) new Fl_Button(245, 245, 25, 25, "b22"); (void) new Fl_Button(255, 255, 25, 25, "b23"); (void) new Fl_Button(265, 265, 25, 25, "b24"); o->end(); w->resizable(o); } scroll->end(); {Fl_Light_Button* o = new Fl_Light_Button(10, 325, 175, 25, "HORIZONTAL"); o->type(FL_RADIO_BUTTON); o->callback((Fl_Callback*)type_cb, (void*)(Fl_Pack::HORIZONTAL)); } {Fl_Light_Button* o = new Fl_Light_Button(10, 350, 175, 25, "VERTICAL"); o->type(FL_RADIO_BUTTON); o->value(1); o->callback((Fl_Callback*)type_cb, (void*)(Fl_Pack::VERTICAL)); } {Fl_Value_Slider* o = new Fl_Value_Slider(50,375, 295,25,"spacing:"); o->clear_flag(FL_ALIGN_MASK); o->set_flag(FL_ALIGN_LEFT); o->type(Fl_Slider::HORIZONTAL); o->range(0,30); o->step(1); o->callback((Fl_Callback*)spacing_cb); } w->end(); } w->show(argc, argv); return Fl::run(); }
void ModelerUI::addControl(const char* szName, float fMin, float fMax, float fStepSize, float fInitVal) { Fl_Group* pgrpCurrBak = Fl_Group::current(); Fl_Group::current(m_ppckPack); const int k_iTextHeight = 20; const int k_iSliderHeight = 20; // Setup the label box Fl_Box* box = new Fl_Box(0, 0, m_ppckPack->w(), k_iTextHeight, szName); box->labelsize(10); box->hide(); box->box(FL_FLAT_BOX); // otherwise, Fl_Scroll messes up (ehsu) // Setup the slider Fl_Value_Slider *slider = new Fl_Value_Slider(0, 0, m_ppckPack->w(), k_iSliderHeight, 0); slider->type(1); slider->hide(); slider->user_data(this); slider->callback(cb_sliders); slider->range(fMin, fMax); slider->step(fStepSize); slider->value(fInitVal); Fl_Group::current(pgrpCurrBak); // Add this entry to the browser string strName = "@C0"; // FLTK color encoding, we'll use @C0~@C6 strName += szName; m_pbrsBrowser->add(strName.c_str()); // Setup the curve m_pwndGraphWidget->addCurve(fInitVal, fMin, fMax); ++m_iCurrControlCount; }
void ModelerUserInterface::pickGroupProperty(GroupProperty* group) { // Remove the event listeners for old controls // TODO: we really need to have a PropertyEditor class that handles this // automatically... if (currentGroup) { PropertyList* props = currentGroup->getProperties(); for (PropertyList::iterator iter = props->begin(); iter != props->end(); iter++) { if (RangeProperty* prop = dynamic_cast<RangeProperty*>(*iter)) { prop->unlisten((SignalListener)updateRangeSlider); } else if (RGBProperty* prop = dynamic_cast<RGBProperty*>(*iter)) { prop->unlisten((SignalListener)updateColorChooser); } else if (BooleanProperty* prop = dynamic_cast<BooleanProperty*>(*iter)) { prop->unlisten((SignalListener)updateCheckbox); } else if (ChoiceProperty* prop = dynamic_cast<ChoiceProperty*>(*iter)) { prop->unlisten((SignalListener)updateChoice); } } // Clear out the old controls m_controlsPack->clear(); currentGroup = NULL; } // Reset the scrollbar m_controlsScroll->position(0, 0); // If there's no group, exit if (!group) { m_controlsScroll->redraw(); return; } // Constants for slider dimensions const int packWidth = m_controlsPack->w(); const int textHeight = 20; const int sliderHeight = 20; const int chooserHeight = 100; const int buttonHeight = 20; // Show them // For each control, add appropriate objects to the user interface currentGroup = group; PropertyList* props = group->getProperties(); for (PropertyList::iterator iter = props->begin(); iter != props->end(); iter++) { // Ignore it if it's a group property (those belong in the tree). if (dynamic_cast<GroupProperty*>(*iter)) continue; // And now we'll create a UI element for the property. // The big if-statement below uses dynamic_cast<PropertyType*>(ptr), // to see if a property has a given type. dynamic_cast will // return 0 if ptr is not of type PropertyType. // Add a slider if the property is a RangeProperty if (RangeProperty* prop = dynamic_cast<RangeProperty*>(*iter)) { // Add the label Fl_Box *box = new Fl_Box(0, 0, packWidth, textHeight, (*iter)->getName()); box->labelsize(14); box->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); box->box(FL_FLAT_BOX); // otherwise, Fl_Scroll messes up (ehsu) m_controlsPack->add(box); // Add the slider Fl_Value_Slider *slider = new Fl_Value_Slider(0, 0, packWidth, sliderHeight); slider->type(1); slider->range(prop->getMin(), prop->getMax()); slider->step(prop->getStep()); slider->value(prop->getValue()); m_controlsPack->add(slider); // Use the step size to determine the number of decimal places // shown in the slider's label. if (prop->getStep() > 0) { slider->precision((int)-log(prop->getStep())); } // Have the slider notify the program when it changes slider->callback((Fl_Callback*)SliderCallback, (void*) prop); // Have the property notify the slider when it changes prop->listen((SignalListener)updateRangeSlider, (void*) slider); // Add a color picker if the property is an RGB property } else if (RGBProperty* prop = dynamic_cast<RGBProperty*>(*iter)) { // Add the label Fl_Box *box = new Fl_Box(0, 0, packWidth, textHeight, (*iter)->getName()); box->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); box->labelsize(14); box->box(FL_FLAT_BOX); // otherwise, Fl_Scroll messes up (ehsu) m_controlsPack->add(box); // Add a color chooser Fl_Color_Chooser* chooser = new Fl_Color_Chooser(0, 0, packWidth, chooserHeight); chooser->rgb(prop->getRed(), prop->getGreen(), prop->getBlue()); m_controlsPack->add(chooser); // Have the chooser notify the program when it changes chooser->callback((Fl_Callback*)ColorPickerCallback, (void*) prop); // Remove any existing color chooser listeners on the property prop->unlisten((SignalListener)updateColorChooser); // Have the property notify the chooser when it changes prop->listen((SignalListener)updateColorChooser, (void*) chooser); // Add a checkbox if the property is a boolean property } else if (BooleanProperty* prop = dynamic_cast<BooleanProperty*>(*iter)) { // Add the checkbox -- no label needed! Fl_Check_Button* btn = new Fl_Check_Button(0, 0, packWidth, buttonHeight, prop->getName()); btn->labelsize(14); btn->type(FL_TOGGLE_BUTTON); btn->value(prop->getValue()); m_controlsPack->add(btn); // Have the button notify the program when it changes btn->callback((Fl_Callback*)ButtonCallback, (void*) prop); // Remove any existing color chooser listeners on the property prop->unlisten((SignalListener)updateCheckbox); // Have the property notify the chooser when it changes prop->listen((SignalListener)updateCheckbox, (void*) btn); // Add radio buttons if the property is a choice property } else if (ChoiceProperty* prop = dynamic_cast<ChoiceProperty*>(*iter)) { // Add the label Fl_Box *box = new Fl_Box(0, 0, packWidth, textHeight, (*iter)->getName()); box->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); box->labelsize(14); box->box(FL_FLAT_BOX); // otherwise, Fl_Scroll messes up (ehsu) m_controlsPack->add(box); // Add a group Fl_Pack* pack = new Fl_Pack(0, 0, packWidth, buttonHeight); pack->type(Fl_Pack::VERTICAL); pack->box(FL_THIN_DOWN_FRAME); pack->user_data((void*) prop); // Add the radio buttons const char* choices = prop->getLabels(); int start = 0, end = -1, index = 0; do { end++; if (choices[end] == 0 || choices[end] == '|') { string str(choices, start, end - start); Fl_Button* btn = new Fl_Round_Button(0, 0, packWidth, buttonHeight, prop->getName()); btn->type(FL_RADIO_BUTTON); btn->copy_label(str.c_str()); btn->value(prop->getValue() == index); // Have the button notify the program when it changes btn->callback((Fl_Callback*)ChoiceCallback, (void*)index); index++; start = end + 1; } } while (choices[end] != 0); pack->end(); m_controlsPack->add(pack); // Remove any existing choce listeners on the property prop->unlisten((SignalListener)updateChoice); // Have the property update the choices when it changes prop->listen((SignalListener)updateChoice, (void*) pack); } } m_controlsScroll->redraw(); }
void ColorFltkMenu::make_window() { size(400, 305); { { Fl_Hold_Browser* o = categorybrowser = new Fl_Hold_Browser(10, 55, 125, 100, "Categories"); o->align(FL_ALIGN_TOP); o->color(VMDMENU_BROWSER_BG, VMDMENU_BROWSER_SEL); o->callback(category_cb, this); VMDFLTKTOOLTIP(o, "Select color category then name to set active color") } { Fl_Hold_Browser* o = itembrowser = new Fl_Hold_Browser(140, 55, 120, 100, "Names"); o->align(FL_ALIGN_TOP); o->color(VMDMENU_BROWSER_BG, VMDMENU_BROWSER_SEL); o->callback(item_cb, this); VMDFLTKTOOLTIP(o, "Select color category then name to set active color") } { Fl_Hold_Browser* o = colorbrowser = new Fl_Hold_Browser(265, 55, 125, 100, "Colors"); o->align(FL_ALIGN_TOP); o->color(VMDMENU_BROWSER_BG, VMDMENU_BROWSER_SEL); o->callback(color_cb, this); VMDFLTKTOOLTIP(o, "Select color category then name to set active color") } new Fl_Box(10, 10, 190, 25, "Assign colors to categories:"); { Fl_Tabs* o = new Fl_Tabs(0, 165, 400, 150); #if defined(VMDMENU_WINDOW) o->color(VMDMENU_WINDOW, FL_GRAY); o->selection_color(VMDMENU_WINDOW); #endif { Fl_Group* o = new Fl_Group(0, 185, 400, 125, "Color Definitions"); #if defined(VMDMENU_WINDOW) o->color(VMDMENU_WINDOW, FL_GRAY); o->selection_color(VMDMENU_WINDOW); #endif { Fl_Hold_Browser* o = colordefbrowser = new Fl_Hold_Browser(15, 195, 135, 100); o->labeltype(FL_NO_LABEL); o->color(VMDMENU_BROWSER_BG, VMDMENU_BROWSER_SEL); o->callback(colordef_cb, this); VMDFLTKTOOLTIP(o, "Select color name to adjust RGB color definition") } { Fl_Value_Slider* o = redscale = new Fl_Value_Slider(160, 195, 225, 20); o->type(FL_HORIZONTAL); o->color(VMDMENU_COLOR_RSLIDER); o->callback(rgb_cb, this); VMDFLTKTOOLTIP(o, "Adjust slider to change RGB color definition") } { Fl_Value_Slider* o = greenscale = new Fl_Value_Slider(160, 215, 225, 20); o->type(FL_HORIZONTAL); o->color(VMDMENU_COLOR_GSLIDER); o->callback(rgb_cb, this); VMDFLTKTOOLTIP(o, "Adjust slider to change RGB color definition") } { Fl_Value_Slider* o = bluescale = new Fl_Value_Slider(160, 235, 225, 20); o->type(FL_HORIZONTAL); o->color(VMDMENU_COLOR_BSLIDER); o->callback(rgb_cb, this); VMDFLTKTOOLTIP(o, "Adjust slider to change RGB color definition") } { Fl_Button* o = grayscalebutton = new Fl_Button(165, 265, 85, 25, "Grayscale"); o->type(FL_TOGGLE_BUTTON); #if defined(VMDMENU_WINDOW) o->color(VMDMENU_WINDOW, FL_GRAY); #endif VMDFLTKTOOLTIP(o, "Lock sliders for grayscale color") } defaultbutton = new Fl_Button(290, 265, 85, 25, "Default"); #if defined(VMDMENU_WINDOW) defaultbutton->color(VMDMENU_WINDOW, FL_GRAY); #endif defaultbutton->callback(default_cb, this); VMDFLTKTOOLTIP(defaultbutton, "Reset to original RGB color") o->end(); } { Fl_Group* o = new Fl_Group(0, 185, 400, 125, "Color Scale"); #if defined(VMDMENU_WINDOW) o->color(VMDMENU_WINDOW, FL_GRAY); o->selection_color(VMDMENU_WINDOW); #endif o->hide(); { Fl_Choice* o = scalemethod = new Fl_Choice(15, 220, 80, 25, "Method"); o->color(VMDMENU_CHOOSER_BG, VMDMENU_CHOOSER_SEL); o->down_box(FL_BORDER_BOX); o->align(FL_ALIGN_TOP); o->callback(scalemethod_cb, this); } offsetvalue = new Fl_Value_Slider(160, 205, 180, 20, "Offset"); offsetvalue->type(FL_HORIZONTAL); offsetvalue->color(VMDMENU_SLIDER_BG, VMDMENU_SLIDER_FG); offsetvalue->align(FL_ALIGN_LEFT); offsetvalue->range(-1.0, 1.0); offsetvalue->callback(scalesettings_cb, this); { Fl_Value_Slider* o = midpointvalue = new Fl_Value_Slider(160, 235, 180, 20, "Midpoint"); o->type(FL_HORIZONTAL); midpointvalue->align(FL_ALIGN_LEFT); midpointvalue->color(VMDMENU_SLIDER_BG, VMDMENU_SLIDER_FG); o->range(0.0, 1.0); o->callback(scalesettings_cb, this); } image = new ColorscaleImage(10, 265, 380, 25, app); o->end(); } o->end(); } end(); } }