static void field_new_cb(Fl_Widget *w, void *data) { Fl_Menu_Button* mb = ((Fl_Menu_Button*)w); FieldManager *fields = GModel::current()->getFields(); int id = fields->newId(); add_field(id, mb->text(), GModel::current()->getFileName()); if((*fields)[id]) FlGui::instance()->fields->editField((*fields)[id]); }
void gMidiChannel::__cb_openMenu() { Fl_Menu_Item rclick_menu[] = { {"Edit actions..."}, // 0 {"Clear actions", 0, 0, 0, FL_SUBMENU}, // 1 {"All"}, // 2 {0}, // 3 {"Setup MIDI output..."}, // 4 {"Setup MIDI input..."}, // 5 {"Delete channel"}, // 6 {0} }; /* no 'clear actions' if there are no actions */ if (!ch->hasActions) rclick_menu[1].deactivate(); Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_BOX); b->textsize(11); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = rclick_menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) return; if (strcmp(m->label(), "Delete channel") == 0) { if (!gdConfirmWin("Warning", "Delete channel: are you sure?")) return; glue_deleteChannel(ch); return; } if (strcmp(m->label(), "All") == 0) { if (!gdConfirmWin("Warning", "Clear all actions: are you sure?")) return; recorder::clearChan(ch->index); gu_refreshActionEditor(); // refresh a.editor window, it could be open return; } if (strcmp(m->label(), "Edit actions...") == 0) { gu_openSubWindow(mainWin, new gdActionEditor(ch), WID_ACTION_EDITOR); return; } if (strcmp(m->label(), "Setup MIDI output...") == 0) { gu_openSubWindow(mainWin, new gdMidiInputSetup(ch), 0); return; } if (strcmp(m->label(), "Setup MIDI input...") == 0) { gu_openSubWindow(mainWin, new gdMidiGrabberChannel(ch), 0); return; } }
Fl_Menu_Button & Control_Sequence::menu ( void ) { static Fl_Menu_Button _menu( 0, 0, 0, 0, "Control Sequence" ); _menu.clear(); if ( mode() == OSC ) { add_osc_peers_to_menu( &_menu, "Connect To" ); } _menu.add( "Interpolation/None", 0, 0, 0, FL_MENU_RADIO | ( interpolation() == None ? FL_MENU_VALUE : 0 ) ); _menu.add( "Interpolation/Linear", 0, 0, 0, FL_MENU_RADIO | ( interpolation() == Linear ? FL_MENU_VALUE : 0 ) ); _menu.add( "Mode/Control Voltage (JACK)", 0, 0, 0 ,FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 ) ); _menu.add( "Mode/Control Signal (OSC)", 0, 0, 0 , FL_MENU_RADIO | ( mode() == OSC ? FL_MENU_VALUE : 0 ) ); _menu.add( "Rename", 0, 0, 0 ); _menu.add( "Color", 0, 0, 0 ); _menu.add( "Remove", 0, 0, 0 ); _menu.callback( &Control_Sequence::menu_cb, (void*)this); return _menu; }
void gdMainWindow::__cb_open_edit_menu() { Fl_Menu_Item menu[] = { {"Clear all samples"}, {"Clear all actions"}, {"Reset to init state"}, {0} }; /* clear all actions disabled if no recs, clear all samples disabled * if no samples. */ menu[1].deactivate(); for (unsigned i=0; i<MAX_NUM_CHAN; i++) if (recorder::chanEvents[i]) { menu[1].activate(); break; } for (unsigned i=0; i<MAX_NUM_CHAN; i++) if (G_Mixer.chan[i] != NULL) { menu[0].activate(); break; } Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_BOX); b->textsize(11); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) return; if (strcmp(m->label(), "Clear all samples") == 0) { if (!gdConfirmWin("Warning", "Clear all samples: are you sure?")) return; delSubWindow(WID_SAMPLE_EDITOR); glue_clearAllSamples(); return; } if (strcmp(m->label(), "Clear all actions") == 0) { if (!gdConfirmWin("Warning", "Clear all actions: are you sure?")) return; delSubWindow(WID_ACTION_EDITOR); glue_clearAllRecs(); return; } if (strcmp(m->label(), "Reset to init state") == 0) { if (!gdConfirmWin("Warning", "Reset to init state: are you sure?")) return; gu_closeAllSubwindows(); glue_resetToInitState(); return; } }
void Fl_Tool_Bar::cb_menu(Fl_Widget *w, void *data) { Fl_Menu_Button *m = (Fl_Menu_Button *)w; Fl_Widget *item = m->item(); if (item && item->user_data()) { Fl_Widget *toolw = (Fl_Widget *)item->user_data(); if(item->value()) toolw->set_value(); else toolw->clear_value(); toolw->do_callback(); } }
static void field_put_on_view_cb(Fl_Widget *w, void *data) { Fl_Menu_Button* mb = ((Fl_Menu_Button*)w); Field *field = (Field*)FlGui::instance()->fields->editor_group->user_data(); if(mb->value() == 0) field->putOnNewView(); else if(mb->value() - 1 < (int)PView::list.size()) field->putOnView(PView::list[mb->value() - 1]); FlGui::instance()->updateViews(mb->value() == 0, true); drawContext::global()->draw(); }
void gMenu::__cb_file() { /* An Fl_Menu_Button is made of many Fl_Menu_Item */ Fl_Menu_Item menu[] = { {"Open patch or project..."}, {"Save patch..."}, {"Save project..."}, {"Quit Giada"}, {0} }; Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_BOX); b->textsize(11); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) return; if (strcmp(m->label(), "Open patch or project...") == 0) { gWindow *childWin = new gdBrowser("Load Patch", G_Conf.patchPath.c_str(), 0, BROWSER_LOAD_PATCH); gu_openSubWindow(mainWin, childWin, WID_FILE_BROWSER); return; } if (strcmp(m->label(), "Save patch...") == 0) { if (G_Mixer.hasLogicalSamples() || G_Mixer.hasEditedSamples()) if (!gdConfirmWin("Warning", "You should save a project in order to store\nyour takes and/or processed samples.")) return; gWindow *childWin = new gdBrowser("Save Patch", G_Conf.patchPath.c_str(), 0, BROWSER_SAVE_PATCH); gu_openSubWindow(mainWin, childWin, WID_FILE_BROWSER); return; } if (strcmp(m->label(), "Save project...") == 0) { gWindow *childWin = new gdBrowser("Save Project", G_Conf.patchPath.c_str(), 0, BROWSER_SAVE_PROJECT); gu_openSubWindow(mainWin, childWin, WID_FILE_BROWSER); return; } if (strcmp(m->label(), "Quit Giada") == 0) { mainWin->do_callback(); return; } }
void gdMainWindow::__cb_open_file_menu() { /* An Fl_Menu_Button is made of many Fl_Menu_Item */ Fl_Menu_Item menu[] = { {"Open patch or project..."}, {"Save patch..."}, {"Save project..."}, {"Quit Giada"}, {0} }; Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_BOX); b->textsize(11); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) return; if (strcmp(m->label(), "Open patch or project...") == 0) { __cb_open_loadpatch_win(); return; } if (strcmp(m->label(), "Save patch...") == 0) { if (G_Mixer.hasLogicalSamples() || G_Mixer.hasEditedSamples()) if (!gdConfirmWin("Warning", "You should save a project in order to store\nyour takes and/or processed samples.")) return; __cb_open_savepatch_win(); return; } if (strcmp(m->label(), "Save project...") == 0) { __cb_open_saveproject_win(); return; } if (strcmp(m->label(), "Quit Giada") == 0) { __cb_endprogram(); return; } }
/** build the context menu for this control */ Fl_Menu_Button & Controller_Module::menu ( void ) { static Fl_Menu_Button m( 0, 0, 0, 0, "Controller" ); Fl_Menu_Item items[] = { { "Mode", 0, 0, 0, FL_SUBMENU }, { "GUI + OSC", 0, 0, 0, FL_MENU_RADIO | ( mode() == GUI ? FL_MENU_VALUE : 0 ) }, { "Control Voltage (JACK)", 0, 0, 0, FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 ) }, { 0 }, { "Remove", 0, 0, 0, 0 }, { 0 }, }; menu_set_callback( items, &Controller_Module::menu_cb, (void*)this ); m.copy( items, (void*)this ); return m; }
int Keyboard::openChanTypeMenu() { Fl_Menu_Item rclick_menu[] = { {"Sample channel"}, {"MIDI channel"}, {0} }; Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_BOX); b->textsize(11); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = rclick_menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) return 0; if (strcmp(m->label(), "Sample channel") == 0) return CHANNEL_SAMPLE; if (strcmp(m->label(), "MIDI channel") == 0) return CHANNEL_MIDI; return 0; }
/** build the context menu for this control */ Fl_Menu_Button & Controller_Module::menu ( void ) { static Fl_Menu_Button m( 0, 0, 0, 0, "Controller" ); m.clear(); if ( mode() == GUI ) { add_osc_peers_to_menu( &m, "Connect To" ); add_osc_connections_to_menu( &m, "Disconnect From" ); } m.add( "Mode/GUI + OSC", 0, 0, 0, FL_MENU_RADIO | ( mode() == GUI ? FL_MENU_VALUE : 0 )); m.add( "Mode/Control Voltage (JACK)", 0, 0, 0, FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 )); m.add( "Remove", 0, 0, 0, is_default() ? FL_MENU_INACTIVE : 0 ); // menu_set_callback( m.items(), &Controller_Module::menu_cb, (void*)this ); m.callback( &Controller_Module::menu_cb, (void*)this ); // m.copy( items, (void*)this ); return m; }
/** build the context menu */ Fl_Menu_Button & Track::menu ( void ) const { int c = output.size(); int s = size(); _menu.clear(); _menu.add( "Takes/Show all takes", 0, 0, 0, FL_MENU_TOGGLE | ( show_all_takes() ? FL_MENU_VALUE : 0 ) ); _menu.add( "Takes/New", 0, 0, 0 ); if ( takes->children() ) { _menu.add( "Takes/Remove", 0, 0, 0 ); _menu.add( "Takes/Remove others", 0, 0, 0, FL_MENU_DIVIDER ); for ( int i = 0; i < takes->children(); ++i ) { Sequence *s = (Sequence *)takes->child( i ); char n[256]; snprintf( n, sizeof(n), "Takes/%s", s->name() ); _menu.add( n, 0, 0, s); } } _menu.add( "Type/Mono", 0, 0, 0, FL_MENU_RADIO | ( c == 1 ? FL_MENU_VALUE : 0 ) ); _menu.add( "Type/Stereo", 0, 0, 0, FL_MENU_RADIO | ( c == 2 ? FL_MENU_VALUE : 0 )); _menu.add( "Type/Quad", 0, 0, 0, FL_MENU_RADIO | ( c == 4 ? FL_MENU_VALUE : 0 ) ); _menu.add( "Type/...", 0, 0, 0, FL_MENU_RADIO | ( c == 3 || c > 4 ? FL_MENU_VALUE : 0 ) ); _menu.add( "Overlay controls", 0, 0, 0, FL_MENU_TOGGLE | ( overlay_controls() ? FL_MENU_VALUE : 0 ) ); _menu.add( "Add Control", 0, 0, 0 ); _menu.add( "Add Annotation", 0, 0, 0 ); _menu.add( "Color", 0, 0, 0 ); _menu.add( "Rename", FL_CTRL + 'n', 0, 0 ); _menu.add( "Size/Small", FL_ALT + '1', 0, 0, FL_MENU_RADIO | ( s == 0 ? FL_MENU_VALUE : 0 ) ); _menu.add( "Size/Medium", FL_ALT + '2', 0, 0, FL_MENU_RADIO | ( s == 1 ? FL_MENU_VALUE : 0 ) ); _menu.add( "Size/Large", FL_ALT + '3', 0, 0, FL_MENU_RADIO | ( s == 2 ? FL_MENU_VALUE : 0 ) ); _menu.add( "Size/Huge", FL_ALT + '4', 0, 0, FL_MENU_RADIO | ( s == 3 ? FL_MENU_VALUE : 0 ) ); _menu.add( "Flags/Record", FL_CTRL + 'r', 0, 0, FL_MENU_TOGGLE | ( armed() ? FL_MENU_VALUE : 0 ) ); _menu.add( "Flags/Mute", FL_CTRL + 'm', 0, 0, FL_MENU_TOGGLE | ( mute() ? FL_MENU_VALUE : 0 ) ); _menu.add( "Flags/Solo", FL_CTRL + 's', 0, 0, FL_MENU_TOGGLE | ( solo() ? FL_MENU_VALUE : 0 ) ); _menu.add( "Move Up", FL_SHIFT + '1', 0, 0 ); _menu.add( "Move Down", FL_SHIFT + '2', 0, 0 ); _menu.add( "Remove", 0, 0, 0 ); // transport->rolling ? FL_MENU_INACTIVE : 0 ); _menu.callback( &Track::menu_cb, (void*)this ); return _menu; }
int Track::handle ( int m ) { /* if ( m != FL_NO_EVENT ) */ /* DMESSAGE( "%s", event_name( m ) ); */ static Fl_Widget *dragging = NULL; switch ( m ) { case FL_DND_ENTER: case FL_DND_LEAVE: case FL_DND_DRAG: case FL_DND_RELEASE: case FL_PASTE: if ( Fl::event_x() > Track::width() ) return sequence()->handle(m); default: break; } switch ( m ) { case FL_KEYBOARD: { Fl_Menu_Button * men = &menu(); if ( Fl::event_key() == FL_Menu ) { menu_popup( men ); return 1; } else return men->test_shortcut() || Fl_Group::handle( m ); } case FL_MOUSEWHEEL: { Logger log( this ); if ( ! Fl::event_shift() ) return Fl_Group::handle( m ); int d = Fl::event_dy(); if ( d < 0 ) size( size() - 1 ); else size( size() + 1 ); return 1; } case FL_PUSH: { if ( Fl::event_button1() && Fl::event_inside( ((Track_Header*)child(0))->color_box ) ) { dragging = this; return 1; } if ( Fl::event_button1() && Fl::event_inside( ((Track_Header*)child(0))->output_connector_handle ) ) return 1; Logger log( this ); if ( Fl_Group::handle( m ) ) return 1; if ( test_press( FL_BUTTON3 ) && Fl::event_x() < Track::width() ) { menu_popup( &menu() ); return 1; } return 0; } /* we have to prevent Fl_Group::handle() from getting these, otherwise it will mess up Fl::belowmouse() */ case FL_ENTER: case FL_LEAVE: case FL_MOVE: if ( Fl::event_x() >= Track::width() ) { return Fl_Group::handle(m); } return 1; case FL_DND_ENTER: return 1; case FL_DND_LEAVE: if ( ! Fl::event_inside(this) && this == receptive_to_drop ) { receptive_to_drop = 0; redraw(); Fl::selection_owner(0); } return 1; case FL_RELEASE: if ( dragging == this ) { dragging = NULL; timeline->insert_track( this, timeline->event_inside() ); return 1; } return 0; break; case FL_DND_RELEASE: receptive_to_drop = 0; redraw(); Fl::selection_owner(0); return 1; case FL_DND_DRAG: { if ( receptive_to_drop == ((Track_Header*)child(0))->input_connector_handle ) return 1; if ( Fl::event_inside( ((Track_Header*)child(0))->input_connector_handle ) && receptive_to_drop != ((Track_Header*)child(0))->input_connector_handle ) { receptive_to_drop = ((Track_Header*)child(0))->input_connector_handle; redraw(); return 1; } else { receptive_to_drop = NULL; redraw(); return 0; } } case FL_PASTE: { receptive_to_drop = 0; redraw(); if (! Fl::event_inside( ((Track_Header*)child(0))->input_connector_handle ) ) return 0; /* NOW we get the text... */ const char *text = Fl::event_text(); DMESSAGE( "Got drop text \"%s\"",text); if ( strncmp( text, "jack.port://", strlen( "jack.port://" ) ) ) { return 0; } std::vector<std::string> port_names; char *port_name; int end; while ( sscanf( text, "jack.port://%a[^\r\n]\r\n%n", &port_name, &end ) > 0 ) { DMESSAGE( "Scanning %s", port_name ); port_names.push_back( port_name ); free(port_name ); text += end; } for ( unsigned int i = 0; i < input.size() && i < port_names.size(); i++) { const char *pn = port_names[i].c_str(); JACK::Port *ji = &input[i]; if ( ji->connected_to( pn ) ) { DMESSAGE( "Disconnecting from \"%s\"", pn ); ji->disconnect( pn ); } else { DMESSAGE( "Connecting to %s", pn ); ji->connect( pn ); } } Fl::selection_owner(0); return 1; } case FL_DRAG: { if ( this != Fl::selection_owner() && Fl::event_inside( ((Track_Header*)child(0))->output_connector_handle ) ) { char *s = (char*)malloc(256); s[0] = 0; for ( unsigned int i = 0; i < output.size(); ++i ) { char *s2; asprintf(&s2, "jack.port://%s:%s\r\n", instance_name, output[i].name() ); s = (char*)realloc( s, strlen( s ) + strlen( s2 ) + 1 ); strcat( s, s2 ); free( s2 ); } Fl::copy(s, strlen(s) + 1, 0); Fl::selection_owner(this); free( s ); Fl::dnd(); return 1; } else { return 1; } } default: return Fl_Group::handle( m ); } return 0; }
int main(int argc, char **argv) { signal(SIGCHLD, SIG_IGN); signal(SIGSEGV, terminationHandler); fl_init_locale_support("eworkpanel", PREFIX"/share/locale"); fl_init_images_lib(); int X=0,Y=0,W=Fl::w(),H=Fl::h(); int substract; // Get current workarea Fl_WM::get_workarea(X,Y,W,H); //printf("Free area: %d %d %d %d\n", X,Y,W,H); // We expect that other docks are moving away from panel :) mPanelWindow = new Fl_Update_Window(X, Y+H-30, W, 30, "Workpanel"); mPanelWindow->layout_spacing(0); // Panel is type DOCK mPanelWindow->window_type(Fl_WM::DOCK); mPanelWindow->setAutoHide(0); // Read config bool doShowDesktop; pGlobalConfig.get("Panel", "ShowDesktop", doShowDesktop, false); bool doWorkspaces; pGlobalConfig.get("Panel", "Workspaces", doWorkspaces, true); bool doQLB; pGlobalConfig.get("Panel", "QuickLaunchBar", doQLB, true); bool doRunBrowser; pGlobalConfig.get("Panel", "RunBrowser", doRunBrowser, true); bool doSoundMixer; pGlobalConfig.get("Panel", "SoundMixer", doSoundMixer, true); bool doCpuMonitor; pGlobalConfig.get("Panel", "CPUMonitor", doCpuMonitor, true); bool doBatteryMonitor; doBatteryMonitor=true; // blah // Group that holds everything.. Fl_Group *g = new Fl_Group(0,0,0,0); g->box(FL_DIV_UP_BOX); g->layout_spacing(2); g->layout_align(FL_ALIGN_CLIENT); g->begin(); mSystemMenu = new MainMenu(); Fl_VertDivider *v = new Fl_VertDivider(0, 0, 5, 18, ""); v->layout_align(FL_ALIGN_LEFT); substract = 5; //this kind of if-else block is ugly // - but users demand such features so... if ((doShowDesktop) || (doWorkspaces) || (doQLB)) { int size=0; if ((doShowDesktop) && (doWorkspaces)) { size=48; } else { size=24; } // Add size for QLB: if (doQLB && qlb_create_toolbuttons(0)) size += (qlb_numbuttons * 24); Fl_Group *g2 = new Fl_Group(0,0,size,22); g2->box(FL_FLAT_BOX); g2->layout_spacing(0); g2->layout_align(FL_ALIGN_LEFT); // Show desktop button if (doShowDesktop) { PanelButton *mShowDesktop; mShowDesktop = new PanelButton(0, 0, 24, 22, FL_NO_BOX, FL_DOWN_BOX, "ShowDesktop"); mShowDesktop->layout_align(FL_ALIGN_LEFT); mShowDesktop->label_type(FL_NO_LABEL); mShowDesktop->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER); mShowDesktop->image(showdesktop_pix); mShowDesktop->tooltip(_("Show desktop")); mShowDesktop->callback( (Fl_Callback*)cb_showdesktop); mShowDesktop->show(); substract += 26; } // Workspaces panel mWorkspace=0; // so we can detect it later if (doWorkspaces) { mWorkspace = new PanelMenu(0, 0, 24, 22, FL_NO_BOX, FL_DOWN_BOX, "WSMenu"); mWorkspace->layout_align(FL_ALIGN_LEFT); mWorkspace->label_type(FL_NO_LABEL); mWorkspace->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER); mWorkspace->image(desktop_pix); mWorkspace->tooltip(_("Workspaces")); mWorkspace->end(); substract += 26; } // "Quick Lunch" buttons for (int count=0; count<qlb_numbuttons; count++) { qlb_buttons[count] = new PanelButton(0, 0, 24, 22, FL_NO_BOX, FL_DOWN_BOX, qlb_tooltips[count]); qlb_buttons[count]->layout_align(FL_ALIGN_LEFT); qlb_buttons[count]->label_type(FL_NO_LABEL); qlb_buttons[count]->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER); qlb_images[count] = NULL; qlb_images[count] = Fl_Image::read(qlb_icons[count]); if (!qlb_images[count]) fprintf(stderr, "skipping icon: %s\n", qlb_icons[count]); else qlb_buttons[count]->image(qlb_images[count]); qlb_buttons[count]->tooltip(qlb_tooltips[count]); qlb_buttons[count]->callback((Fl_Callback*)cb_qlb_taskbutton, (void *)qlb_commands[count]); qlb_buttons[count]->show(); substract += 26; } g2->end(); g2->show(); g2->resizable(); v = new Fl_VertDivider(0, 0, 5, 18, ""); v->layout_align(FL_ALIGN_LEFT); substract += 5; } // Run browser if (doRunBrowser) { Fl_Group *g3 = new Fl_Group(0,0,100,20); g3->box(FL_FLAT_BOX); g3->layout_spacing(0); g3->layout_align(FL_ALIGN_LEFT); runBrowser = new Fl_Input_Browser("",100,FL_ALIGN_LEFT,30); //runBrowser->image(run_pix); runBrowser->box(FL_THIN_DOWN_BOX); // This is the only box type which works :( // Added _ALWAYS so callback is in case: // 1) select old command from input browser // 2) press enter to execute. (this won't work w/o _ALWAYS) // runBrowser->input()->when(FL_WHEN_ENTER_KEY_ALWAYS | FL_WHEN_RELEASE_ALWAYS); // Vedran: HOWEVER, with _ALWAYS cb_run_app will be called way // too many times, causing fork-attack runBrowser->input()->when(FL_WHEN_ENTER_KEY); runBrowser->input()->callback((Fl_Callback*)cb_run_app); runBrowser->callback((Fl_Callback*)cb_run_app2); g3->end(); g3->show(); g3->resizable(); v = new Fl_VertDivider(0, 0, 5, 18, ""); v->layout_align(FL_ALIGN_LEFT); substract += 105; } // Popup menu for the whole taskbar Fl_Menu_Button *mPopupPanelProp = new Fl_Menu_Button( 0, 0, W, 28 ); mPopupPanelProp->type( Fl_Menu_Button::POPUP3 ); mPopupPanelProp->anim_flags(Fl_Menu_::LEFT_TO_RIGHT); mPopupPanelProp->anim_speed(0.8); mPopupPanelProp->begin(); Fl_Item *mPanelSettings = new Fl_Item(_("Settings")); mPanelSettings->x_offset(12); mPanelSettings->callback( (Fl_Callback*)runUtility, (void*)"epanelconf" ); new Fl_Divider(10, 5); Fl_Item *mAboutItem = new Fl_Item(_("About EDE...")); mAboutItem->x_offset(12); mAboutItem->callback( (Fl_Callback *)AboutDialog ); mPopupPanelProp->end(); // Taskbar... tasks = new TaskBar(); // Dock and various entries... dock = new Dock(); v = new Fl_VertDivider(0, 0, 5, 18, ""); v->layout_align(FL_ALIGN_RIGHT); { // MODEM mModemLeds = new Fl_Group(0, 0, 25, 18); mModemLeds->box(FL_FLAT_BOX); mModemLeds->hide(); mLedIn = new Fl_Box(2, 5, 10, 10); mLedIn->box( FL_OVAL_BOX ); mLedIn->color( (Fl_Color)968701184); mLedOut = new Fl_Box(12, 5, 10, 10); mLedOut->box( FL_OVAL_BOX); mLedOut->color( (Fl_Color)968701184); mModemLeds->end(); } { // KEYBOARD SELECT mKbdSelect = new KeyboardChooser(0, 0, 20, 18, FL_NO_BOX, FL_DOWN_BOX, "us"); mKbdSelect->hide(); mKbdSelect->anim_speed(4); mKbdSelect->label_font(mKbdSelect->label_font()->bold()); mKbdSelect->highlight_color(mKbdSelect->selection_color()); mKbdSelect->highlight_label_color( mKbdSelect->selection_text_color()); } { // CLOCK mClockBox = new Fl_Button(0, 0, 50, 20); mClockBox->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT); mClockBox->hide(); mClockBox->box(FL_FLAT_BOX); mClockBox->callback( (Fl_Callback*)startUtility, (void*)"Time and date"); } // SOUND applet if (doSoundMixer) { mSoundMixer = new Fl_Button(0, 0, 20, 18); mSoundMixer->hide(); mSoundMixer->box(FL_NO_BOX); mSoundMixer->focus_box(FL_NO_BOX); mSoundMixer->image(sound_pix); mSoundMixer->tooltip(_("Volume control")); mSoundMixer->align(FL_ALIGN_INSIDE); mSoundMixer->callback( (Fl_Callback*)startUtility, (void*)"Volume Control" ); } // CPU monitor if (doCpuMonitor) { cpumon = new CPUMonitor(); cpumon->hide(); } // Battery monitor if (doBatteryMonitor) { batmon = new BatteryMonitor(dock); batmon->hide(); } dock->add_to_tray(new Fl_Box(0, 0, 5, 20)); dock->add_to_tray(mClockBox); dock->add_to_tray(mKbdSelect); dock->add_to_tray(mSoundMixer); dock->add_to_tray(cpumon); dock->add_to_tray(batmon); // end Dock Fl::focus(mSystemMenu); mPanelWindow->end(); mPanelWindow->show(argc, argv); Fl_WM::callback(FL_WM_handler, 0, Fl_WM::DESKTOP_COUNT | Fl_WM::DESKTOP_NAMES | Fl_WM::DESKTOP_CHANGED| Fl_WM::WINDOW_LIST| Fl_WM::WINDOW_DESKTOP| Fl_WM::WINDOW_ACTIVE| Fl_WM::WINDOW_NAME| Fl_WM::WINDOW_ICONNAME); updateWorkspaces(0,0); tasks->update(); Fl::add_timeout(0, clockRefresh); Fl::add_timeout(0, updateStats); while(mPanelWindow->shown()) Fl::wait(); }
void gSampleChannel::__cb_openMenu() { if (G_Mixer.chanInput == ch || recorder::active) return; Fl_Menu_Item rclick_menu[] = { {"Load new sample..."}, {"Export sample to file..."}, {"Setup keyboard input..."}, {"Setup MIDI input..."}, {"Setup MIDI output..."}, {"Edit sample..."}, {"Edit actions..."}, {"Clear actions", 0, 0, 0, FL_SUBMENU}, {"All"}, {"Mute"}, {"Volume"}, {"Start/Stop"}, {0}, {"Clone channel"}, {"Free channel"}, {"Delete channel"}, {0} }; if (ch->status & (STATUS_EMPTY | STATUS_MISSING)) { rclick_menu[1].deactivate(); rclick_menu[5].deactivate(); rclick_menu[14].deactivate(); } if (!ch->hasActions) rclick_menu[7].deactivate(); if (ch->mode & LOOP_ANY) rclick_menu[11].deactivate(); Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_BOX); b->textsize(GUI_FONT_SIZE_BASE); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = rclick_menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) return; if (strcmp(m->label(), "Load new sample...") == 0) { openBrowser(BROWSER_LOAD_SAMPLE); return; } if (strcmp(m->label(), "Setup keyboard input...") == 0) { new gdKeyGrabber(ch); return; } if (strcmp(m->label(), "Setup MIDI input...") == 0) { gu_openSubWindow(mainWin, new gdMidiInputChannel(ch), 0); return; } if (strcmp(m->label(), "Setup MIDI output...") == 0) { gu_openSubWindow(mainWin, new gdMidiOutputSampleCh(ch), 0); return; } if (strcmp(m->label(), "Edit sample...") == 0) { gu_openSubWindow(mainWin, new gdEditor(ch), WID_SAMPLE_EDITOR); return; } if (strcmp(m->label(), "Export sample to file...") == 0) { openBrowser(BROWSER_SAVE_SAMPLE); return; } if (strcmp(m->label(), "Delete channel") == 0) { if (!gdConfirmWin("Warning", "Delete channel: are you sure?")) return; glue_deleteChannel(ch); return; } if (strcmp(m->label(), "Free channel") == 0) { if (ch->status == STATUS_PLAY) { if (!gdConfirmWin("Warning", "This action will stop the channel: are you sure?")) return; } else if (!gdConfirmWin("Warning", "Free channel: are you sure?")) return; glue_freeChannel(ch); mainWin->delSubWindow(WID_FILE_BROWSER); mainWin->delSubWindow(WID_ACTION_EDITOR); mainWin->delSubWindow(WID_SAMPLE_EDITOR); mainWin->delSubWindow(WID_FX_LIST); return; } if (strcmp(m->label(), "Clone channel") == 0) { glue_cloneChannel(ch); return; } if (strcmp(m->label(), "Mute") == 0) { if (!gdConfirmWin("Warning", "Clear all mute actions: are you sure?")) return; recorder::clearAction(ch->index, ACTION_MUTEON | ACTION_MUTEOFF); if (!ch->hasActions) delActionButton(); gu_refreshActionEditor(); return; } if (strcmp(m->label(), "Start/Stop") == 0) { if (!gdConfirmWin("Warning", "Clear all start/stop actions: are you sure?")) return; recorder::clearAction(ch->index, ACTION_KEYPRESS | ACTION_KEYREL | ACTION_KILLCHAN); if (!ch->hasActions) delActionButton(); gu_refreshActionEditor(); return; } if (strcmp(m->label(), "Volume") == 0) { if (!gdConfirmWin("Warning", "Clear all volume actions: are you sure?")) return; recorder::clearAction(ch->index, ACTION_VOLUME); if (!ch->hasActions) delActionButton(); gu_refreshActionEditor(); return; } if (strcmp(m->label(), "All") == 0) { if (!gdConfirmWin("Warning", "Clear all actions: are you sure?")) return; recorder::clearChan(ch->index); delActionButton(); gu_refreshActionEditor(); return; } if (strcmp(m->label(), "Edit actions...") == 0) { gu_openSubWindow(mainWin, new gdActionEditor(ch), WID_ACTION_EDITOR); return; } }
void gSampleChannel::__cb_openMenu() { /* if you're recording (actions or input) no menu is allowed; you can't * do anything, especially deallocate the channel */ if (G_Mixer.chanInput == ch || recorder::active) return; /* the following is a trash workaround for a FLTK menu. We need a gMenu * widget asap */ Fl_Menu_Item rclick_menu[] = { {"Load new sample..."}, // 0 {"Export sample to file..."}, // 1 {"Set key..."}, // 2 {"Setup MIDI input..."}, // 3 {"Edit sample..."}, // 4 {"Edit actions..."}, // 5 {"Clear actions", 0, 0, 0, FL_SUBMENU}, // 6 {"All"}, // 7 {"Mute"}, // 8 {"Volume"}, // 9 {"Start/Stop"}, // 10 {0}, // 11 {"Free channel"}, // 12 {"Delete channel"}, // 13 {0} }; if (ch->status & (STATUS_EMPTY | STATUS_MISSING)) { rclick_menu[1].deactivate(); rclick_menu[4].deactivate(); rclick_menu[12].deactivate(); } /* no 'clear actions' if there are no actions */ if (!ch->hasActions) rclick_menu[6].deactivate(); /* no 'clear start/stop actions' for those channels in loop mode: * they cannot have start/stop actions. */ if (ch->mode & LOOP_ANY) rclick_menu[10].deactivate(); Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_BOX); b->textsize(11); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = rclick_menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) return; if (strcmp(m->label(), "Load new sample...") == 0) { openBrowser(BROWSER_LOAD_SAMPLE); return; } if (strcmp(m->label(), "Set key...") == 0) { new gdKeyGrabber(ch); /// FIXME - use gu_openSubWindow return; } if (strcmp(m->label(), "Setup MIDI input...") == 0) { gu_openSubWindow(mainWin, new gdMidiGrabberChannel(ch), 0); return; } if (strcmp(m->label(), "Edit sample...") == 0) { gu_openSubWindow(mainWin, new gdEditor(ch), WID_SAMPLE_EDITOR); /// FIXME title it's up to gdEditor return; } if (strcmp(m->label(), "Export sample to file...") == 0) { openBrowser(BROWSER_SAVE_SAMPLE); return; } if (strcmp(m->label(), "Delete channel") == 0) { if (!gdConfirmWin("Warning", "Delete channel: are you sure?")) return; glue_deleteChannel(ch); return; } if (strcmp(m->label(), "Free channel") == 0) { if (ch->status == STATUS_PLAY) { if (!gdConfirmWin("Warning", "This action will stop the channel: are you sure?")) return; } else if (!gdConfirmWin("Warning", "Free channel: are you sure?")) return; glue_freeChannel(ch); /* delete any related subwindow */ /** FIXME - use gu_closeAllSubwindows() */ mainWin->delSubWindow(WID_FILE_BROWSER); mainWin->delSubWindow(WID_ACTION_EDITOR); mainWin->delSubWindow(WID_SAMPLE_EDITOR); mainWin->delSubWindow(WID_FX_LIST); return; } if (strcmp(m->label(), "Mute") == 0) { if (!gdConfirmWin("Warning", "Clear all mute actions: are you sure?")) return; recorder::clearAction(ch->index, ACTION_MUTEON | ACTION_MUTEOFF); if (!ch->hasActions) delActionButton(); /* TODO - set mute=false */ gu_refreshActionEditor(); // refresh a.editor window, it could be open return; } if (strcmp(m->label(), "Start/Stop") == 0) { if (!gdConfirmWin("Warning", "Clear all start/stop actions: are you sure?")) return; recorder::clearAction(ch->index, ACTION_KEYPRESS | ACTION_KEYREL | ACTION_KILLCHAN); if (!ch->hasActions) delActionButton(); gu_refreshActionEditor(); // refresh a.editor window, it could be open return; } if (strcmp(m->label(), "Volume") == 0) { if (!gdConfirmWin("Warning", "Clear all volume actions: are you sure?")) return; recorder::clearAction(ch->index, ACTION_VOLUME); if (!ch->hasActions) delActionButton(); gu_refreshActionEditor(); // refresh a.editor window, it could be open return; } if (strcmp(m->label(), "All") == 0) { if (!gdConfirmWin("Warning", "Clear all actions: are you sure?")) return; recorder::clearChan(ch->index); delActionButton(); gu_refreshActionEditor(); // refresh a.editor window, it could be open return; } if (strcmp(m->label(), "Edit actions...") == 0) { gu_openSubWindow(mainWin, new gdActionEditor(ch), WID_ACTION_EDITOR); return; } }
void gWaveform::openEditMenu() { if (selectionA == selectionB) return; menuOpen = true; Fl_Menu_Item menu[] = { {"Cut"}, {"Trim"}, {"Silence"}, {"Fade in"}, {"Fade out"}, {"Smooth edges"}, {"Set start/end here"}, {0} }; if (chan->status == STATUS_PLAY) { menu[0].deactivate(); menu[1].deactivate(); } Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_BOX); b->textsize(11); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) { menuOpen = false; return; } /* straightSel() to ensure that point A is always lower than B */ straightSel(); if (strcmp(m->label(), "Silence") == 0) { wfx_silence(chan->wave, absolutePoint(selectionA), absolutePoint(selectionB)); selectionA = 0; selectionB = 0; stretchToWindow(); redraw(); menuOpen = false; return; } if (strcmp(m->label(), "Set start/end here") == 0) { glue_setBeginEndChannel( (gdEditor *) window(), // parent chan, absolutePoint(selectionA) * 2, // stereo! absolutePoint(selectionB) * 2, // stereo! false, // no recalc (we do it here) false // don't check ); selectionA = 0; selectionB = 0; selectionA_abs = 0; selectionB_abs = 0; recalcPoints(); redraw(); menuOpen = false; return; } if (strcmp(m->label(), "Cut") == 0) { wfx_cut(chan->wave, absolutePoint(selectionA), absolutePoint(selectionB)); /* for convenience reset start/end points */ glue_setBeginEndChannel( (gdEditor *) window(), chan, 0, chan->wave->size, false); selectionA = 0; selectionB = 0; selectionA_abs = 0; selectionB_abs = 0; setZoom(0); menuOpen = false; return; } if (strcmp(m->label(), "Trim") == 0) { wfx_trim(chan->wave, absolutePoint(selectionA), absolutePoint(selectionB)); glue_setBeginEndChannel( (gdEditor *) window(), chan, 0, chan->wave->size, false); selectionA = 0; selectionB = 0; selectionA_abs = 0; selectionB_abs = 0; stretchToWindow(); menuOpen = false; redraw(); return; } if (!strcmp(m->label(), "Fade in") || !strcmp(m->label(), "Fade out")) { int type = !strcmp(m->label(), "Fade in") ? 0 : 1; wfx_fade(chan->wave, absolutePoint(selectionA), absolutePoint(selectionB), type); selectionA = 0; selectionB = 0; stretchToWindow(); redraw(); menuOpen = false; return; } if (!strcmp(m->label(), "Smooth edges")) { wfx_smooth(chan->wave, absolutePoint(selectionA), absolutePoint(selectionB)); selectionA = 0; selectionB = 0; stretchToWindow(); redraw(); menuOpen = false; return; } }
void geMidiChannel::__cb_openMenu() { Fl_Menu_Item rclick_menu[] = { {"Edit actions..."}, // 0 {"Clear actions", 0, 0, 0, FL_SUBMENU}, // 1 {"All"}, // 2 {0}, // 3 {"Setup keyboard input..."}, // 5 {"Setup MIDI input..."}, // 6 {"Setup MIDI output..."}, // 7 {"Clone channel"}, // 8 {"Delete channel"}, // 9 {0} }; /* no 'clear actions' if there are no actions */ if (!ch->hasActions) rclick_menu[1].deactivate(); Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_CUSTOM_BORDER_BOX); b->textsize(GUI_FONT_SIZE_BASE); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = rclick_menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) return; if (strcmp(m->label(), "Delete channel") == 0) { if (!gdConfirmWin("Warning", "Delete channel: are you sure?")) return; glue_deleteChannel(ch); return; } if (strcmp(m->label(), "Clone channel") == 0) { glue_cloneChannel(ch); return; } if (strcmp(m->label(), "Setup keyboard input...") == 0) { gu_openSubWindow(G_MainWin, new gdKeyGrabber(ch), 0); //new gdKeyGrabber(ch); return; } if (strcmp(m->label(), "All") == 0) { if (!gdConfirmWin("Warning", "Clear all actions: are you sure?")) return; G_Recorder.clearChan(ch->index); ch->hasActions = false; gu_refreshActionEditor(); // refresh a.editor window, it could be open return; } if (strcmp(m->label(), "Edit actions...") == 0) { gu_openSubWindow(G_MainWin, new gdActionEditor(ch), WID_ACTION_EDITOR); return; } if (strcmp(m->label(), "Setup MIDI input...") == 0) { gu_openSubWindow(G_MainWin, new gdMidiInputChannel(ch), 0); return; } if (strcmp(m->label(), "Setup MIDI output...") == 0) { //gu_openSubWindow(G_MainWin, new gdMidiGrabberChannel(ch, GrabForOutput), 0); gu_openSubWindow(G_MainWin, new gdMidiOutputMidiCh((MidiChannel*) ch), 0); return; } }
void gMenu::__cb_edit() { Fl_Menu_Item menu[] = { {"Clear all samples"}, {"Clear all actions"}, {"Remove empty columns"}, {"Reset to init state"}, {"Setup global MIDI input..."}, {0} }; /* clear all actions disabled if no recs, clear all samples disabled * if no samples. */ menu[1].deactivate(); for (unsigned i=0; i<G_Mixer.channels.size(); i++) if (G_Mixer.channels.at(i)->hasActions) { menu[1].activate(); break; } for (unsigned i=0; i<G_Mixer.channels.size(); i++) if (G_Mixer.channels.at(i)->type == CHANNEL_SAMPLE) if (((SampleChannel*)G_Mixer.channels.at(i))->wave != NULL) { menu[0].activate(); break; } Fl_Menu_Button *b = new Fl_Menu_Button(0, 0, 100, 50); b->box(G_BOX); b->textsize(11); b->textcolor(COLOR_TEXT_0); b->color(COLOR_BG_0); const Fl_Menu_Item *m = menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, b); if (!m) return; if (strcmp(m->label(), "Clear all samples") == 0) { if (!gdConfirmWin("Warning", "Clear all samples: are you sure?")) return; mainWin->delSubWindow(WID_SAMPLE_EDITOR); glue_clearAllSamples(); return; } if (strcmp(m->label(), "Clear all actions") == 0) { if (!gdConfirmWin("Warning", "Clear all actions: are you sure?")) return; mainWin->delSubWindow(WID_ACTION_EDITOR); glue_clearAllRecs(); return; } if (strcmp(m->label(), "Reset to init state") == 0) { if (!gdConfirmWin("Warning", "Reset to init state: are you sure?")) return; gu_closeAllSubwindows(); glue_resetToInitState(); return; } if (strcmp(m->label(), "Remove empty columns") == 0) { mainWin->keyboard->organizeColumns(); return; } if (strcmp(m->label(), "Setup global MIDI input...") == 0) { gu_openSubWindow(mainWin, new gdMidiInputMaster(), 0); return; } }
Fl_Scopes_Manager::Fl_Scopes_Manager(int x, int y, int width, int height, Fl_MDI_Viewport *s, const char *name) { Fl::lock(); s->begin(); Fl_MDI_Window *w = SWin = new Fl_MDI_Window(0, 0, width, height, name); w->user_data((void *)this); w->resizable(w->view()); w->titlebar()->close_button()->hide(); w->view()->begin(); Scopes_Tabs = new Fl_Tabs*[Num_Scopes]; Scope_Show = new Fl_Check_Button*[Num_Scopes]; Scope_Pause = new Fl_Button*[Num_Scopes]; Scope_OneShot = new Fl_Check_Button*[Num_Scopes]; Scope_Options = new Fl_Menu_Button*[Num_Scopes]; Grid_Color = new Fl_Button*[Num_Scopes]; Bg_Color = new Fl_Button*[Num_Scopes]; Sec_Div = new Fl_Input_Browser*[Num_Scopes]; Save_Type = new Fl_Check_Button*[Num_Scopes]; Save_Points = new Fl_Int_Input*[Num_Scopes]; Save_Time = new Fl_Float_Input*[Num_Scopes]; Save_File = new Fl_Input*[Num_Scopes]; Save = new Fl_Light_Button*[Num_Scopes]; Save_Flag = new int[Num_Scopes]; Save_File_Pointer = new FILE*[Num_Scopes]; Trace_Page = new Fl_Group**[Num_Scopes]; Trace_Show = new Fl_Check_Button**[Num_Scopes]; Units_Div = new Fl_Input_Browser**[Num_Scopes]; Trace_Color = new Fl_Button**[Num_Scopes]; Trace_Pos = new Fl_Dial**[Num_Scopes]; Trace_Width = new Fl_Dial**[Num_Scopes]; Trigger_Mode = new Fl_Choice*[Num_Scopes]; Trace_Options = new Fl_Menu_Button**[Num_Scopes]; Scope_Windows = new Fl_Scope_Window*[Num_Scopes]; for (int i = 0; i < Num_Scopes; i++) { Save_Flag[i] = false; { Fl_Tabs *o = Scopes_Tabs[i] = new Fl_Tabs(160, 5, width-165, height-40); o->new_page("General"); { Fl_Check_Button *o = Scope_Show[i] = new Fl_Check_Button(10, 25, 100, 20, "Show/Hide"); o->callback((Fl_Callback *)show_scope, (void *)i); } { Fl_Button *o = Scope_Pause[i] = new Fl_Button(10, 75, 90, 25, "Trigger"); o->value(0); o->deactivate(); o->when(FL_WHEN_CHANGED); o->callback((Fl_Callback *)pause_scope, (void *)i); } { Fl_Check_Button *o = Scope_OneShot[i] = new Fl_Check_Button(10, 50, 100, 20, "OneShot/Run"); o->deactivate(); o->callback((Fl_Callback *)oneshot_scope, (void *)i); } { Fl_Menu_Button *o = Scope_Options[i] = new Fl_Menu_Button(10, 105, 90, 25, "Options"); o->menu(Scope_Opts); o->when(FL_WHEN_ENTER_KEY); o->child(0)->set_value(); o->callback((Fl_Callback *)enter_options, (void *)i); } { Fl_Button *o = Grid_Color[i] = new Fl_Button(10, 135, 90, 25, "Grid Color"); o->callback((Fl_Callback *)select_grid_color, (void *)i); } { Fl_Button *o = Bg_Color[i] = new Fl_Button(10, 165, 90, 25, "Bg Color"); o->callback((Fl_Callback *)select_bg_color, (void *)i); } { Fl_Input_Browser *o = Sec_Div[i] = new Fl_Input_Browser(200, 25, 60, 20, "Sec/Div: "); o->add("0.001|0.005|0.01|0.05|0.1|0.5|1"); o->align(FL_ALIGN_LEFT); o->value("0.1"); o->when(FL_WHEN_ENTER_KEY); o->callback((Fl_Callback *)enter_secdiv, (void *)i); } { Fl_Check_Button *o = Save_Type[i] = new Fl_Check_Button(140, 50, 100, 20, "Points/Time"); o->value(1); o->callback((Fl_Callback *)select_save, (void *)i); } { Fl_Int_Input *o = Save_Points[i] = new Fl_Int_Input(200, 75, 60, 20, "N Points: "); o->align(FL_ALIGN_LEFT); o->value("1000"); } { Fl_Float_Input *o = Save_Time[i] = new Fl_Float_Input(200, 105, 60, 20, "Time [s]: "); o->align(FL_ALIGN_LEFT); o->value("1.0"); o->deactivate(); } { Fl_Input *o = Save_File[i] = new Fl_Input(200, 135, 100, 20, "Filename:"); char buf[100]; o->align(FL_ALIGN_LEFT); sprintf(buf, "%s", Scopes[i].name); o->value(buf); } { Fl_Light_Button *o = Save[i] = new Fl_Light_Button(140, 165, 90, 25, "Save"); o->selection_color(FL_BLACK); o->callback((Fl_Callback *)enable_saving, (void *)i); } { Fl_Choice *o = Trigger_Mode[i] = new Fl_Choice(60, 200, 170, 25, "Trigger:"); o->add("Continuous Roling|Continuous Overwrite|Rising (-to+) CH1|Falling (+to-) CH1|Hold"); o->align(FL_ALIGN_LEFT); o->value(0); o->when(FL_WHEN_ENTER_KEY); o->callback((Fl_Callback *)enter_trigger_mode, (void *)i); } Trace_Page[i] = new Fl_Group*[Scopes[i].ntraces]; Trace_Show[i] = new Fl_Check_Button*[Scopes[i].ntraces]; Units_Div[i] = new Fl_Input_Browser*[Scopes[i].ntraces]; Trace_Color[i] = new Fl_Button*[Scopes[i].ntraces]; Trace_Pos[i] = new Fl_Dial*[Scopes[i].ntraces]; Trace_Width[i] = new Fl_Dial*[Scopes[i].ntraces]; Trace_Options[i] = new Fl_Menu_Button*[Scopes[i].ntraces]; for (int j = 0; j < Scopes[i].ntraces; j++) { s_idx_T *idx = new s_idx_T; idx->scope_idx = i; idx->trace_idx = j; Trace_Page[i][j] = o->new_page(Scopes[i].traceName[j]); Trace_Page[i][j]->label_color(FL_WHITE); { Fl_Check_Button *o = Trace_Show[i][j] = new Fl_Check_Button(10, 25, 100, 20, "Show/Hide"); o->value(1); o->callback((Fl_Callback *)show_trace, (void *)idx); } { Fl_Input_Browser *o = Units_Div[i][j] = new Fl_Input_Browser(77, 55, 60, 20, "Units/Div: "); o->align(FL_ALIGN_LEFT); o->value("2.5"); o->add("0.001|0.002|0.005|0.01|0.02|0.05|0.1|0.2|0.5|1|2|5|10|50|100|1000"); o->when(FL_WHEN_ENTER_KEY); o->callback((Fl_Callback *)enter_unitsdiv, (void *)idx); } { Fl_Button *o = Trace_Color[i][j] = new Fl_Button(10, 90, 90, 25, "Trace Color"); o->callback((Fl_Callback *)select_trace_color, (void *)idx); } { Fl_Dial *o = Trace_Pos[i][j] = new Fl_Dial(170, 40, 50, 50, "Trace Offset"); o->type(Fl_Dial::LINE); o->minimum(0.0); o->maximum(2.0); o->value(1); o->callback((Fl_Callback *)change_trace_pos, (void *)idx); } { Fl_Dial *o = Trace_Width[i][j] = new Fl_Dial(250, 40, 50, 50, "Trace Width"); o->type(Fl_Dial::LINE); o->minimum(0.1); o->maximum(40.0); o->value(0.1); o->callback((Fl_Callback *)change_trace_width, (void *)idx); } { Fl_Menu_Button *o = Trace_Options[i][j] = new Fl_Menu_Button(10, 130, 90, 25, "Options "); int i; o->menu(Trace_Opts); o->when(FL_WHEN_ENTER_KEY); o->callback((Fl_Callback *)enter_options, (void *)idx); // for(i=0;i<o->children();i++) { // loop through all menu items, and add checked items to the value // o->child(i)->set_value(); // } } } o->end(); Fl_Group::current()->resizable(w); } } for (int i = 1; i < Num_Scopes; i++) { Scopes_Tabs[i]->hide(); } Scopes_Tabs[0]->show(); Help = new Fl_Button(width-150, height-30, 70, 25, "Help"); Close = new Fl_Button(width-75, height-30, 70, 25, "Close"); Close->callback((Fl_Callback *)close); Fl_Browser *o = Scopes_Tree = new Fl_Browser(5, 5, 150, height-10); o->indented(1); o->callback((Fl_Callback *)select_scope); for (int i = 0; i < Num_Scopes; i++) { add_paper(Scopes_Tree, Scopes[i].name, Fl_Image::read_xpm(0, scope_icon)); } w->view()->end(); s->end(); w->titlebar()->h(15); w->titlebar()->color(FL_BLACK); w->position(x, y); Fl::unlock(); }
/** build the context menu */ Fl_Menu_Button & Module::menu ( void ) const { static Fl_Menu_Button m( 0, 0, 0, 0, "Module" ); static Fl_Menu_Button *insert_menu = NULL; if ( ! insert_menu ) { insert_menu = new Fl_Menu_Button( 0, 0, 0, 0 ); insert_menu->add( "Gain", 0, 0, new unsigned long(2) ); insert_menu->add( "Meter", 0, 0, new unsigned long(3) ); insert_menu->add( "Mono Pan", 0, 0, new unsigned long(4) ); Plugin_Module::add_plugins_to_menu( insert_menu ); // menu_set_callback( insert_menu, &Module::insert_menu_cb, (void*)this ); insert_menu->callback( &Module::insert_menu_cb, (void*)this ); } m.clear(); m.add( "Insert", 0, &Module::menu_cb, (void*)this, 0); m.add( "Insert", 0, &Module::menu_cb, const_cast< Fl_Menu_Item *>( insert_menu->menu() ), FL_SUBMENU_POINTER ); m.add( "Edit Parameters", ' ', &Module::menu_cb, (void*)this, 0 ); m.add( "Bypass", 'b', &Module::menu_cb, (void*)this, FL_MENU_TOGGLE | ( bypass() ? FL_MENU_VALUE : 0 ) ); m.add( "Cut", FL_CTRL + 'x', &Module::menu_cb, (void*)this, is_default() ? FL_MENU_INACTIVE : 0 ); m.add( "Copy", FL_CTRL + 'c', &Module::menu_cb, (void*)this, is_default() ? FL_MENU_INACTIVE : 0 ); m.add( "Paste", FL_CTRL + 'v', &Module::menu_cb, (void*)this, _copied_module_empty ? 0 : FL_MENU_INACTIVE ); m.add( "Remove", FL_Delete, &Module::menu_cb, (void*)this ); // menu_set_callback( menu, &Module::menu_cb, (void*)this ); m.callback( &Module::insert_menu_cb, (void*)this ); return m; }