/[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 1300 by schoenebeck, Fri Aug 24 19:11:41 2007 UTC revision 1436 by schoenebeck, Mon Oct 15 15:29:58 2007 UTC
# Line 17  Line 17 
17   * 02110-1301 USA.   * 02110-1301 USA.
18   */   */
19    
 #include <libintl.h>  
20  #include <iostream>  #include <iostream>
21    
22  #include <gtkmm/filechooserdialog.h>  #include <gtkmm/filechooserdialog.h>
# Line 25  Line 24 
24  #include <gtkmm/stock.h>  #include <gtkmm/stock.h>
25  #include <gtkmm/targetentry.h>  #include <gtkmm/targetentry.h>
26  #include <gtkmm/main.h>  #include <gtkmm/main.h>
27    #include <gtkmm/toggleaction.h>
28    
29    #include "global.h"
30    
31  #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION >= 6) || GTKMM_MAJOR_VERSION > 2  #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION >= 6) || GTKMM_MAJOR_VERSION > 2
32  #define ABOUT_DIALOG  #define ABOUT_DIALOG
33  #include <gtkmm/aboutdialog.h>  #include <gtkmm/aboutdialog.h>
34  #endif  #endif
35    
36    #if (GLIBMM_MAJOR_VERSION == 2 && GLIBMM_MINOR_VERSION < 6) || GLIBMM_MAJOR_VERSION < 2
37    namespace Glib {
38    Glib::ustring filename_display_basename(const std::string& filename)
39    {
40        gchar* gstr = g_path_get_basename(filename.c_str());
41        Glib::ustring str(gstr);
42        g_free(gstr);
43        return Glib::filename_to_utf8(str);
44    }
45    }
46    #endif
47    
48  #include <stdio.h>  #include <stdio.h>
49  #include <sndfile.h>  #include <sndfile.h>
50    
51  #include "mainwindow.h"  #include "mainwindow.h"
52    
53  #define _(String) gettext(String)  #include "../../gfx/status_attached.xpm"
54    #include "../../gfx/status_detached.xpm"
55    
56  template<class T> inline std::string ToString(T o) {  template<class T> inline std::string ToString(T o) {
57      std::stringstream ss;      std::stringstream ss;
# Line 115  MainWindow::MainWindow() Line 130  MainWindow::MainWindow()
130                           *this, &MainWindow::on_action_quit));                           *this, &MainWindow::on_action_quit));
131      actionGroup->add(Gtk::Action::create("MenuInstrument", _("_Instrument")));      actionGroup->add(Gtk::Action::create("MenuInstrument", _("_Instrument")));
132    
133        actionGroup->add(Gtk::Action::create("MenuView", _("_View")));
134        Glib::RefPtr<Gtk::ToggleAction> toggle_action =
135            Gtk::ToggleAction::create("Statusbar", _("_Statusbar"));
136        toggle_action->set_active(true);
137        actionGroup->add(toggle_action,
138                         sigc::mem_fun(
139                             *this, &MainWindow::on_action_view_status_bar));
140    
141      action = Gtk::Action::create("MenuHelp", Gtk::Stock::HELP);      action = Gtk::Action::create("MenuHelp", Gtk::Stock::HELP);
142      actionGroup->add(Gtk::Action::create("MenuHelp",      actionGroup->add(Gtk::Action::create("MenuHelp",
143                                           action->property_label()));                                           action->property_label()));
# Line 170  MainWindow::MainWindow() Line 193  MainWindow::MainWindow()
193          "    </menu>"          "    </menu>"
194          "    <menu action='MenuInstrument'>"          "    <menu action='MenuInstrument'>"
195          "    </menu>"          "    </menu>"
196            "    <menu action='MenuView'>"
197            "      <menuitem action='Statusbar'/>"
198            "    </menu>"
199  #ifdef ABOUT_DIALOG  #ifdef ABOUT_DIALOG
200          "    <menu action='MenuHelp'>"          "    <menu action='MenuHelp'>"
201          "      <menuitem action='About'/>"          "      <menuitem action='About'/>"
# Line 199  MainWindow::MainWindow() Line 225  MainWindow::MainWindow()
225      m_VBox.pack_start(m_HPaned);      m_VBox.pack_start(m_HPaned);
226      m_VBox.pack_start(m_RegionChooser, Gtk::PACK_SHRINK);      m_VBox.pack_start(m_RegionChooser, Gtk::PACK_SHRINK);
227      m_VBox.pack_start(m_DimRegionChooser, Gtk::PACK_SHRINK);      m_VBox.pack_start(m_DimRegionChooser, Gtk::PACK_SHRINK);
228        m_VBox.pack_start(m_StatusBar, Gtk::PACK_SHRINK);
229    
230        // Status Bar:
231        m_StatusBar.pack_start(m_AttachedStateLabel, Gtk::PACK_SHRINK);
232        m_StatusBar.pack_start(m_AttachedStateImage, Gtk::PACK_SHRINK);
233        m_StatusBar.show();
234    
235      m_RegionChooser.signal_region_selected().connect(      m_RegionChooser.signal_region_selected().connect(
236          sigc::mem_fun(*this, &MainWindow::region_changed) );          sigc::mem_fun(*this, &MainWindow::region_changed) );
# Line 234  MainWindow::MainWindow() Line 266  MainWindow::MainWindow()
266      std::list<Gtk::TargetEntry> drag_target_gig_sample;      std::list<Gtk::TargetEntry> drag_target_gig_sample;
267      drag_target_gig_sample.push_back( Gtk::TargetEntry("gig::Sample") );      drag_target_gig_sample.push_back( Gtk::TargetEntry("gig::Sample") );
268      m_TreeViewSamples.drag_source_set(drag_target_gig_sample);      m_TreeViewSamples.drag_source_set(drag_target_gig_sample);
269        m_TreeViewSamples.signal_drag_begin().connect(
270            sigc::mem_fun(*this, &MainWindow::on_sample_treeview_drag_begin)
271        );
272      m_TreeViewSamples.signal_drag_data_get().connect(      m_TreeViewSamples.signal_drag_data_get().connect(
273          sigc::mem_fun(*this, &MainWindow::on_sample_treeview_drag_data_get)          sigc::mem_fun(*this, &MainWindow::on_sample_treeview_drag_data_get)
274      );      );
# Line 242  MainWindow::MainWindow() Line 277  MainWindow::MainWindow()
277          sigc::mem_fun(*this, &MainWindow::on_sample_label_drop_drag_data_received)          sigc::mem_fun(*this, &MainWindow::on_sample_label_drop_drag_data_received)
278      );      );
279      dimreg_edit.signal_dimreg_changed().connect(      dimreg_edit.signal_dimreg_changed().connect(
280          sigc::mem_fun(*this, &MainWindow::file_changed));          sigc::hide(sigc::mem_fun(*this, &MainWindow::file_changed)));
281      m_RegionChooser.signal_instrument_changed().connect(      m_RegionChooser.signal_instrument_changed().connect(
282          sigc::mem_fun(*this, &MainWindow::file_changed));          sigc::mem_fun(*this, &MainWindow::file_changed));
283      m_DimRegionChooser.signal_region_changed().connect(      m_DimRegionChooser.signal_region_changed().connect(
284          sigc::mem_fun(*this, &MainWindow::file_changed));          sigc::mem_fun(*this, &MainWindow::file_changed));
285      instrumentProps.signal_instrument_changed().connect(      instrumentProps.signal_instrument_changed().connect(
286          sigc::mem_fun(*this, &MainWindow::file_changed));          sigc::mem_fun(*this, &MainWindow::file_changed));
287    
288        dimreg_edit.signal_dimreg_to_be_changed().connect(
289            dimreg_to_be_changed_signal.make_slot());
290        dimreg_edit.signal_dimreg_changed().connect(
291            dimreg_changed_signal.make_slot());
292        dimreg_edit.signal_sample_ref_changed().connect(
293            sample_ref_changed_signal.make_slot());
294    
295        m_RegionChooser.signal_instrument_struct_to_be_changed().connect(
296            sigc::hide(
297                sigc::bind(
298                    file_structure_to_be_changed_signal.make_slot(),
299                    sigc::ref(this->file)
300                )
301            )
302        );
303        m_RegionChooser.signal_instrument_struct_changed().connect(
304            sigc::hide(
305                sigc::bind(
306                    file_structure_changed_signal.make_slot(),
307                    sigc::ref(this->file)
308                )
309            )
310        );
311        m_RegionChooser.signal_region_to_be_changed().connect(
312            region_to_be_changed_signal.make_slot());
313        m_RegionChooser.signal_region_changed_signal().connect(
314            region_changed_signal.make_slot());
315    
316      file = 0;      file = 0;
317      file_is_changed = false;      file_is_changed = false;
318        set_file_is_shared(false);
319    
320      show_all_children();      show_all_children();
321    
# Line 264  MainWindow::~MainWindow() Line 329  MainWindow::~MainWindow()
329    
330  bool MainWindow::on_delete_event(GdkEventAny* event)  bool MainWindow::on_delete_event(GdkEventAny* event)
331  {  {
332      return file_is_changed && !close_confirmation_dialog();      return !file_is_shared && file_is_changed && !close_confirmation_dialog();
333  }  }
334    
335  void MainWindow::on_action_quit()  void MainWindow::on_action_quit()
336  {  {
337      if (file_is_changed && !close_confirmation_dialog()) return;      if (!file_is_shared && file_is_changed && !close_confirmation_dialog()) return;
338      hide();      hide();
339  }  }
340    
# Line 383  void MainWindow::__clear() { Line 448  void MainWindow::__clear() {
448      m_refTreeModel->clear();      m_refTreeModel->clear();
449      m_refSamplesTreeModel->clear();      m_refSamplesTreeModel->clear();
450      // free libgig's gig::File instance      // free libgig's gig::File instance
451      if (file) {      if (file && !file_is_shared) delete file;
452          delete file;      file = NULL;
453          file = NULL;      set_file_is_shared(false);
     }  
