/[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 1411 by schoenebeck, Fri Oct 12 17:46:29 2007 UTC revision 1799 by persson, Sat Dec 6 13:49:26 2008 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2006, 2007 Andreas Persson   * Copyright (C) 2006 - 2008 Andreas Persson
3   *   *
4   * This program is free software; you can redistribute it and/or   * This program is free software; you can redistribute it and/or
5   * modify it under the terms of the GNU General Public License as   * modify it under the terms of the GNU General Public License as
# Line 18  Line 18 
18   */   */
19    
20  #include <iostream>  #include <iostream>
21    #include <cstring>
22    
23  #include <gtkmm/filechooserdialog.h>  #include <gtkmm/filechooserdialog.h>
24  #include <gtkmm/messagedialog.h>  #include <gtkmm/messagedialog.h>
25  #include <gtkmm/stock.h>  #include <gtkmm/stock.h>
26  #include <gtkmm/targetentry.h>  #include <gtkmm/targetentry.h>
27  #include <gtkmm/main.h>  #include <gtkmm/main.h>
28    #include <gtkmm/toggleaction.h>
29    #include "wrapLabel.hh"
30    
31  #include "global.h"  #include "global.h"
32    
# Line 58  template<class T> inline std::string ToS Line 61  template<class T> inline std::string ToS
61      return ss.str();      return ss.str();
62  }  }
63    
64  MainWindow::MainWindow()  Table::Table(int x, int y) : Gtk::Table(x, y), rowno(0) {  }
65    
66    void Table::add(BoolEntry& boolentry)
67    {
68        attach(boolentry.widget, 0, 2, rowno, rowno + 1,
69               Gtk::FILL, Gtk::SHRINK);
70        rowno++;
71    }
72    
73    void Table::add(BoolEntryPlus6& boolentry)
74    {
75        attach(boolentry.widget, 0, 2, rowno, rowno + 1,
76               Gtk::FILL, Gtk::SHRINK);
77        rowno++;
78    }
79    
80    void Table::add(LabelWidget& prop)
81    {
82        attach(prop.label, 1, 2, rowno, rowno + 1,
83               Gtk::FILL, Gtk::SHRINK);
84        attach(prop.widget, 2, 3, rowno, rowno + 1,
85               Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK);
86        rowno++;
87    }
88    
89    MainWindow::MainWindow() :
90        dimreg_label(_("Changes apply to:")),
91        dimreg_all_regions(_("all regions")),
92        dimreg_all_dimregs(_("all dimension splits")),
93        dimreg_stereo(_("both channels"))
94  {  {
95  //    set_border_width(5);  //    set_border_width(5);
96  //    set_default_size(400, 200);  //    set_default_size(400, 200);
# Line 88  MainWindow::MainWindow() Line 120  MainWindow::MainWindow()
120      m_TreeViewNotebook.set_size_request(300);      m_TreeViewNotebook.set_size_request(300);
121    
122      m_HPaned.add1(m_TreeViewNotebook);      m_HPaned.add1(m_TreeViewNotebook);
123      m_HPaned.add2(dimreg_edit);      dimreg_hbox.add(dimreg_label);
124        dimreg_hbox.add(dimreg_all_regions);
125        dimreg_hbox.add(dimreg_all_dimregs);
126        dimreg_stereo.set_active();
127        dimreg_hbox.add(dimreg_stereo);
128        dimreg_vbox.add(dimreg_edit);
129        dimreg_vbox.pack_start(dimreg_hbox, Gtk::PACK_SHRINK);
130        m_HPaned.add2(dimreg_vbox);
131    
132    
133      m_TreeViewNotebook.append_page(m_ScrolledWindowSamples, "Samples");      m_TreeViewNotebook.append_page(m_ScrolledWindowSamples, "Samples");
# Line 129  MainWindow::MainWindow() Line 168  MainWindow::MainWindow()
168                           *this, &MainWindow::on_action_quit));                           *this, &MainWindow::on_action_quit));
169      actionGroup->add(Gtk::Action::create("MenuInstrument", _("_Instrument")));      actionGroup->add(Gtk::Action::create("MenuInstrument", _("_Instrument")));
170    
171        actionGroup->add(Gtk::Action::create("MenuView", _("_View")));
172        Glib::RefPtr<Gtk::ToggleAction> toggle_action =
173            Gtk::ToggleAction::create("Statusbar", _("_Statusbar"));
174        toggle_action->set_active(true);
175        actionGroup->add(toggle_action,
176                         sigc::mem_fun(
177                             *this, &MainWindow::on_action_view_status_bar));
178    
179      action = Gtk::Action::create("MenuHelp", Gtk::Stock::HELP);      action = Gtk::Action::create("MenuHelp", Gtk::Stock::HELP);
180      actionGroup->add(Gtk::Action::create("MenuHelp",      actionGroup->add(Gtk::Action::create("MenuHelp",
181                                           action->property_label()));                                           action->property_label()));
# Line 156  MainWindow::MainWindow() Line 203  MainWindow::MainWindow()
203          sigc::mem_fun(*this, &MainWindow::on_action_add_group)          sigc::mem_fun(*this, &MainWindow::on_action_add_group)
204      );      );
205      actionGroup->add(      actionGroup->add(
206          Gtk::Action::create("AddSample", _("Add _Sample(s)")),          Gtk::Action::create("AddSample", _("Add _Sample(s)...")),
207          sigc::mem_fun(*this, &MainWindow::on_action_add_sample)          sigc::mem_fun(*this, &MainWindow::on_action_add_sample)
208      );      );
209      actionGroup->add(      actionGroup->add(
210          Gtk::Action::create("RemoveSample", Gtk::Stock::REMOVE),          Gtk::Action::create("RemoveSample", Gtk::Stock::REMOVE),
211          sigc::mem_fun(*this, &MainWindow::on_action_remove_sample)          sigc::mem_fun(*this, &MainWindow::on_action_remove_sample)
212      );      );
213        actionGroup->add(
214            Gtk::Action::create("ReplaceAllSamplesInAllGroups",
215                                _("Replace All Samples in All Groups...")),
216            sigc::mem_fun(*this, &MainWindow::on_action_replace_all_samples_in_all_groups)
217        );
218    
219      uiManager = Gtk::UIManager::create();      uiManager = Gtk::UIManager::create();
220      uiManager->insert_action_group(actionGroup);      uiManager->insert_action_group(actionGroup);
# Line 184  MainWindow::MainWindow() Line 236  MainWindow::MainWindow()
236          "    </menu>"          "    </menu>"
237          "    <menu action='MenuInstrument'>"          "    <menu action='MenuInstrument'>"
238          "    </menu>"          "    </menu>"
239            "    <menu action='MenuView'>"
240            "      <menuitem action='Statusbar'/>"
241            "    </menu>"
242  #ifdef ABOUT_DIALOG  #ifdef ABOUT_DIALOG
243          "    <menu action='MenuHelp'>"          "    <menu action='MenuHelp'>"
244          "      <menuitem action='About'/>"          "      <menuitem action='About'/>"
# Line 200  MainWindow::MainWindow() Line 255  MainWindow::MainWindow()
255          "    <menuitem action='SampleProperties'/>"          "    <menuitem action='SampleProperties'/>"
256          "    <menuitem action='AddGroup'/>"          "    <menuitem action='AddGroup'/>"
257          "    <menuitem action='AddSample'/>"          "    <menuitem action='AddSample'/>"
258            "    <menuitem action='ReplaceAllSamplesInAllGroups' />"
259          "    <separator/>"          "    <separator/>"
260          "    <menuitem action='RemoveSample'/>"          "    <menuitem action='RemoveSample'/>"
261          "  </popup>"          "  </popup>"
# Line 212  MainWindow::MainWindow() Line 268  MainWindow::MainWindow()
268      m_VBox.pack_start(*menuBar, Gtk::PACK_SHRINK);      m_VBox.pack_start(*menuBar, Gtk::PACK_SHRINK);
269      m_VBox.pack_start(m_HPaned);      m_VBox.pack_start(m_HPaned);
270      m_VBox.pack_start(m_RegionChooser, Gtk::PACK_SHRINK);      m_VBox.pack_start(m_RegionChooser, Gtk::PACK_SHRINK);
271        m_VBox.pack_start(m_RegionChooser.m_VirtKeybPropsBox, Gtk::PACK_SHRINK);
272      m_VBox.pack_start(m_DimRegionChooser, Gtk::PACK_SHRINK);      m_VBox.pack_start(m_DimRegionChooser, Gtk::PACK_SHRINK);
273      m_VBox.pack_start(m_StatusBar, Gtk::PACK_SHRINK);      m_VBox.pack_start(m_StatusBar, Gtk::PACK_SHRINK);
274    
# Line 272  MainWindow::MainWindow() Line 329  MainWindow::MainWindow()
329          sigc::mem_fun(*this, &MainWindow::file_changed));          sigc::mem_fun(*this, &MainWindow::file_changed));
330      instrumentProps.signal_instrument_changed().connect(      instrumentProps.signal_instrument_changed().connect(
331          sigc::mem_fun(*this, &MainWindow::file_changed));          sigc::mem_fun(*this, &MainWindow::file_changed));
332        propDialog.signal_info_changed().connect(
333            sigc::mem_fun(*this, &MainWindow::file_changed));
334    
335      dimreg_edit.signal_dimreg_to_be_changed().connect(      dimreg_edit.signal_dimreg_to_be_changed().connect(
336          dimreg_to_be_changed_signal.make_slot());          dimreg_to_be_changed_signal.make_slot());
# Line 301  MainWindow::MainWindow() Line 360  MainWindow::MainWindow()
360      m_RegionChooser.signal_region_changed_signal().connect(      m_RegionChooser.signal_region_changed_signal().connect(
361          region_changed_signal.make_slot());          region_changed_signal.make_slot());
362    
363        note_on_signal.connect(
364            sigc::mem_fun(m_RegionChooser, &RegionChooser::on_note_on_event));
365        note_off_signal.connect(
366            sigc::mem_fun(m_RegionChooser, &RegionChooser::on_note_off_event));
367    
368        dimreg_all_regions.signal_toggled().connect(
369            sigc::mem_fun(*this, &MainWindow::update_dimregs));
370        dimreg_all_dimregs.signal_toggled().connect(
371            sigc::mem_fun(*this, &MainWindow::dimreg_all_dimregs_toggled));
372        dimreg_stereo.signal_toggled().connect(
373            sigc::mem_fun(*this, &MainWindow::update_dimregs));
374    
375      file = 0;      file = 0;
376      file_is_changed = false;      file_is_changed = false;
377      set_file_is_shared(false);      set_file_is_shared(false);
# Line 331  void MainWindow::region_changed() Line 402  void MainWindow::region_changed()
402      m_DimRegionChooser.set_region(m_RegionChooser.get_region());      m_DimRegionChooser.set_region(m_RegionChooser.get_region());
403  }  }
404    
405  void MainWindow::dimreg_changed()  gig::Instrument* MainWindow::get_instrument()
 {  
     dimreg_edit.set_dim_region(m_DimRegionChooser.get_dimregion());  
 }  
   
 void MainWindow::on_sel_change()  
