2

Hello I am new to FLTK and right now I have a very simple program, if you run the program, click create then robot part you will see several options choose one. A new window will open with several FL_Input boxes and one enter button I want to make a callback so that when the user presses enter the text entered into in the FL_Input boxes is saved to a string, for example someone enters Space head into the FL_Input and then that value is assigned to a string. I primarily don't need help with the callback just setting a string equal to a FL_Input. Thank you very much for your help

#include <iostream>
#include <sstream>
#include <stdio.h>
#include <FL/Fl.H>
#include <FL/Fl_Text_Display.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Window.H>
#include <FL/filename.H>    
#include <FL/Fl_Box.H>
#include <FL/Fl_Slider.H>
#include <string>
#include <FL/Fl_Int_Input.H>
#include <list>
#include <FL/Fl_Color_Chooser.H>
#include <vector>
#include <FL/Fl_Button.H>
#include <FL/Fl_Check_Button.H>
#include <FL/Fl_Tabs.H>
#include <FL/Fl_Input.H>
#include <FL/Fl_Menu_Bar.H>
#include <FL/Fl_Output.H>
#include <cstdlib>
using namespace std;


void Change_CB(Fl_Widget *w, void *) {
    Fl_Menu_Bar *menu = (Fl_Menu_Bar*)w;
    Fl_Menu_Item *p;
    // Change submenu name
    p = (Fl_Menu_Item*)menu->find_item("Edit/Submenu");
    if (p) p->label("New Submenu Name");
    // Change item name
    p = (Fl_Menu_Item*)menu->find_item("Edit/New Submenu Name/Aaa");
    if (p) p->label("New Aaa Name");
}
void Quit_CB(Fl_Widget *, void *) {
    exit(0);
}
void head_window(Fl_Widget *, void *) {
    Fl_Window *head = new Fl_Window(300, 200, "Head");
    Fl_Input *input = new Fl_Input(110, 0, 100, 30, "Name");
    Fl_Input *input1 = new Fl_Input(110, 40, 100, 30, "Part-Number");
    Fl_Input *input2 = new Fl_Input(110, 80, 100, 30, "Weight");
    Fl_Input *input3 = new Fl_Input(110, 120, 100, 30, "Cost");
    Fl_Button *enter = new Fl_Button(110, 160, 100, 30, "Enter");
    head->show();
}
void torso_window(Fl_Widget *, void *) {
    Fl_Window *head = new Fl_Window(350, 250, "Torso");
    Fl_Input *input = new Fl_Input(150, 0, 100, 30, "Name");
    Fl_Input *input1 = new Fl_Input(150, 40, 100, 30, "Part-Number");
    Fl_Input *input2 = new Fl_Input(150, 80, 100, 30, "Weight");
    Fl_Input *input3 = new Fl_Input(150, 120, 100, 30, "Cost");
    Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Battery Compartments");
    Fl_Button *enter = new Fl_Button(150, 200, 100, 30, "Enter");
    head->show();
}
void locomotor_window(Fl_Widget *, void *) {
    Fl_Window *head = new Fl_Window(350, 300, "Locomotor");
    Fl_Input *input = new Fl_Input(150, 0, 100, 30, "Name");
    Fl_Input *input1 = new Fl_Input(150, 40, 100, 30, "Part-Number");
    Fl_Input *input2 = new Fl_Input(150, 80, 100, 30, "Weight");
    Fl_Input *input3 = new Fl_Input(150, 120, 100, 30, "Cost");
    Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Speed(MPH)");
    Fl_Input *input5 = new Fl_Input(150, 200, 100, 30, "Power Consumed(W)");
    Fl_Button *enter = new Fl_Button(150, 240, 100, 30, "Enter");
    head->show();
}
void arm_window(Fl_Widget *, void *) {
    Fl_Window *head = new Fl_Window(350, 250, "Arm");
    Fl_Input *input = new Fl_Input(150, 0, 100, 30, "Name");
    Fl_Input *input1 = new Fl_Input(150, 40, 100, 30, "Part-Number");
    Fl_Input *input2 = new Fl_Input(150, 80, 100, 30, "Weight");
    Fl_Input *input3 = new Fl_Input(150, 120, 100, 30, "Cost");
    Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Power Consumed(W)");
    Fl_Button *enter = new Fl_Button(150, 200, 100, 30, "Enter");
    head->show();
}
void battery_window(Fl_Widget *, void *) {
    Fl_Window *head = new Fl_Window(350, 250, "Battery");
    Fl_Input *input = new Fl_Input(150, 0, 100, 30, "Name");
    Fl_Input *input1 = new Fl_Input(150, 40, 100, 30, "Part-Number");
    Fl_Input *input2 = new Fl_Input(150, 80, 100, 30, "Weight");
    Fl_Input *input3 = new Fl_Input(150, 120, 100, 30, "Cost");
    Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Energy Stored");
    Fl_Button *enter = new Fl_Button(150, 200, 100, 30, "Enter");
    head->show();
}
void manual_window(Fl_Widget *, void *) {
    Fl_Window *win = new Fl_Window(400, 275);
    Fl_Text_Buffer *buff = new Fl_Text_Buffer();
    Fl_Text_Display *disp = new Fl_Text_Display(20, 20, 350 , 250 , "Manual");
    disp->buffer(buff);
    win->resizable(*disp);
    win->show();
    buff->text("You may click the file button to open a dropdown\nmenu and you will get a button to exit the window\nor press CTRL + v\n"
        "You may click create and you get two options either\nto make a robot part or robot model\n"
        "Clicking on robot part that shows the parts you may\ncreate and their associated shortcuts\n"
        "If you have any questions click help then click on\nmanual to open the manual\n"
            );
        win->show();
}