454  }  }
455    
456  void MainWindow::on_action_file_new()  void MainWindow::on_action_file_new()
457  {  {
458      if (file_is_changed && !close_confirmation_dialog()) return;      if (!file_is_shared && file_is_changed && !close_confirmation_dialog()) return;
459    
460        if (file_is_shared && !leaving_shared_mode_dialog()) return;
461    
462      // clear all GUI elements      // clear all GUI elements
463      __clear();      __clear();
# Line 410  bool MainWindow::close_confirmation_dial Line 476  bool MainWindow::close_confirmation_dial
476                                   Glib::filename_display_basename(filename).c_str());                                   Glib::filename_display_basename(filename).c_str());
477      Gtk::MessageDialog dialog(*this, msg, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);      Gtk::MessageDialog dialog(*this, msg, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
478      g_free(msg);      g_free(msg);
479    #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION >= 6) || GTKMM_MAJOR_VERSION > 2
480      dialog.set_secondary_text(_("If you close without saving, your changes will be lost."));      dialog.set_secondary_text(_("If you close without saving, your changes will be lost."));
481    #endif
482      dialog.add_button(_("Close _Without Saving"), Gtk::RESPONSE_NO);      dialog.add_button(_("Close _Without Saving"), Gtk::RESPONSE_NO);
483      dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);      dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
484      dialog.add_button(file_has_name ? Gtk::Stock::SAVE : Gtk::Stock::SAVE_AS, Gtk::RESPONSE_YES);      dialog.add_button(file_has_name ? Gtk::Stock::SAVE : Gtk::Stock::SAVE_AS, Gtk::RESPONSE_YES);
485      dialog.set_default_response(Gtk::RESPONSE_YES);      dialog.set_default_response(Gtk::RESPONSE_YES);
486      int response = dialog.run();      int response = dialog.run();
487        dialog.hide();
488      if (response == Gtk::RESPONSE_YES) return file_save();      if (response == Gtk::RESPONSE_YES) return file_save();
489      return response != Gtk::RESPONSE_CANCEL;      return response != Gtk::RESPONSE_CANCEL;
490  }  }
491    
492    bool MainWindow::leaving_shared_mode_dialog() {
493        Glib::ustring msg = _("Detach from sampler and proceed working stand-alone?");
494        Gtk::MessageDialog dialog(*this, msg, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
495    #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION >= 6) || GTKMM_MAJOR_VERSION > 2
496        dialog.set_secondary_text(
497            _("If you proceed to work on another instrument file, it won't be "
498              "used by the sampler until you tell the sampler explicitly to "
499              "load it.")
500       );
501    #endif
502        dialog.add_button(_("_Yes, Detach"), Gtk::RESPONSE_YES);
503        dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
504        dialog.set_default_response(Gtk::RESPONSE_CANCEL);
505        int response = dialog.run();
506        dialog.hide();
507        return response == Gtk::RESPONSE_YES;
508    }
509    
510  void MainWindow::on_action_file_open()  void MainWindow::on_action_file_open()
511  {  {
512      if (file_is_changed && !close_confirmation_dialog()) return;      if (!file_is_shared && file_is_changed && !close_confirmation_dialog()) return;
513    
514        if (file_is_shared && !leaving_shared_mode_dialog()) return;
515    
516      Gtk::FileChooserDialog dialog(*this, _("Open file"));      Gtk::FileChooserDialog dialog(*this, _("Open file"));
517      dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);      dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
# Line 437  void MainWindow::on_action_file_open() Line 526  void MainWindow::on_action_file_open()
526      if (dialog.run() == Gtk::RESPONSE_OK) {      if (dialog.run() == Gtk::RESPONSE_OK) {
527          std::string filename = dialog.get_filename();          std::string filename = dialog.get_filename();
528          printf("filename=%s\n", filename.c_str());          printf("filename=%s\n", filename.c_str());
         __clear();  
529          printf("on_action_file_open self=%x\n", Glib::Thread::self());          printf("on_action_file_open self=%x\n", Glib::Thread::self());
530          load_file(filename.c_str());          load_file(filename.c_str());
531          current_dir = Glib::path_get_dirname(filename);          current_dir = Glib::path_get_dirname(filename);
# Line 446  void MainWindow::on_action_file_open() Line 534  void MainWindow::on_action_file_open()
534    
535  void MainWindow::load_file(const char* name)  void MainWindow::load_file(const char* name)
536  {  {
537        __clear();
538      load_dialog = new LoadDialog("Loading...", *this);      load_dialog = new LoadDialog("Loading...", *this);
539      load_dialog->show_all();      load_dialog->show_all();
540      loader = new Loader(strdup(name));      loader = new Loader(strdup(name));
# Line 463  void MainWindow::load_instrument(gig::In Line 552  void MainWindow::load_instrument(gig::In
552          msg.run();          msg.run();
553          Gtk::Main::quit();          Gtk::Main::quit();
554      }      }
555        // clear all GUI elements
556        __clear();
557        // load the instrument
558      gig::File* pFile = (gig::File*) instr->GetParent();      gig::File* pFile = (gig::File*) instr->GetParent();
559      load_gig(pFile, 0 /*file name*/);      load_gig(pFile, 0 /*file name*/, true /*shared instrument*/);
560      //TODO: automatically select the given instrument      //TODO: automatically select the given instrument
561  }  }
562    
# Line 486  void MainWindow::on_action_file_save() Line 578  void MainWindow::on_action_file_save()
578      file_save();      file_save();
579  }  }
580    
581  bool MainWindow::file_save()  bool MainWindow::check_if_savable()
582  {  {
583      if (!file) return false;      if (!file) return false;
584      if (!file_has_name) return file_save_as();  
585        if (!file->GetFirstSample()) {
586            Gtk::MessageDialog(*this, _("The file could not be saved "
587                                        "because it contains no samples"),
588                               false, Gtk::MESSAGE_ERROR).run();
589            return false;
590        }
591    
592        for (gig::Instrument* instrument = file->GetFirstInstrument() ; instrument ;
593             instrument = file->GetNextInstrument()) {
594            if (!instrument->GetFirstRegion()) {
595                Gtk::MessageDialog(*this, _("The file could not be saved "
596                                            "because there are instruments "
597                                            "that have no regions"),
598                                   false, Gtk::MESSAGE_ERROR).run();
599                return false;
600            }
601        }
602        return true;
603    }
604    
605    bool MainWindow::file_save()
606    {
607        if (!check_if_savable()) return false;
608        if (!file_is_shared && !file_has_name) return file_save_as();
609    
610      std::cout << "Saving file\n" << std::flush;      std::cout << "Saving file\n" << std::flush;
611        file_structure_to_be_changed_signal.emit(this->file);
612      try {      try {
613          file->Save();          file->Save();
614          if (file_is_changed) {          if (file_is_changed) {
# Line 499  bool MainWindow::file_save() Line 616  bool MainWindow::file_save()
616              file_is_changed = false;              file_is_changed = false;
617          }          }
618      } catch (RIFF::Exception e) {      } catch (RIFF::Exception e) {
619          Glib::ustring txt = "Could not save file: " + e.Message;          file_structure_changed_signal.emit(this->file);
620            Glib::ustring txt = _("Could not save file: ") + e.Message;
621          Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);          Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);
622          msg.run();          msg.run();
623          return false;          return false;
624      }      }
625      std::cout << "Saving file done\n" << std::flush;      std::cout << "Saving file done\n" << std::flush;
626      __import_queued_samples();      __import_queued_samples();
627        file_structure_changed_signal.emit(this->file);
628      return true;      return true;
629  }  }
630    
631  void MainWindow::on_action_file_save_as()  void MainWindow::on_action_file_save_as()
632  {  {
633        if (!check_if_savable()) return;
634      file_save_as();      file_save_as();
635  }  }
636    
637  bool MainWindow::file_save_as()  bool MainWindow::file_save_as()
638  {  {
     if (!file) return false;  
639      Gtk::FileChooserDialog dialog(*this, _("Save as"), Gtk::FILE_CHOOSER_ACTION_SAVE);      Gtk::FileChooserDialog dialog(*this, _("Save as"), Gtk::FILE_CHOOSER_ACTION_SAVE);
640      dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);      dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
641      dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);      dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);
# Line 538  bool MainWindow::file_save_as() Line 657  bool MainWindow::file_save_as()
657      dialog.set_current_name(Glib::filename_display_basename(filename));      dialog.set_current_name(Glib::filename_display_basename(filename));
658    
659      if (dialog.run() == Gtk::RESPONSE_OK) {      if (dialog.run() == Gtk::RESPONSE_OK) {
660            file_structure_to_be_changed_signal.emit(this->file);
661          try {          try {
662              std::string filename = dialog.get_filename();              std::string filename = dialog.get_filename();
663              if (!Glib::str_has_suffix(filename, ".gig")) {              if (!Glib::str_has_suffix(filename, ".gig")) {
# Line 551  bool MainWindow::file_save_as() Line 671  bool MainWindow::file_save_as()
671              file_has_name = true;              file_has_name = true;
672              file_is_changed = false;              file_is_changed = false;
673          } catch (RIFF::Exception e) {          } catch (RIFF::Exception e) {
674              Glib::ustring txt = "Could not save file: " + e.Message;              file_structure_changed_signal.emit(this->file);
675                Glib::ustring txt = _("Could not save file: ") + e.Message;
676              Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);              Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);
677              msg.run();              msg.run();
678              return false;              return false;
679          }          }
680          __import_queued_samples();          __import_queued_samples();
681            file_structure_changed_signal.emit(this->file);
682          return true;          return true;
683      }      }
684      return false;      return false;
# Line 647  void MainWindow::__import_queued_samples Line 769  void MainWindow::__import_queued_samples
769      }      }
770      // show error message box when some sample(s) could not be imported      // show error message box when some sample(s) could not be imported
771      if (error_files.size()) {      if (error_files.size()) {
772          Glib::ustring txt = "Could not import the following sample(s):\n" + error_files;          Glib::ustring txt = _("Could not import the following sample(s):\n") + error_files;
773          Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);          Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);
774          msg.run();          msg.run();
775      }      }
# Line 664  void MainWindow::on_action_help_about() Line 786  void MainWindow::on_action_help_about()
786  #ifdef ABOUT_DIALOG  #ifdef ABOUT_DIALOG
787      Gtk::AboutDialog dialog;      Gtk::AboutDialog dialog;
788      dialog.set_version(VERSION);      dialog.set_version(VERSION);
789        dialog.set_copyright("Copyright (C) 2006,2007 Andreas Persson");
790        dialog.set_comments(
791            "Released under the GNU General Public License.\n"
792            "\n"
793            "Please notice that this is still a very young instrument editor. "
794            "So better backup your Gigasampler files before editing them with "
795            "this application.\n"
796            "\n"
797            "Please report bugs to: http://bugs.linuxsampler.org"
798        );
799        dialog.set_website("http://www.linuxsampler.org");
800        dialog.set_website_label("http://www.linuxsampler.org");
801      dialog.run();      dialog.run();
802  #endif  #endif
803  }  }
# Line 841  void InstrumentProps::key_range_high_cha Line 975  void InstrumentProps::key_range_high_cha
975      if (h < l) eDimensionKeyRangeLow.set_value(h);      if (h < l) eDimensionKeyRangeLow.set_value(h);
976  }  }
977    
978  sigc::signal<void> InstrumentProps::signal_instrument_changed()  sigc::signal<void>& InstrumentProps::signal_instrument_changed()
979  {  {
980      return instrument_changed;      return instrument_changed;
981  }  }
# Line 854  void MainWindow::file_changed() Line 988  void MainWindow::file_changed()
988      }      }
989  }  }
990    
991  void MainWindow::load_gig(gig::File* gig, const char* filename)  void MainWindow::load_gig(gig::File* gig, const char* filename, bool isSharedInstrument)
992  {  {
993      file = 0;      file = 0;
994        set_file_is_shared(isSharedInstrument);
995    
996      this->filename = filename ? filename : _("Unsaved Gig File");      this->filename = filename ? filename : _("Unsaved Gig File");
997      set_title(Glib::filename_display_basename(this->filename));      set_title(Glib::filename_display_basename(this->filename));
# Line 933  void MainWindow::show_instr_props() Line 1068  void MainWindow::show_instr_props()
1068      }      }
1069  }  }
1070    
1071    void MainWindow::on_action_view_status_bar() {
1072        Gtk::CheckMenuItem* item =
1073            dynamic_cast<Gtk::CheckMenuItem*>(uiManager->get_widget("/MenuBar/MenuView/Statusbar"));
1074        if (!item) {
1075            std::cerr << "/MenuBar/MenuView/Statusbar == NULL\n";
1076            return;
1077        }
1078        if (item->get_active()) m_StatusBar.show();
1079        else                    m_StatusBar.hide();
1080    }
1081    
1082  void MainWindow::on_button_release(GdkEventButton* button)  void MainWindow::on_button_release(GdkEventButton* button)
1083  {  {
1084      if (button->type == GDK_2BUTTON_PRESS) {      if (button->type == GDK_2BUTTON_PRESS) {
# Line 990  void MainWindow::on_action_add_instrumen Line 1136  void MainWindow::on_action_add_instrumen
1136    
1137  void MainWindow::on_action_remove_instrument() {  void MainWindow::on_action_remove_instrument() {
1138      if (!file) return;      if (!file) return;
1139        if (file_is_shared) {
1140            Gtk::MessageDialog msg(
1141                *this,
1142                 _("You cannot delete an instrument from this file, since it's "
1143                   "currently used by the sampler."),
1144                 false, Gtk::MESSAGE_INFO
1145            );
1146            msg.run();
1147            return;
1148        }
1149    
1150      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeView.get_selection();      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeView.get_selection();
1151      Gtk::TreeModel::iterator it = sel->get_selected();      Gtk::TreeModel::iterator it = sel->get_selected();
1152      if (it) {      if (it) {
# Line 1125  void MainWindow::on_action_add_sample() Line 1282  void MainWindow::on_action_add_sample()
1282                  {                  {
1283                      sample->MIDIUnityNote = instrument.basenote;                      sample->MIDIUnityNote = instrument.basenote;
1284    
1285    #if HAVE_SF_INSTRUMENT_LOOPS
1286                      if (instrument.loop_count && instrument.loops[0].mode != SF_LOOP_NONE) {                      if (instrument.loop_count && instrument.loops[0].mode != SF_LOOP_NONE) {
1287                          sample->Loops = 1;                          sample->Loops = 1;
1288    
# Line 1144  void MainWindow::on_action_add_sample() Line 1302  void MainWindow::on_action_add_sample()
1302                          sample->LoopPlayCount = instrument.loops[0].count;                          sample->LoopPlayCount = instrument.loops[0].count;
1303                          sample->LoopSize = sample->LoopEnd - sample->LoopStart + 1;                          sample->LoopSize = sample->LoopEnd - sample->LoopStart + 1;
1304                      }                      }
1305    #endif
1306                  }                  }
1307    
1308                  // schedule resizing the sample (which will be done                  // schedule resizing the sample (which will be done
# Line 1174  void MainWindow::on_action_add_sample() Line 1333  void MainWindow::on_action_add_sample()
1333          }          }
1334          // show error message box when some file(s) could not be opened / added          // show error message box when some file(s) could not be opened / added
1335          if (error_files.size()) {          if (error_files.size()) {
1336              Glib::ustring txt = "Could not add the following sample(s):\n" + error_files;              Glib::ustring txt = _("Could not add the following sample(s):\n") + error_files;
1337              Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);              Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);
1338              msg.run();              msg.run();
1339          }          }
# Line 1200  void MainWindow::on_action_remove_sample Line 1359  void MainWindow::on_action_remove_sample
1359                       pSample; pSample = group->GetNextSample()) {                       pSample; pSample = group->GetNextSample()) {
1360                      members.push_back(pSample);                      members.push_back(pSample);
1361                  }                  }
1362                    // notify everybody that we're going to remove these samples
1363                    samples_to_be_removed_signal.emit(members);
1364                  // delete the group in the .gig file including the                  // delete the group in the .gig file including the
1365                  // samples that belong to the group                  // samples that belong to the group
1366                  file->DeleteGroup(group);                  file->DeleteGroup(group);
1367                    // notify that we're done with removal
1368                    samples_removed_signal.emit();
1369                  // if sample(s) were just previously added, remove                  // if sample(s) were just previously added, remove
1370                  // them from the import queue                  // them from the import queue
1371                  for (std::list<gig::Sample*>::iterator member = members.begin();                  for (std::list<gig::Sample*>::iterator member = members.begin();
# Line 1219  void MainWindow::on_action_remove_sample Line 1382  void MainWindow::on_action_remove_sample
1382                  }                  }
1383                  file_changed();                  file_changed();
1384              } else if (sample) {              } else if (sample) {
1385                    // notify everybody that we're going to remove this sample
1386                    std::list<gig::Sample*> lsamples;
1387                    lsamples.push_back(sample);
1388                    samples_to_be_removed_signal.emit(lsamples);
1389                  // remove sample from the .gig file                  // remove sample from the .gig file
1390                  file->DeleteSample(sample);                  file->DeleteSample(sample);
1391                    // notify that we're done with removal
1392                    samples_removed_signal.emit();
1393                  // if sample was just previously added, remove it from                  // if sample was just previously added, remove it from
1394                  // the import queue                  // the import queue
1395                  for (std::list<SampleImportItem>::iterator iter = m_SampleImportQueue.begin();                  for (std::list<SampleImportItem>::iterator iter = m_SampleImportQueue.begin();
# Line 1232  void MainWindow::on_action_remove_sample Line 1401  void MainWindow::on_action_remove_sample
1401                          break;                          break;
1402                      }                      }
1403                  }                  }
1404                    dimreg_changed();
1405                  file_changed();                  file_changed();
1406              }              }
1407              // remove respective row(s) from samples tree view              // remove respective row(s) from samples tree view
1408              m_refSamplesTreeModel->erase(it);              m_refSamplesTreeModel->erase(it);
1409          } catch (RIFF::Exception e) {          } catch (RIFF::Exception e) {
1410                // pretend we're done with removal (i.e. to avoid dead locks)
1411                samples_removed_signal.emit();
1412                // show error message
1413              Gtk::MessageDialog msg(*this, e.Message.c_str(), false, Gtk::MESSAGE_ERROR);              Gtk::MessageDialog msg(*this, e.Message.c_str(), false, Gtk::MESSAGE_ERROR);
1414              msg.run();              msg.run();
1415          }          }
1416      }      }
1417  }  }
1418    
1419    // For some reason drag_data_get gets called two times for each
1420    // drag'n'drop (at least when target is an Entry). This work-around
1421    // makes sure the code in drag_data_get and drop_drag_data_received is
1422    // only executed once, as drag_begin only gets called once.
1423    void MainWindow::on_sample_treeview_drag_begin(const Glib::RefPtr<Gdk::DragContext>& context)
1424    {
1425        first_call_to_drag_data_get = true;
1426    }
1427    
1428  void MainWindow::on_sample_treeview_drag_data_get(const Glib::RefPtr<Gdk::DragContext>&,  void MainWindow::on_sample_treeview_drag_data_get(const Glib::RefPtr<Gdk::DragContext>&,
1429                                                    Gtk::SelectionData& selection_data, guint, guint)                                                    Gtk::SelectionData& selection_data, guint, guint)
1430  {  {
1431        if (!first_call_to_drag_data_get) return;
1432        first_call_to_drag_data_get = false;
1433    
1434      // get selected sample      // get selected sample
1435      gig::Sample* sample = NULL;      gig::Sample* sample = NULL;
1436      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewSamples.get_selection();      Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewSamples.get_selection();
# Line 1266  void MainWindow::on_sample_label_drop_dr Line 1451  void MainWindow::on_sample_label_drop_dr
1451      gig::Sample* sample = *((gig::Sample**) selection_data.get_data());      gig::Sample* sample = *((gig::Sample**) selection_data.get_data());
1452    
1453      if (sample && selection_data.get_length() == sizeof(gig::Sample*)) {      if (sample && selection_data.get_length() == sizeof(gig::Sample*)) {
1454          if (dimreg_edit.set_sample(sample)) {          std::cout << "Drop received sample \"" <<
1455              std::cout << "Drop received sample \"" <<              sample->pInfo->Name << "\"" << std::endl;
1456                  sample->pInfo->Name << "\"" << std::endl;          // drop success
1457              // drop success          context->drop_reply(true, time);
1458              context->drop_reply(true, time);  
1459              return;          //TODO: we should better move most of the following code to DimRegionEdit::set_sample()
1460    
1461            // notify everybody that we're going to alter the region
1462            gig::Region* region = m_RegionChooser.get_region();
1463            region_to_be_changed_signal.emit(region);
1464    
1465            // find the samplechannel dimension
1466            gig::dimension_def_t* stereo_dimension = 0;
1467            for (int i = 0 ; i < region->Dimensions ; i++) {
1468                if (region->pDimensionDefinitions[i].dimension ==
1469                    gig::dimension_samplechannel) {
1470                    stereo_dimension = &region->pDimensionDefinitions[i];
1471                    break;
1472                }
1473            }
1474            bool channels_changed = false;
1475            if (sample->Channels == 1 && stereo_dimension) {
1476                // remove the samplechannel dimension
1477                region->DeleteDimension(stereo_dimension);
1478                channels_changed = true;
1479                region_changed();
1480            }
1481            dimreg_edit.set_sample(sample);
1482    
1483            if (sample->Channels == 2 && !stereo_dimension) {
1484                // add samplechannel dimension
1485                gig::dimension_def_t dim;
1486                dim.dimension = gig::dimension_samplechannel;
1487                dim.bits = 1;
1488                dim.zones = 2;
1489                region->AddDimension(&dim);
1490                channels_changed = true;
1491                region_changed();
1492          }          }
1493            if (channels_changed) {
1494                // unmap all samples with wrong number of channels
1495                // TODO: maybe there should be a warning dialog for this
1496                for (int i = 0 ; i < region->DimensionRegions ; i++) {
1497                    gig::DimensionRegion* d = region->pDimensionRegions[i];
1498                    if (d->pSample && d->pSample->Channels != sample->Channels) {
1499                        gig::Sample* oldref = d->pSample;
1500                        d->pSample = NULL;
1501                        sample_ref_changed_signal.emit(oldref, NULL);
1502                    }
1503                }
1504            }
1505    
1506            // notify we're done with altering
1507            region_changed_signal.emit(region);
1508    
1509            return;
1510      }      }
1511      // drop failed      // drop failed
1512      context->drop_reply(false, time);      context->drop_reply(false, time);
# Line 1311  void MainWindow::instrument_name_changed Line 1545  void MainWindow::instrument_name_changed
1545          file_changed();          file_changed();
1546      }      }
1547  }  }
1548    
1549    void MainWindow::set_file_is_shared(bool b) {
1550        this->file_is_shared = b;
1551    
1552        if (file_is_shared) {
1553            m_AttachedStateLabel.set_label(_("live-mode"));
1554            m_AttachedStateImage.set(
1555                Gdk::Pixbuf::create_from_xpm_data(status_attached_xpm)
1556            );
1557        } else {
1558            m_AttachedStateLabel.set_label(_("stand-alone"));
1559            m_AttachedStateImage.set(
1560                Gdk::Pixbuf::create_from_xpm_data(status_detached_xpm)
1561            );
1562        }
1563    }
1564    
1565    sigc::signal<void, gig::File*>& MainWindow::signal_file_structure_to_be_changed() {
1566        return file_structure_to_be_changed_signal;
1567    }
1568    
1569    sigc::signal<void, gig::File*>& MainWindow::signal_file_structure_changed() {
1570        return file_structure_changed_signal;
1571    }
1572    
1573    sigc::signal<void, std::list<gig::Sample*> >& MainWindow::signal_samples_to_be_removed() {
1574        return samples_to_be_removed_signal;
1575    }
1576    
1577    sigc::signal<void>& MainWindow::signal_samples_removed() {
1578        return samples_removed_signal;
1579    }
1580    
1581    sigc::signal<void, gig::Region*>& MainWindow::signal_region_to_be_changed() {
1582        return region_to_be_changed_signal;
1583    }
1584    
1585    sigc::signal<void, gig::Region*>& MainWindow::signal_region_changed() {
1586        return region_changed_signal;
1587    }
1588    
1589    sigc::signal<void, gig::Sample*/*old*/, gig::Sample*/*new*/>& MainWindow::signal_sample_ref_changed() {
1590        return sample_ref_changed_signal;
1591    }
1592    
1593    sigc::signal<void, gig::DimensionRegion*>& MainWindow::signal_dimreg_to_be_changed() {
1594        return dimreg_to_be_changed_signal;
1595    }
1596    
1597    sigc::signal<void, gig::DimensionRegion*>& MainWindow::signal_dimreg_changed() {
1598        return dimreg_changed_signal;
1599    }

Legend:
Removed from v.1300  
changed lines
  Added in v.1436

  ViewVC Help
Powered by ViewVC