/[svn]/gigedit/trunk/src/gigedit/mainwindow.cpp
ViewVC logotype

Diff of /gigedit/trunk/src/gigedit/mainwindow.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3749 by schoenebeck, Sun Feb 16 18:39:53 2020 UTC revision 3808 by schoenebeck, Fri Aug 14 11:24:09 2020 UTC
# Line 106  MainWindow::MainWindow() : Line 106  MainWindow::MainWindow() :
106      add(m_VBox);      add(m_VBox);
107    
108      // Handle selection      // Handle selection
109      m_TreeView.get_selection()->signal_changed().connect(      m_TreeViewInstruments.get_selection()->signal_changed().connect(
110          sigc::mem_fun(*this, &MainWindow::on_sel_change));          sigc::mem_fun(*this, &MainWindow::on_sel_change));
111    
112      // m_TreeView.set_reorderable();      // m_TreeViewInstruments.set_reorderable();
113    
114  #if GTKMM_MAJOR_VERSION > 3 || (GTKMM_MAJOR_VERSION == 3 && (GTKMM_MINOR_VERSION > 91 || (GTKMM_MINOR_VERSION == 91 && GTKMM_MICRO_VERSION >= 2))) // GTKMM >= 3.91.2  #if GTKMM_MAJOR_VERSION > 3 || (GTKMM_MAJOR_VERSION == 3 && (GTKMM_MINOR_VERSION > 91 || (GTKMM_MINOR_VERSION == 91 && GTKMM_MICRO_VERSION >= 2))) // GTKMM >= 3.91.2
115      m_TreeView.signal_button_press_event().connect(      m_TreeViewInstruments.signal_button_press_event().connect(
116          sigc::mem_fun(*this, &MainWindow::on_button_release));          sigc::mem_fun(*this, &MainWindow::on_button_release));
117  #else  #else
118      m_TreeView.signal_button_press_event().connect_notify(      m_TreeViewInstruments.signal_button_press_event().connect_notify(
119          sigc::mem_fun(*this, &MainWindow::on_button_release));          sigc::mem_fun(*this, &MainWindow::on_button_release));
120  #endif  #endif
121    
122      // Add the TreeView tab, inside a ScrolledWindow, with the button underneath:      // Add the TreeView tab, inside a ScrolledWindow, with the button underneath:
123      m_ScrolledWindow.add(m_TreeView);      m_ScrolledWindow.add(m_TreeViewInstruments);
124  //    m_ScrolledWindow.set_size_request(200, 600);  //    m_ScrolledWindow.set_size_request(200, 600);
125      m_ScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);      m_ScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
126    
# Line 1383  MainWindow::MainWindow() : Line 1383  MainWindow::MainWindow() :
1383    
1384    
1385      // Create the Tree model:      // Create the Tree model:
1386      m_refTreeModel = Gtk::ListStore::create(m_Columns);      m_refInstrumentsTreeModel = Gtk::ListStore::create(m_InstrumentsModel);
1387      m_refTreeModelFilter = Gtk::TreeModelFilter::create(m_refTreeModel);      m_refInstrumentsModelFilter = Gtk::TreeModelFilter::create(m_refInstrumentsTreeModel);
1388      m_refTreeModelFilter->set_visible_func(      m_refInstrumentsModelFilter->set_visible_func(
1389          sigc::mem_fun(*this, &MainWindow::instrument_row_visible)          sigc::mem_fun(*this, &MainWindow::instrument_row_visible)
1390      );      );
1391      m_TreeView.set_model(m_refTreeModelFilter);      m_TreeViewInstruments.set_model(m_refInstrumentsModelFilter);
1392    
1393      m_TreeView.get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);      m_TreeViewInstruments.get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
1394      m_TreeView.set_has_tooltip(true);      m_TreeViewInstruments.set_has_tooltip(true);
1395      m_TreeView.signal_query_tooltip().connect(      m_TreeViewInstruments.signal_query_tooltip().connect(
1396          sigc::mem_fun(*this, &MainWindow::onQueryTreeViewTooltip)          sigc::mem_fun(*this, &MainWindow::onQueryTreeViewTooltip)
1397      );      );
1398      instrument_name_connection = m_refTreeModel->signal_row_changed().connect(      instrument_name_connection = m_refInstrumentsTreeModel->signal_row_changed().connect(
1399          sigc::mem_fun(*this, &MainWindow::instrument_name_changed)          sigc::mem_fun(*this, &MainWindow::instrument_name_changed)
1400      );      );
1401    
1402      // Add the TreeView's view columns:      // Add the TreeView's view columns:
1403      m_TreeView.append_column(_("Nr"), m_Columns.m_col_nr);      m_TreeViewInstruments.append_column(_("Nr"), m_InstrumentsModel.m_col_nr);
1404      m_TreeView.append_column_editable(_("Instrument"), m_Columns.m_col_name);      m_TreeViewInstruments.append_column_editable(_("Instrument"), m_InstrumentsModel.m_col_name);
1405      m_TreeView.append_column(_("Scripts"), m_Columns.m_col_scripts);      m_TreeViewInstruments.append_column(_("Scripts"), m_InstrumentsModel.m_col_scripts);
1406      m_TreeView.set_headers_visible(true);      m_TreeViewInstruments.set_headers_visible(true);
1407            
1408      // establish drag&drop within the instrument tree view, allowing to reorder      // establish drag&drop within the instrument tree view, allowing to reorder
1409      // the sequence of instruments within the gig file      // the sequence of instruments within the gig file
1410      {      {
1411          std::vector<Gtk::TargetEntry> drag_target_instrument;          std::vector<Gtk::TargetEntry> drag_target_instrument;
1412          drag_target_instrument.push_back(Gtk::TargetEntry("gig::Instrument"));          drag_target_instrument.push_back(Gtk::TargetEntry("gig::Instrument"));
1413          m_TreeView.drag_source_set(drag_target_instrument);          m_TreeViewInstruments.drag_source_set(drag_target_instrument);
1414          m_TreeView.drag_dest_set(drag_target_instrument);          m_TreeViewInstruments.drag_dest_set(drag_target_instrument);
1415          m_TreeView.signal_drag_begin().connect(          m_TreeViewInstruments.signal_drag_begin().connect(
1416              sigc::mem_fun(*this, &MainWindow::on_instruments_treeview_drag_begin)              sigc::mem_fun(*this, &MainWindow::on_instruments_treeview_drag_begin)
1417          );          );
1418          m_TreeView.signal_drag_data_get().connect(          m_TreeViewInstruments.signal_drag_data_get().connect(
1419              sigc::mem_fun(*this, &MainWindow::on_instruments_treeview_drag_data_get)              sigc::mem_fun(*this, &MainWindow::on_instruments_treeview_drag_data_get)
1420          );          );
1421          m_TreeView.signal_drag_data_received().connect(          m_TreeViewInstruments.signal_drag_data_received().connect(
1422              sigc::mem_fun(*this, &MainWindow::on_instruments_treeview_drop_drag_data_received)              sigc::mem_fun(*this, &MainWindow::on_instruments_treeview_drop_drag_data_received)
1423          );          );
1424      }      }
# Line 1620  MainWindow::MainWindow() : Line 1620  MainWindow::MainWindow() :
1620          sigc::mem_fun(*this, &MainWindow::update_dimregs));          sigc::mem_fun(*this, &MainWindow::update_dimregs));
1621    
1622      m_searchText.signal_changed().connect(      m_searchText.signal_changed().connect(
1623          sigc::mem_fun(*m_refTreeModelFilter.operator->(), &Gtk::TreeModelFilter::refilter)          sigc::mem_fun(*m_refInstrumentsModelFilter.operator->(), &Gtk::TreeModelFilter::refilter)
1624      );      );
1625    
1626      file = 0;      file = 0;
# Line 1864  void MainWindow::region_changed() Line 1864  void MainWindow::region_changed()
1864    
1865  gig::Instrument* MainWindow::get_instrument()  gig::Instrument* MainWindow::get_instrument()
1866  {  {
1867      gig::Instrument* instrument = 0;      gig::Instrument* instrument = NULL;
1868      std::vector<Gtk::TreeModel::Path> rows = m_TreeView.get_selection()->get_selected_rows();  
1869        // get indeces of visual selection
1870        std::vector<Gtk::TreeModel::Path> rows = m_TreeViewInstruments.get_selection()->get_selected_rows();
1871      if (rows.empty()) return NULL;      if (rows.empty()) return NULL;
1872    
1873        // convert index of visual selection (i.e. if filtered) to index of model
1874        Gtk::TreeModel::Path path = m_refInstrumentsModelFilter->convert_path_to_child_path(rows[0]);
1875        if (!path) return NULL;
1876    
1877      //NOTE: was const_iterator before, which did not compile with GTKMM4 development branch, probably going to be fixed before final GTKMM4 release though.      //NOTE: was const_iterator before, which did not compile with GTKMM4 development branch, probably going to be fixed before final GTKMM4 release though.
1878      Gtk::TreeModel::iterator it = m_refTreeModel->get_iter(rows[0]);      Gtk::TreeModel::iterator it = m_refInstrumentsTreeModel->get_iter(path);
1879      if (it) {      if (it) {
1880          Gtk::TreeModel::Row row = *it;          Gtk::TreeModel::Row row = *it;
1881          instrument = row[m_Columns.m_col_instr];          instrument = row[m_InstrumentsModel.m_col_instr];
1882      }      }
1883      return instrument;      return instrument;
1884  }  }
# Line 1936  void MainWindow::on_sel_change() Line 1943  void MainWindow::on_sel_change()
1943  {  {
1944  #if !USE_GTKMM_BUILDER  #if !USE_GTKMM_BUILDER
1945      // select item in instrument menu      // select item in instrument menu
1946      std::vector<Gtk::TreeModel::Path> rows = m_TreeView.get_selection()->get_selected_rows();      std::vector<Gtk::TreeModel::Path> rows = m_TreeViewInstruments.get_selection()->get_selected_rows();
1947      if (!rows.empty()) {      if (!rows.empty()) {
1948          Gtk::TreeModel::iterator it = m_refTreeModel->get_iter(rows[0]);          Gtk::TreeModel::iterator it = m_refInstrumentsTreeModel->get_iter(rows[0]);
1949          if (it) {          if (it) {
1950              Gtk::TreePath path(it);              Gtk::TreePath path(it);
1951              int index = path[0];              int index = path[0];
# Line 2146  void MainWindow::__clear() { Line 2153  void MainWindow::__clear() {
2153      // forget all samples that ought to be imported      // forget all samples that ought to be imported
2154      m_SampleImportQueue.clear();      m_SampleImportQueue.clear();
2155      // clear the samples and instruments tree views      // clear the samples and instruments tree views
2156      m_refTreeModel->clear();      m_refInstrumentsTreeModel->clear();
2157      m_refSamplesTreeModel->clear();      m_refSamplesTreeModel->clear();
2158      m_refScriptsTreeModel->clear();      m_refScriptsTreeModel->clear();
2159  #if !USE_GTKMM_BUILDER  #if !USE_GTKMM_BUILDER
# Line 2163  void MainWindow::__clear() { Line 2170  void MainWindow::__clear() {
2170    
2171  void MainWindow::__refreshEntireGUI() {  void MainWindow::__refreshEntireGUI() {
2172      // clear the samples and instruments tree views      // clear the samples and instruments tree views
2173      m_refTreeModel->clear();      m_refInstrumentsTreeModel->clear();
2174      m_refSamplesTreeModel->clear();      m_refSamplesTreeModel->clear();
2175      m_refScriptsTreeModel->clear();      m_refScriptsTreeModel->clear();
2176  #if !USE_GTKMM_BUILDER  #if !USE_GTKMM_BUILDER
# Line 2336  void MainWindow::load_instrument(gig::In Line 2343  void MainWindow::load_instrument(gig::In
2343      {      {
2344          if (instrument == instr) {          if (instrument == instr) {
2345              // select item in "instruments" tree view              // select item in "instruments" tree view
2346              m_TreeView.get_selection()->select(Gtk::TreePath(ToString(i)));              m_TreeViewInstruments.get_selection()->select(Gtk::TreePath(ToString(i)));
2347              // make sure the selected item in the "instruments" tree view is              // make sure the selected item in the "instruments" tree view is
2348              // visible (scroll to it)              // visible (scroll to it)
2349              m_TreeView.scroll_to_row(Gtk::TreePath(ToString(i)));              m_TreeViewInstruments.scroll_to_row(Gtk::TreePath(ToString(i)));
2350  #if !USE_GTKMM_BUILDER  #if !USE_GTKMM_BUILDER
2351              // select item in instrument menu              // select item in instrument menu
2352              {              {
# Line 2703  void MainWindow::on_show_tooltips_change Line 2710  void MainWindow::on_show_tooltips_change
2710      dimreg_stereo.set_has_tooltip(b);      dimreg_stereo.set_has_tooltip(b);
2711    
2712      // Not doing this here, we let onQueryTreeViewTooltip() handle this per cell      // Not doing this here, we let onQueryTreeViewTooltip() handle this per cell
2713      //m_TreeView.set_has_tooltip(b);      //m_TreeViewInstruments.set_has_tooltip(b);
2714    
2715      m_TreeViewSamples.set_has_tooltip(b);      m_TreeViewSamples.set_has_tooltip(b);
2716      m_TreeViewScripts.set_has_tooltip(b);      m_TreeViewScripts.set_has_tooltip(b);
# Line 3455  void MainWindow::updateSampleRefCountMap Line 3462  void MainWindow::updateSampleRefCountMap
3462    
3463  bool MainWindow::onQueryTreeViewTooltip(int x, int y, bool keyboardTip, const Glib::RefPtr<Gtk::Tooltip>& tooltip) {  bool MainWindow::onQueryTreeViewTooltip(int x, int y, bool keyboardTip, const Glib::RefPtr<Gtk::Tooltip>& tooltip) {
3464      Gtk::TreeModel::iterator iter;      Gtk::TreeModel::iterator iter;
3465      if (!m_TreeView.get_tooltip_context_iter(x, y, keyboardTip, iter)) {      if (!m_TreeViewInstruments.get_tooltip_context_iter(x, y, keyboardTip, iter)) {
3466          return false;          return false;
3467      }      }
3468      Gtk::TreeModel::Path path(iter);      Gtk::TreeModel::Path path(iter);
# Line 3465  bool MainWindow::onQueryTreeViewTooltip( Line 3472  bool MainWindow::onQueryTreeViewTooltip(
3472      {      {
3473          Gtk::TreeModel::Path path; // unused          Gtk::TreeModel::Path path; // unused
3474          int cellX, cellY; // unused          int cellX, cellY; // unused
3475          m_TreeView.get_path_at_pos(x, y, path, pointedColumn, cellX, cellY);          m_TreeViewInstruments.get_path_at_pos(x, y, path, pointedColumn, cellX, cellY);
3476      }      }
3477      Gtk::TreeViewColumn* scriptsColumn = m_TreeView.get_column(2);      Gtk::TreeViewColumn* scriptsColumn = m_TreeViewInstruments.get_column(2);
3478      if (pointedColumn == scriptsColumn) { // mouse hovers scripts column ...      if (pointedColumn == scriptsColumn) { // mouse hovers scripts column ...
3479          // show the script(s) assigned to the hovered instrument as tooltip          // show the script(s) assigned to the hovered instrument as tooltip
3480          tooltip->set_markup( row[m_Columns.m_col_tooltip] );          tooltip->set_markup( row[m_InstrumentsModel.m_col_tooltip] );
3481          m_TreeView.set_tooltip_cell(tooltip, &path, scriptsColumn, NULL);          m_TreeViewInstruments.set_tooltip_cell(tooltip, &path, scriptsColumn, NULL);
3482      } else {      } else {
3483          // if beginners' tooltips is disabled then don't show the following one          // if beginners' tooltips is disabled then don't show the following one
3484          if (!Settings::singleton()->showTooltips)          if (!Settings::singleton()->showTooltips)
# Line 3481  bool MainWindow::onQueryTreeViewTooltip( Line 3488  bool MainWindow::onQueryTreeViewTooltip(
3488              "Right click here for actions on instruments & MIDI Rules. "              "Right click here for actions on instruments & MIDI Rules. "
3489              "Drag & drop to change the order of instruments."              "Drag & drop to change the order of instruments."
3490          ));          ));
3491          m_TreeView.set_tooltip_cell(tooltip, &path, pointedColumn, NULL);          m_TreeViewInstruments.set_tooltip_cell(tooltip, &path, pointedColumn, NULL);
3492      }      }
3493      return true;      return true;
3494  }  }
# Line 3524  void MainWindow::load_gig(gig::File* gig Line 3531  void MainWindow::load_gig(gig::File* gig
3531          Glib::ustring name(gig_to_utf8(instrument->pInfo->Name));          Glib::ustring name(gig_to_utf8(instrument->pInfo->Name));
3532          const int iScriptSlots = instrument->ScriptSlotCount();          const int iScriptSlots = instrument->ScriptSlotCount();
3533    
3534          Gtk::TreeModel::iterator iter = m_refTreeModel->append();          Gtk::TreeModel::iterator iter = m_refInstrumentsTreeModel->append();
3535          Gtk::TreeModel::Row row = *iter;          Gtk::TreeModel::Row row = *iter;
3536          row[m_Columns.m_col_nr] = index;          row[m_InstrumentsModel.m_col_nr] = index;
3537          row[m_Columns.m_col_name] = name;          row[m_InstrumentsModel.m_col_name] = name;
3538          row[m_Columns.m_col_instr] = instrument;          row[m_InstrumentsModel.m_col_instr] = instrument;
3539          row[m_Columns.m_col_scripts] = iScriptSlots ? ToString(iScriptSlots) : "";          row[m_InstrumentsModel.m_col_scripts] = iScriptSlots ? ToString(iScriptSlots) : "";
3540          row[m_Columns.m_col_tooltip] = scriptTooltipFor(instrument, index);          row[m_InstrumentsModel.m_col_tooltip] = scriptTooltipFor(instrument, index);
3541    
3542  #if !USE_GTKMM_BUILDER  #if !USE_GTKMM_BUILDER
3543          add_instrument_to_menu(name);          add_instrument_to_menu(name);
# Line 3592  void MainWindow::load_gig(gig::File* gig Line 3599  void MainWindow::load_gig(gig::File* gig
3599      file = gig;      file = gig;
3600    
3601      // select the first instrument      // select the first instrument
3602      m_TreeView.get_selection()->select(Gtk::TreePath("0"));      m_TreeViewInstruments.get_selection()->select(Gtk::TreePath("0"));
3603    
3604      instr_props_set_instrument();      instr_props_set_instrument();
3605      gig::Instrument* instrument = get_instrument();      gig::Instrument* instrument = get_instrument();
# Line 3605  bool MainWindow::instr_props_set_instrum Line 3612  bool MainWindow::instr_props_set_instrum
3612  {  {
3613      instrumentProps.signal_name_changed().clear();      instrumentProps.signal_name_changed().clear();
3614    
3615      std::vector<Gtk::TreeModel::Path> rows = m_TreeView.get_selection()->get_selected_rows();      std::vector<Gtk::TreeModel::Path> rows = m_TreeViewInstruments.get_selection()->get_selected_rows();
3616      if (rows.empty()) {      if (rows.empty()) {
3617          instrumentProps.hide();          instrumentProps.hide();
3618          return false;          return false;
3619      }      }
3620      //NOTE: was const_iterator before, which did not compile with GTKMM4 development branch, probably going to be fixed before final GTKMM4 release though.      //NOTE: was const_iterator before, which did not compile with GTKMM4 development branch, probably going to be fixed before final GTKMM4 release though.
3621      Gtk::TreeModel::iterator it = m_refTreeModel->get_iter(rows[0]);      Gtk::TreeModel::iterator it = m_refInstrumentsTreeModel->get_iter(rows[0]);
3622      if (it) {      if (it) {
3623          Gtk::TreeModel::Row row = *it;          Gtk::TreeModel::Row row = *it;
3624          gig::Instrument* instrument = row[m_Columns.m_col_instr];          gig::Instrument* instrument = row[m_InstrumentsModel.m_col_instr];
3625    
3626          instrumentProps.set_instrument(instrument);          instrumentProps.set_instrument(instrument);
3627    
# Line 3643  void MainWindow::show_instr_props() Line 3650  void MainWindow::show_instr_props()
3650  void MainWindow::instr_name_changed_by_instr_props(Gtk::TreeModel::iterator& it)  void MainWindow::instr_name_changed_by_instr_props(Gtk::TreeModel::iterator& it)
3651  {  {
3652      Gtk::TreeModel::Row row = *it;      Gtk::TreeModel::Row row = *it;
3653      Glib::ustring name = row[m_Columns.m_col_name];      Glib::ustring name = row[m_InstrumentsModel.m_col_name];
3654    
3655      gig::Instrument* instrument = row[m_Columns.m_col_instr];      gig::Instrument* instrument = row[m_InstrumentsModel.m_col_instr];
3656      Glib::ustring gigname(gig_to_utf8(instrument->pInfo->Name));      Glib::ustring gigname(gig_to_utf8(instrument->pInfo->Name));
3657      if (gigname != name) {      if (gigname != name) {
3658          Gtk::TreeModel::Path path(*it);          Gtk::TreeModel::Path path(*it);
3659          const int index = path[0];          const int index = path[0];
3660          row[m_Columns.m_col_name] = gigname;          row[m_InstrumentsModel.m_col_name] = gigname;
3661          row[m_Columns.m_col_tooltip] = scriptTooltipFor(instrument, index);          row[m_InstrumentsModel.m_col_tooltip] = scriptTooltipFor(instrument, index);
3662      }      }
3663  }  }
3664    
# Line 3721  void MainWindow::show_midi_rules() Line 3728  void MainWindow::show_midi_rules()
3728    
3729  void MainWindow::show_script_slots() {  void MainWindow::show_script_slots() {
3730      if (!file) return;      if (!file) return;
3731    
3732      // get selected instrument      // get selected instrument
3733      std::vector<Gtk::TreeModel::Path> rows = m_TreeView.get_selection()->get_selected_rows();      gig::Instrument* instrument = get_instrument();
     if (rows.empty()) return;  
     Gtk::TreeModel::iterator it = m_refTreeModel->get_iter(rows[0]);  
     if (!it) return;  
     Gtk::TreeModel::Row row = *it;  
     gig::Instrument* instrument = row[m_Columns.m_col_instr];  
3734      if (!instrument) return;      if (!instrument) return;
3735    
3736      ScriptSlots* window = new ScriptSlots;      ScriptSlots* window = new ScriptSlots;
# Line 3743  void MainWindow::onScriptSlotsModified(g Line 3746  void MainWindow::onScriptSlotsModified(g
3746      if (!pInstrument) return;      if (!pInstrument) return;
3747      const int iScriptSlots = pInstrument->ScriptSlotCount();      const int iScriptSlots = pInstrument->ScriptSlotCount();
3748    
3749      //NOTE: This is a big mess! Sometimes GTK requires m_TreeView.get_model(), here we need m_refTreeModelFilter->get_model(), otherwise accessing children below causes an error!      //NOTE: This is a big mess! Sometimes GTK requires m_TreeViewInstruments.get_model(), here we need m_refInstrumentsModelFilter->get_model(), otherwise accessing children below causes an error!
3750      //Glib::RefPtr<Gtk::TreeModel> model = m_TreeView.get_model();      //Glib::RefPtr<Gtk::TreeModel> model = m_TreeViewInstruments.get_model();
3751      Glib::RefPtr<Gtk::TreeModel> model = m_refTreeModelFilter->get_model();      Glib::RefPtr<Gtk::TreeModel> model = m_refInstrumentsModelFilter->get_model();
3752    
3753      for (int i = 0; i < model->children().size(); ++i) {      for (int i = 0; i < model->children().size(); ++i) {
3754          Gtk::TreeModel::Row row = model->children()[i];          Gtk::TreeModel::Row row = model->children()[i];
3755          if (row[m_Columns.m_col_instr] != pInstrument) continue;          if (row[m_InstrumentsModel.m_col_instr] != pInstrument) continue;
3756          row[m_Columns.m_col_scripts] = iScriptSlots ? ToString(iScriptSlots) : "";          row[m_InstrumentsModel.m_col_scripts] = iScriptSlots ? ToString(iScriptSlots) : "";
3757          row[m_Columns.m_col_tooltip] = scriptTooltipFor(pInstrument, i);          row[m_InstrumentsModel.m_col_tooltip] = scriptTooltipFor(pInstrument, i);
3758          break;          break;
3759      }      }
3760    
3761      // causes the sampler to reload the instrument with the new script      // causes the sampler to reload the instrument with the new script
3762      on_sel_change();      on_sel_change();
3763    
3764        // force script 'patch' variables editor ("Script" tab) to be refreshed
3765        dimreg_edit.scriptVars.setInstrument(pInstrument, true/*force update*/);
3766  }  }
3767    
3768  void MainWindow::assignScript(gig::Script* pScript) {  void MainWindow::assignScript(gig::Script* pScript) {
# Line 3963  void MainWindow::on_instrument_selection Line 3969  void MainWindow::on_instrument_selection
3969              find(children.begin(), children.end(), item);              find(children.begin(), children.end(), item);
3970          if (it != children.end()) {          if (it != children.end()) {
3971              int index = it - children.begin();              int index = it - children.begin();
3972              m_TreeView.get_selection()->select(Gtk::TreePath(ToString(index)));              m_TreeViewInstruments.get_selection()->select(Gtk::TreePath(ToString(index)));
3973    
3974              m_RegionChooser.set_instrument(file->GetInstrument(index));              m_RegionChooser.set_instrument(file->GetInstrument(index));
3975          }          }
# Line 4034  void MainWindow::on_action_move_instr() Line 4040  void MainWindow::on_action_move_instr()
4040  void MainWindow::select_instrument(gig::Instrument* instrument) {  void MainWindow::select_instrument(gig::Instrument* instrument) {
4041      if (!instrument) return;      if (!instrument) return;
4042    
4043      //NOTE: This is a big mess! Sometimes GTK requires m_refTreeModelFilter->get_model(), here we need m_TreeView.get_model(), otherwise treeview selection below causes an error!      //NOTE: This is a big mess! Sometimes GTK requires m_refInstrumentsModelFilter->get_model(), here we need m_TreeViewInstruments.get_model(), otherwise treeview selection below causes an error!
4044      Glib::RefPtr<Gtk::TreeModel> model = m_TreeView.get_model();      Glib::RefPtr<Gtk::TreeModel> model = m_TreeViewInstruments.get_model();
4045      //Glib::RefPtr<Gtk::TreeModel> model = m_refTreeModelFilter->get_model();      //Glib::RefPtr<Gtk::TreeModel> model = m_refInstrumentsModelFilter->get_model();
4046    
4047      for (int i = 0; i < model->children().size(); ++i) {      for (int i = 0; i < model->children().size(); ++i) {
4048          Gtk::TreeModel::Row row = model->children()[i];          Gtk::TreeModel::Row row = model->children()[i];
4049          if (row[m_Columns.m_col_instr] == instrument) {          if (row[m_InstrumentsModel.m_col_instr] == instrument) {
4050              // select and show the respective instrument in the list view              // select and show the respective instrument in the list view
4051              show_intruments_tab();              show_intruments_tab();
4052              m_TreeView.get_selection()->unselect_all();              m_TreeViewInstruments.get_selection()->unselect_all();
4053                            
4054  #if GTKMM_MAJOR_VERSION > 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION > 24)  #if GTKMM_MAJOR_VERSION > 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION > 24)
4055              auto iterSel = model->children()[i].get_iter();              auto iterSel = model->children()[i].get_iter();
4056              m_TreeView.get_selection()->select(iterSel);              m_TreeViewInstruments.get_selection()->select(iterSel);
4057  #else  #else
4058              m_TreeView.get_selection()->select(model->children()[i]);              m_TreeViewInstruments.get_selection()->select(model->children()[i]);
4059  #endif  #endif
4060              std::vector<Gtk::TreeModel::Path> rows =              std::vector<Gtk::TreeModel::Path> rows =
4061                  m_TreeView.get_selection()->get_selected_rows();                  m_TreeViewInstruments.get_selection()->get_selected_rows();
4062              if (!rows.empty())              if (!rows.empty())
4063                  m_TreeView.scroll_to_row(rows[0]);                  m_TreeViewInstruments.scroll_to_row(rows[0]);
4064              on_sel_change(); // the regular instrument selection change callback              on_sel_change(); // the regular instrument selection change callback
4065          }          }
4066      }      }
# Line 4065  bool MainWindow::select_dimension_region Line 4071  bool MainWindow::select_dimension_region
4071      gig::Region* pRegion = (gig::Region*) dimRgn->GetParent();      gig::Region* pRegion = (gig::Region*) dimRgn->GetParent();
4072      gig::Instrument* pInstrument = (gig::Instrument*) pRegion->GetParent();      gig::Instrument* pInstrument = (gig::Instrument*) pRegion->GetParent();
4073    
4074      //NOTE: This is a big mess! Sometimes GTK requires m_refTreeModelFilter->get_model(), here we need m_TreeView.get_model(), otherwise treeview selection below causes an error!      //NOTE: This is a big mess! Sometimes GTK requires m_refInstrumentsModelFilter->get_model(), here we need m_TreeViewInstruments.get_model(), otherwise treeview selection below causes an error!
4075      Glib::RefPtr<Gtk::TreeModel> model = m_TreeView.get_model();      Glib::RefPtr<Gtk::TreeModel> model = m_TreeViewInstruments.get_model();
4076      //Glib::RefPtr<Gtk::TreeModel> model = m_refTreeModelFilter->get_model();      //Glib::RefPtr<Gtk::TreeModel> model = m_refInstrumentsModelFilter->get_model();
4077    
4078      for (int i = 0; i < model->children().size(); ++i) {      for (int i = 0; i < model->children().size(); ++i) {
4079          Gtk::TreeModel::Row row = model->children()[i];          Gtk::TreeModel::Row row = model->children()[i];
4080          if (row[m_Columns.m_col_instr] == pInstrument) {          if (row[m_InstrumentsModel.m_col_instr] == pInstrument) {
4081              // select and show the respective instrument in the list view              // select and show the respective instrument in the list view
4082              show_intruments_tab();              show_intruments_tab();
4083              m_TreeView.get_selection()->unselect_all();              m_TreeViewInstruments.get_selection()->unselect_all();
4084  #if GTKMM_MAJOR_VERSION > 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION > 24)  #if GTKMM_MAJOR_VERSION > 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION > 24)
4085              auto iterSel = model->children()[i].get_iter();              auto iterSel = model->children()[i].get_iter();
4086              m_TreeView.get_selection()->select(iterSel);              m_TreeViewInstruments.get_selection()->select(iterSel);
4087  #else  #else
4088              m_TreeView.get_selection()->select(model->children()[i]);              m_TreeViewInstruments.get_selection()->select(model->children()[i]);
4089  #endif  #endif
4090              std::vector<Gtk::TreeModel::Path> rows =              std::vector<Gtk::TreeModel::Path> rows =
4091                  m_TreeView.get_selection()->get_selected_rows();                  m_TreeViewInstruments.get_selection()->get_selected_rows();
4092              if (!rows.empty())              if (!rows.empty())
4093                  m_TreeView.scroll_to_row(rows[0]);                  m_TreeViewInstruments.scroll_to_row(rows[0]);
4094              on_sel_change(); // the regular instrument selection change callback              on_sel_change(); // the regular instrument selection change callback
4095    
4096              // select respective region in the region selector              // select respective region in the region selector
# Line 4369  void MainWindow::add_instrument(gig::Ins Line 4375  void MainWindow::add_instrument(gig::Ins
4375    
4376      // update instrument tree view      // update instrument tree view
4377      instrument_name_connection.block();      instrument_name_connection.block();
4378      Gtk::TreeModel::iterator iterInstr = m_refTreeModel->append();      Gtk::TreeModel::iterator iterInstr = m_refInstrumentsTreeModel->append();
4379      Gtk::TreeModel::Row rowInstr = *iterInstr;      Gtk::TreeModel::Row rowInstr = *iterInstr;
4380      const int index = m_refTreeModel->children().size() - 1;      const int index = m_refInstrumentsTreeModel->children().size() - 1;
4381      rowInstr[m_Columns.m_col_nr] = index;      const int iScriptSlots = instrument->ScriptSlotCount();
4382      rowInstr[m_Columns.m_col_name] = name;      rowInstr[m_InstrumentsModel.m_col_nr] = index;
4383      rowInstr[m_Columns.m_col_instr] = instrument;      rowInstr[m_InstrumentsModel.m_col_name] = name;
4384      rowInstr[m_Columns.m_col_scripts] = "";      rowInstr[m_InstrumentsModel.m_col_instr] = instrument;
4385      rowInstr[m_Columns.m_col_tooltip] = scriptTooltipFor(instrument, index);      rowInstr[m_InstrumentsModel.m_col_scripts] = iScriptSlots ? ToString(iScriptSlots) : "";
4386        rowInstr[m_InstrumentsModel.m_col_tooltip] = scriptTooltipFor(instrument, index);
4387      instrument_name_connection.unblock();      instrument_name_connection.unblock();
4388    
4389  #if !USE_GTKMM_BUILDER  #if !USE_GTKMM_BUILDER
# Line 4402  void MainWindow::on_action_duplicate_ins Line 4409  void MainWindow::on_action_duplicate_ins
4409    
4410      // retrieve the currently selected instrument      // retrieve the currently selected instrument
4411      // (being the original instrument to be duplicated)      // (being the original instrument to be duplicated)
4412      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeView.get_selection();      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewInstruments.get_selection();
4413      std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();      std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();
4414      for (int r = 0; r < rows.size(); ++r) {      for (int r = 0; r < rows.size(); ++r) {
4415          Gtk::TreeModel::iterator it = m_refTreeModel->get_iter(rows[r]);          Gtk::TreeModel::iterator it = m_refInstrumentsTreeModel->get_iter(rows[r]);
4416          if (it) {          if (it) {
4417              Gtk::TreeModel::Row row = *it;              Gtk::TreeModel::Row row = *it;
4418              gig::Instrument* instrOrig = row[m_Columns.m_col_instr];              gig::Instrument* instrOrig = row[m_InstrumentsModel.m_col_instr];
4419              if (instrOrig) {              if (instrOrig) {
4420                  // duplicate the orginal instrument                  // duplicate the orginal instrument
4421                  gig::Instrument* instrNew = file->AddDuplicateInstrument(instrOrig);                  gig::Instrument* instrNew = file->AddDuplicateInstrument(instrOrig);
# Line 4435  void MainWindow::on_action_remove_instru Line 4442  void MainWindow::on_action_remove_instru
4442          return;          return;
4443      }      }
4444    
4445      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeView.get_selection();      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewInstruments.get_selection();
4446      std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();      std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();
4447      for (int r = rows.size() - 1; r >= 0; --r) {      for (int r = rows.size() - 1; r >= 0; --r) {
4448          Gtk::TreeModel::iterator it = m_refTreeModel->get_iter(rows[r]);          Gtk::TreeModel::iterator it = m_refInstrumentsTreeModel->get_iter(rows[r]);
4449          if (!it) continue;          if (!it) continue;
4450          Gtk::TreeModel::Row row = *it;          Gtk::TreeModel::Row row = *it;
4451          gig::Instrument* instr = row[m_Columns.m_col_instr];          gig::Instrument* instr = row[m_InstrumentsModel.m_col_instr];
4452          try {          try {
4453              Gtk::TreePath path(it);              Gtk::TreePath path(it);
4454              int index = path[0];              int index = path[0];
# Line 4455  void MainWindow::on_action_remove_instru Line 4462  void MainWindow::on_action_remove_instru
4462  #endif  #endif
4463    
4464              // remove row from instruments tree view              // remove row from instruments tree view
4465              m_refTreeModel->erase(it);              m_refInstrumentsTreeModel->erase(it);
4466              // update "Nr" column of all instrument rows              // update "Nr" column of all instrument rows
4467              {              {
4468                  int index = 0;                  int index = 0;
4469                  for (Gtk::TreeModel::iterator it = m_refTreeModel->children().begin();                  for (Gtk::TreeModel::iterator it = m_refInstrumentsTreeModel->children().begin();
4470                       it != m_refTreeModel->children().end(); ++it, ++index)                       it != m_refInstrumentsTreeModel->children().end(); ++it, ++index)
4471                  {                  {
4472                      Gtk::TreeModel::Row row = *it;                      Gtk::TreeModel::Row row = *it;
4473                      gig::Instrument* instrument = row[m_Columns.m_col_instr];                      gig::Instrument* instrument = row[m_InstrumentsModel.m_col_instr];
4474                      row[m_Columns.m_col_nr] = index;                      row[m_InstrumentsModel.m_col_nr] = index;
4475                      row[m_Columns.m_col_tooltip] = scriptTooltipFor(instrument, index);                      row[m_InstrumentsModel.m_col_tooltip] = scriptTooltipFor(instrument, index);
4476                  }                  }
4477              }              }
4478    
4479  #if GTKMM_MAJOR_VERSION < 3  #if GTKMM_MAJOR_VERSION < 3
4480              // select another instrument (in gtk3 this is done              // select another instrument (in gtk3 this is done
4481              // automatically)              // automatically)
4482              if (!m_refTreeModel->children().empty()) {              if (!m_refInstrumentsTreeModel->children().empty()) {
4483                  if (index == m_refTreeModel->children().size()) {                  if (index == m_refInstrumentsTreeModel->children().size()) {
4484                      index--;                      index--;
4485                  }                  }
4486                  m_TreeView.get_selection()->select(                  m_TreeViewInstruments.get_selection()->select(
4487                      Gtk::TreePath(ToString(index)));                      Gtk::TreePath(ToString(index)));
4488              }              }
4489  #endif  #endif
# Line 4567  void MainWindow::editScript(gig::Script* Line 4574  void MainWindow::editScript(gig::Script*
4574      editor->signal_script_to_be_changed.connect(      editor->signal_script_to_be_changed.connect(
4575          signal_script_to_be_changed.make_slot()          signal_script_to_be_changed.make_slot()
4576      );      );
4577      editor->signal_script_changed.connect(      editor->signal_script_changed.connect([this](gig::Script* script) {
4578          signal_script_changed.make_slot()          // signal to sampler (which will reload the script due to this)
4579      );          signal_script_changed.emit(script);
4580            // force script 'patch' variables editor ("Script" tab) to be refreshed
4581            gig::Instrument* instr = get_instrument();
4582            dimreg_edit.scriptVars.setInstrument(instr, true/*force update*/);
4583        });
4584      editor->setScript(script);      editor->setScript(script);
4585      //editor->reparent(*this);      //editor->reparent(*this);
4586      editor->show();      editor->show();
# Line 5124  void MainWindow::on_instruments_treeview Line 5135  void MainWindow::on_instruments_treeview
5135      // get selected source instrument      // get selected source instrument
5136      gig::Instrument* src = NULL;      gig::Instrument* src = NULL;
5137      {      {
5138          Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeView.get_selection();          Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewInstruments.get_selection();
5139          std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();          std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();
5140          if (!rows.empty()) {          if (!rows.empty()) {
5141              Gtk::TreeModel::iterator it = m_refTreeModel->get_iter(rows[0]);              Gtk::TreeModel::iterator it = m_refInstrumentsTreeModel->get_iter(rows[0]);
5142              if (it) {              if (it) {
5143                  Gtk::TreeModel::Row row = *it;                  Gtk::TreeModel::Row row = *it;
5144                  src = row[m_Columns.m_col_instr];                  src = row[m_InstrumentsModel.m_col_instr];
5145              }              }
5146          }          }
5147      }      }
# Line 5152  void MainWindow::on_instruments_treeview Line 5163  void MainWindow::on_instruments_treeview
5163      gig::Instrument* dst = NULL;      gig::Instrument* dst = NULL;
5164      {      {
5165          Gtk::TreeModel::Path path;          Gtk::TreeModel::Path path;
5166          const bool found = m_TreeView.get_path_at_pos(x, y, path);          const bool found = m_TreeViewInstruments.get_path_at_pos(x, y, path);
5167          if (!found) return;          if (!found) return;
5168    
5169          Gtk::TreeModel::iterator iter = m_refTreeModel->get_iter(path);          Gtk::TreeModel::iterator iter = m_refInstrumentsTreeModel->get_iter(path);
5170          if (!iter) return;          if (!iter) return;
5171          Gtk::TreeModel::Row row = *iter;          Gtk::TreeModel::Row row = *iter;
5172          dst = row[m_Columns.m_col_instr];          dst = row[m_InstrumentsModel.m_col_instr];
5173      }      }
5174      if (!dst) return;      if (!dst) return;
5175    
# Line 5333  void MainWindow::script_double_clicked(c Line 5344  void MainWindow::script_double_clicked(c
5344      if (!iter) return;      if (!iter) return;
5345      Gtk::TreeModel::Row row = *iter;      Gtk::TreeModel::Row row = *iter;
5346      gig::Script* script = row[m_ScriptsModel.m_col_script];      gig::Script* script = row[m_ScriptsModel.m_col_script];
5347      if (!script) return;      editScript(script);
   
     ScriptEditor* editor = new ScriptEditor;  
     editor->signal_script_to_be_changed.connect(  
         signal_script_to_be_changed.make_slot()  
     );  
     editor->signal_script_changed.connect(  
         signal_script_changed.make_slot()  
     );  
     editor->setScript(script);  
     //editor->reparent(*this);  
     editor->show();  
5348  }  }
5349    
5350  void MainWindow::instrument_name_changed(const Gtk::TreeModel::Path& path,  void MainWindow::instrument_name_changed(const Gtk::TreeModel::Path& path,
5351                                           const Gtk::TreeModel::iterator& iter) {                                           const Gtk::TreeModel::iterator& iter) {
5352      if (!iter) return;      if (!iter) return;
5353      Gtk::TreeModel::Row row = *iter;      Gtk::TreeModel::Row row = *iter;
5354      Glib::ustring name = row[m_Columns.m_col_name];      Glib::ustring name = row[m_InstrumentsModel.m_col_name];
5355    
5356  #if !USE_GTKMM_BUILDER  #if !USE_GTKMM_BUILDER
5357      // change name in instrument menu      // change name in instrument menu
# Line 5369  void MainWindow::instrument_name_changed Line 5369  void MainWindow::instrument_name_changed
5369  #endif  #endif
5370    
5371      // change name in gig      // change name in gig
5372      gig::Instrument* instrument = row[m_Columns.m_col_instr];      gig::Instrument* instrument = row[m_InstrumentsModel.m_col_instr];
5373      gig::String gigname(gig_from_utf8(name));      gig::String gigname(gig_from_utf8(name));
5374      if (instrument && instrument->pInfo->Name != gigname) {      if (instrument && instrument->pInfo->Name != gigname) {
5375          instrument->pInfo->Name = gigname;          instrument->pInfo->Name = gigname;
# Line 5397  bool MainWindow::instrument_row_visible( Line 5397  bool MainWindow::instrument_row_visible(
5397  #else  #else
5398      Gtk::TreeModel::Row row = *iter;      Gtk::TreeModel::Row row = *iter;
5399  #endif  #endif
5400      Glib::ustring name = row[m_Columns.m_col_name];      Glib::ustring name = row[m_InstrumentsModel.m_col_name];
5401      name = name.lowercase();      name = name.lowercase();
5402    
5403      std::vector<Glib::ustring> tokens = Glib::Regex::split_simple(" ", pattern);      std::vector<Glib::ustring> tokens = Glib::Regex::split_simple(" ", pattern);
# Line 5415  void MainWindow::on_action_combine_instr Line 5415  void MainWindow::on_action_combine_instr
5415      // list view as pre-selection      // list view as pre-selection
5416      std::set<int> indeces;      std::set<int> indeces;
5417      {      {
5418          Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeView.get_selection();          Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewInstruments.get_selection();
5419          std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();          std::vector<Gtk::TreeModel::Path> rows = sel->get_selected_rows();
5420          for (int r = 0; r < rows.size(); ++r) {          for (int r = 0; r < rows.size(); ++r) {
5421              Gtk::TreeModel::iterator it = m_refTreeModel->get_iter(rows[r]);              Gtk::TreeModel::iterator it = m_refInstrumentsTreeModel->get_iter(rows[r]);
5422              if (it) {              if (it) {
5423                  Gtk::TreeModel::Row row = *it;                  Gtk::TreeModel::Row row = *it;
5424                  int index = row[m_Columns.m_col_nr];                  int index = row[m_InstrumentsModel.m_col_nr];
5425                  indeces.insert(index);                  indeces.insert(index);
5426              }              }
5427          }          }

Legend:
Removed from v.3749  
changed lines
  Added in v.3808

  ViewVC Help
Powered by ViewVC