--- gigedit/trunk/src/gigedit/dimregionedit.cpp 2015/08/30 10:00:49 2841 +++ gigedit/trunk/src/gigedit/dimregionedit.cpp 2017/05/11 20:59:46 3177 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2015 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 @@ -230,8 +230,10 @@ eMSDecode(_("Decode Mid/Side Recordings")), eSampleStartOffset(_("Sample start offset"), 0, 2000), eUnityNote(_("Unity note")), + eSampleGroup(_("Sample Group")), eSampleFormatInfo(_("Sample Format")), eSampleID("Sample ID"), + eChecksum("Wave Data CRC-32"), eFineTune(_("Fine tune"), -49, 50), eGain(_("Gain"), -96, 0, 2, -655360), eGainPlus6(_("Gain +6dB"), eGain, 6 * -655360), @@ -244,6 +246,10 @@ buttonSelectSample(UNICODE_LEFT_ARROW + " " + _("Select Sample")), update_model(0) { + // make synthesis parameter page tabs scrollable + // (workaround for GTK3: default theme uses huge tabs which breaks layout) + set_scrollable(); + connect(eEG1PreAttack, &gig::DimensionRegion::EG1PreAttack); connect(eEG1Attack, &gig::DimensionRegion::EG1Attack); connect(eEG1Decay1, &gig::DimensionRegion::EG1Decay1); @@ -463,8 +469,10 @@ wSample->set_tooltip_text(_("Drag & drop a sample here")); #endif addProp(eUnityNote); + addProp(eSampleGroup); addProp(eSampleFormatInfo); addProp(eSampleID); + addProp(eChecksum); addRightHandSide(buttonSelectSample); addHeader(_("Optional Settings")); addProp(eSampleStartOffset); @@ -1017,6 +1025,13 @@ eMSDecode.set_value(d->MSDecode); eSampleStartOffset.set_value(d->SampleStartOffset); eUnityNote.set_value(d->UnityNote); + // show sample group name + { + Glib::ustring s = "---"; + if (d->pSample && d->pSample->GetGroup()) + s = d->pSample->GetGroup()->Name; + eSampleGroup.text.set_text(s); + } // assemble sample format info string { Glib::ustring s; @@ -1048,6 +1063,16 @@ } eSampleID.text.set_text(s); } + // generate raw wave form data CRC-32 checksum string + { + Glib::ustring s = "---"; + if (d->pSample) { + char buf[64] = {}; + snprintf(buf, sizeof(buf), "%x", d->pSample->GetWaveDataCRC32Checksum()); + s = buf; + } + eChecksum.text.set_text(s); + } buttonSelectSample.set_sensitive(d && d->pSample); eFineTune.set_value(d->FineTune); eGain.set_value(d->Gain); @@ -1290,18 +1315,29 @@ bool DimRegionEdit::set_sample(gig::Sample* sample, bool copy_sample_unity, bool copy_sample_tune, bool copy_sample_loop) { - if (dimregion) { + bool result = false; + for (std::set::iterator itDimReg = dimregs.begin(); + itDimReg != dimregs.end(); ++itDimReg) + { + result |= set_sample(*itDimReg, sample, copy_sample_unity, copy_sample_tune, copy_sample_loop); + } + return result; +} + +bool DimRegionEdit::set_sample(gig::DimensionRegion* dimreg, gig::Sample* sample, bool copy_sample_unity, bool copy_sample_tune, bool copy_sample_loop) +{ + if (dimreg) { //TODO: we should better move the code from MainWindow::on_sample_label_drop_drag_data_received() here // currently commented because we're sending a similar signal in MainWindow::on_sample_label_drop_drag_data_received() - //dimreg_to_be_changed_signal.emit(dimregion); + //DimRegionChangeGuard(this, dimregion); // make sure stereo samples always are the same in both // dimregs in the samplechannel dimension int nbDimregs = 1; - gig::DimensionRegion* d[2] = { dimregion, 0 }; + gig::DimensionRegion* d[2] = { dimreg, 0 }; if (sample->Channels == 2) { - gig::Region* region = dimregion->GetParent(); + gig::Region* region = dimreg->GetParent(); int bitcount = 0; int stereo_bit = 0; @@ -1316,7 +1352,7 @@ if (stereo_bit) { int dimregno; for (dimregno = 0 ; dimregno < region->DimensionRegions ; dimregno++) { - if (region->pDimensionRegions[dimregno] == dimregion) { + if (region->pDimensionRegions[dimregno] == dimreg) { break; } } @@ -1326,7 +1362,7 @@ } } - gig::Sample* oldref = dimregion->pSample; + gig::Sample* oldref = dimreg->pSample; for (int i = 0 ; i < nbDimregs ; i++) { d[i]->pSample = sample; @@ -1356,16 +1392,14 @@ // update ui update_model++; - wSample->set_text(gig_to_utf8(dimregion->pSample->pInfo->Name)); - eUnityNote.set_value(dimregion->UnityNote); - eFineTune.set_value(dimregion->FineTune); - eSampleLoopEnabled.set_value(dimregion->SampleLoops); + wSample->set_text(gig_to_utf8(dimreg->pSample->pInfo->Name)); + eUnityNote.set_value(dimreg->UnityNote); + eFineTune.set_value(dimreg->FineTune); + eSampleLoopEnabled.set_value(dimreg->SampleLoops); update_loop_elements(); update_model--; sample_ref_changed_signal.emit(oldref, sample); - // currently commented because we're sending a similar signal in MainWindow::on_sample_label_drop_drag_data_received() - //dimreg_changed_signal.emit(dimregion); return true; } return false; @@ -1434,24 +1468,24 @@ if (value) { // create a new sample loop in case there is none yet if (!d->SampleLoops) { + DimRegionChangeGuard(this, d); + DLS::sample_loop_t loop; loop.LoopType = gig::loop_type_normal; // loop the whole sample by default loop.LoopStart = 0; loop.LoopLength = (d->pSample) ? d->pSample->SamplesTotal : 0; - dimreg_to_be_changed_signal.emit(d); d->AddSampleLoop(&loop); - dimreg_changed_signal.emit(d); } } else { if (d->SampleLoops) { - dimreg_to_be_changed_signal.emit(d); + DimRegionChangeGuard(this, d); + // delete ALL existing sample loops while (d->SampleLoops) { d->DeleteSampleLoop(&d->pSampleLoops[0]); } - dimreg_changed_signal.emit(d); } } } @@ -1501,7 +1535,7 @@ gig::Sample* oldref = dimregion->pSample; if (!oldref) return; - dimreg_to_be_changed_signal.emit(dimregion); + DimRegionChangeGuard(this, dimregion); // in case currently assigned sample is a stereo one, then remove both // references (expected to be due to a "stereo dimension") @@ -1539,7 +1573,6 @@ set_dim_region(dimregion); sample_ref_changed_signal.emit(oldref, NULL); - dimreg_changed_signal.emit(dimregion); } void DimRegionEdit::onButtonSelectSamplePressed() {