64
Table::Table(int x, int y) : Gtk::Table(x, y), rowno(0) { }
66
void Table::add(BoolEntry& boolentry)
68
attach(boolentry.widget, 0, 2, rowno, rowno + 1,
69
Gtk::FILL, Gtk::SHRINK);
73
void Table::add(BoolEntryPlus6& boolentry)
75
attach(boolentry.widget, 0, 2, rowno, rowno + 1,
76
Gtk::FILL, Gtk::SHRINK);
80
void Table::add(LabelWidget& prop)
82
attach(prop.label, 1, 2, rowno, rowno + 1,
83
Gtk::FILL, Gtk::SHRINK);
84
attach(prop.widget, 2, 3, rowno, rowno + 1,
85
Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK);
64
89
MainWindow::MainWindow() :
65
90
dimreg_label(_("Changes apply to:")),
66
91
dimreg_all_regions(_("all regions")),
587
626
Gtk::FileFilter filter;
588
627
filter.add_pattern("*.gig");
589
628
dialog.set_filter(filter);
590
if (current_dir != "") {
591
dialog.set_current_folder(current_dir);
629
if (current_gig_dir != "") {
630
dialog.set_current_folder(current_gig_dir);
593
632
if (dialog.run() == Gtk::RESPONSE_OK) {
594
633
std::string filename = dialog.get_filename();
595
634
printf("filename=%s\n", filename.c_str());
596
635
printf("on_action_file_open self=%x\n", Glib::Thread::self());
597
636
load_file(filename.c_str());
598
current_dir = Glib::path_get_dirname(filename);
637
current_gig_dir = Glib::path_get_dirname(filename);
602
641
void MainWindow::load_file(const char* name)
605
load_dialog = new LoadDialog("Loading...", *this);
644
load_dialog = new LoadDialog(_("Loading..."), *this);
606
645
load_dialog->show_all();
607
646
loader = new Loader(strdup(name));
608
647
loader->signal_progress().connect(
716
755
filter.add_pattern("*.gig");
717
756
dialog.set_filter(filter);
719
if (Glib::path_is_absolute(filename)) {
720
dialog.set_filename(filename);
721
} else if (current_dir != "") {
722
dialog.set_current_folder(current_dir);
758
// set initial dir and filename of the Save As dialog
759
// and prepare that initial filename as a copy of the gig
761
std::string basename = Glib::path_get_basename(filename);
762
std::string dir = Glib::path_get_dirname(filename);
763
basename = std::string(_("copy_of_")) + basename;
764
Glib::ustring copyFileName = Glib::build_filename(dir, basename);
765
if (Glib::path_is_absolute(filename)) {
766
dialog.set_filename(copyFileName);
768
if (current_gig_dir != "") dialog.set_current_folder(current_gig_dir);
770
dialog.set_current_name(Glib::filename_display_basename(copyFileName));
724
dialog.set_current_name(Glib::filename_display_basename(filename));
773
// show warning in the dialog
774
Gtk::HBox descriptionArea;
775
descriptionArea.set_spacing(15);
776
Gtk::Image warningIcon(Gtk::Stock::DIALOG_WARNING, Gtk::IconSize(Gtk::ICON_SIZE_DIALOG));
777
descriptionArea.pack_start(warningIcon, Gtk::PACK_SHRINK);
778
view::WrapLabel description;
779
description.set_markup(
780
_("\n<b>CAUTION:</b> You <b>MUST</b> use the "
781
"<span style=\"italic\">\"Save\"</span> dialog instead of "
782
"<span style=\"italic\">\"Save As...\"</span> if you want to save "
783
"to the same .gig file. Using "
784
"<span style=\"italic\">\"Save As...\"</span> for writing to the "
785
"same .gig file will end up in corrupted sample wave data!\n")
787
descriptionArea.pack_start(description);
788
dialog.get_vbox()->pack_start(descriptionArea, Gtk::PACK_SHRINK);
789
descriptionArea.show_all();
726
791
if (dialog.run() == Gtk::RESPONSE_OK) {
727
792
file_structure_to_be_changed_signal.emit(this->file);
872
944
PropDialog::PropDialog()
947
eCreationDate(_("Creation date")),
948
eComments(_("Comments")),
949
eProduct(_("Product")),
950
eCopyright(_("Copyright")),
951
eArtists(_("Artists")),
953
eKeywords(_("Keywords")),
954
eEngineer(_("Engineer")),
955
eTechnician(_("Technician")),
956
eSoftware(_("Software")),
957
eMedium(_("Medium")),
958
eSource(_("Source")),
959
eSourceForm(_("Source form")),
960
eCommissioned(_("Commissioned")),
961
eSubject(_("Subject")),
962
quitButton(Gtk::Stock::CLOSE),
965
set_title(_("File Properties"));
966
eName.set_width_chars(50);
968
connect(eName, &DLS::Info::Name);
969
connect(eCreationDate, &DLS::Info::CreationDate);
970
connect(eComments, &DLS::Info::Comments);
971
connect(eProduct, &DLS::Info::Product);
972
connect(eCopyright, &DLS::Info::Copyright);
973
connect(eArtists, &DLS::Info::Artists);
974
connect(eGenre, &DLS::Info::Genre);
975
connect(eKeywords, &DLS::Info::Keywords);
976
connect(eEngineer, &DLS::Info::Engineer);
977
connect(eTechnician, &DLS::Info::Technician);
978
connect(eSoftware, &DLS::Info::Software);
979
connect(eMedium, &DLS::Info::Medium);
980
connect(eSource, &DLS::Info::Source);
981
connect(eSourceForm, &DLS::Info::SourceForm);
982
connect(eCommissioned, &DLS::Info::Commissioned);
983
connect(eSubject, &DLS::Info::Subject);
986
table.add(eCreationDate);
987
table.add(eComments);
989
table.add(eCopyright);
992
table.add(eKeywords);
993
table.add(eEngineer);
994
table.add(eTechnician);
995
table.add(eSoftware);
998
table.add(eSourceForm);
999
table.add(eCommissioned);
1000
table.add(eSubject);
875
1002
table.set_col_spacings(5);
876
const char* propLabels[] = {
879
"Comments:", // TODO: multiline
887
"Software:", // TODO: readonly
894
for (int i = 0 ; i < sizeof(propLabels) / sizeof(char*) ; i++) {
895
label[i].set_text(propLabels[i]);
896
label[i].set_alignment(Gtk::ALIGN_LEFT);
897
table.attach(label[i], 0, 1, i, i + 1, Gtk::FILL, Gtk::SHRINK);
898
table.attach(entry[i], 1, 2, i, i + 1, Gtk::FILL | Gtk::EXPAND,
1004
table.set_border_width(5);
1006
vbox.pack_start(buttonBox, Gtk::PACK_SHRINK);
1007
buttonBox.set_layout(Gtk::BUTTONBOX_END);
1008
buttonBox.set_border_width(5);
1010
buttonBox.pack_start(quitButton);
1011
quitButton.set_flags(Gtk::CAN_DEFAULT);
1012
quitButton.grab_focus();
1013
quitButton.signal_clicked().connect(
1014
sigc::mem_fun(*this, &PropDialog::hide));
903
// add_button(Gtk::Stock::CANCEL, 0);
904
// add_button(Gtk::Stock::OK, 1);
905
1018
show_all_children();
908
1021
void PropDialog::set_info(DLS::Info* info)
910
entry[0].set_text(info->Name);
911
entry[1].set_text(info->CreationDate);
912
entry[2].set_text(Glib::convert(info->Comments, "UTF-8", "ISO-8859-1"));
913
entry[3].set_text(info->Product);
914
entry[4].set_text(info->Copyright);
915
entry[5].set_text(info->Artists);
916
entry[6].set_text(info->Genre);
917
entry[7].set_text(info->Keywords);
918
entry[8].set_text(info->Engineer);
919
entry[9].set_text(info->Technician);
920
entry[10].set_text(info->Software);
921
entry[11].set_text(info->Medium);
922
entry[12].set_text(info->Source);
923
entry[13].set_text(info->SourceForm);
924
entry[14].set_text(info->Commissioned);
925
entry[15].set_text(info->Subject);
1025
eName.set_value(info->Name);
1026
eCreationDate.set_value(info->CreationDate);
1027
eComments.set_value(info->Comments);
1028
eProduct.set_value(info->Product);
1029
eCopyright.set_value(info->Copyright);
1030
eArtists.set_value(info->Artists);
1031
eGenre.set_value(info->Genre);
1032
eKeywords.set_value(info->Keywords);
1033
eEngineer.set_value(info->Engineer);
1034
eTechnician.set_value(info->Technician);
1035
eSoftware.set_value(info->Software);
1036
eMedium.set_value(info->Medium);
1037
eSource.set_value(info->Source);
1038
eSourceForm.set_value(info->SourceForm);
1039
eCommissioned.set_value(info->Commissioned);
1040
eSubject.set_value(info->Subject);
1044
sigc::signal<void>& PropDialog::signal_info_changed()
1046
return info_changed;
928
1049
void InstrumentProps::set_IsDrum(bool value)
959
void InstrumentProps::add_prop(BoolEntry& boolentry)
961
table.attach(boolentry.widget, 0, 2, rowno, rowno + 1,
962
Gtk::FILL, Gtk::SHRINK);
966
void InstrumentProps::add_prop(BoolEntryPlus6& boolentry)
968
table.attach(boolentry.widget, 0, 2, rowno, rowno + 1,
969
Gtk::FILL, Gtk::SHRINK);
973
void InstrumentProps::add_prop(LabelWidget& prop)
975
table.attach(prop.label, 0, 1, rowno, rowno + 1,
976
Gtk::FILL, Gtk::SHRINK);
977
table.attach(prop.widget, 1, 2, rowno, rowno + 1,
978
Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK);
982
1080
InstrumentProps::InstrumentProps()
984
1082
quitButton(Gtk::Stock::CLOSE),
987
eMIDIBank("MIDI bank", 0, 16383),
988
eMIDIProgram("MIDI program"),
989
eAttenuation("Attenuation", 0, 96, 0, 1),
990
eGainPlus6("Gain +6dB", eAttenuation, -6),
991
eEffectSend("Effect send", 0, 65535),
992
eFineTune("Fine tune", -8400, 8400),
993
ePitchbendRange("Pitchbend range", 0, 12),
994
ePianoReleaseMode("Piano release mode"),
995
eDimensionKeyRangeLow("Dimension key range low"),
996
eDimensionKeyRangeHigh("Dimension key range high"),
1084
eIsDrum(_("Is drum")),
1085
eMIDIBank(_("MIDI bank"), 0, 16383),
1086
eMIDIProgram(_("MIDI program")),
1087
eAttenuation(_("Attenuation"), 0, 96, 0, 1),
1088
eGainPlus6(_("Gain +6dB"), eAttenuation, -6),
1089
eEffectSend(_("Effect send"), 0, 65535),
1090
eFineTune(_("Fine tune"), -8400, 8400),
1091
ePitchbendRange(_("Pitchbend range"), 0, 12),
1092
ePianoReleaseMode(_("Piano release mode")),
1093
eDimensionKeyRangeLow(_("Keyswitching range low")),
1094
eDimensionKeyRangeHigh(_("Keyswitching range high")),
999
set_title("Instrument properties");
1097
set_title(_("Instrument Properties"));
1099
eDimensionKeyRangeLow.set_tip(
1100
_("start of the keyboard area which should switch the "
1101
"\"keyswitching\" dimension")
1103
eDimensionKeyRangeHigh.set_tip(
1104
_("end of the keyboard area which should switch the "
1105
"\"keyswitching\" dimension")
1001
1108
connect(eIsDrum, &InstrumentProps::set_IsDrum);
1002
1109
connect(eMIDIBank, &InstrumentProps::set_MIDIBank);
1310
1416
for (int i = 0; supportedFileTypes[i]; i++)
1311
1417
soundfilter.add_pattern(supportedFileTypes[i]);
1312
soundfilter.set_name("Sound Files");
1418
soundfilter.set_name(_("Sound Files"));
1313
1419
Gtk::FileFilter allpassfilter; // matches every file
1314
1420
allpassfilter.add_pattern("*.*");
1315
allpassfilter.set_name("All Files");
1421
allpassfilter.set_name(_("All Files"));
1316
1422
dialog.add_filter(soundfilter);
1317
1423
dialog.add_filter(allpassfilter);
1424
if (current_sample_dir != "") {
1425
dialog.set_current_folder(current_sample_dir);
1318
1427
if (dialog.run() == Gtk::RESPONSE_OK) {
1428
current_sample_dir = dialog.get_current_folder();
1319
1429
Glib::ustring error_files;
1320
1430
Glib::SListHandle<Glib::ustring> filenames = dialog.get_filenames();
1321
1431
for (Glib::SListHandle<Glib::ustring>::iterator iter = filenames.begin();
1541
void MainWindow::on_action_replace_all_samples_in_all_groups()
1544
Gtk::FileChooserDialog dialog(*this, _("Select Folder"),
1545
Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
1546
view::WrapLabel description(
1547
_("This is a very specific function. It tries to replace all samples "
1548
"in the current gig file by samples located in the chosen "
1550
"It works like this: For each sample in the gig file, it tries to "
1551
"find a sample file in the selected directory with the same name as "
1552
"the sample in the gig file. Optionally, you can add a filename "
1553
"extension below, which will be added to the filename expected to be "
1554
"found. That is, assume you have a gig file with a sample called "
1555
"'Snare', if you enter '.wav' below (like it's done by default), it "
1556
"expects to find a sample file called 'Snare.wav' and will replace "
1557
"the sample in the gig file accordingly. If you don't need an "
1558
"extension, blank the field below. Any gig sample where no "
1559
"appropriate sample file could be found will be reported and left "
1562
Gtk::HBox entryArea;
1563
Gtk::Label entryLabel( _("Add filename extension: "), Gtk::ALIGN_RIGHT);
1564
Gtk::Entry postfixEntryBox;
1565
postfixEntryBox.set_text(".wav");
1566
entryArea.pack_start(entryLabel);
1567
entryArea.pack_start(postfixEntryBox);
1568
dialog.get_vbox()->pack_start(description, Gtk::PACK_SHRINK);
1569
dialog.get_vbox()->pack_start(entryArea, Gtk::PACK_SHRINK);
1571
entryArea.show_all();
1572
dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
1573
dialog.add_button(_("Select"), Gtk::RESPONSE_OK);
1574
dialog.set_select_multiple(false);
1575
if (current_sample_dir != "") {
1576
dialog.set_current_folder(current_sample_dir);
1578
if (dialog.run() == Gtk::RESPONSE_OK)
1580
current_sample_dir = dialog.get_current_folder();
1581
Glib::ustring error_files;
1582
Glib::ustring folder = dialog.get_filename();
1583
for (gig::Sample* sample = file->GetFirstSample();
1584
sample; sample = file->GetNextSample())
1586
std::string filename =
1587
folder + G_DIR_SEPARATOR_S + sample->pInfo->Name +
1588
postfixEntryBox.get_text().raw();
1591
SNDFILE* hFile = sf_open(filename.c_str(), SFM_READ, &info);
1594
if (!hFile) throw std::string(_("could not open file"));
1596
switch (info.format & 0xff) {
1597
case SF_FORMAT_PCM_S8:
1598
case SF_FORMAT_PCM_16:
1599
case SF_FORMAT_PCM_U8:
1602
case SF_FORMAT_PCM_24:
1603
case SF_FORMAT_PCM_32:
1604
case SF_FORMAT_FLOAT:
1605
case SF_FORMAT_DOUBLE:
1610
throw std::string(_("format not supported"));
1612
SampleImportItem sched_item;
1613
sched_item.gig_sample = sample;
1614
sched_item.sample_path = filename;
1615
m_SampleImportQueue.push_back(sched_item);
1619
catch (std::string what)
1621
if (error_files.size()) error_files += "\n";
1622
error_files += filename += " (" + what + ")";
1625
// show error message box when some file(s) could not be opened / added
1626
if (error_files.size()) {
1628
_("Could not replace the following sample(s):\n") + error_files;
1629
Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);
1431
1635
void MainWindow::on_action_remove_sample() {
1432
1636
if (!file) return;
1433
1637
Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewSamples.get_selection();