options::options (Gtk::Window & parent, perform * a_p): Gtk::Dialog ("Options", parent, true, true), m_perf(a_p) { #if GTK_MINOR_VERSION < 12 m_tooltips = manage(new Tooltips()); #endif HBox *hbox = manage (new HBox ()); get_vbox ()->pack_start (*hbox, false, false); get_action_area ()->set_border_width (2); hbox->set_border_width (6); m_button_ok = manage (new Button(Gtk::Stock::OK)); get_action_area ()->pack_end (*m_button_ok, false, false); m_button_ok->signal_clicked ().connect (mem_fun (*this, &options::hide)); m_notebook = manage (new Notebook ()); hbox->pack_start (*m_notebook); add_midi_clock_page(); add_midi_input_page(); add_keyboard_page(); add_mouse_page(); add_jack_sync_page(); }
tempopopup::tempopopup(tempo *a_tempo) : m_tempo(a_tempo), m_escape(false), m_return(false), m_is_typing(false), m_current_beats(0), m_base_time_ms(0), m_last_time_ms(0) { // std::string title = "BPM"; // set_title(title); set_size_request(150, 50); #if GTK_MINOR_VERSION < 12 m_tooltips = manage( new Tooltips() ); #endif /* bpm spin button */ m_adjust_bpm = manage(new Adjustment(m_tempo->m_mainperf->get_bpm(), c_bpm_minimum -1, c_bpm_maximum, 1)); m_spinbutton_bpm = manage( new SpinButton( *m_adjust_bpm )); m_spinbutton_bpm->set_editable( true ); m_spinbutton_bpm->set_digits(2); // 2 = two decimal precision m_adjust_bpm->signal_value_changed().connect( mem_fun(*this, &tempopopup::adj_callback_bpm )); m_spinbutton_bpm->set_numeric(); add_tooltip ( m_spinbutton_bpm, "Adjust beats per minute (BPM) value.\n" "Values range from 0 to 600.00.\n" "Escape to leave without setting\n" "Entry of 0 indicates a STOP marker.\n" ); m_spinbutton_bpm->set_update_policy(Gtk::UPDATE_IF_VALID); // ignore bad entries Label* bpmlabel = manage(new Label("BPM")); /* bpm tap tempo button - sequencer64 */ m_button_tap = manage(new Button("0")); m_button_tap->signal_clicked().connect(sigc::mem_fun(*this, &tempopopup::tap)); add_tooltip ( m_button_tap, "Tap in time to set the beats per minute (BPM) value. " "After 5 seconds of no taps, the tap-counter will reset to 0. " "Also see the File / Options / Keyboard / Tap BPM key assignment." ); m_button_tap->set_can_focus(false); // to force all keys to the spin button HBox *hbox = manage(new HBox()); hbox->set_border_width(6); hbox->pack_start(*bpmlabel, Gtk::PACK_SHRINK); hbox->pack_start(*m_spinbutton_bpm, Gtk::PACK_SHRINK ); hbox->pack_start(*m_button_tap, Gtk::PACK_SHRINK, 5 ); add(*hbox); set_modal(); // keep focus until done set_transient_for(*m_tempo->m_perfedit); // always on top set_decorated(false); // don't show title bar add_events( Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK ); m_timeout_connect = Glib::signal_timeout().connect( mem_fun(*this, &tempopopup::timer_callback), 25); }
AnalogueGUI(const std::string& URI) { std::cout << "starting GUI" <<std::endl; int control_ports = p_n_ports - 3; //initialize sliders for (int i = 0; i < control_ports; i++) { if (isOSCType(i)) { scales[i] = manage(new OSCTypeComboBox()); } else if (isFilterType(i)) { scales[i] = manage(new FilterTypeComboBox()); } else if (isPower(i)) { scales[i] = manage(new Toggle()); } else if (isBypass(i)) { scales[i] = manage(new Toggle(true)); } else { Knob* knob = new Knob(p_port_meta[i].min, p_port_meta[i].max, p_port_meta[i].step); if (isEnvControl(i)) { // small knob->set_size(30); knob->set_radius(10); } else if (isModControl(i) || isEffect(i)) { // medium knob->set_radius(12.0); } scales[i] = manage(knob); } } //connect widgets to control ports (change control values when sliders are moved) for (int i = 0; i < control_ports; i++) { slot<void> slot1 = compose(bind<0>(mem_fun(*this, &AnalogueGUI::write_control), i + 3), mem_fun(*scales[i], &Changeable::get_value)); slot<void> slot2 = compose(bind<0>(mem_fun(*this, &AnalogueGUI::change_status_bar), i + 3), mem_fun(*scales[i], &Changeable::get_value)); scales[i]->connect(slot1); if (!isOSCType(i) && !isFilterType(i) && !isToggle(i)) { scales[i]->connect(slot2); } } //connect all faders to the 'notify' function to inform the plugin to recalculate /*for (int i = 0; i < control_ports; i++) { scales[i]->signal_value_changed().connect( mem_fun(*this, &AnalogueGUI::notify_param_change)); }*/ Table* block1 = manage(new Table(2,4)); block1->attach(*createOSC1(), 0, 1, 1, 2); block1->attach(*createFilter1(), 1, 2, 1, 2); block1->attach(*createAmp1(), 2, 3, 1, 2); block1->attach(*createLFO1(), 3, 4, 1, 2); block1->attach(*createLFO2(), 0, 1, 2, 3); block1->attach(*createOSC2(), 1, 2, 2, 3); block1->attach(*createFilter2(), 2, 3, 2, 3); block1->attach(*createAmp2(), 3, 4, 2, 3); mainBox.pack_start(*align(block1)); HBox* block3 = manage(new HBox()); block3->pack_start(*createFilter1Env()); block3->pack_start(*createFilter2Env()); block3->pack_start(*createAmp1Env()); block3->pack_start(*createAmp2Env()); mainBox.pack_start(*align(block3)); HBox* block4 = manage(new HBox()); block4->pack_start(*createNoise()); block4->pack_start(*createFlanger()); block4->pack_start(*createDelay()); block4->pack_start(*createReverb()); mainBox.pack_start(*align(block4)); HBox* header = manage(new HBox()); header->pack_start(*manage(new Image("analogue.png"))); header->pack_end(*scales[p_amp_output - 3]->get_widget()); header->set_border_width(5); mainBox.pack_start(*align(header)); mainBox.pack_end(statusbar); add(*align(&mainBox)); std::cout << "GUI ready" <<std::endl; }
options::options (Gtk::Window & parent, perform * a_p): Gtk::Dialog ("Options", parent, true, true) { m_perf = a_p; VBox *vbox = NULL; HBox *hbox = manage (new HBox ()); get_vbox ()->pack_start (*hbox, false, false); get_action_area ()->set_border_width (2); hbox->set_border_width (6); m_button_ok = manage (new Button ("Ok")); get_action_area ()->pack_end (*m_button_ok, false, false); m_button_ok->signal_clicked ().connect (mem_fun (*this, &options::hide)); m_notebook = manage (new Notebook ()); hbox->pack_start (*m_notebook); // Clock Buses int buses = m_perf->get_master_midi_bus ()->get_num_out_buses (); //Notebook *clock_notebook = manage( new Notebook()); //clock_notebook->set_scrollable(true); vbox = manage(new VBox()); m_notebook->pages().push_back(Notebook_Helpers::TabElem(*vbox, "MIDI Clock")); CheckButton *check; Label *label; Gtk::Tooltips * tooltips = manage (new Tooltips ()); for (int i = 0; i < buses; i++) { HBox *hbox2 = manage (new HBox ()); label = manage( new Label(m_perf->get_master_midi_bus ()-> get_midi_out_bus_name (i), 0)); hbox2->pack_start (*label, false, false); Gtk::RadioButton * rb_off = manage (new RadioButton ("Off")); add_tooltip( rb_off, "Midi Clock will be disabled."); Gtk::RadioButton * rb_on = manage (new RadioButton ("On (Pos)")); add_tooltip( rb_on, "Midi Clock will be sent. Midi Song Position and Midi Continue will be sent if starting greater than tick 0 in song mode, otherwise Midi Start is sent."); Gtk::RadioButton * rb_mod = manage (new RadioButton ("On (Mod)")); add_tooltip( rb_mod, "Midi Clock will be sent. Midi Start will be sent and clocking will begin once the song position has reached the modulo of the specified Size. (Used for gear that doesn't respond to Song Position)"); Gtk::RadioButton::Group group = rb_off->get_group (); rb_on->set_group (group); rb_mod->set_group (group); rb_off->signal_toggled().connect (sigc::bind(mem_fun (*this, &options::clock_callback_off), i, rb_off )); rb_on->signal_toggled ().connect (sigc::bind(mem_fun (*this, &options::clock_callback_on), i, rb_on )); rb_mod->signal_toggled().connect (sigc::bind(mem_fun (*this, &options::clock_callback_mod), i, rb_mod )); hbox2->pack_end (*rb_mod, false, false ); hbox2->pack_end (*rb_on, false, false); hbox2->pack_end (*rb_off, false, false); vbox->pack_start( *hbox2, false, false ); switch ( m_perf->get_master_midi_bus ()->get_clock (i)) { case e_clock_off: rb_off->set_active(1); break; case e_clock_pos: rb_on->set_active(1); break; case e_clock_mod: rb_mod->set_active(1); break; } // SET DEFAULT STATES check->set_active (m_perf->get_master_midi_bus ()->get_clock (i)); } Adjustment *clock_mod_adj = new Adjustment( midibus::get_clock_mod(), 1, 16 << 10, 1 ); SpinButton *clock_mod_spin = new SpinButton( *clock_mod_adj ); HBox *hbox2 = manage (new HBox ()); //m_spinbutton_bpm->set_editable( false ); hbox2->pack_start(*(manage( new Label( "Clock Start Modulo (1/16 Notes)"))), false, false, 4); hbox2->pack_start(*clock_mod_spin, false, false ); vbox->pack_start( *hbox2, false, false ); clock_mod_adj->signal_value_changed().connect( sigc::bind(mem_fun(*this,&options::clock_mod_callback),clock_mod_adj)); // add controls for input method { Adjustment *adj = new Adjustment( global_interactionmethod, 0, e_number_of_interactions-1, 1 ); SpinButton *spin = new SpinButton( *adj ); HBox *hbox2 = manage (new HBox ()); HBox *hbox3 = manage (new HBox ()); //m_spinbutton_bpm->set_editable( false ); interaction_method_label = new Label("Input Method"); hbox2->pack_start(*(manage( interaction_method_label )), false, false, 4); hbox2->pack_start(*spin, false, false ); vbox->pack_start( *hbox2, false, false ); interaction_method_desc_label = new Label(" ----- "); hbox3->pack_start(*(manage( interaction_method_desc_label )), false, false, 4); vbox->pack_start(*hbox3, false, false ); adj->signal_value_changed().connect( sigc::bind(mem_fun(*this,&options::interaction_method_callback),adj)); // force it to refresh. interaction_method_callback( adj ); } // Input Buses buses = m_perf->get_master_midi_bus ()->get_num_in_buses (); vbox = manage (new VBox ()); m_notebook->pages (). push_back (Notebook_Helpers::TabElem (*vbox, "MIDI Input")); for (int i = 0; i < buses; i++) { check = manage (new CheckButton (m_perf->get_master_midi_bus ()-> get_midi_in_bus_name (i), 0)); check->signal_toggled (). connect (bind (mem_fun (*this, &options::input_callback), i, check)); check->set_active (m_perf->get_master_midi_bus ()->get_input (i)); vbox->pack_start (*check, false, false); } // KeyBoard keybinding setup (editor for .seq42rc keybindings. vbox = manage (new VBox ()); m_notebook->pages ().push_back (Notebook_Helpers::TabElem (*vbox, "Keyboard")); { Label* label; KeyBindEntry* entry; HBox *hbox; #define AddKey(text, integer) \ label = manage (new Label( text )); \ hbox->pack_start (*label, false, false, 4); \ entry = manage (new KeyBindEntry( &integer )); \ hbox->pack_start (*entry, false, false, 4); hbox = manage (new HBox ()); AddKey( "start:", m_perf->m_key_start ); AddKey( "stop:", m_perf->m_key_stop ); AddKey( "toggle looping:", m_perf->m_key_loop ); vbox->pack_start (*hbox, false, false); hbox = manage (new HBox ()); AddKey( "bpm dn:", m_perf->m_key_bpm_dn ); AddKey( "bpm up:", m_perf->m_key_bpm_up ); vbox->pack_start (*hbox, false, false); #undef AddKey } // Jack #ifdef JACK_SUPPORT VBox *vbox2 = manage (new VBox ()); vbox2->set_border_width (4); m_notebook->pages().push_back(Notebook_Helpers::TabElem(*vbox2, "Jack Sync")); check = manage (new CheckButton ("Jack Transport")); check->set_active (global_with_jack_transport); add_tooltip( check, "Enable sync with JACK Transport."); check->signal_toggled (). connect (bind (mem_fun (*this, &options::transport_callback), e_jack_transport, check)); vbox2->pack_start (*check, false, false); check = manage (new CheckButton ("Transport Master")); check->set_active (global_with_jack_master); add_tooltip( check, "Seq42 will attempt to serve as JACK Master."); check->signal_toggled (). connect (bind (mem_fun (*this, &options::transport_callback), e_jack_master, check)); vbox2->pack_start (*check, false, false); check = manage (new CheckButton ("Master Conditional")); check->set_active (global_with_jack_master_cond); add_tooltip( check, "Seq42 will fail to be master if there is already a master set."); check->signal_toggled (). connect (bind (mem_fun (*this, &options::transport_callback), e_jack_master_cond, check)); vbox2->pack_start (*check, false, false); Gtk::Button * button = manage (new Button ("Connect")); add_tooltip( button, "Connect to Jack."); button->signal_clicked().connect(bind(mem_fun(*this, &options::transport_callback), e_jack_connect, button)); vbox2->pack_start (*button, false, false); button = manage (new Button ("Disconnect")); add_tooltip( button, "Disconnect Jack."); button->signal_clicked().connect(bind(mem_fun(*this, &options::transport_callback), e_jack_disconnect, button)); vbox2->pack_start (*button, false, false); #endif /* show everything */ show_all_children (); }