--- gigedit/trunk/src/gigedit/dimregionedit.cpp 2007/07/05 17:12:20 1261 +++ gigedit/trunk/src/gigedit/dimregionedit.cpp 2007/10/10 15:48:54 1396 @@ -19,8 +19,7 @@ #include "dimregionedit.h" -#include -#define _(String) gettext(String) +#include "global.h" DimRegionEdit::DimRegionEdit() : eEG1PreAttack("Pre-attack", 0, 100, 2), @@ -499,7 +498,19 @@ table[pageno]->attach(boolentry.widget, 1, 3, rowno, rowno + 1, Gtk::FILL, Gtk::SHRINK); rowno++; - boolentry.signal_changed_by_user().connect(dimreg_changed_signal.make_slot()); + boolentry.signal_changed_by_user().connect( + sigc::bind(dimreg_changed_signal.make_slot(), sigc::ref(this->dimregion)) + ); +} + +void DimRegionEdit::addProp(BoolEntryPlus6& boolentry) +{ + table[pageno]->attach(boolentry.widget, 1, 3, rowno, rowno + 1, + Gtk::FILL, Gtk::SHRINK); + rowno++; + boolentry.signal_changed_by_user().connect( + sigc::bind(dimreg_changed_signal.make_slot(), sigc::ref(this->dimregion)) + ); } void DimRegionEdit::addProp(LabelWidget& prop) @@ -509,7 +520,9 @@ table[pageno]->attach(prop.widget, 2, 3, rowno, rowno + 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK); rowno++; - prop.signal_changed_by_user().connect(dimreg_changed_signal.make_slot()); + prop.signal_changed_by_user().connect( + sigc::bind(dimreg_changed_signal.make_slot(), sigc::ref(this->dimregion)) + ); } @@ -517,6 +530,18 @@ { dimregion = d; + // disconnect connections to old dimregion, to avoid segfaults + connection_eVCFCutoffController.disconnect(); + connection_eVCFVelocityCurve.disconnect(); + connection_eVCFVelocityScale.disconnect(); + connection_eVCFVelocityDynamicRange.disconnect(); + connection_eVelocityResponseCurve.disconnect(); + connection_eVelocityResponseDepth.disconnect(); + connection_eVelocityResponseCurveScaling.disconnect(); + connection_eReleaseVelocityResponseCurve.disconnect(); + connection_eReleaseVelocityResponseDepth.disconnect(); + connection_eGain.disconnect(); + set_sensitive(d); if (!d) return; @@ -568,21 +593,57 @@ eVCFEnabled.set_ptr(&d->VCFEnabled); eVCFType.set_ptr(&d->VCFType); eVCFCutoffController.set_ptr(&d->VCFCutoffController); + connection_eVCFCutoffController = + eVCFCutoffController.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetVCFCutoffController) + ); eVCFCutoffControllerInvert.set_ptr(&d->VCFCutoffControllerInvert); eVCFCutoff.set_ptr(&d->VCFCutoff); eVCFVelocityCurve.set_ptr(&d->VCFVelocityCurve); + connection_eVCFVelocityCurve = + eVCFVelocityCurve.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetVCFVelocityCurve) + ); eVCFVelocityScale.set_ptr(&d->VCFVelocityScale); + connection_eVCFVelocityScale = + eVCFVelocityScale.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetVCFVelocityScale) + ); eVCFVelocityDynamicRange.set_ptr(&d->VCFVelocityDynamicRange); + connection_eVCFVelocityDynamicRange = + eVCFVelocityDynamicRange.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetVCFVelocityDynamicRange) + ); eVCFResonance.set_ptr(&d->VCFResonance); eVCFResonanceDynamic.set_ptr(&d->VCFResonanceDynamic); eVCFResonanceController.set_ptr(&d->VCFResonanceController); eVCFKeyboardTracking.set_ptr(&d->VCFKeyboardTracking); eVCFKeyboardTrackingBreakpoint.set_ptr(&d->VCFKeyboardTrackingBreakpoint); eVelocityResponseCurve.set_ptr(&d->VelocityResponseCurve); + connection_eVelocityResponseCurve = + eVelocityResponseCurve.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetVelocityResponseCurve) + ); eVelocityResponseDepth.set_ptr(&d->VelocityResponseDepth); + connection_eVelocityResponseDepth = + eVelocityResponseDepth.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetVelocityResponseDepth) + ); eVelocityResponseCurveScaling.set_ptr(&d->VelocityResponseCurveScaling); + connection_eVelocityResponseCurveScaling = + eVelocityResponseCurveScaling.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetVelocityResponseCurveScaling) + ); eReleaseVelocityResponseCurve.set_ptr(&d->ReleaseVelocityResponseCurve); + connection_eReleaseVelocityResponseCurve = + eReleaseVelocityResponseCurve.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetReleaseVelocityResponseCurve) + ); eReleaseVelocityResponseDepth.set_ptr(&d->ReleaseVelocityResponseDepth); + connection_eReleaseVelocityResponseDepth = + eReleaseVelocityResponseDepth.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetReleaseVelocityResponseDepth) + ); eReleaseTriggerDecay.set_ptr(&d->ReleaseTriggerDecay); eCrossfade_in_start.set_ptr(0); @@ -608,6 +669,10 @@ eUnityNote.set_ptr(&d->UnityNote); eFineTune.set_ptr(&d->FineTune); eGain.set_ptr(&d->Gain); + connection_eGain = + eGain.signal_value_changed().connect( + sigc::mem_fun(d, &gig::DimensionRegion::SetGain) + ); eGainPlus6.set_ptr(&d->Gain); eSampleLoopEnabled.set_active(d->SampleLoops); @@ -783,16 +848,18 @@ loop.LoopStart = 0; loop.LoopLength = (dimregion->pSample) ? dimregion->pSample->GetSize() : 0; + dimreg_to_be_changed_signal.emit(dimregion); dimregion->AddSampleLoop(&loop); - dimreg_changed_signal(); + dimreg_changed_signal.emit(dimregion); } } else { if (dimregion->SampleLoops) { + dimreg_to_be_changed_signal.emit(dimregion); // delete ALL existing sample loops while (dimregion->SampleLoops) { dimregion->DeleteSampleLoop(&dimregion->pSampleLoops[0]); } - dimreg_changed_signal(); + dimreg_changed_signal.emit(dimregion); } } updateLoopElements(); @@ -804,7 +871,7 @@ eSampleLoopStart.set_sensitive(active); eSampleLoopLength.set_sensitive(active); eSampleLoopType.set_sensitive(active); - eSampleLoopInfinite.set_sensitive(active); + eSampleLoopInfinite.set_sensitive(active && dimregion && dimregion->pSample); eSampleLoopStart.set_ptr(0); eSampleLoopLength.set_ptr(0); eSampleLoopPlayCount.set_ptr(0); @@ -826,13 +893,13 @@ // sample loop shall never be longer than the actual sample size eSampleLoopStart.set_upper( (dimregion->pSample) - ? dimregion->pSample->GetSize() - + ? dimregion->pSample->SamplesTotal - dimregion->pSampleLoops[0].LoopLength : 0 ); eSampleLoopLength.set_upper( (dimregion->pSample) - ? dimregion->pSample->GetSize() - + ? dimregion->pSample->SamplesTotal - dimregion->pSampleLoops[0].LoopStart : 0 ); @@ -845,6 +912,7 @@ void DimRegionEdit::loop_infinite_toggled() { eSampleLoopPlayCount.set_sensitive( + dimregion && dimregion->pSample && !eSampleLoopInfinite.get_active() && eSampleLoopEnabled.get_active() ); @@ -853,3 +921,61 @@ else if (!eSampleLoopPlayCount.get_value()) eSampleLoopPlayCount.set_value(1); } + +bool DimRegionEdit::set_sample(gig::Sample* sample) +{ + if (dimregion) { + //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); + + gig::Sample* oldref = dimregion->pSample; + dimregion->pSample = sample; + + // copy sample information from Sample to DimensionRegion + + dimregion->UnityNote = sample->MIDIUnityNote; + dimregion->FineTune = sample->FineTune; + + int loops = sample->Loops ? 1 : 0; + while (dimregion->SampleLoops > loops) { + dimregion->DeleteSampleLoop(&dimregion->pSampleLoops[0]); + } + while (dimregion->SampleLoops < sample->Loops) { + DLS::sample_loop_t loop; + dimregion->AddSampleLoop(&loop); + } + if (loops) { + dimregion->pSampleLoops[0].Size = sizeof(DLS::sample_loop_t); + dimregion->pSampleLoops[0].LoopType = sample->LoopType; + dimregion->pSampleLoops[0].LoopStart = sample->LoopStart; + dimregion->pSampleLoops[0].LoopLength = sample->LoopEnd - sample->LoopStart + 1; + } + + // update ui + wSample->set_text(dimregion->pSample->pInfo->Name); + eUnityNote.set_ptr(&dimregion->UnityNote); + eFineTune.set_ptr(&dimregion->FineTune); + eSampleLoopEnabled.set_active(dimregion->SampleLoops); + updateLoopElements(); + + 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; +} + +sigc::signal& DimRegionEdit::signal_dimreg_to_be_changed() { + return dimreg_to_be_changed_signal; +} + +sigc::signal& DimRegionEdit::signal_dimreg_changed() { + return dimreg_changed_signal; +} + +sigc::signal& DimRegionEdit::signal_sample_ref_changed() { + return sample_ref_changed_signal; +}