/[svn]/gigedit/trunk/src/gigedit/mainwindow.h
ViewVC logotype

Contents of /gigedit/trunk/src/gigedit/mainwindow.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3157 - (show annotations) (download) (as text)
Mon May 8 17:30:10 2017 UTC (6 years, 10 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 20177 byte(s)
* Fixed potentially unhandled exceptions when app is loading
  its config file.
* WIP: Introduced user configurable list of macros which are
  auto assigned to keyboard accelerators (F1 ... F12) and
  saved along with the app's config file (added under new
  main menu bar section "Macro").
* Bumped version (1.0.0.svn38).

1 /* -*- c++ -*-
2 * Copyright (C) 2006 - 2017 Andreas Persson
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2, or (at
7 * your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with program; see the file COPYING. If not, write to the Free
16 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17 * 02110-1301 USA.
18 */
19
20 #ifndef GIGEDIT_MAINWINDOW_H
21 #define GIGEDIT_MAINWINDOW_H
22
23 #ifdef LIBGIG_HEADER_FILE
24 # include LIBGIG_HEADER_FILE(gig.h)
25 # include LIBGIG_HEADER_FILE(Serialization.h)
26 #else
27 # include <gig.h>
28 # include <Serialization.h>
29 #endif
30
31 #include <gtkmm/box.h>
32 #include <gtkmm/actiongroup.h>
33 #include <gtkmm/buttonbox.h>
34 #include <gtkmm/dialog.h>
35 #include <gtkmm/liststore.h>
36 #include <gtkmm/menu.h>
37 #include <gtkmm/paned.h>
38 #include <gtkmm/progressbar.h>
39 #include <gtkmm/radiomenuitem.h>
40 #include <gtkmm/scrolledwindow.h>
41 #include <gtkmm/treestore.h>
42 #include <gtkmm/uimanager.h>
43 #include <gtkmm/window.h>
44 #include <gtkmm/statusbar.h>
45 #include <gtkmm/image.h>
46
47 #include <sstream>
48
49 #include "regionchooser.h"
50 #include "dimregionchooser.h"
51 #include "dimregionedit.h"
52 #include "midirules.h"
53 #ifndef OLD_THREADS
54 #include <glibmm/threads.h>
55 #endif
56 #include "ManagedWindow.h"
57
58 class MainWindow;
59
60 class PropDialog : public ManagedWindow,
61 public PropEditor<DLS::Info> {
62 public:
63 PropDialog();
64 void set_info(DLS::Info* info);
65 void set_file(gig::File* file);
66
67 // implementation for abstract methods of interface class "ManagedWindow"
68 virtual Settings::Property<int>* windowSettingX() { return &Settings::singleton()->filePropsWindowX; }
69 virtual Settings::Property<int>* windowSettingY() { return &Settings::singleton()->filePropsWindowY; }
70 virtual Settings::Property<int>* windowSettingWidth() { return &Settings::singleton()->filePropsWindowW; }
71 virtual Settings::Property<int>* windowSettingHeight() { return &Settings::singleton()->filePropsWindowH; }
72
73 protected:
74 ChoiceEntry<int> eFileFormat;
75 StringEntry eName;
76 StringEntry eCreationDate;
77 StringEntryMultiLine eComments;
78 StringEntry eProduct;
79 StringEntry eCopyright;
80 StringEntry eArtists;
81 StringEntry eGenre;
82 StringEntry eKeywords;
83 StringEntry eEngineer;
84 StringEntry eTechnician;
85 StringEntry eSoftware;
86 StringEntry eMedium;
87 StringEntry eSource;
88 StringEntry eSourceForm;
89 StringEntry eCommissioned;
90 StringEntry eSubject;
91 Gtk::VBox vbox;
92 Gtk::HButtonBox buttonBox;
93 Gtk::Button quitButton;
94 Table table;
95
96 gig::File* m_file;
97
98 void onFileFormatChanged();
99 };
100
101 class InstrumentProps : public ManagedWindow,
102 public PropEditor<gig::Instrument> {
103 public:
104 InstrumentProps();
105 void set_instrument(gig::Instrument* instrument);
106 gig::Instrument* get_instrument() { return m; }
107 void update_name();
108 sigc::signal<void>& signal_name_changed() {
109 return sig_name_changed;
110 }
111
112 // implementation for abstract methods of interface class "ManagedWindow"
113 virtual Settings::Property<int>* windowSettingX() { return &Settings::singleton()->instrPropsWindowX; }
114 virtual Settings::Property<int>* windowSettingY() { return &Settings::singleton()->instrPropsWindowY; }
115 virtual Settings::Property<int>* windowSettingWidth() { return &Settings::singleton()->instrPropsWindowW; }
116 virtual Settings::Property<int>* windowSettingHeight() { return &Settings::singleton()->instrPropsWindowH; }
117
118 protected:
119 void set_Name(const gig::String& name);
120 void set_IsDrum(bool value);
121 void set_MIDIBank(uint16_t value);
122 void set_MIDIProgram(uint32_t value);
123
124 sigc::signal<void> sig_name_changed;
125 Gtk::VBox vbox;
126 Gtk::HButtonBox buttonBox;
127 Gtk::Button quitButton;
128 Table table;
129 StringEntry eName;
130 BoolEntry eIsDrum;
131 NumEntryTemp<uint16_t> eMIDIBank;
132 NumEntryTemp<uint32_t> eMIDIProgram;
133 NumEntryGain eAttenuation;
134 BoolEntryPlus6 eGainPlus6;
135 NumEntryTemp<uint16_t> eEffectSend;
136 NumEntryTemp<int16_t> eFineTune;
137 NumEntryTemp<uint16_t> ePitchbendRange;
138 BoolEntry ePianoReleaseMode;
139 NoteEntry eDimensionKeyRangeLow;
140 NoteEntry eDimensionKeyRangeHigh;
141 };
142
143 class ProgressDialog : public Gtk::Dialog {
144 public:
145 ProgressDialog(const Glib::ustring& title, Gtk::Window& parent);
146 void set_fraction(float fraction) { progressBar.set_fraction(fraction); }
147 protected:
148 Gtk::ProgressBar progressBar;
149 };
150
151 class Loader : public sigc::trackable {
152 public:
153 Loader(const char* filename);
154 void launch();
155 Glib::Dispatcher& signal_progress();
156 Glib::Dispatcher& signal_finished(); ///< Finished successfully, without error.
157 Glib::Dispatcher& signal_error();
158 void progress_callback(float fraction);
159 float get_progress();
160 const Glib::ustring filename;
161 Glib::ustring error_message;
162 gig::File* gig;
163
164 private:
165 Glib::Threads::Thread* thread;
166 void thread_function();
167 Glib::Dispatcher finished_dispatcher;
168 Glib::Dispatcher progress_dispatcher;
169 Glib::Dispatcher error_dispatcher;
170 Glib::Threads::Mutex progressMutex;
171 float progress;
172 };
173
174 class Saver : public sigc::trackable {
175 public:
176 Saver(gig::File* file, Glib::ustring filename = ""); ///< one argument means "save", two arguments means "save as"
177 void launch();
178 Glib::Dispatcher& signal_progress();
179 Glib::Dispatcher& signal_finished(); ///< Finished successfully, without error.
180 Glib::Dispatcher& signal_error();
181 void progress_callback(float fraction);
182 float get_progress();
183 gig::File* gig;
184 const Glib::ustring filename;
185 Glib::ustring error_message;
186
187 private:
188 Glib::Threads::Thread* thread;
189 void thread_function();
190 Glib::Dispatcher finished_dispatcher;
191 Glib::Dispatcher progress_dispatcher;
192 Glib::Dispatcher error_dispatcher;
193 Glib::Threads::Mutex progressMutex;
194 float progress;
195 };
196
197 class MainWindow : public ManagedWindow {
198 public:
199 MainWindow();
200 virtual ~MainWindow();
201 void load_file(const char* name);
202 void load_instrument(gig::Instrument* instr);
203 void file_changed();
204 sigc::signal<void, gig::File*>& signal_file_structure_to_be_changed();
205 sigc::signal<void, gig::File*>& signal_file_structure_changed();
206 sigc::signal<void, std::list<gig::Sample*> >& signal_samples_to_be_removed();
207 sigc::signal<void>& signal_samples_removed();
208 sigc::signal<void, gig::Region*>& signal_region_to_be_changed();
209 sigc::signal<void, gig::Region*>& signal_region_changed();
210 sigc::signal<void, gig::DimensionRegion*>& signal_dimreg_to_be_changed();
211 sigc::signal<void, gig::DimensionRegion*>& signal_dimreg_changed();
212 sigc::signal<void, gig::Sample*>& signal_sample_changed();
213 sigc::signal<void, gig::Sample*/*old*/, gig::Sample*/*new*/>& signal_sample_ref_changed();
214
215 sigc::signal<void, int/*key*/, int/*velocity*/>& signal_note_on();
216 sigc::signal<void, int/*key*/, int/*velocity*/>& signal_note_off();
217
218 sigc::signal<void, int/*key*/, int/*velocity*/>& signal_keyboard_key_hit();
219 sigc::signal<void, int/*key*/, int/*velocity*/>& signal_keyboard_key_released();
220
221 sigc::signal<void, gig::Instrument*>& signal_switch_sampler_instrument();
222
223 sigc::signal<void, gig::Script*> signal_script_to_be_changed;
224 sigc::signal<void, gig::Script*> signal_script_changed;
225
226 // implementation for abstract methods of interface class "ManagedWindow"
227 virtual Settings::Property<int>* windowSettingX() { return &Settings::singleton()->mainWindowX; }
228 virtual Settings::Property<int>* windowSettingY() { return &Settings::singleton()->mainWindowY; }
229 virtual Settings::Property<int>* windowSettingWidth() { return &Settings::singleton()->mainWindowW; }
230 virtual Settings::Property<int>* windowSettingHeight() { return &Settings::singleton()->mainWindowH; }
231
232 protected:
233 Glib::RefPtr<Gtk::ActionGroup> actionGroup;
234 Glib::RefPtr<Gtk::UIManager> uiManager;
235
236 Gtk::Statusbar m_StatusBar;
237 Gtk::Label m_AttachedStateLabel;
238 Gtk::Image m_AttachedStateImage;
239
240 RegionChooser m_RegionChooser;
241 DimRegionChooser m_DimRegionChooser;
242
243 PropDialog propDialog;
244 InstrumentProps instrumentProps;
245 MidiRules midiRules;
246
247 sigc::signal<void, gig::File*> file_structure_to_be_changed_signal;
248 sigc::signal<void, gig::File*> file_structure_changed_signal;
249 sigc::signal<void, std::list<gig::Sample*> > samples_to_be_removed_signal;
250 sigc::signal<void> samples_removed_signal;
251 sigc::signal<void, gig::Region*> region_to_be_changed_signal;
252 sigc::signal<void, gig::Region*> region_changed_signal;
253 sigc::signal<void, gig::DimensionRegion*> dimreg_to_be_changed_signal;
254 sigc::signal<void, gig::DimensionRegion*> dimreg_changed_signal;
255 sigc::signal<void, gig::Sample*> sample_changed_signal;
256 sigc::signal<void, gig::Sample*/*old*/, gig::Sample*/*new*/> sample_ref_changed_signal;
257
258 sigc::signal<void, int/*key*/, int/*velocity*/> note_on_signal;
259 sigc::signal<void, int/*key*/, int/*velocity*/> note_off_signal;
260
261 sigc::signal<void, gig::Instrument*> switch_sampler_instrument_signal;
262
263 void on_instrument_selection_change(Gtk::RadioMenuItem* item);
264 void on_sel_change();
265 void region_changed();
266 void dimreg_changed();
267 void select_instrument(gig::Instrument* instrument);
268 bool select_dimension_region(gig::DimensionRegion* dimRgn);
269 void select_sample(gig::Sample* sample);
270 void on_loader_progress();
271 void on_loader_finished();
272 void on_loader_error();
273 void on_saver_progress();
274 void on_saver_error();
275 void on_saver_finished();
276 void updateMacroMenu();
277 void onMacroSelected(int iMacro);
278 void setupMacros();
279 void onMacrosSetupChanged(const std::vector<Serialization::Archive>& macros);
280 void applyMacro(Serialization::Archive& macro);
281
282 void dimreg_all_dimregs_toggled();
283 gig::Instrument* get_instrument();
284 void add_region_to_dimregs(gig::Region* region, bool stereo, bool all_dimregs);
285 void update_dimregs();
286
287 class ModelColumns : public Gtk::TreeModel::ColumnRecord {
288 public:
289 ModelColumns() {
290 add(m_col_nr);
291 add(m_col_name);
292 add(m_col_instr);
293 }
294
295 Gtk::TreeModelColumn<int> m_col_nr;
296 Gtk::TreeModelColumn<Glib::ustring> m_col_name;
297 Gtk::TreeModelColumn<gig::Instrument*> m_col_instr;
298 } m_Columns;
299
300 Gtk::VBox m_VBox;
301 Gtk::HPaned m_HPaned;
302
303 Gtk::ScrolledWindow m_ScrolledWindow;
304
305 Gtk::TreeView m_TreeView;
306 Glib::RefPtr<Gtk::ListStore> m_refTreeModel;
307
308 Gtk::Menu* instrument_menu;
309
310 std::map<gig::Sample*,int> sample_ref_count;
311
312 class SamplesModel : public Gtk::TreeModel::ColumnRecord {
313 public:
314 SamplesModel() {
315 add(m_col_name);
316 add(m_col_sample);
317 add(m_col_group);
318 add(m_col_refcount);
319 add(m_color);
320 }
321
322 Gtk::TreeModelColumn<Glib::ustring> m_col_name;
323 Gtk::TreeModelColumn<gig::Sample*> m_col_sample;
324 Gtk::TreeModelColumn<gig::Group*> m_col_group;
325 Gtk::TreeModelColumn<Glib::ustring> m_col_refcount;
326 Gtk::TreeModelColumn<Glib::ustring> m_color;
327 } m_SamplesModel;
328
329 class SamplesTreeStore : public Gtk::TreeStore {
330 public:
331 static Glib::RefPtr<SamplesTreeStore> create(const SamplesModel& columns) {
332 return Glib::RefPtr<SamplesTreeStore>( new SamplesTreeStore(columns) );
333 }
334 protected:
335 SamplesTreeStore(const SamplesModel& columns) : Gtk::TreeStore(columns) {}
336 };
337
338 Gtk::ScrolledWindow m_ScrolledWindowSamples;
339 Gtk::TreeView m_TreeViewSamples;
340 Glib::RefPtr<SamplesTreeStore> m_refSamplesTreeModel;
341
342 class ScriptsModel : public Gtk::TreeModel::ColumnRecord {
343 public:
344 ScriptsModel() {
345 add(m_col_name);
346 add(m_col_script);
347 add(m_col_group);
348 }
349
350 Gtk::TreeModelColumn<Glib::ustring> m_col_name;
351 Gtk::TreeModelColumn<gig::Script*> m_col_script;
352 Gtk::TreeModelColumn<gig::ScriptGroup*> m_col_group;
353 } m_ScriptsModel;
354
355 class ScriptsTreeStore : public Gtk::TreeStore {
356 public:
357 static Glib::RefPtr<ScriptsTreeStore> create(const ScriptsModel& columns) {
358 return Glib::RefPtr<ScriptsTreeStore>( new ScriptsTreeStore(columns) );
359 }
360 protected:
361 ScriptsTreeStore(const ScriptsModel& columns) : Gtk::TreeStore(columns) {}
362 };
363
364 Gtk::ScrolledWindow m_ScrolledWindowScripts;
365 Gtk::TreeView m_TreeViewScripts;
366 Glib::RefPtr<ScriptsTreeStore> m_refScriptsTreeModel;
367
368 Gtk::VBox dimreg_vbox;
369 Gtk::HBox dimreg_hbox;
370 Gtk::Label dimreg_label;
371 Gtk::CheckButton dimreg_all_regions;
372 Gtk::CheckButton dimreg_all_dimregs;
373 Gtk::CheckButton dimreg_stereo;
374
375 Gtk::HBox legend_hbox;
376 Gtk::Label labelLegend;
377 Gtk::Image imageNoSample;
378 Gtk::Label labelNoSample;
379 Gtk::Image imageMissingSample;
380 Gtk::Label labelMissingSample;
381 Gtk::Image imageLooped;
382 Gtk::Label labelLooped;
383 Gtk::Image imageSomeLoops;
384 Gtk::Label labelSomeLoops;
385 DimRegionEdit dimreg_edit;
386
387 Gtk::Notebook m_TreeViewNotebook;
388
389 struct SampleImportItem {
390 gig::Sample* gig_sample; // pointer to the gig::Sample to
391 // which the sample data should be
392 // imported to
393 Glib::ustring sample_path; // file name of the sample to be
394 // imported
395 };
396 std::map<gig::Sample*, SampleImportItem> m_SampleImportQueue;
397
398
399 void on_action_file_new();
400 void on_action_file_open();
401 void on_action_file_save();
402 void on_action_file_save_as();
403 void on_action_file_properties();
404 void on_action_quit();
405 void show_instr_props();
406 bool instr_props_set_instrument();
407 void show_midi_rules();
408 void show_script_slots();
409 void on_action_view_status_bar();
410 void on_auto_restore_win_dim();
411 void on_save_with_temporary_file();
412 void on_action_refresh_all();
413 void on_action_warn_user_on_extensions();
414 void on_action_sync_sampler_instrument_selection();
415 void on_action_move_root_note_with_region_moved();
416 void on_action_help_about();
417
418 // sample right-click popup actions
419 void on_sample_treeview_button_release(GdkEventButton* button);
420 void on_action_sample_properties();
421 void on_action_add_group();
422 void on_action_add_sample();
423 void on_action_replace_sample();
424 void on_action_replace_all_samples_in_all_groups();
425 void on_action_remove_sample();
426 void on_action_remove_unused_samples();
427
428 // script right-click popup actions
429 void on_script_treeview_button_release(GdkEventButton* button);
430 void on_action_add_script_group();
431 void on_action_add_script();
432 void on_action_edit_script();
433 void on_action_remove_script();
434
435 void on_action_add_instrument();
436 void on_action_duplicate_instrument();
437 void on_action_remove_instrument();
438
439 void show_samples_tab();
440 void show_intruments_tab();
441 void show_scripts_tab();
442
443 void select_prev_region();
444 void select_next_region();
445
446 void select_next_dim_rgn_zone();
447 void select_prev_dim_rgn_zone();
448 void select_add_next_dim_rgn_zone();
449 void select_add_prev_dim_rgn_zone();
450 void select_prev_dimension();
451 void select_next_dimension();
452
453 Serialization::Archive m_serializationArchive; ///< Clipboard content.
454 std::vector<Serialization::Archive> m_macros; ///< User configured list of macros.
455
456 void copy_selected_dimrgn();
457 void paste_copied_dimrgn();
458 void adjust_clipboard_content();
459 void updateClipboardCopyAvailable();
460 void updateClipboardPasteAvailable();
461 void on_clipboard_owner_change(GdkEventOwnerChange* event);
462 void on_clipboard_get(Gtk::SelectionData& selection_data, guint info);
463 void on_clipboard_clear();
464 void on_clipboard_received(const Gtk::SelectionData& selection_data);
465 void on_clipboard_received_targets(const std::vector<Glib::ustring>& targets);
466
467 void add_instrument(gig::Instrument* instrument);
468 Gtk::RadioMenuItem* add_instrument_to_menu(const Glib::ustring& name,
469 int position = -1);
470 void remove_instrument_from_menu(int index);
471
472 ProgressDialog* progress_dialog;
473 Loader* loader;
474 Saver* saver;
475 void load_gig(gig::File* gig, const char* filename, bool isSharedInstrument = false);
476 void updateSampleRefCountMap(gig::File* gig);
477
478 gig::File* file;
479 bool file_is_shared;
480 bool file_has_name;
481 bool file_is_changed;
482 std::string filename;
483 std::string current_gig_dir;
484 std::string current_sample_dir;
485
486 void set_file_is_shared(bool);
487
488 bool file_save();
489 bool file_save_as();
490 bool check_if_savable();
491
492 void on_button_release(GdkEventButton* button);
493 void on_instruments_treeview_drag_begin(const Glib::RefPtr<Gdk::DragContext>& context);
494 void on_instruments_treeview_drag_data_get(const Glib::RefPtr<Gdk::DragContext>&,
495 Gtk::SelectionData& selection_data, guint, guint);
496 void on_instruments_treeview_drop_drag_data_received(
497 const Glib::RefPtr<Gdk::DragContext>& context, int, int,
498 const Gtk::SelectionData& selection_data, guint, guint time
499 );
500 void on_scripts_treeview_drag_begin(const Glib::RefPtr<Gdk::DragContext>& context);
501 void on_scripts_treeview_drag_data_get(const Glib::RefPtr<Gdk::DragContext>&,
502 Gtk::SelectionData& selection_data, guint, guint);
503 void on_sample_treeview_drag_begin(const Glib::RefPtr<Gdk::DragContext>& context);
504 void on_sample_treeview_drag_data_get(const Glib::RefPtr<Gdk::DragContext>&,
505 Gtk::SelectionData& selection_data, guint, guint);
506 void on_sample_label_drop_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context,
507 int, int,
508 const Gtk::SelectionData& selection_data,
509 guint, guint time);
510
511 void script_name_changed(const Gtk::TreeModel::Path& path,
512 const Gtk::TreeModel::iterator& iter);
513 void script_double_clicked(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column);
514 void sample_name_changed(const Gtk::TreeModel::Path& path,
515 const Gtk::TreeModel::iterator& iter);
516 void instrument_name_changed(const Gtk::TreeModel::Path& path,
517 const Gtk::TreeModel::iterator& iter);
518 void instr_name_changed_by_instr_props(Gtk::TreeModel::iterator& it);
519 sigc::connection instrument_name_connection;
520
521 void on_action_combine_instruments();
522 void on_action_view_references();
523 void on_action_merge_files();
524 void mergeFiles(const std::vector<std::string>& filenames);
525
526 void on_sample_ref_changed(gig::Sample* oldSample, gig::Sample* newSample);
527 void on_sample_ref_count_incremented(gig::Sample* sample, int offset);
528 void on_samples_to_be_removed(std::list<gig::Sample*> samples);
529
530 void add_or_replace_sample(bool replace);
531
532 void __import_queued_samples();
533 void __clear();
534 void __refreshEntireGUI();
535
536 bool close_confirmation_dialog();
537 bool leaving_shared_mode_dialog();
538
539 Gtk::Menu* popup_menu;
540
541 bool on_delete_event(GdkEventAny* event);
542
543 bool first_call_to_drag_data_get;
544
545 bool is_copy_samples_unity_note_enabled() const;
546 bool is_copy_samples_fine_tune_enabled() const;
547 bool is_copy_samples_loop_enabled() const;
548 };
549
550 #endif

  ViewVC Help
Powered by ViewVC