--- gigedit/branches/linuxsampler_org/src/mainwindow.cpp 2007/03/03 12:20:01 1052 +++ gigedit/trunk/src/mainwindow.cpp 2007/03/08 01:43:18 1082 @@ -31,6 +31,11 @@ #define _(String) gettext(String) +template inline std::string ToString(T o) { + std::stringstream ss; + ss << o; + return ss.str(); +} bool update_gui; @@ -524,8 +529,8 @@ m_TreeView.signal_button_press_event().connect_notify( sigc::mem_fun(*this, &MainWindow::on_button_release)); - // Add the TreeView, inside a ScrolledWindow, with the button underneath: - m_ScrolledWindow.add(m_TreeView); + // Add the TreeView tab, inside a ScrolledWindow, with the button underneath: + m_ScrolledWindow.add(m_TreeViewNotebook); m_ScrolledWindow.set_size_request(400, 600); m_ScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); @@ -784,6 +789,10 @@ m_HPaned.add2(m_Notebook); + m_TreeViewNotebook.append_page(m_TreeViewSamples, "Samples"); + m_TreeViewNotebook.append_page(m_TreeView, "Instruments"); + + actionGroup = Gtk::ActionGroup::create(); actionGroup->add(Gtk::Action::create("MenuFile", _("_File"))); @@ -817,6 +826,8 @@ actionGroup->add(Gtk::Action::create("Quit", Gtk::Stock::QUIT), sigc::mem_fun( *this, &MainWindow::hide)); + actionGroup->add(Gtk::Action::create("MenuInstrument", _("_Instrument"))); + action = Gtk::Action::create("MenuHelp", Gtk::Stock::HELP); actionGroup->add(Gtk::Action::create("MenuHelp", action->property_label())); @@ -825,11 +836,29 @@ sigc::mem_fun( *this, &MainWindow::on_action_help_about)); #endif - action = Gtk::Action::create("Remove", "Ta bort"); + action = Gtk::Action::create("Remove", Gtk::Stock::REMOVE); actionGroup->add(action, sigc::mem_fun( *this, &MainWindow::hide)); + // sample right-click popup actions + actionGroup->add( + Gtk::Action::create("SampleProperties", Gtk::Stock::PROPERTIES), + sigc::mem_fun(*this, &MainWindow::on_action_sample_properties) + ); + actionGroup->add( + Gtk::Action::create("AddGroup", _("Add _Group")), + sigc::mem_fun(*this, &MainWindow::on_action_add_group) + ); + actionGroup->add( + Gtk::Action::create("AddSample", _("Add _Sample")), + sigc::mem_fun(*this, &MainWindow::on_action_add_sample) + ); + actionGroup->add( + Gtk::Action::create("RemoveSample", Gtk::Stock::REMOVE), + sigc::mem_fun(*this, &MainWindow::on_action_remove_sample) + ); + uiManager = Gtk::UIManager::create(); uiManager->insert_action_group(actionGroup); // add_accel_group(uiManager->get_accel_group()); @@ -848,6 +877,8 @@ " " " " " " + " " + " " #ifdef ABOUT_DIALOG " " " " @@ -858,6 +889,13 @@ " " " " " " + " " + " " + " " + " " + " " + " " + " " ""; uiManager->add_ui_from_string(ui_info); @@ -883,6 +921,15 @@ m_TreeView.append_column("Instrument", m_Columns.m_col_name); m_TreeView.set_headers_visible(false); + // create samples treeview (including its data model) + m_refSamplesTreeModel = Gtk::TreeStore::create(m_SamplesModel); + m_TreeViewSamples.set_model(m_refSamplesTreeModel); + m_TreeViewSamples.append_column("Samples", m_SamplesModel.m_col_name); + m_TreeViewSamples.set_headers_visible(false); + m_TreeViewSamples.signal_button_press_event().connect_notify( + sigc::mem_fun(*this, &MainWindow::on_sample_treeview_button_release) + ); + file = 0; show_all_children(); @@ -1242,7 +1289,17 @@ if (dialog.run() == Gtk::RESPONSE_OK) { printf("filename=%s\n", dialog.get_filename().c_str()); + // remove all entries from "Instrument" menu + Gtk::MenuItem* instrument_menu = + dynamic_cast(uiManager->get_widget("/MenuBar/MenuInstrument")); + instrument_menu->hide(); + for (int i = 0; i < instrument_menu->get_submenu()->items().size(); i++) { + delete &instrument_menu->get_submenu()->items()[i]; + } + instrument_menu->get_submenu()->items().clear(); + m_refTreeModel->clear(); + m_refSamplesTreeModel->clear(); if (file) delete file; // getInfo(dialog.get_filename().c_str(), *this); @@ -1474,12 +1531,44 @@ propDialog.set_info(gig->pInfo); + Gtk::MenuItem* instrument_menu = + dynamic_cast(uiManager->get_widget("/MenuBar/MenuInstrument")); + + int instrument_index = 0; + Gtk::RadioMenuItem::Group instrument_group; for (gig::Instrument* instrument = gig->GetFirstInstrument() ; instrument ; instrument = gig->GetNextInstrument()) { Gtk::TreeModel::iterator iter = m_refTreeModel->append(); Gtk::TreeModel::Row row = *iter; row[m_Columns.m_col_name] = instrument->pInfo->Name.c_str(); row[m_Columns.m_col_instr] = instrument; + // create a menu item for this instrument + Gtk::RadioMenuItem* item= new Gtk::RadioMenuItem(instrument_group, instrument->pInfo->Name.c_str()); + instrument_menu->get_submenu()->append(*item); + item->signal_activate().connect( + sigc::bind( + sigc::mem_fun(*this, &MainWindow::on_instrument_selection_change), + instrument_index + ) + ); + instrument_index++; + } + instrument_menu->show(); + instrument_menu->get_submenu()->show_all_children(); + + for (gig::Group* group = gig->GetFirstGroup(); group; group = gig->GetNextGroup()) { + Gtk::TreeModel::iterator iterGroup = m_refSamplesTreeModel->append(); + Gtk::TreeModel::Row rowGroup = *iterGroup; + rowGroup[m_SamplesModel.m_col_name] = group->Name.c_str(); + rowGroup[m_SamplesModel.m_col_group] = group; + rowGroup[m_SamplesModel.m_col_sample] = NULL; + for (gig::Sample* sample = group->GetFirstSample(); sample; sample = group->GetNextSample()) { + Gtk::TreeModel::iterator iterSample = m_refSamplesTreeModel->append(rowGroup.children()); + Gtk::TreeModel::Row rowSample = *iterSample; + rowSample[m_SamplesModel.m_col_name] = sample->pInfo->Name.c_str(); + rowSample[m_SamplesModel.m_col_sample] = sample; + rowSample[m_SamplesModel.m_col_group] = NULL; + } } } @@ -1502,3 +1591,57 @@ popup_menu->popup(button->button, button->time); } } + +void MainWindow::on_instrument_selection_change(int index) { + m_RegionChooser.set_instrument(file->GetInstrument(index)); +} + +void MainWindow::on_sample_treeview_button_release(GdkEventButton* button) { + if (button->type == GDK_BUTTON_PRESS && button->button == 3) { + Gtk::Menu* sample_popup = + dynamic_cast(uiManager->get_widget("/SamplePopupMenu")); + // update enabled/disabled state of sample popup items + Glib::RefPtr sel = m_TreeViewSamples.get_selection(); + Gtk::TreeModel::iterator it = sel->get_selected(); + bool group_selected = false; + bool sample_selected = false; + if (it) { + Gtk::TreeModel::Row row = *it; + group_selected = row[m_SamplesModel.m_col_group]; + sample_selected = row[m_SamplesModel.m_col_sample]; + } + dynamic_cast(uiManager->get_widget("/SamplePopupMenu/SampleProperties"))->set_sensitive(group_selected || sample_selected); + dynamic_cast(uiManager->get_widget("/SamplePopupMenu/AddSample"))->set_sensitive(group_selected || sample_selected); + dynamic_cast(uiManager->get_widget("/SamplePopupMenu/AddGroup"))->set_sensitive(file); + dynamic_cast(uiManager->get_widget("/SamplePopupMenu/RemoveSample"))->set_sensitive(group_selected || sample_selected); + // show sample popup + sample_popup->popup(button->button, button->time); + } +} + +void MainWindow::on_action_sample_properties() { + //TODO: show a dialog where the selected sample's properties can be edited +} + +void MainWindow::on_action_add_group() { + static int __sample_indexer = 0; + if (!file) return; + gig::Group* group = file->AddGroup(); + group->Name = "Unnamed Group"; + if (__sample_indexer) group->Name += " " + ToString(__sample_indexer); + __sample_indexer++; + // update sample tree view + Gtk::TreeModel::iterator iterGroup = m_refSamplesTreeModel->append(); + Gtk::TreeModel::Row rowGroup = *iterGroup; + rowGroup[m_SamplesModel.m_col_name] = group->Name.c_str(); + rowGroup[m_SamplesModel.m_col_sample] = NULL; + rowGroup[m_SamplesModel.m_col_group] = group; +} + +void MainWindow::on_action_add_sample() { + //TODO: open browse for file dialog for adding new samples +} + +void MainWindow::on_action_remove_sample() { + //TODO: remove the selected group or sample +}