/* -*- c++ -*- * Copyright (C) 2006, 2007 Andreas Persson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with program; see the file COPYING. If not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA. */ #ifndef GIGEDIT_MAINWINDOW_H #define GIGEDIT_MAINWINDOW_H #include #include #include #include #include #include #include #include #include #include #include #include #include "regionchooser.h" #include "dimregionchooser.h" #include "dimregionedit.h" class MainWindow; class PropDialog : public Gtk::Window { public: PropDialog(); void set_info(DLS::Info* info); protected: Gtk::Table table; Gtk::Label label[16]; Gtk::Entry entry[16]; }; class InstrumentProps : public Gtk::Window { public: InstrumentProps(); void set_instrument(gig::Instrument* instrument); protected: Gtk::VBox vbox; Gtk::HButtonBox buttonBox; Gtk::Button quitButton; Gtk::Table table; Gtk::Label label[10]; Gtk::Entry entry[8]; Gtk::CheckButton check[2]; StringEntry eName; BoolEntry eIsDrum; NumEntryTemp eMIDIBank; NumEntryTemp eMIDIProgram; NumEntryGain eAttenuation; BoolEntryPlus6 eGainPlus6; NumEntryTemp eEffectSend; NumEntryTemp eFineTune; NumEntryTemp ePitchbendRange; BoolEntry ePianoReleaseMode; NoteEntry eDimensionKeyRangeLow; NoteEntry eDimensionKeyRangeHigh; int rowno; void add_prop(LabelWidget& prop); void key_range_low_changed(); void key_range_high_changed(); }; class LoadDialog : public Gtk::Dialog { public: LoadDialog(const Glib::ustring& title, Gtk::Window& parent); void set_fraction(float fraction) { progressBar.set_fraction(fraction); } protected: Gtk::ProgressBar progressBar; }; class Loader : public sigc::trackable { public: Loader(const char* filename); void launch(); Glib::Dispatcher& signal_progress(); Glib::Dispatcher& signal_finished(); void progress_callback(float fraction); float get_progress(); const char* filename; gig::File* gig; private: Glib::Thread* thread; void thread_function(); Glib::Dispatcher finished_dispatcher; Glib::Dispatcher progress_dispatcher; Glib::Mutex progressMutex; float progress; }; class MainWindow : public Gtk::Window { public: MainWindow(); virtual ~MainWindow(); void load_file(const char* name); void load_instrument(gig::Instrument* instr); protected: Glib::RefPtr actionGroup; Glib::RefPtr uiManager; RegionChooser m_RegionChooser; DimRegionChooser m_DimRegionChooser; PropDialog propDialog; InstrumentProps instrumentProps; void on_instrument_selection_change(int index); void on_sel_change(); void region_changed(); void dimreg_changed(); void on_loader_progress(); void on_loader_finished(); class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_name); add(m_col_instr); } Gtk::TreeModelColumn m_col_name; Gtk::TreeModelColumn m_col_instr; } m_Columns; Gtk::VBox m_VBox; Gtk::HPaned m_HPaned; Gtk::ScrolledWindow m_ScrolledWindow; Gtk::TreeView m_TreeView; Glib::RefPtr m_refTreeModel; class SamplesModel : public Gtk::TreeModel::ColumnRecord { public: SamplesModel() { add(m_col_name); add(m_col_sample); add(m_col_group); } Gtk::TreeModelColumn m_col_name; Gtk::TreeModelColumn m_col_sample; Gtk::TreeModelColumn m_col_group; } m_SamplesModel; class SamplesTreeStore : public Gtk::TreeStore { public: static Glib::RefPtr create(const SamplesModel& columns) { return Glib::RefPtr( new SamplesTreeStore(columns) ); } protected: SamplesTreeStore(const SamplesModel& columns) : Gtk::TreeStore(columns) {} }; Gtk::ScrolledWindow m_ScrolledWindowSamples; Gtk::TreeView m_TreeViewSamples; Glib::RefPtr m_refSamplesTreeModel; DimRegionEdit dimreg_edit; Gtk::Notebook m_Notebook; Gtk::Notebook m_TreeViewNotebook; struct SampleImportItem { gig::Sample* gig_sample; // pointer to the gig::Sample to // which the sample data should be // imported to Glib::ustring sample_path; // file name of the sample to be // imported }; std::list m_SampleImportQueue; void on_action_file_new(); void on_action_file_open(); void on_action_file_save(); void on_action_file_save_as(); void on_action_file_properties(); void show_instr_props(); void on_action_help_about(); // sample right-click popup actions void on_sample_treeview_button_release(GdkEventButton* button); void on_action_sample_properties(); void on_action_add_group(); void on_action_add_sample(); void on_action_remove_sample(); void on_action_add_instrument(); void on_action_remove_instrument(); LoadDialog* load_dialog; Loader* loader; void load_gig(gig::File* gig, const char* filename); gig::File* file; void on_button_release(GdkEventButton* button); void on_sample_treeview_drag_data_get(const Glib::RefPtr&, Gtk::SelectionData& selection_data, guint, guint); void on_sample_label_drop_drag_data_received(const Glib::RefPtr& context, int, int, const Gtk::SelectionData& selection_data, guint, guint time); void sample_name_changed(const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter); void instrument_name_changed(const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter); void __import_queued_samples(); void __clear(); Gtk::Menu* popup_menu; }; #endif