/[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 1339 by schoenebeck, Mon Sep 10 19:56:26 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
# Line 48  Glib::ustring filename_display_basename( Line 50  Glib::ustring filename_display_basename(
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 127  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 182  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 211  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 295  MainWindow::MainWindow() Line 315  MainWindow::MainWindow()
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 308  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 427  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 467  bool MainWindow::close_confirmation_dial Line 489  bool MainWindow::close_confirmation_dial
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 514  void MainWindow::load_instrument(gig::In Line 556  void MainWindow::load_instrument(gig::In
556      __clear();      __clear();
557      // load the instrument      // 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 563  bool MainWindow::check_if_savable() Line 605  bool MainWindow::check_if_savable()
605  bool MainWindow::file_save()  bool MainWindow::file_save()
606  {  {
607      if (!check_if_savable()) return false;      if (!check_if_savable()) return false;
608      if (!file_has_name) return file_save_as();      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);      file_structure_to_be_changed_signal.emit(this->file);
# Line 575  bool MainWindow::file_save() Line 617  bool MainWindow::file_save()
617          }          }
618      } catch (RIFF::Exception e) {      } catch (RIFF::Exception e) {
619          file_structure_changed_signal.emit(this->file);          file_structure_changed_signal.emit(this->file);
620          Glib::ustring txt = "Could not save file: " + e.Message;          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;
# Line 630  bool MainWindow::file_save_as() Line 672  bool MainWindow::file_save_as()
672              file_is_changed = false;              file_is_changed = false;
673          } catch (RIFF::Exception e) {          } catch (RIFF::Exception e) {
674              file_structure_changed_signal.emit(this->file);              file_structure_changed_signal.emit(this->file);
675              Glib::ustring txt = "Could not save file: " + e.Message;              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;
# Line 727  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 744  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 934  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 1013  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 1070  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 1256  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 1469  void MainWindow::instrument_name_changed Line 1546  void MainWindow::instrument_name_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() {  sigc::signal<void, gig::File*>& MainWindow::signal_file_structure_to_be_changed() {
1566      return file_structure_to_be_changed_signal;      return file_structure_to_be_changed_signal;
1567  }  }

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

  ViewVC Help
Powered by ViewVC