Merge remote-tracking branch 'origin/master' into newFilePicker

This commit is contained in:
tildearrow 2025-10-04 04:05:25 -05:00
commit f9372ec53f
19 changed files with 224 additions and 67 deletions

View file

@ -50,7 +50,7 @@ void FurnaceGUI::drawChannels() {
ImGui::TableNextColumn();
ImGui::Text(_("Osc"));
ImGui::TableNextColumn();
ImGui::Text(_("Swap"));
ImGui::Text("%s", "");
ImGui::TableNextColumn();
ImGui::Text(_("Name"));
for (int i=0; i<e->getTotalChannelCount(); i++) {
@ -79,14 +79,17 @@ void FurnaceGUI::drawChannels() {
ImGui::Button(ICON_FA_ARROWS "##ChanDrag");
ImGui::EndDragDropSource();
} else if (ImGui::IsItemHovered()) {
ImGui::SetTooltip(_("%s #%d\n(drag to swap channels)"),e->getSystemName(e->sysOfChan[i]),e->dispatchChanOfChan[i]);
ImGui::SetTooltip(_("%s #%d\n(drag to swap channels)\n(shift+drag to copy channel contents)"),e->getSystemName(e->sysOfChan[i]),e->dispatchChanOfChan[i]);
}
if (ImGui::BeginDragDropTarget()) {
const ImGuiPayload* dragItem=ImGui::AcceptDragDropPayload("FUR_CHAN");
if (dragItem!=NULL) {
if (dragItem->IsDataType("FUR_CHAN")) {
if (chanToMove!=i && chanToMove>=0) {
e->swapChannelsP(chanToMove,i);
if (ImGui::IsKeyDown(ImGuiKey_LeftShift))
e->copyChannelP(chanToMove,i);
else
e->swapChannelsP(chanToMove,i);
MARK_MODIFIED;
}
chanToMove=-1;

View file

@ -279,6 +279,7 @@ void FurnaceGUI::sampleListItem(int i, int dir, int asset) {
curSample=i;
samplePos=0;
updateSampleTex=true;
notifySampleChange=true;
lastAssetType=2;
}
if (ImGui::IsItemHovered() && !mobileUI) {
@ -309,6 +310,7 @@ void FurnaceGUI::sampleListItem(int i, int dir, int asset) {
curSample=i;
samplePos=0;
updateSampleTex=true;
notifySampleChange=true;
lastAssetType=2;
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]);
if (ImGui::MenuItem(_("edit"))) {

View file

@ -946,6 +946,7 @@ void FurnaceGUI::doAction(int what) {
MARK_MODIFIED;
}
updateSampleTex=true;
notifySampleChange=true;
}
break;
case GUI_ACTION_WAVE_LIST_MOVE_UP:
@ -1003,6 +1004,7 @@ void FurnaceGUI::doAction(int what) {
MARK_MODIFIED;
}
updateSampleTex=true;
notifySampleChange=true;
break;
case GUI_ACTION_SAMPLE_LIST_DUPLICATE:
if (curSample>=0 && curSample<(int)e->song.sample.size()) {
@ -1037,6 +1039,7 @@ void FurnaceGUI::doAction(int what) {
MARK_MODIFIED;
}
updateSampleTex=true;
notifySampleChange=true;
}
break;
case GUI_ACTION_SAMPLE_LIST_OPEN:
@ -1062,6 +1065,7 @@ void FurnaceGUI::doAction(int what) {
curSample--;
wantScrollListSample=true;
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
}
break;
@ -1070,6 +1074,7 @@ void FurnaceGUI::doAction(int what) {
curSample++;
wantScrollListSample=true;
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
}
break;
@ -1081,6 +1086,7 @@ void FurnaceGUI::doAction(int what) {
curSample--;
}
updateSampleTex=true;
notifySampleChange=true;
break;
case GUI_ACTION_SAMPLE_LIST_EDIT:
sampleEditOpen=true;
@ -1089,11 +1095,13 @@ void FurnaceGUI::doAction(int what) {
if (--curSample<0) curSample=0;
wantScrollListSample=true;
updateSampleTex=true;
notifySampleChange=true;
break;
case GUI_ACTION_SAMPLE_LIST_DOWN:
if (++curSample>=(int)e->song.sample.size()) curSample=((int)e->song.sample.size())-1;
wantScrollListSample=true;
updateSampleTex=true;
notifySampleChange=true;
break;
case GUI_ACTION_SAMPLE_LIST_PREVIEW:
e->previewSample(curSample);
@ -1183,6 +1191,7 @@ void FurnaceGUI::doAction(int what) {
e->lockEngine([this,sample,start,end]() {
sample->strip(start,end);
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1235,6 +1244,7 @@ void FurnaceGUI::doAction(int what) {
sampleSelStart=pos;
sampleSelEnd=pos+sampleClipboardLen;
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
break;
}
@ -1266,6 +1276,7 @@ void FurnaceGUI::doAction(int what) {
sampleSelEnd=pos+sampleClipboardLen;
if (sampleSelEnd>(int)sample->samples) sampleSelEnd=sample->samples;
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
break;
}
@ -1303,6 +1314,7 @@ void FurnaceGUI::doAction(int what) {
sampleSelEnd=pos+sampleClipboardLen;
if (sampleSelEnd>(int)sample->samples) sampleSelEnd=sample->samples;
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
break;
}
@ -1368,6 +1380,7 @@ void FurnaceGUI::doAction(int what) {
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1399,6 +1412,7 @@ void FurnaceGUI::doAction(int what) {
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1430,6 +1444,7 @@ void FurnaceGUI::doAction(int what) {
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1459,6 +1474,7 @@ void FurnaceGUI::doAction(int what) {
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1475,6 +1491,7 @@ void FurnaceGUI::doAction(int what) {
sample->strip(start,end);
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1493,6 +1510,7 @@ void FurnaceGUI::doAction(int what) {
sample->trim(start,end);
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1528,6 +1546,7 @@ void FurnaceGUI::doAction(int what) {
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1555,6 +1574,7 @@ void FurnaceGUI::doAction(int what) {
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1580,6 +1600,7 @@ void FurnaceGUI::doAction(int what) {
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1713,6 +1734,7 @@ void FurnaceGUI::doAction(int what) {
sample->loopEnd=end;
sample->loop=true;
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});

View file

@ -2914,6 +2914,7 @@ void FurnaceGUI::processDrags(int dragX, int dragY) {
for (int i=x; i<=x1; i++) ((signed char*)sampleDragTarget)[i]=val;
}
updateSampleTex=true;
notifySampleChange=true;
}
} else { // select
if (sampleSelStart<0) {
@ -4020,26 +4021,22 @@ bool FurnaceGUI::loop() {
}
nextWindow=GUI_WINDOW_WAVE_LIST;
MARK_MODIFIED;
}
else if (!samples.empty())
{
} else if (!samples.empty()) {
if (e->song.sampleLen!=sampleCountBefore) {
//e->renderSamplesP();
}
if (!e->getWarnings().empty())
{
if (!e->getWarnings().empty()) {
showWarning(e->getWarnings(),GUI_WARN_GENERIC);
}
int sampleCount=-1;
for (DivSample* s: samples)
{
for (DivSample* s: samples) {
sampleCount=e->addSamplePtr(s);
}
//sampleCount=e->addSamplePtr(droppedSample);
if (sampleCount>=0 && settings.selectAssetOnLoad)
{
if (sampleCount>=0 && settings.selectAssetOnLoad) {
curSample=sampleCount;
updateSampleTex=true;
notifySampleChange=true;
}
nextWindow=GUI_WINDOW_SAMPLE_LIST;
MARK_MODIFIED;
@ -4278,6 +4275,11 @@ bool FurnaceGUI::loop() {
e->notifyWaveChange(curWave);
}
if (notifySampleChange) {
notifySampleChange=false;
e->notifySampleChange(curSample);
}
eventTimeEnd=SDL_GetPerformanceCounter();
if (SDL_GetWindowFlags(sdlWin)&SDL_WINDOW_MINIMIZED) {
@ -5526,6 +5528,7 @@ bool FurnaceGUI::loop() {
MARK_MODIFIED;
});
updateSampleTex=true;
notifySampleChange=true;
} else {
showError(_("...but you haven't selected a sample!"));
delete samples[0];
@ -7149,6 +7152,7 @@ bool FurnaceGUI::loop() {
MARK_MODIFIED;
});
updateSampleTex=true;
notifySampleChange=true;
} else {
showError(_("...but you haven't selected a sample!"));
delete s;
@ -8521,6 +8525,7 @@ FurnaceGUI::FurnaceGUI():
sysDupEnd(false),
noteInputPoly(true),
notifyWaveChange(false),
notifySampleChange(false),
wantScrollListIns(false),
wantScrollListWave(false),
wantScrollListSample(false),

View file

@ -1708,7 +1708,7 @@ class FurnaceGUI {
bool vgmExportDirectStream, displayInsTypeList, displayWaveSizeList;
bool portrait, injectBackUp, mobileMenuOpen, warnColorPushed;
bool wantCaptureKeyboard, oldWantCaptureKeyboard, displayMacroMenu;
bool displayNew, displayExport, displayPalette, fullScreen, preserveChanPos, sysDupCloneChannels, sysDupEnd, noteInputPoly, notifyWaveChange;
bool displayNew, displayExport, displayPalette, fullScreen, preserveChanPos, sysDupCloneChannels, sysDupEnd, noteInputPoly, notifyWaveChange, notifySampleChange;
bool wantScrollListIns, wantScrollListWave, wantScrollListSample;
bool displayPendingIns, pendingInsSingle, displayPendingRawSample, snesFilterHex, modTableHex, displayEditString;
bool displayPendingSamples, replacePendingSample;
@ -2060,6 +2060,7 @@ class FurnaceGUI {
int s3mOPL3;
int songNotesWrap;
int rackShowLEDs;
int sampleImportInstDetune;
String mainFontPath;
String headFontPath;
String patFontPath;
@ -2313,6 +2314,7 @@ class FurnaceGUI {
s3mOPL3(1),
songNotesWrap(0),
rackShowLEDs(1),
sampleImportInstDetune(0),
mainFontPath(""),
headFontPath(""),
patFontPath(""),

View file

@ -3465,6 +3465,7 @@ void FurnaceGUI::insTabSample(DivInstrument* ins) {
if (ImGui::InputInt(_("Sample bank slot##BANKSLOT"),&ins->x1_010.bankSlot,1,4)) { PARAMETER
if (ins->x1_010.bankSlot<0) ins->x1_010.bankSlot=0;
if (ins->x1_010.bankSlot>=7) ins->x1_010.bankSlot=7;
notifySampleChange=true;
}
}
}
@ -3478,6 +3479,7 @@ void FurnaceGUI::insTabSample(DivInstrument* ins) {
id=fmt::sprintf("%d: %s",i,e->song.sample[i]->name);
if (ImGui::Selectable(id.c_str(),ins->amiga.initSample==i)) { PARAMETER
ins->amiga.initSample=i;
notifySampleChange=true;
}
}
ImGui::EndCombo();

View file

@ -289,6 +289,7 @@ void FurnaceGUI::drawNewSong() {
orderCursor=-1;
samplePos=0;
updateSampleTex=true;
notifySampleChange=true;
selStart=SelectionPoint();
selEnd=SelectionPoint();
cursor=SelectionPoint();

View file

@ -328,7 +328,8 @@ void FurnaceGUI::initSystemPresets() {
ENTRY(
"Watara Supervision", {
CH(DIV_SYSTEM_SUPERVISION, 1.0f, 0, "")
}
},
"tickRate=50.81300813008130081301"
);
CATEGORY_END;

View file

@ -293,10 +293,11 @@ void FurnaceGUI::drawSampleEdit() {
String alignHint=fmt::sprintf(_("NES: loop start must be a multiple of 512 (try with %d)"),tryWith);
SAMPLE_WARN(warnLoopStart,alignHint);
}
if ((sample->loopEnd>0) && ((sample->loopEnd-8)&127)) {
if ((sample->loopEnd-8)&127) {
int tryWith=(sample->loopEnd-8)&(~127);
if (tryWith>(int)sample->samples) tryWith-=128;
tryWith+=8; // +1 bc of how sample length is treated: https://www.nesdev.org/wiki/APU_DMC
if (tryWith<8) tryWith=8;
String alignHint=fmt::sprintf(_("NES: loop end must be a multiple of 128 + 8 (try with %d)"),tryWith);
SAMPLE_WARN(warnLoopEnd,alignHint);
}
@ -655,6 +656,7 @@ void FurnaceGUI::drawSampleEdit() {
sample->loopEnd=sample->samples;*/
}
updateSampleTex=true;
notifySampleChange=true;
REFRESH_SAMPLE
}
popWarningColor();
@ -687,6 +689,7 @@ void FurnaceGUI::drawSampleEdit() {
e->renderSamples(curSample);
});
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
}
}
@ -707,6 +710,7 @@ void FurnaceGUI::drawSampleEdit() {
sample->brrEmphasis=be;
e->renderSamplesP(curSample);
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
}
if (ImGui::IsItemHovered()) {
@ -724,6 +728,7 @@ void FurnaceGUI::drawSampleEdit() {
sample->brrNoFilter=bf;
e->renderSamplesP(curSample);
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
}
if (ImGui::IsItemHovered()) {
@ -737,6 +742,7 @@ void FurnaceGUI::drawSampleEdit() {
sample->dither=di;
e->renderSamplesP(curSample);
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
}
if (ImGui::IsItemHovered()) {
@ -869,6 +875,7 @@ void FurnaceGUI::drawSampleEdit() {
sample->loopMode=(DivSampleLoopMode)i;
e->renderSamplesP(curSample);
updateSampleTex=true;
notifySampleChange=true;
MARK_MODIFIED;
}
}
@ -892,6 +899,7 @@ void FurnaceGUI::drawSampleEdit() {
sample->loopStart=sample->loopEnd;
}
updateSampleTex=true;
notifySampleChange=true;
REFRESH_SAMPLE
}
if (ImGui::IsItemActive()) {
@ -933,6 +941,7 @@ void FurnaceGUI::drawSampleEdit() {
sample->loopEnd=sample->samples;
}
updateSampleTex=true;
notifySampleChange=true;
REFRESH_SAMPLE
}
if (ImGui::IsItemActive()) {
@ -1107,6 +1116,7 @@ void FurnaceGUI::drawSampleEdit() {
e->renderSamples(curSample);
});
updateSampleTex=true;
notifySampleChange=true;
sampleSelStart=-1;
sampleSelEnd=-1;
MARK_MODIFIED;
@ -1171,6 +1181,7 @@ void FurnaceGUI::drawSampleEdit() {
e->renderSamples(curSample);
});
updateSampleTex=true;
notifySampleChange=true;
sampleSelStart=-1;
sampleSelEnd=-1;
MARK_MODIFIED;
@ -1238,6 +1249,7 @@ void FurnaceGUI::drawSampleEdit() {
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1291,6 +1303,7 @@ void FurnaceGUI::drawSampleEdit() {
e->renderSamples(curSample);
});
updateSampleTex=true;
notifySampleChange=true;
sampleSelStart=pos;
sampleSelEnd=pos+silenceSize;
MARK_MODIFIED;
@ -1466,6 +1479,7 @@ void FurnaceGUI::drawSampleEdit() {
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -1545,6 +1559,7 @@ void FurnaceGUI::drawSampleEdit() {
}
}
updateSampleTex=true;
notifySampleChange=true;
e->renderSamples(curSample);
});
@ -2507,6 +2522,7 @@ void FurnaceGUI::doUndoSample() {
if (sample->undo()==2) {
e->renderSamples(curSample);
updateSampleTex=true;
notifySampleChange=true;
}
});
}
@ -2519,6 +2535,7 @@ void FurnaceGUI::doRedoSample() {
if (sample->redo()==2) {
e->renderSamples(curSample);
updateSampleTex=true;
notifySampleChange=true;
}
});
}

View file

@ -1161,9 +1161,10 @@ void FurnaceGUI::drawSettings() {
settings.newSongBehavior=1;
settingsChanged=true;
}
if (ImGui::InputText(_("Default author name"), &settings.defaultAuthorName)) settingsChanged=true;
ImGui::Unindent();
if (ImGui::InputText(_("Default author name"), &settings.defaultAuthorName)) settingsChanged=true;
// SUBSECTION START-UP
CONFIG_SUBSECTION(_("Start-up"));
#ifndef NO_INTRO
@ -1229,6 +1230,14 @@ void FurnaceGUI::drawSettings() {
settings.s3mOPL3=s3mOPL3B;
settingsChanged=true;
}
bool sampleImportInstDetuneB=settings.sampleImportInstDetune;
if (ImGui::Checkbox(_("Load sample fine tuning when importing a sample"), &sampleImportInstDetuneB)) {
settings.sampleImportInstDetune=sampleImportInstDetuneB;
settingsChanged=true;
}
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip(_("this may result in glitches with some samples."));
}
#ifdef ANDROID
// SUBSECTION ANDROID
@ -3843,7 +3852,7 @@ void FurnaceGUI::drawSettings() {
settingsChanged=true;
}
// SUBSECTION SONG COMMENTS
// SUBSECTION CHIP MANAGER
CONFIG_SUBSECTION(_("Chip Manager"));
bool rackShowLEDsB=settings.rackShowLEDs;
if (ImGui::Checkbox(_("Show channel indicators"), &rackShowLEDsB)) {
@ -4880,6 +4889,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) {
settings.vibrationLength=conf.getInt("vibrationLength",20);
settings.s3mOPL3=conf.getInt("s3mOPL3",1);
settings.sampleImportInstDetune=conf.getInt("sampleImportInstDetune",0);
settings.backupEnable=conf.getInt("backupEnable",1);
settings.backupInterval=conf.getInt("backupInterval",30);
@ -5395,6 +5405,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) {
clampSetting(settings.autoFillSave,0,1);
clampSetting(settings.autoMacroStepSize,0,2);
clampSetting(settings.s3mOPL3,0,1);
clampSetting(settings.sampleImportInstDetune,0,1);
clampSetting(settings.backgroundPlay,0,1);
clampSetting(settings.noMaximizeWorkaround,0,1);
@ -5477,6 +5488,7 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) {
conf.set("vibrationLength",settings.vibrationLength);
conf.set("s3mOPL3",settings.s3mOPL3);
conf.set("sampleImportInstDetune",settings.sampleImportInstDetune);
conf.set("backupEnable",settings.backupEnable);
conf.set("backupInterval",settings.backupInterval);