jsweeper/src/gui.cpp

247 lines
5.6 KiB
C++

#include <sys/stat.h>
#include <iostream>
#include "config.h"
#include "jack.h"
#include "portmanager.h"
#include "gui.h"
#include "session_gui.h"
#include "preferences_gui.h"
#define PACKAGE_NAME "jsweeper"
Glib::RefPtr<Gtk::Builder> g_builder;
Gui::Gui(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &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_timeout().connect(sigc::mem_fun(*this, &Gui::on_timeout), 50);
if (!jack_set_port_rename_callback) {
Glib::signal_timeout().connect(sigc::mem_fun(*this, &Gui::on_timeout_2), 1000);
}
Glib::RefPtr<Gtk::UIManager> uim = Glib::RefPtr<Gtk::UIManager>::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.get_n_pages() > 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);
}
}
static void TryLoad(const char *filename)
{
struct stat out;
if (stat(filename, &out) == 0) {
g_builder = Gtk::Builder::create_from_file(filename);
}
}
Gui *Gui::Open()
{
if (!g_builder) {
const char * const *dirs = g_get_system_data_dirs();
while (*dirs != NULL && !g_builder) {
std::string path = *dirs;
path = Glib::build_filename(path, PACKAGE_NAME);
path = Glib::build_filename(path, "jsweeper.ui");
TryLoad(path.c_str());
dirs++;
}
if (!g_builder) TryLoad("jsweeper.ui");
if (!g_builder) {
std::cerr << "Failed to load jsweeper.ui!" << std::endl;
exit(-1);
}
}
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_timeout()
{
if (m_closing) return false;
if (jack.ProcessEvents()) {
Refresh();
queue_draw();
}
return true;
}
bool Gui::on_timeout_2()
{
if (m_closing) return false;
if (pm.PollPortRenames()) {
Refresh();
queue_draw();
}
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();
}