auto*trim_button=newFl_Button(16,520,180,30,"Trim clip to selection");trim_button->callback([](Fl_Widget*,void*c){autor=static_cast<SampleEditor*>(c)->trim_clip();if(r!=XTC_OK)fl_alert("Clip trim unchanged: %s",xtc_result_string(r));},this);
auto*save=newFl_Button(210,520,210,30,"Save full copy and relink...");save->callback([](Fl_Widget*,void*c){auto*e=static_cast<SampleEditor*>(c);constchar*path=fl_input("NEW absolute WAV path (full source; project undo keeps the new file)","");if(path){autor=e->save_copy(path,true);if(r!=XTC_OK)fl_alert("Copy not adopted: %s",xtc_result_string(r));}},this);
auto*fade=newFl_Button(532,562,160,30,"Sample fades...");fade->callback([](Fl_Widget*,void*c){auto*e=static_cast<SampleEditor*>(c);constchar*text=fl_input("Fade: 0 linear in, 1 linear out, 2 equal-power in, 3 equal-power out","0");if(!text)return;unsignedintmode;charextra;if(std::sscanf(text,"%u %c",&mode,&extra)!=1||mode>3){fl_alert("Enter a fade mode 0..3.");return;}autor=e->process(static_cast<xtc_sample_operation>(XTC_SAMPLE_FADE_IN+mode));if(r!=XTC_OK)fl_alert("Fade failed: %s",xtc_result_string(r));},this);
auto*gain=newFl_Button(704,562,160,30,"Gain / normalize...");gain->callback([](Fl_Widget*,void*c){auto*e=static_cast<SampleEditor*>(c);constchar*text=fl_input("Mode (0 gain, 1 normalize), linear gain 0..16 or target peak >0..1","1 0.9");if(!text)return;unsignedintmode;doublevalue;charextra;if(std::sscanf(text,"%u %lf %c",&mode,&value,&extra)!=2||mode>1){fl_alert("Enter mode and linear value.");return;}autor=e->process(mode?XTC_SAMPLE_NORMALIZE:XTC_SAMPLE_GAIN,value);if(r!=XTC_OK)fl_alert("Gain edit failed: %s",xtc_result_string(r));},this);
auto*silence=newFl_Button(876,562,200,30,"Select audible bounds...");silence->callback([](Fl_Widget*,void*c){auto*e=static_cast<SampleEditor*>(c);constchar*text=fl_input("Silence threshold dBFS (-120..0), padding ms (0..10000)","-60 2");if(!text)return;doubledb,ms;charextra;if(std::sscanf(text,"%lf %lf %c",&db,&ms,&extra)!=2||!std::isfinite(db)||!std::isfinite(ms)||db<-120||db>0||ms<0||ms>10000){fl_alert("Enter a threshold and padding within the shown bounds.");return;}autor=e->select_audible(std::pow(10.,db/20),static_cast<size_t>(std::min(static_cast<double>(e->frames_),ms*e->rate_/1000)));if(r!=XTC_OK)fl_alert("Audible bounds not found: %s",xtc_result_string(r));},this);
auto*undo=newFl_Button(850,604,110,30,"Undo / redo");undo->callback([](Fl_Widget*,void*c){autor=static_cast<SampleEditor*>(c)->undo_sample();if(r!=XTC_OK)fl_alert("No local sample edit to undo.");},this);