--- gigedit/trunk/src/gigedit/mainwindow.h 2014/01/12 19:37:55 2507 +++ gigedit/trunk/src/gigedit/mainwindow.h 2017/01/02 22:13:01 3068 @@ -1,5 +1,5 @@ /* -*- c++ -*- - * Copyright (C) 2006 - 2014 Andreas Persson + * Copyright (C) 2006 - 2017 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 @@ -20,8 +20,13 @@ #ifndef GIGEDIT_MAINWINDOW_H #define GIGEDIT_MAINWINDOW_H -#include +#ifdef LIBGIG_HEADER_FILE +# include LIBGIG_HEADER_FILE(gig.h) +#else +# include +#endif +#include #include #include #include @@ -46,15 +51,25 @@ #ifndef OLD_THREADS #include #endif +#include "ManagedWindow.h" class MainWindow; -class PropDialog : public Gtk::Window, +class PropDialog : public ManagedWindow, public PropEditor { public: PropDialog(); void set_info(DLS::Info* info); + void set_file(gig::File* file); + + // implementation for abstract methods of interface class "ManagedWindow" + virtual Settings::Property* windowSettingX() { return &Settings::singleton()->filePropsWindowX; } + virtual Settings::Property* windowSettingY() { return &Settings::singleton()->filePropsWindowY; } + virtual Settings::Property* windowSettingWidth() { return &Settings::singleton()->filePropsWindowW; } + virtual Settings::Property* windowSettingHeight() { return &Settings::singleton()->filePropsWindowH; } + protected: + ChoiceEntry eFileFormat; StringEntry eName; StringEntry eCreationDate; StringEntryMultiLine eComments; @@ -75,9 +90,13 @@ Gtk::HButtonBox buttonBox; Gtk::Button quitButton; Table table; + + gig::File* m_file; + + void onFileFormatChanged(); }; -class InstrumentProps : public Gtk::Window, +class InstrumentProps : public ManagedWindow, public PropEditor { public: InstrumentProps(); @@ -87,6 +106,13 @@ sigc::signal& signal_name_changed() { return sig_name_changed; } + + // implementation for abstract methods of interface class "ManagedWindow" + virtual Settings::Property* windowSettingX() { return &Settings::singleton()->instrPropsWindowX; } + virtual Settings::Property* windowSettingY() { return &Settings::singleton()->instrPropsWindowY; } + virtual Settings::Property* windowSettingWidth() { return &Settings::singleton()->instrPropsWindowW; } + virtual Settings::Property* windowSettingHeight() { return &Settings::singleton()->instrPropsWindowH; } + protected: void set_Name(const gig::String& name); void set_IsDrum(bool value); @@ -112,9 +138,9 @@ NoteEntry eDimensionKeyRangeHigh; }; -class LoadDialog : public Gtk::Dialog { +class ProgressDialog : public Gtk::Dialog { public: - LoadDialog(const Glib::ustring& title, Gtk::Window& parent); + ProgressDialog(const Glib::ustring& title, Gtk::Window& parent); void set_fraction(float fraction) { progressBar.set_fraction(fraction); } protected: Gtk::ProgressBar progressBar; @@ -125,22 +151,48 @@ Loader(const char* filename); void launch(); Glib::Dispatcher& signal_progress(); - Glib::Dispatcher& signal_finished(); + Glib::Dispatcher& signal_finished(); ///< Finished successfully, without error. + Glib::Dispatcher& signal_error(); + void progress_callback(float fraction); + float get_progress(); + const Glib::ustring filename; + Glib::ustring error_message; + gig::File* gig; + +private: + Glib::Threads::Thread* thread; + void thread_function(); + Glib::Dispatcher finished_dispatcher; + Glib::Dispatcher progress_dispatcher; + Glib::Dispatcher error_dispatcher; + Glib::Threads::Mutex progressMutex; + float progress; +}; + +class Saver : public sigc::trackable { +public: + Saver(gig::File* file, Glib::ustring filename = ""); ///< one argument means "save", two arguments means "save as" + void launch(); + Glib::Dispatcher& signal_progress(); + Glib::Dispatcher& signal_finished(); ///< Finished successfully, without error. + Glib::Dispatcher& signal_error(); void progress_callback(float fraction); float get_progress(); - const char* filename; gig::File* gig; + const Glib::ustring filename; + Glib::ustring error_message; private: Glib::Threads::Thread* thread; void thread_function(); Glib::Dispatcher finished_dispatcher; Glib::Dispatcher progress_dispatcher; + Glib::Dispatcher error_dispatcher; Glib::Threads::Mutex progressMutex; float progress; }; -class MainWindow : public Gtk::Window { +class MainWindow : public ManagedWindow { public: MainWindow(); virtual ~MainWindow(); @@ -164,6 +216,17 @@ sigc::signal& signal_keyboard_key_hit(); sigc::signal& signal_keyboard_key_released(); + sigc::signal& signal_switch_sampler_instrument(); + + sigc::signal signal_script_to_be_changed; + sigc::signal signal_script_changed; + + // implementation for abstract methods of interface class "ManagedWindow" + virtual Settings::Property* windowSettingX() { return &Settings::singleton()->mainWindowX; } + virtual Settings::Property* windowSettingY() { return &Settings::singleton()->mainWindowY; } + virtual Settings::Property* windowSettingWidth() { return &Settings::singleton()->mainWindowW; } + virtual Settings::Property* windowSettingHeight() { return &Settings::singleton()->mainWindowH; } + protected: Glib::RefPtr actionGroup; Glib::RefPtr uiManager; @@ -193,12 +256,22 @@ sigc::signal note_on_signal; sigc::signal note_off_signal; + sigc::signal switch_sampler_instrument_signal; + void on_instrument_selection_change(Gtk::RadioMenuItem* item); void on_sel_change(); void region_changed(); void dimreg_changed(); + void select_instrument(gig::Instrument* instrument); + bool select_dimension_region(gig::DimensionRegion* dimRgn); + void select_sample(gig::Sample* sample); void on_loader_progress(); void on_loader_finished(); + void on_loader_error(); + void on_saver_progress(); + void on_saver_error(); + void on_saver_finished(); + void dimreg_all_dimregs_toggled(); gig::Instrument* get_instrument(); void add_region_to_dimregs(gig::Region* region, bool stereo, bool all_dimregs); @@ -207,10 +280,12 @@ class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { + add(m_col_nr); add(m_col_name); add(m_col_instr); } + Gtk::TreeModelColumn m_col_nr; Gtk::TreeModelColumn m_col_name; Gtk::TreeModelColumn m_col_instr; } m_Columns; @@ -225,17 +300,23 @@ Gtk::Menu* instrument_menu; + std::map sample_ref_count; + class SamplesModel : public Gtk::TreeModel::ColumnRecord { public: SamplesModel() { add(m_col_name); add(m_col_sample); add(m_col_group); + add(m_col_refcount); + add(m_color); } Gtk::TreeModelColumn m_col_name; Gtk::TreeModelColumn m_col_sample; Gtk::TreeModelColumn m_col_group; + Gtk::TreeModelColumn m_col_refcount; + Gtk::TreeModelColumn m_color; } m_SamplesModel; class SamplesTreeStore : public Gtk::TreeStore { @@ -251,6 +332,32 @@ Gtk::TreeView m_TreeViewSamples; Glib::RefPtr m_refSamplesTreeModel; + class ScriptsModel : public Gtk::TreeModel::ColumnRecord { + public: + ScriptsModel() { + add(m_col_name); + add(m_col_script); + add(m_col_group); + } + + Gtk::TreeModelColumn m_col_name; + Gtk::TreeModelColumn m_col_script; + Gtk::TreeModelColumn m_col_group; + } m_ScriptsModel; + + class ScriptsTreeStore : public Gtk::TreeStore { + public: + static Glib::RefPtr create(const ScriptsModel& columns) { + return Glib::RefPtr( new ScriptsTreeStore(columns) ); + } + protected: + ScriptsTreeStore(const ScriptsModel& columns) : Gtk::TreeStore(columns) {} + }; + + Gtk::ScrolledWindow m_ScrolledWindowScripts; + Gtk::TreeView m_TreeViewScripts; + Glib::RefPtr m_refScriptsTreeModel; + Gtk::VBox dimreg_vbox; Gtk::HBox dimreg_hbox; Gtk::Label dimreg_label; @@ -280,7 +387,14 @@ void show_instr_props(); bool instr_props_set_instrument(); void show_midi_rules(); + void show_script_slots(); void on_action_view_status_bar(); + void on_auto_restore_win_dim(); + void on_save_with_temporary_file(); + void on_action_refresh_all(); + void on_action_warn_user_on_extensions(); + void on_action_sync_sampler_instrument_selection(); + void on_action_move_root_note_with_region_moved(); void on_action_help_about(); // sample right-click popup actions @@ -288,21 +402,36 @@ void on_action_sample_properties(); void on_action_add_group(); void on_action_add_sample(); + void on_action_replace_sample(); void on_action_replace_all_samples_in_all_groups(); void on_action_remove_sample(); + void on_action_remove_unused_samples(); + + // script right-click popup actions + void on_script_treeview_button_release(GdkEventButton* button); + void on_action_add_script_group(); + void on_action_add_script(); + void on_action_edit_script(); + void on_action_remove_script(); void on_action_add_instrument(); void on_action_duplicate_instrument(); void on_action_remove_instrument(); + void show_samples_tab(); + void show_intruments_tab(); + void show_scripts_tab(); + void add_instrument(gig::Instrument* instrument); Gtk::RadioMenuItem* add_instrument_to_menu(const Glib::ustring& name, int position = -1); void remove_instrument_from_menu(int index); - LoadDialog* load_dialog; + ProgressDialog* progress_dialog; Loader* loader; + Saver* saver; void load_gig(gig::File* gig, const char* filename, bool isSharedInstrument = false); + void updateSampleRefCountMap(gig::File* gig); gig::File* file; bool file_is_shared; @@ -319,6 +448,16 @@ bool check_if_savable(); void on_button_release(GdkEventButton* button); + void on_instruments_treeview_drag_begin(const Glib::RefPtr& context); + void on_instruments_treeview_drag_data_get(const Glib::RefPtr&, + Gtk::SelectionData& selection_data, guint, guint); + void on_instruments_treeview_drop_drag_data_received( + const Glib::RefPtr& context, int, int, + const Gtk::SelectionData& selection_data, guint, guint time + ); + void on_scripts_treeview_drag_begin(const Glib::RefPtr& context); + void on_scripts_treeview_drag_data_get(const Glib::RefPtr&, + Gtk::SelectionData& selection_data, guint, guint); void on_sample_treeview_drag_begin(const Glib::RefPtr& context); void on_sample_treeview_drag_data_get(const Glib::RefPtr&, Gtk::SelectionData& selection_data, guint, guint); @@ -327,6 +466,9 @@ const Gtk::SelectionData& selection_data, guint, guint time); + void script_name_changed(const Gtk::TreeModel::Path& path, + const Gtk::TreeModel::iterator& iter); + void script_double_clicked(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column); void sample_name_changed(const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter); void instrument_name_changed(const Gtk::TreeModel::Path& path, @@ -334,8 +476,20 @@ void instr_name_changed_by_instr_props(Gtk::TreeModel::iterator& it); sigc::connection instrument_name_connection; + void on_action_combine_instruments(); + void on_action_view_references(); + void on_action_merge_files(); + void mergeFiles(const std::vector& filenames); + + void on_sample_ref_changed(gig::Sample* oldSample, gig::Sample* newSample); + void on_sample_ref_count_incremented(gig::Sample* sample, int offset); + void on_samples_to_be_removed(std::list samples); + + void add_or_replace_sample(bool replace); + void __import_queued_samples(); void __clear(); + void __refreshEntireGUI(); bool close_confirmation_dialog(); bool leaving_shared_mode_dialog();