#include #include #include #include "jack.h" #include "portmanager.h" #include "gui.h" #include "config.h" #include "session_gui.h" Glib::RefPtr g_builder; Gui::Gui(BaseObjectType *cobject, const Glib::RefPtr &builder) : Gtk::Window(cobject), m_vbox(NULL), m_matrix_audio(NULL), m_matrix_midi(NULL), m_closing(false) { builder->get_widget("vbox1", m_vbox); SetPortTypeSeparation(); Refresh(); Glib::signal_idle().connect(sigc::mem_fun(*this, &Gui::on_idle)); Glib::RefPtr uim = Glib::RefPtr::cast_static(builder->get_object("uimanager1")); uim->get_action("/menubar1/menuitem1/menu_quit")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_quit)); uim->get_action("/menubar1/menuitem5/menu_session_open")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_session_open)); uim->get_action("/menubar1/menuitem5/menu_session_save")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_session_save)); uim->get_action("/menubar1/menuitem5/menu_session_save_as")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_session_save_as)); uim->get_action("/menubar1/menuitem5/menu_session_close")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_session_close)); uim->get_action("/menubar1/menuitem2/menu_preferences")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_preferences)); uim->get_action("/menubar1/menuitem3/menu_connect")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_connect)); uim->get_action("/menubar1/menuitem3/menu_disconnect")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_disconnect)); uim->get_action("/menubar1/menuitem4/menu_about")->signal_activate().connect(sigc::mem_fun(*this, &Gui::on_about)); } Gui::~Gui() { m_closing = true; delete m_matrix_audio; delete m_matrix_midi; } void Gui::SetPortTypeSeparation() { if (cfg.SeparateByPortType) { if (m_matrix_audio && m_matrix_midi) return; m_scrolledwindow_audio.remove(); m_scrolledwindow_midi.remove(); if (m_notebook.pages().size() > 0) { m_notebook.remove(m_scrolledwindow_audio); m_notebook.remove(m_scrolledwindow_midi); } if (m_vbox->children().size() == 3) { m_vbox->remove(m_scrolledwindow_audio); } delete m_matrix_audio; delete m_matrix_midi; m_matrix_audio = new Matrix(PT_AUDIO); m_matrix_midi = new Matrix(PT_MIDI); m_notebook.pages().clear(); m_notebook.pages().push_back( Gtk::Notebook_Helpers::TabElem(m_scrolledwindow_audio, "Audio")); m_scrolledwindow_audio.add(*m_matrix_audio); m_scrolledwindow_audio.show(); m_notebook.pages().push_back( Gtk::Notebook_Helpers::TabElem(m_scrolledwindow_midi, "MIDI")); m_scrolledwindow_midi.add(*m_matrix_midi); m_scrolledwindow_midi.show(); m_notebook.show(); m_notebook.signal_switch_page().connect(sigc::mem_fun(*this, &Gui::on_notebook_switch_page)); m_vbox->pack_start(m_notebook); } else { if (m_matrix_audio && !m_matrix_midi) return; m_scrolledwindow_audio.remove(); m_scrolledwindow_midi.remove(); if (m_notebook.pages().size() > 0) { m_notebook.remove(m_scrolledwindow_audio); m_notebook.remove(m_scrolledwindow_midi); } if (m_vbox->children().size() == 3) { m_vbox->remove(m_notebook); } delete m_matrix_audio; delete m_matrix_midi; m_matrix_audio = new Matrix(PT_ALL); m_matrix_midi = NULL; m_scrolledwindow_audio.add(*m_matrix_audio); m_scrolledwindow_audio.show(); m_vbox->pack_start(m_scrolledwindow_audio); } } Gui *Gui::Open() { if (g_builder == NULL) { g_builder = Gtk::Builder::create_from_file("jsweeper.ui"); } Gui *window = NULL; g_builder->get_widget_derived("window1", window); return window; } void Gui::Refresh() { if (m_closing) return; if (cfg.SeparateByPortType) { int page = m_notebook.get_current_page(); if (page == 0 && m_matrix_audio != NULL) m_matrix_audio->Refresh(); if (page == 1 && m_matrix_midi != NULL) m_matrix_midi->Refresh(); } else { if (m_matrix_audio != NULL) m_matrix_audio->Refresh(); } } bool Gui::on_idle() { if (m_closing) return false; if (jack.ProcessEvents()) { Refresh(); queue_draw(); } usleep(1000); return true; } void Gui::on_notebook_switch_page(GtkNotebookPage * /* page */, guint /* page_num */) { if (m_closing) return; Refresh(); } void Gui::on_quit() { hide(); } void Gui::on_session_open() { SessionOpenGui *sgui = SessionOpenGui::Open(); sgui->show(); } void Gui::on_session_save() { } void Gui::on_session_save_as() { SessionSaveGui *sgui = SessionSaveGui::Open(); sgui->show(); } void Gui::on_session_close() { } void Gui::on_preferences() { Preferences *p = Preferences::Open(); p->show(); } void Gui::on_connect() { jack.Connect(); Refresh(); } void Gui::on_disconnect() { jack.Disconnect(); Refresh(); } void Gui::on_about() { Gtk::AboutDialog *about; g_builder->get_widget("aboutdialog1", about); about->show(); } Preferences::Preferences(BaseObjectType *cobject, const Glib::RefPtr &builder) : Gtk::Dialog(cobject) { builder->get_widget("button_preferences_close", button_preferences_close); builder->get_widget("check_separate_port_type", check_separate_port_type); builder->get_widget("check_expand_clients", check_expand_clients); builder->get_widget("check_expand_groups", check_expand_groups); builder->get_widget("check_default_location", check_default_location); builder->get_widget("filechooser_custom_location", filechooser_custom_location); builder->get_widget("check_activate_connections", check_activate_connections); builder->get_widget("treeview_connections", treeview_connections); builder->get_widget("button_connections_add", button_connections_add); builder->get_widget("button_connections_remove", button_connections_remove); builder->get_widget("button_connections_edit", button_connections_edit); builder->get_widget("button_connections_up", button_connections_up); builder->get_widget("button_connections_down", button_connections_down); builder->get_widget("check_activate_aliases", check_activate_aliases); builder->get_widget("treeview_aliases", treeview_aliases); builder->get_widget("button_aliases_add", button_aliases_add); builder->get_widget("button_aliases_remove", button_aliases_remove); builder->get_widget("button_aliases_edit", button_aliases_edit); builder->get_widget("button_aliases_up", button_aliases_up); builder->get_widget("button_aliases_down", button_aliases_down); builder->get_widget("fontbutton_font", fontbutton_font); builder->get_widget("spin_cell_padding", spin_cell_padding); builder->get_widget("colorbutton_background", colour_background); builder->get_widget("colorbutton_clients", colour_clients); builder->get_widget("colorbutton_port_groups", colour_port_groups); builder->get_widget("colorbutton_ports_audio", colour_ports_audio); builder->get_widget("colorbutton_ports_midi", colour_ports_midi); builder->get_widget("colorbutton_text", colour_text); builder->get_widget("colorbutton_grid_client", colour_grid_client); builder->get_widget("colorbutton_grid_group", colour_grid_group); builder->get_widget("colorbutton_grid_port", colour_grid_port); check_separate_port_type->set_active(cfg.SeparateByPortType); check_expand_clients->set_active(cfg.ExpandClients); check_expand_groups->set_active(cfg.ExpandGroups); Refresh(); { check_activate_aliases->set_active(cfg.UseAliases); m_tree_model_aliases = Gtk::ListStore::create(m_columns); treeview_aliases->set_model(m_tree_model_aliases); const AliasList &list = pm.AliasGetList(); AliasList::const_iterator it; int i = 0; for (it = list.begin(); it != list.end(); ++it, i++) { const Alias &a = *it; Gtk::TreeModel::Row row = *(m_tree_model_aliases->append()); row[m_columns.m_row] = i; row[m_columns.m_first] = a.match; row[m_columns.m_second] = a.replace; } treeview_aliases->append_column("Match", m_columns.m_first); treeview_aliases->append_column("Replace", m_columns.m_second); } char font[256]; snprintf(font, sizeof font, "%s %d", cfg.FontFace.c_str(), cfg.FontSize); fontbutton_font->set_font_name(font); spin_cell_padding->set_value(cfg.CellPadding); colour_background->set_color(cfg.Background.colour); colour_clients->set_color(cfg.TabClient.colour); colour_port_groups->set_color(cfg.TabGroup.colour); colour_ports_audio->set_color(cfg.TabPortAudio.colour); colour_ports_midi->set_color(cfg.TabPortMidi.colour); colour_text->set_color(cfg.Text.colour); colour_grid_client->set_color(cfg.GridLinesClient.colour); colour_grid_group->set_color(cfg.GridLinesGroup.colour); colour_grid_port->set_color(cfg.GridLinesPort.colour); button_preferences_close->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::on_preferences_close_click)); check_separate_port_type->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::on_check_separate_port_type_click)); check_expand_clients->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::on_check_expand_clients_click)); check_expand_groups->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::on_check_expand_groups_click)); check_activate_aliases->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::on_check_activate_aliases_click)); fontbutton_font->signal_font_set().connect(sigc::mem_fun(*this, &Preferences::on_fontbutton_font_click)); spin_cell_padding->signal_value_changed().connect(sigc::mem_fun(*this, &Preferences::on_spin_cell_padding_click)); } Preferences *Preferences::Open() { Preferences *window = NULL; g_builder->get_widget_derived("dialog_preferences", window); window->Refresh(); return window; } void Preferences::Refresh() { } void Preferences::on_preferences_close_click() { hide(); } void Preferences::on_check_separate_port_type_click() { cfg.SeparateByPortType = check_separate_port_type->get_active(); g->SetPortTypeSeparation(); g->Refresh(); } void Preferences::on_check_expand_clients_click() { cfg.ExpandClients = check_expand_clients->get_active(); } void Preferences::on_check_expand_groups_click() { cfg.ExpandGroups = check_expand_groups->get_active(); } void Preferences::on_check_activate_aliases_click() { cfg.UseAliases = check_activate_aliases->get_active(); pm.Refresh(); g->Refresh(); Refresh(); } void Preferences::on_fontbutton_font_click() { std::string font = fontbutton_font->get_font_name(); cfg.FontFace = font.substr(0, font.find_last_of(' ')); cfg.FontSize = ss_conv_to(font.substr(font.find_last_of(' ') + 1)); g->Refresh(); } void Preferences::on_spin_cell_padding_click() { cfg.CellPadding = spin_cell_padding->get_value(); g->Refresh(); }