int main() {
    Fl_Window *win = new Fl_Window(600, 300, "Robot Shop" );
    Fl_Menu_Bar *menu = new Fl_Menu_Bar(0, 0, 600, 25);
    menu->add("File/Quit", FL_CTRL + 'v', Quit_CB);
    menu->add("Create/Robot Part/Head" , FL_CTRL + 'h' , head_window );
    menu->add("Create/Robot Part/Torso" , FL_CTRL + 't' , torso_window);
    menu->add("Create/Robot Part/Arm" , FL_CTRL + 'a' , arm_window);
    menu->add("Create/Robot Part/Battery" , FL_CTRL + 'b' , battery_window);
    menu->add("Create/Robot Part/Locomotor" , FL_CTRL + 'l' , locomotor_window);
    menu->add("Create/Robot Model");
    menu->add("Help/Manual", FL_CTRL + 'm' , manual_window);

    win->show();
    return(Fl::run());
}
Xavier
  • 21
  • 2
  • Recommendation: When preparing a sample for other people to run, hardcode all of the inputs to ensure they experience the exact same behaviour you do. – user4581301 Nov 08 '16 at 23:38

3 Answers3

2

Sorry this is coming late but i think the below will work.

Fl_Input * inp1; //This is a global declaration 
Fl_Button * sav1;
static void sav1_cb(Fl_Button *theButton, void*) // The callback function
{
    string Surname = inp1 -> value();
cout << Surname;
}

inp1 = new Fl_Input (170+100, 50, 200, 20,"Surname"); // The input field which must be in a window
sav1 = new Fl_Button (170+310, 50 + 280, 100, 30,"Save"); // The save button
    sav1->callback((Fl_Callback*)sav1_cb); //Attaching the callback to the save button

What to note is that the "value()" function is what I use to manipulate the data stored or written in the input field. This is just a sample. Hope it helps.

Maxfurry
  • 54
  • 9
1

You need to store your data somewhere. Suggest something like

enum EData
{
   EDHeadWeight,
   EDHeadCost,
   ...
   EDMax
};
std::string data[EDMax];

Option 1: Change your Fl_Button (enter) to Fl_Return_Button then set the callback for the button to save all the values. This assumes that when the user presses return, they have entered all the values.

Option 2: If you want to capture enter on each input, use when(FL_WHEN_ENTER_KEY)

Fl_Input *input4 = new Fl_Input(150, 160, 100, 30, "Battery Compartments");
input4->when(FL_WHEN_ENTER_KEY);
input4->callback(grab, &data[EDTorsoBattery]);
...
void grab(Fl_Widget* w, void* param)
{
   std::string& rv = *((std::string*)param);
   Fl_Input* inp = dynamic_cast<Fl_Input*>(w);
   rv = inp->value();
}
cup
  • 7,589
  • 4
  • 19
  • 42
0

The problem here is that it requires you to store inp->value() into a const char* yet constants can't be modified... I am completely confused.