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 gdMainWindow::__cb_endprogram() { if (!gdConfirmWin("Warning", "Quit Giada: are you sure?")) return; G_quit = true; /* close any open subwindow, especially before cleaning PluginHost to * avoid mess */ puts("GUI closing..."); gu_closeAllSubwindows(); /* write configuration file */ if (!G_Conf.write()) puts("Error while saving configuration file!"); else puts("Configuration saved"); puts("Mixer cleanup..."); /* if G_audio_status we close the kernelAudio FIRST, THEN the mixer. * The opposite could cause random segfaults (even now with RtAudio?). */ if (G_audio_status) { kernelAudio::closeDevice(); G_Mixer.close(); } puts("Recorder cleanup..."); recorder::clearAll(); #ifdef WITH_VST puts("Plugin Host cleanup..."); G_PluginHost.freeAllStacks(); #endif puts("Giada "VERSIONE" closed."); hide(); delete this; }
int glue_loadPatch(const char *fname, const char *fpath, gProgress *status) { /* update browser's status bar with % 0.1 */ status->show(); status->value(0.1f); //Fl::check(); Fl::wait(0); /* is it a valid patch? */ int res = G_Patch.open(fname); if (res != PATCH_OPEN_OK) return res; /* reset the system. False = don't update the gui right now */ glue_resetToInitState(false); status->value(0.2f); // progress status: % 0.2 //Fl::check(); Fl::wait(0); /* mixerHandler will update the samples inside Mixer */ mh_loadPatch(); /* take the patch name and update the main window's title */ G_Patch.getName(); gu_update_win_label(G_Patch.name); status->value(0.4f); // progress status: 0.4 //Fl::check(); Fl::wait(0); G_Patch.readRecs(); status->value(0.6f); // progress status: 0.6 //Fl::check(); Fl::wait(0); #ifdef WITH_VST int resPlugins = G_Patch.readPlugins(); status->value(0.8f); // progress status: 0.8 //Fl::check(); Fl::wait(0); #endif /* this one is vital: let recorder recompute the actions' positions if * the current samplerate != patch samplerate */ recorder::updateSamplerate(G_Conf.samplerate, G_Patch.samplerate); /* update gui */ gu_update_controls(); status->value(1.0f); // progress status: 1.0 (done) //Fl::check(); Fl::wait(0); /* save patchPath by taking the last dir of the broswer, in order to * reuse it the next time */ G_Conf.setPath(G_Conf.patchPath, fpath); printf("[glue] patch %s loaded\n", fname); #ifdef WITH_VST if (resPlugins != 1) gdAlert("Some VST files were not loaded successfully."); #endif /* lastly close all other windows */ if (res) gu_closeAllSubwindows(); return res; }
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; } }