GUI: new sample map UI, part 1

keyboard/MIDI missing
This commit is contained in:
tildearrow 2023-04-11 18:17:30 -05:00
parent 8d4fa6e0cc
commit f90ca2410f
1 changed files with 58 additions and 35 deletions

View File

@ -4405,66 +4405,89 @@ void FurnaceGUI::drawInsEdit() {
ImGui::BeginDisabled(ins->amiga.useWave); ImGui::BeginDisabled(ins->amiga.useWave);
P(ImGui::Checkbox("Use sample map",&ins->amiga.useNoteMap)); P(ImGui::Checkbox("Use sample map",&ins->amiga.useNoteMap));
if (ins->amiga.useNoteMap) { if (ins->amiga.useNoteMap) {
if (ImGui::BeginTable("NoteMap",3,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) { if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
sampleMapFocused=false;
}
if (ImGui::BeginTable("NoteMap",4,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) {
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed);
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed);
ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthFixed);
ImGui::TableSetupColumn("c3",ImGuiTableColumnFlags_WidthStretch);
ImGui::TableSetupScrollFreeze(0,1); ImGui::TableSetupScrollFreeze(0,1);
ImGui::TableNextRow(ImGuiTableRowFlags_Headers); ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::Text("Sample"); ImGui::Text("#");
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::Text("Note"); ImGui::Text("note");
ImGui::TableNextColumn();
if (sampleMapFocused) {
ImGui::Text("FOCUSED");
} else {
ImGui::Text("sample name");
}
int sampleMapMin=sampleMapSelStart;
int sampleMapMax=sampleMapSelEnd;
if (sampleMapMin>sampleMapMax) {
sampleMapMin^=sampleMapMax;
sampleMapMax^=sampleMapMin;
sampleMapMin^=sampleMapMax;
}
for (int i=0; i<120; i++) { for (int i=0; i<120; i++) {
DivInstrumentAmiga::SampleMap& sampleMap=ins->amiga.noteMap[i]; DivInstrumentAmiga::SampleMap& sampleMap=ins->amiga.noteMap[i];
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::PushID(fmt::sprintf("NM_%d",i).c_str());
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::Text("%s",noteNames[60+i]); ImGui::Text("%s",noteNames[60+i]);
ImGui::TableNextColumn(); ImGui::TableNextColumn();
// TODO: new style sample map
if (sampleMap.map<0 || sampleMap.map>=e->song.sampleLen) { if (sampleMap.map<0 || sampleMap.map>=e->song.sampleLen) {
sName="-- empty --"; sName=fmt::sprintf("---##SM%d",i);
sampleMap.map=-1; sampleMap.map=-1;
} else { } else {
sName=e->song.sample[sampleMap.map]->name; sName=fmt::sprintf("%3d##SM%d",sampleMap.map,i);
} }
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::PushFont(patFont);
if (ImGui::BeginCombo("##SM",sName.c_str())) { ImGui::SetNextItemWidth(ImGui::CalcTextSize("00000").x);
String id; ImGui::Selectable(sName.c_str(),(sampleMapFocused && sampleMapColumn==0 && i>=sampleMapMin && i<=sampleMapMax));
if (ImGui::Selectable("-- empty --",sampleMap.map==-1)) { PARAMETER if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) {
sampleMap.map=-1; sampleMapFocused=true;
} sampleMapColumn=0;
for (int j=0; j<e->song.sampleLen; j++) { sampleMapSelStart=i;
id=fmt::sprintf("%d: %s",j,e->song.sample[j]->name); sampleMapSelEnd=i;
if (ImGui::Selectable(id.c_str(),sampleMap.map==j)) { PARAMETER ImGui::InhibitInertialScroll();
sampleMap.map=j;
}
}
ImGui::EndCombo();
} }
if (sampleMapFocused && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && ImGui::IsMouseDown(ImGuiMouseButton_Left)) {
sampleMapSelEnd=i;
}
ImGui::PopFont();
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); sName="???";
const char* nName="???";
if ((sampleMap.freq+60)>0 && (sampleMap.freq+60)<180) { if ((sampleMap.freq+60)>0 && (sampleMap.freq+60)<180) {
nName=noteNames[sampleMap.freq+60]; sName=noteNames[sampleMap.freq+60];
} }
if (ImGui::BeginCombo("##SN",nName)) { sName+=fmt::sprintf("##SN%d",i);
for (int j=0; j<180; j++) { ImGui::PushFont(patFont);
const char* nName2="???"; ImGui::SetNextItemWidth(ImGui::CalcTextSize("00000").x);
nName2=noteNames[j]; ImGui::Selectable(sName.c_str(),(sampleMapFocused && sampleMapColumn==1 && i>=sampleMapMin && i<=sampleMapMax));
if (ImGui::Selectable(nName2,(sampleMap.freq+60)==j)) { if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) {
sampleMap.freq=j-60; sampleMapFocused=true;
} sampleMapColumn=1;
} sampleMapSelStart=i;
ImGui::EndCombo(); sampleMapSelEnd=i;
ImGui::InhibitInertialScroll();
} }
if (sampleMapFocused && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && ImGui::IsMouseDown(ImGuiMouseButton_Left)) {
sampleMapSelEnd=i;
}
ImGui::PopFont();
ImGui::PopID(); ImGui::TableNextColumn();
if (sampleMap.map>=0 && sampleMap.map<e->song.sampleLen) {
ImGui::TextUnformatted(e->song.sample[sampleMap.map]->name.c_str());
}
} }
ImGui::EndTable(); ImGui::EndTable();
} }