/[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 3134 - (show annotations) (download) (as text)
Fri Apr 28 12:41:12 2017 UTC (6 years, 11 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 19203 byte(s)
* Implemented selecting multiple dimension region zones by keyboard with
  keyboard accelerators Alt+Shift+Left and Alt+Shift+Right.
* Bumped version (1.0.0.svn31).

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

  ViewVC Help
Powered by ViewVC