406  {  {
407        gig::Instrument* instrument = 0;
408      Glib::RefPtr<Gtk::TreeSelection> tree_sel_ref = m_TreeView.get_selection();      Glib::RefPtr<Gtk::TreeSelection> tree_sel_ref = m_TreeView.get_selection();
409    
410      Gtk::TreeModel::iterator it = tree_sel_ref->get_selected();      Gtk::TreeModel::iterator it = tree_sel_ref->get_selected();
411      if (it) {      if (it) {
412          Gtk::TreeModel::Row row = *it;          Gtk::TreeModel::Row row = *it;
413          std::cout << row[m_Columns.m_col_name] << std::endl;          instrument = row[m_Columns.m_col_instr];
414        }
415        return instrument;
416    }
417    
418    void MainWindow::add_region_to_dimregs(gig::Region* region, bool stereo, bool all_dimregs)
419    {
420        if (all_dimregs) {
421            for (int i = 0 ; i < region->DimensionRegions ; i++) {
422                if (region->pDimensionRegions[i]) {
423                    dimreg_edit.dimregs.insert(region->pDimensionRegions[i]);
424                }
425            }
426        } else {
427            m_DimRegionChooser.get_dimregions(region, stereo, dimreg_edit.dimregs);
428        }
429    }
430    
431          m_RegionChooser.set_instrument(row[m_Columns.m_col_instr]);  void MainWindow::update_dimregs()
432    {
433        dimreg_edit.dimregs.clear();
434        bool all_regions = dimreg_all_regions.get_active();
435        bool stereo = dimreg_stereo.get_active();
436        bool all_dimregs = dimreg_all_dimregs.get_active();
437    
438        if (all_regions) {
439            gig::Instrument* instrument = get_instrument();
440            if (instrument) {
441                for (gig::Region* region = instrument->GetFirstRegion() ;
442                     region ;
443                     region = instrument->GetNextRegion()) {
444                    add_region_to_dimregs(region, stereo, all_dimregs);
445                }
446            }
447      } else {      } else {
448          m_RegionChooser.set_instrument(0);          gig::Region* region = m_RegionChooser.get_region();
449            if (region) {
450                add_region_to_dimregs(region, stereo, all_dimregs);
451            }
452      }      }
453  }  }
454    
455    void MainWindow::dimreg_all_dimregs_toggled()
456    {
457        dimreg_stereo.set_sensitive(!dimreg_all_dimregs.get_active());
458        update_dimregs();
459    }
460    
461    void MainWindow::dimreg_changed()
462    {
463        update_dimregs();
464        dimreg_edit.set_dim_region(m_DimRegionChooser.get_dimregion());
465    }
466    
467    void MainWindow::on_sel_change()
468    {
469        m_RegionChooser.set_instrument(get_instrument());
470    }
471    
472  void loader_progress_callback(gig::progress_t* progress)  void loader_progress_callback(gig::progress_t* progress)
473  {  {
474      Loader* loader = static_cast<Loader*>(progress->custom);      Loader* loader = static_cast<Loader*>(progress->custom);
# Line 508  void MainWindow::on_action_file_open() Line 626  void MainWindow::on_action_file_open()
626      Gtk::FileFilter filter;      Gtk::FileFilter filter;
627      filter.add_pattern("*.gig");      filter.add_pattern("*.gig");
628      dialog.set_filter(filter);      dialog.set_filter(filter);
629      if (current_dir != "") {      if (current_gig_dir != "") {
630          dialog.set_current_folder(current_dir);          dialog.set_current_folder(current_gig_dir);
631      }      }
632      if (dialog.run() == Gtk::RESPONSE_OK) {      if (dialog.run() == Gtk::RESPONSE_OK) {
633          std::string filename = dialog.get_filename();          std::string filename = dialog.get_filename();
634          printf("filename=%s\n", filename.c_str());          printf("filename=%s\n", filename.c_str());
635          printf("on_action_file_open self=%x\n", Glib::Thread::self());          printf("on_action_file_open self=%x\n", Glib::Thread::self());
636          load_file(filename.c_str());          load_file(filename.c_str());
637          current_dir = Glib::path_get_dirname(filename);          current_gig_dir = Glib::path_get_dirname(filename);
638      }      }
639  }  }
640    
# Line 637  bool MainWindow::file_save_as() Line 755  bool MainWindow::file_save_as()
755      filter.add_pattern("*.gig");      filter.add_pattern("*.gig");
756      dialog.set_filter(filter);      dialog.set_filter(filter);
757    
758      if (Glib::path_is_absolute(filename)) {      // set initial dir and filename of the Save As dialog
759          dialog.set_filename(filename);      // and prepare that initial filename as a copy of the gig
760      } else if (current_dir != "") {      {
761          dialog.set_current_folder(current_dir);          std::string basename = Glib::path_get_basename(filename);
762            std::string dir = Glib::path_get_dirname(filename);
763            basename = std::string("copy_of_") + basename;
764            Glib::ustring copyFileName = Glib::build_filename(dir, basename);
765            if (Glib::path_is_absolute(filename)) {
766                dialog.set_filename(copyFileName);
767            } else {
768                if (current_gig_dir != "") dialog.set_current_folder(current_gig_dir);
769            }
770            dialog.set_current_name(Glib::filename_display_basename(copyFileName));
771      }      }
772      dialog.set_current_name(Glib::filename_display_basename(filename));  
773        // show warning in the dialog
774        Gtk::HBox descriptionArea;
775        descriptionArea.set_spacing(15);
776        Gtk::Image warningIcon(Gtk::Stock::DIALOG_WARNING, Gtk::IconSize(Gtk::ICON_SIZE_DIALOG));
777        descriptionArea.pack_start(warningIcon, Gtk::PACK_SHRINK);
778        view::WrapLabel description;
779        description.set_markup(
780            _("\n<b>CAUTION:</b> You <b>MUST</b> use the "
781              "<span style=\"italic\">\"Save\"</span> dialog instead of "
782              "<span style=\"italic\">\"Save As...\"</span> if you want to save "
783              "to the same .gig file. Using "
784              "<span style=\"italic\">\"Save As...\"</span> for writing to the "
785              "same .gig file will end up in corrupted sample wave data!\n")
786        );
787        descriptionArea.pack_start(description);
788        dialog.get_vbox()->pack_start(descriptionArea, Gtk::PACK_SHRINK);
789        descriptionArea.show_all();
790    
791      if (dialog.run() == Gtk::RESPONSE_OK) {      if (dialog.run() == Gtk::RESPONSE_OK) {
792          file_structure_to_be_changed_signal.emit(this->file);          file_structure_to_be_changed_signal.emit(this->file);
# Line 654  bool MainWindow::file_save_as() Line 798  bool MainWindow::file_save_as()
798              printf("filename=%s\n", filename.c_str());              printf("filename=%s\n", filename.c_str());
799              file->Save(filename);              file->Save(filename);
800              this->filename = filename;              this->filename = filename;
801              current_dir = Glib::path_get_dirname(filename);              current_gig_dir = Glib::path_get_dirname(filename);
802              set_title(Glib::filename_display_basename(filename));              set_title(Glib::filename_display_basename(filename));
803              file_has_name = true;              file_has_name = true;
804              file_is_changed = false;              file_is_changed = false;
# Line 774  void MainWindow::on_action_help_about() Line 918  void MainWindow::on_action_help_about()
918  #ifdef ABOUT_DIALOG  #ifdef ABOUT_DIALOG
919      Gtk::AboutDialog dialog;      Gtk::AboutDialog dialog;
920      dialog.set_version(VERSION);      dialog.set_version(VERSION);
921        dialog.set_copyright("Copyright (C) 2006,2007 Andreas Persson");
922        dialog.set_comments(
923            "Released under the GNU General Public License.\n"
924            "\n"
925            "Please notice that this is still a very young instrument editor. "
926            "So better backup your Gigasampler files before editing them with "
927            "this application.\n"
928            "\n"
929            "Please report bugs to: http://bugs.linuxsampler.org"
930        );
931        dialog.set_website("http://www.linuxsampler.org");
932        dialog.set_website_label("http://www.linuxsampler.org");
933      dialog.run();      dialog.run();
934  #endif  #endif
935  }  }
936    
937  PropDialog::PropDialog()  PropDialog::PropDialog()
938      : table(2,1)      : table(2,1),
939          eName("Name"),
940          eCreationDate("Creation date"),
941          eComments("Comments"),
942          eProduct("Product"),
943          eCopyright("Copyright"),
944          eArtists("Artists"),
945          eGenre("Genre"),
946          eKeywords("Keywords"),
947          eEngineer("Engineer"),
948          eTechnician("Technician"),
949          eSoftware("Software"),
950          eMedium("Medium"),
951          eSource("Source"),
952          eSourceForm("Source form"),
953          eCommissioned("Commissioned"),
954          eSubject("Subject"),
955          quitButton(Gtk::Stock::CLOSE),
956          update_model(0)
957  {  {
958        set_title("File Properties");
959        eName.set_width_chars(50);
960    
961        connect(eName, &DLS::Info::Name);
962        connect(eCreationDate, &DLS::Info::CreationDate);
963        connect(eComments, &DLS::Info::Comments);
964        connect(eProduct, &DLS::Info::Product);
965        connect(eCopyright, &DLS::Info::Copyright);
966        connect(eArtists, &DLS::Info::Artists);
967        connect(eGenre, &DLS::Info::Genre);
968        connect(eKeywords, &DLS::Info::Keywords);
969        connect(eEngineer, &DLS::Info::Engineer);
970        connect(eTechnician, &DLS::Info::Technician);
971        connect(eSoftware, &DLS::Info::Software);
972        connect(eMedium, &DLS::Info::Medium);
973        connect(eSource, &DLS::Info::Source);
974        connect(eSourceForm, &DLS::Info::SourceForm);
975        connect(eCommissioned, &DLS::Info::Commissioned);
976        connect(eSubject, &DLS::Info::Subject);
977    
978        table.add(eName);
979        table.add(eCreationDate);
980        table.add(eComments);
981        table.add(eProduct);
982        table.add(eCopyright);
983        table.add(eArtists);
984        table.add(eGenre);
985        table.add(eKeywords);
986        table.add(eEngineer);
987        table.add(eTechnician);
988        table.add(eSoftware);
989        table.add(eMedium);
990        table.add(eSource);
991        table.add(eSourceForm);
992        table.add(eCommissioned);
993        table.add(eSubject);
994    
995      table.set_col_spacings(5);      table.set_col_spacings(5);
996      const char* propLabels[] = {      add(vbox);
997          "Name:",      table.set_border_width(5);
998          "CreationDate:",      vbox.add(table);
999          "Comments:", // TODO: multiline      vbox.pack_start(buttonBox, Gtk::PACK_SHRINK);
1000          "Product:",      buttonBox.set_layout(Gtk::BUTTONBOX_END);
1001          "Copyright:",      buttonBox.set_border_width(5);
1002          "Artists:",      buttonBox.show();
1003          "Genre:",      buttonBox.pack_start(quitButton);
1004          "Keywords:",      quitButton.set_flags(Gtk::CAN_DEFAULT);
1005          "Engineer:",      quitButton.grab_focus();
1006          "Technician:",      quitButton.signal_clicked().connect(
1007          "Software:", // TODO: readonly          sigc::mem_fun(*this, &PropDialog::hide));
         "Medium:",  
         "Source:",  
         "SourceForm:",  
         "Commissioned:",  
         "Subject:"  
     };  
     for (int i = 0 ; i < sizeof(propLabels) / sizeof(char*) ; i++) {  
         label[i].set_text(propLabels[i]);  
         label[i].set_alignment(Gtk::ALIGN_LEFT);  
         table.attach(label[i], 0, 1, i, i + 1, Gtk::FILL, Gtk::SHRINK);  
         table.attach(entry[i], 1, 2, i, i + 1, Gtk::FILL | Gtk::EXPAND,  
                      Gtk::SHRINK);  
     }  
1008    
1009      add(table);      quitButton.show();
1010      // add_button(Gtk::Stock::CANCEL, 0);      vbox.show();
     // add_button(Gtk::Stock::OK, 1);  
1011      show_all_children();      show_all_children();
1012  }  }
1013    
1014  void PropDialog::set_info(DLS::Info* info)  void PropDialog::set_info(DLS::Info* info)
1015  {  {
1016      entry[0].set_text(info->Name);      this->info = info;
1017      entry[1].set_text(info->CreationDate);      update_model++;
1018      entry[2].set_text(Glib::convert(info->Comments, "UTF-8", "ISO-8859-1"));      eName.set_value(info->Name);
1019      entry[3].set_text(info->Product);      eCreationDate.set_value(info->CreationDate);
1020      entry[4].set_text(info->Copyright);      eComments.set_value(info->Comments);
1021      entry[5].set_text(info->Artists);      eProduct.set_value(info->Product);
1022      entry[6].set_text(info->Genre);      eCopyright.set_value(info->Copyright);
1023      entry[7].set_text(info->Keywords);      eArtists.set_value(info->Artists);
1024      entry[8].set_text(info->Engineer);      eGenre.set_value(info->Genre);
1025      entry[9].set_text(info->Technician);      eKeywords.set_value(info->Keywords);
1026      entry[10].set_text(info->Software);      eEngineer.set_value(info->Engineer);
1027      entry[11].set_text(info->Medium);      eTechnician.set_value(info->Technician);
1028      entry[12].set_text(info->Source);      eSoftware.set_value(info->Software);
1029      entry[13].set_text(info->SourceForm);      eMedium.set_value(info->Medium);
1030      entry[14].set_text(info->Commissioned);      eSource.set_value(info->Source);
1031      entry[15].set_text(info->Subject);      eSourceForm.set_value(info->SourceForm);
1032        eCommissioned.set_value(info->Commissioned);
1033        eSubject.set_value(info->Subject);
1034        update_model--;
1035  }  }
1036    
1037  void InstrumentProps::add_prop(BoolEntry& boolentry)  sigc::signal<void>& PropDialog::signal_info_changed()
1038  {  {
1039      table.attach(boolentry.widget, 0, 2, rowno, rowno + 1,      return info_changed;
                  Gtk::FILL, Gtk::SHRINK);  
     rowno++;  
     boolentry.signal_changed_by_user().connect(instrument_changed.make_slot());  
1040  }  }
1041    
1042  void InstrumentProps::add_prop(BoolEntryPlus6& boolentry)  void InstrumentProps::set_IsDrum(bool value)
1043  {  {
1044      table.attach(boolentry.widget, 0, 2, rowno, rowno + 1,      instrument->IsDrum = value;
                  Gtk::FILL, Gtk::SHRINK);  
     rowno++;  
     boolentry.signal_changed_by_user().connect(instrument_changed.make_slot());  
1045  }  }
1046    
1047  void InstrumentProps::add_prop(LabelWidget& prop)  void InstrumentProps::set_MIDIBank(uint16_t value)
1048  {  {
1049      table.attach(prop.label, 0, 1, rowno, rowno + 1,      instrument->MIDIBank = value;
1050                   Gtk::FILL, Gtk::SHRINK);  }
1051      table.attach(prop.widget, 1, 2, rowno, rowno + 1,  
1052                   Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK);  void InstrumentProps::set_MIDIProgram(uint32_t value)
1053      rowno++;  {
1054      prop.signal_changed_by_user().connect(instrument_changed.make_slot());      instrument->MIDIProgram = value;
1055    }
1056    
1057    void InstrumentProps::set_DimensionKeyRange_low(uint8_t value)
1058    {
1059        instrument->DimensionKeyRange.low = value;
1060        if (value > instrument->DimensionKeyRange.high) {
1061            eDimensionKeyRangeHigh.set_value(value);
1062        }
1063    }
1064    
1065    void InstrumentProps::set_DimensionKeyRange_high(uint8_t value)
1066    {
1067        instrument->DimensionKeyRange.high = value;
1068        if (value < instrument->DimensionKeyRange.low) {
1069            eDimensionKeyRangeLow.set_value(value);
1070        }
1071  }  }
1072    
1073  InstrumentProps::InstrumentProps()  InstrumentProps::InstrumentProps()
# Line 873  InstrumentProps::InstrumentProps() Line 1083  InstrumentProps::InstrumentProps()
1083        eFineTune("Fine tune", -8400, 8400),        eFineTune("Fine tune", -8400, 8400),
1084        ePitchbendRange("Pitchbend range", 0, 12),        ePitchbendRange("Pitchbend range", 0, 12),
1085        ePianoReleaseMode("Piano release mode"),        ePianoReleaseMode("Piano release mode"),
1086        eDimensionKeyRangeLow("Dimension key range low"),        eDimensionKeyRangeLow("Keyswitching range low"),
1087        eDimensionKeyRangeHigh("Dimension key range high")        eDimensionKeyRangeHigh("Keyswitching range high"),
1088  {        update_model(0)
1089      set_title("Instrument properties");  {
1090        set_title("Instrument Properties");
1091    
1092        eDimensionKeyRangeLow.set_tip(
1093            _("start of the keyboard area which should switch the "
1094              "\"keyswitching\" dimension")
1095        );
1096        eDimensionKeyRangeHigh.set_tip(
1097            _("end of the keyboard area which should switch the "
1098              "\"keyswitching\" dimension")
1099        );
1100    
1101        connect(eIsDrum, &InstrumentProps::set_IsDrum);
1102        connect(eMIDIBank, &InstrumentProps::set_MIDIBank);
1103        connect(eMIDIProgram, &InstrumentProps::set_MIDIProgram);
1104        connect(eAttenuation, &gig::Instrument::Attenuation);
1105        connect(eGainPlus6, &gig::Instrument::Attenuation);
1106        connect(eEffectSend, &gig::Instrument::EffectSend);
1107        connect(eFineTune, &gig::Instrument::FineTune);
1108        connect(ePitchbendRange, &gig::Instrument::PitchbendRange);
1109        connect(ePianoReleaseMode, &gig::Instrument::PianoReleaseMode);
1110        connect(eDimensionKeyRangeLow,
1111                &InstrumentProps::set_DimensionKeyRange_low);
1112        connect(eDimensionKeyRangeHigh,
1113                &InstrumentProps::set_DimensionKeyRange_high);
1114    
     rowno = 0;  
1115      table.set_col_spacings(5);      table.set_col_spacings(5);
1116    
1117      add_prop(eName);      table.add(eName);
1118      add_prop(eIsDrum);      table.add(eIsDrum);
1119      add_prop(eMIDIBank);      table.add(eMIDIBank);
1120      add_prop(eMIDIProgram);      table.add(eMIDIProgram);
1121      add_prop(eAttenuation);      table.add(eAttenuation);
1122      add_prop(eGainPlus6);      table.add(eGainPlus6);
1123      add_prop(eEffectSend);      table.add(eEffectSend);
1124      add_prop(eFineTune);      table.add(eFineTune);
1125      add_prop(ePitchbendRange);      table.add(ePitchbendRange);
1126      add_prop(ePianoReleaseMode);      table.add(ePianoReleaseMode);
1127      add_prop(eDimensionKeyRangeLow);      table.add(eDimensionKeyRangeLow);
1128      add_prop(eDimensionKeyRangeHigh);      table.add(eDimensionKeyRangeHigh);
   
     eDimensionKeyRangeLow.signal_changed_by_user().connect(  
         sigc::mem_fun(*this, &InstrumentProps::key_range_low_changed));  
     eDimensionKeyRangeHigh.signal_changed_by_user().connect(  
         sigc::mem_fun(*this, &InstrumentProps::key_range_high_changed));  
1129    
1130      add(vbox);      add(vbox);
1131      table.set_border_width(5);      table.set_border_width(5);
# Line 921  InstrumentProps::InstrumentProps() Line 1149  InstrumentProps::InstrumentProps()
1149    
1150  void InstrumentProps::set_instrument(gig::Instrument* instrument)  void InstrumentProps::set_instrument(gig::Instrument* instrument)
1151  {  {
1152      eName.set_ptr(&instrument->pInfo->Name);      this->instrument = instrument;
1153      eIsDrum.set_ptr(&instrument->IsDrum);  
1154      eMIDIBank.set_ptr(&instrument->MIDIBank);      update_model++;
1155      eMIDIProgram.set_ptr(&instrument->MIDIProgram);      eName.set_value(instrument->pInfo->Name);
1156      eAttenuation.set_ptr(&instrument->Attenuation);      eIsDrum.set_value(instrument->IsDrum);
1157      eGainPlus6.set_ptr(&instrument->Attenuation);      eMIDIBank.set_value(instrument->MIDIBank);
1158      eEffectSend.set_ptr(&instrument->EffectSend);      eMIDIProgram.set_value(instrument->MIDIProgram);
1159      eFineTune.set_ptr(&instrument->FineTune);      eAttenuation.set_value(instrument->Attenuation);
1160      ePitchbendRange.set_ptr(&instrument->PitchbendRange);      eGainPlus6.set_value(instrument->Attenuation);
1161      ePianoReleaseMode.set_ptr(&instrument->PianoReleaseMode);      eEffectSend.set_value(instrument->EffectSend);
1162      eDimensionKeyRangeLow.set_ptr(0);      eFineTune.set_value(instrument->FineTune);
1163      eDimensionKeyRangeHigh.set_ptr(0);      ePitchbendRange.set_value(instrument->PitchbendRange);
1164      eDimensionKeyRangeLow.set_ptr(&instrument->DimensionKeyRange.low);      ePianoReleaseMode.set_value(instrument->PianoReleaseMode);
1165      eDimensionKeyRangeHigh.set_ptr(&instrument->DimensionKeyRange.high);      eDimensionKeyRangeLow.set_value(instrument->DimensionKeyRange.low);
1166  }      eDimensionKeyRangeHigh.set_value(instrument->DimensionKeyRange.high);
1167        update_model--;
 void InstrumentProps::key_range_low_changed()  
 {  
     double l = eDimensionKeyRangeLow.get_value();  
     double h = eDimensionKeyRangeHigh.get_value();  
     if (h < l) eDimensionKeyRangeHigh.set_value(l);  
 }  
   
 void InstrumentProps::key_range_high_changed()  
 {  
     double l = eDimensionKeyRangeLow.get_value();  
     double h = eDimensionKeyRangeHigh.get_value();  
     if (h < l) eDimensionKeyRangeLow.set_value(h);  
1168  }  }
1169    
1170  sigc::signal<void>& InstrumentProps::signal_instrument_changed()  sigc::signal<void>& InstrumentProps::signal_instrument_changed()
# Line 1030  void MainWindow::load_gig(gig::File* gig Line 1246  void MainWindow::load_gig(gig::File* gig
1246    
1247  void MainWindow::show_instr_props()  void MainWindow::show_instr_props()
1248  {  {
1249      Glib::RefPtr<Gtk::TreeSelection> tree_sel_ref = m_TreeView.get_selection();      gig::Instrument* instrument = get_instrument();
1250      Gtk::TreeModel::iterator it = tree_sel_ref->get_selected();      if (instrument)
     if (it)  
1251      {      {
1252          Gtk::TreeModel::Row row = *it;          instrumentProps.set_instrument(instrument);
1253          if (row[m_Columns.m_col_instr])          instrumentProps.show();
1254          {          instrumentProps.deiconify();
1255              instrumentProps.set_instrument(row[m_Columns.m_col_instr]);      }
1256              instrumentProps.show();  }
1257              instrumentProps.deiconify();  
1258          }  void MainWindow::on_action_view_status_bar() {
1259        Gtk::CheckMenuItem* item =
1260            dynamic_cast<Gtk::CheckMenuItem*>(uiManager->get_widget("/MenuBar/MenuView/Statusbar"));
1261        if (!item) {
1262            std::cerr << "/MenuBar/MenuView/Statusbar == NULL\n";
1263            return;
1264      }      }
1265        if (item->get_active()) m_StatusBar.show();
1266        else                    m_StatusBar.hide();
1267  }  }
1268    
1269  void MainWindow::on_button_release(GdkEventButton* button)  void MainWindow::on_button_release(GdkEventButton* button)
# Line 1192  void MainWindow::on_action_add_sample() Line 1414  void MainWindow::on_action_add_sample()
1414      allpassfilter.set_name("All Files");      allpassfilter.set_name("All Files");
1415      dialog.add_filter(soundfilter);      dialog.add_filter(soundfilter);
1416      dialog.add_filter(allpassfilter);      dialog.add_filter(allpassfilter);
1417        if (current_sample_dir != "") {
1418            dialog.set_current_folder(current_sample_dir);
1419        }
1420      if (dialog.run() == Gtk::RESPONSE_OK) {      if (dialog.run() == Gtk::RESPONSE_OK) {
1421            current_sample_dir = dialog.get_current_folder();
1422          Glib::ustring error_files;          Glib::ustring error_files;
1423          Glib::SListHandle<Glib::ustring> filenames = dialog.get_filenames();          Glib::SListHandle<Glib::ustring> filenames = dialog.get_filenames();
1424          for (Glib::SListHandle<Glib::ustring>::iterator iter = filenames.begin();          for (Glib::SListHandle<Glib::ustring>::iterator iter = filenames.begin();
# Line 1305  void MainWindow::on_action_add_sample() Line 1531  void MainWindow::on_action_add_sample()
1531      }      }
1532  }  }
1533    
1534    void MainWindow::on_action_replace_all_samples_in_all_groups()
1535    {
1536        if (!file) return;
1537        Gtk::FileChooserDialog dialog(*this, _("Select Folder"),
1538                                      Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
1539        view::WrapLabel description(
1540            _("This is a very specific function. It tries to replace all samples "
1541              "in the current gig file by samples located in the chosen "
1542              "directory.\n\n"
1543              "It works like this: For each sample in the gig file, it tries to "
1544              "find a sample file in the selected directory with the same name as "
1545              "the sample in the gig file. Optionally, you can add a filename "
1546              "extension below, which will be added to the filename expected to be "
1547              "found. That is, assume you have a gig file with a sample called "
1548              "'Snare', if you enter '.wav' below (like it's done by default), it "
1549              "expects to find a sample file called 'Snare.wav' and will replace "
1550              "the sample in the gig file accordingly. If you don't need an "
1551              "extension, blank the field below. Any gig sample where no "
1552              "appropriate sample file could be found will be reported and left "
1553              "untouched.\n")
1554        );
1555        Gtk::HBox entryArea;
1556        Gtk::Label entryLabel( _("Add filename extension: "), Gtk::ALIGN_RIGHT);
1557        Gtk::Entry postfixEntryBox;
1558        postfixEntryBox.set_text(".wav");
1559        entryArea.pack_start(entryLabel);
1560        entryArea.pack_start(postfixEntryBox);
1561        dialog.get_vbox()->pack_start(description, Gtk::PACK_SHRINK);
1562        dialog.get_vbox()->pack_start(entryArea, Gtk::PACK_SHRINK);
1563        description.show();
1564        entryArea.show_all();
1565        dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
1566        dialog.add_button(_("Select"), Gtk::RESPONSE_OK);
1567        dialog.set_select_multiple(false);
1568        if (current_sample_dir != "") {
1569            dialog.set_current_folder(current_sample_dir);
1570        }
1571        if (dialog.run() == Gtk::RESPONSE_OK)
1572        {
1573            current_sample_dir = dialog.get_current_folder();
1574            Glib::ustring error_files;
1575            Glib::ustring folder = dialog.get_filename();
1576            for (gig::Sample* sample = file->GetFirstSample();
1577                 sample; sample = file->GetNextSample())
1578            {
1579                std::string filename =
1580                    folder + G_DIR_SEPARATOR_S + sample->pInfo->Name +
1581                    postfixEntryBox.get_text().raw();
1582                SF_INFO info;
1583                info.format = 0;
1584                SNDFILE* hFile = sf_open(filename.c_str(), SFM_READ, &info);
1585                try
1586                {
1587                    if (!hFile) throw std::string("could not open file");
1588                    int bitdepth;
1589                    switch (info.format & 0xff) {
1590                        case SF_FORMAT_PCM_S8:
1591                        case SF_FORMAT_PCM_16:
1592                        case SF_FORMAT_PCM_U8:
1593                            bitdepth = 16;
1594                            break;
1595                        case SF_FORMAT_PCM_24:
1596                        case SF_FORMAT_PCM_32:
1597                        case SF_FORMAT_FLOAT:
1598                        case SF_FORMAT_DOUBLE:
1599                            bitdepth = 24;
1600                            break;
1601                        default:
1602                            sf_close(hFile);
1603                            throw std::string("format not supported");
1604                    }
1605                    SampleImportItem sched_item;
1606                    sched_item.gig_sample  = sample;
1607                    sched_item.sample_path = filename;
1608                    m_SampleImportQueue.push_back(sched_item);
1609                    sf_close(hFile);
1610                    file_changed();
1611                }
1612                catch (std::string what)
1613                {
1614                    if (error_files.size()) error_files += "\n";
1615                        error_files += filename += " (" + what + ")";
1616                }
1617            }
1618            // show error message box when some file(s) could not be opened / added
1619            if (error_files.size()) {
1620                Glib::ustring txt =
1621                    _("Could not replace the following sample(s):\n") + error_files;
1622                Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);
1623                msg.run();
1624            }
1625        }
1626    }
1627    
1628  void MainWindow::on_action_remove_sample() {  void MainWindow::on_action_remove_sample() {
1629      if (!file) return;      if (!file) return;
1630      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewSamples.get_selection();      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewSamples.get_selection();
# Line 1471  void MainWindow::on_sample_label_drop_dr Line 1791  void MainWindow::on_sample_label_drop_dr
1791          // notify we're done with altering          // notify we're done with altering
1792          region_changed_signal.emit(region);          region_changed_signal.emit(region);
1793    
1794            file_changed();
1795    
1796          return;          return;
1797      }      }
1798      // drop failed      // drop failed
# Line 1562  sigc::signal<void, gig::DimensionRegion* Line 1884  sigc::signal<void, gig::DimensionRegion*
1884  sigc::signal<void, gig::DimensionRegion*>& MainWindow::signal_dimreg_changed() {  sigc::signal<void, gig::DimensionRegion*>& MainWindow::signal_dimreg_changed() {
1885      return dimreg_changed_signal;      return dimreg_changed_signal;
1886  }  }
1887    
1888    sigc::signal<void, int/*key*/, int/*velocity*/>& MainWindow::signal_note_on() {
1889        return note_on_signal;
1890    }
1891    
1892    sigc::signal<void, int/*key*/, int/*velocity*/>& MainWindow::signal_note_off() {
1893        return note_off_signal;
1894    }
1895    
1896    sigc::signal<void, int/*key*/, int/*velocity*/>& MainWindow::signal_keyboard_key_hit() {
1897        return m_RegionChooser.signal_keyboard_key_hit();
1898    }
1899    
1900    sigc::signal<void, int/*key*/, int/*velocity*/>& MainWindow::signal_keyboard_key_released() {
1901        return m_RegionChooser.signal_keyboard_key_released();
1902    }

Legend:
Removed from v.1411  
changed lines
  Added in v.1799

  ViewVC Help
Powered by ViewVC