GUI: plenty of UI work

- better song info layout
- add BPM indicator
- fix misalignment in FM editor (fixes #98)
This commit is contained in:
tildearrow 2022-02-04 02:51:22 -05:00
parent c1864849a0
commit 2740e8416d

View file

@ -651,91 +651,129 @@ void FurnaceGUI::drawEditControls() {
void FurnaceGUI::drawSongInfo() { void FurnaceGUI::drawSongInfo() {
if (!songInfoOpen) return; if (!songInfoOpen) return;
if (ImGui::Begin("Song Information",&songInfoOpen)) { if (ImGui::Begin("Song Information",&songInfoOpen)) {
ImGui::Text("Name"); if (ImGui::BeginTable("NameAuthor",2,ImGuiTableFlags_SizingStretchProp)) {
ImGui::SameLine(); ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed,0.0);
if (ImGui::InputText("##Name",&e->song.name)) updateWindowTitle(); ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,0.0);
ImGui::Text("Author"); ImGui::TableNextRow();
ImGui::SameLine(); ImGui::TableNextColumn();
ImGui::InputText("##Author",&e->song.author); ImGui::Text("Name");
ImGui::TableNextColumn();
ImGui::Text("TimeBase"); float avail=ImGui::GetContentRegionAvail().x;
ImGui::SameLine(); ImGui::SetNextItemWidth(avail);
ImGui::SetNextItemWidth(120.0f*dpiScale); if (ImGui::InputText("##Name",&e->song.name)) updateWindowTitle();
unsigned char realTB=e->song.timeBase+1; ImGui::TableNextRow();
if (ImGui::InputScalar("##TimeBase",ImGuiDataType_U8,&realTB,&_ONE,&_THREE)) { ImGui::TableNextColumn();
if (realTB<1) realTB=1; ImGui::Text("Author");
if (realTB>16) realTB=16; ImGui::TableNextColumn();
e->song.timeBase=realTB-1; ImGui::SetNextItemWidth(avail);
ImGui::InputText("##Author",&e->song.author);
ImGui::EndTable();
} }
ImGui::Text("Speed"); if (ImGui::BeginTable("OtherProps",3,ImGuiTableFlags_SizingStretchProp)) {
ImGui::SameLine(); ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed,0.0);
ImGui::SetNextItemWidth(120.0f*dpiScale); ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,0.0);
if (ImGui::InputScalar("##Speed1",ImGuiDataType_U8,&e->song.speed1,&_ONE,&_THREE)) { ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch,0.0);
if (e->song.speed1<1) e->song.speed1=1;
if (e->isPlaying()) play();
}
ImGui::SameLine();
ImGui::SetNextItemWidth(120.0f*dpiScale);
if (ImGui::InputScalar("##Speed2",ImGuiDataType_U8,&e->song.speed2,&_ONE,&_THREE)) {
if (e->song.speed2<1) e->song.speed2=1;
if (e->isPlaying()) play();
}
ImGui::Text("Highlight"); ImGui::TableNextRow();
ImGui::SameLine(); ImGui::TableNextColumn();
ImGui::SetNextItemWidth(120.0f*dpiScale); ImGui::Text("TimeBase");
ImGui::InputScalar("##Highlight1",ImGuiDataType_U8,&e->song.hilightA,&_ONE,&_THREE); ImGui::TableNextColumn();
ImGui::SameLine(); float avail=ImGui::GetContentRegionAvail().x;
ImGui::SetNextItemWidth(120.0f*dpiScale); ImGui::SetNextItemWidth(avail);
ImGui::InputScalar("##Highlight2",ImGuiDataType_U8,&e->song.hilightB,&_ONE,&_THREE); unsigned char realTB=e->song.timeBase+1;
if (ImGui::InputScalar("##TimeBase",ImGuiDataType_U8,&realTB,&_ONE,&_THREE)) {
if (realTB<1) realTB=1;
if (realTB>16) realTB=16;
e->song.timeBase=realTB-1;
}
ImGui::TableNextColumn();
float hl=e->song.hilightA;
if (hl<=0.0f) hl=4.0f;
ImGui::Text("%.2f BPM",120.0f*(float)e->song.hz/(hl*(float)(e->song.speed1+e->song.speed2)));
ImGui::Text("Pattern Length"); ImGui::TableNextRow();
ImGui::SameLine(); ImGui::TableNextColumn();
ImGui::SetNextItemWidth(120.0f*dpiScale); ImGui::Text("Speed");
int patLen=e->song.patLen; ImGui::TableNextColumn();
if (ImGui::InputInt("##PatLength",&patLen,1,3)) { ImGui::SetNextItemWidth(avail);
if (patLen<1) patLen=1; if (ImGui::InputScalar("##Speed1",ImGuiDataType_U8,&e->song.speed1,&_ONE,&_THREE)) {
if (patLen>256) patLen=256; if (e->song.speed1<1) e->song.speed1=1;
e->song.patLen=patLen; if (e->isPlaying()) play();
} }
ImGui::TableNextColumn();
ImGui::SetNextItemWidth(avail);
if (ImGui::InputScalar("##Speed2",ImGuiDataType_U8,&e->song.speed2,&_ONE,&_THREE)) {
if (e->song.speed2<1) e->song.speed2=1;
if (e->isPlaying()) play();
}
ImGui::Text("Song Length"); ImGui::TableNextRow();
ImGui::SameLine(); ImGui::TableNextColumn();
ImGui::SetNextItemWidth(120.0f*dpiScale); ImGui::Text("Highlight");
int ordLen=e->song.ordersLen; ImGui::TableNextColumn();
if (ImGui::InputInt("##OrdLength",&ordLen,1,3)) { ImGui::SetNextItemWidth(avail);
if (ordLen<1) ordLen=1; ImGui::InputScalar("##Highlight1",ImGuiDataType_U8,&e->song.hilightA,&_ONE,&_THREE);
if (ordLen>127) ordLen=127; ImGui::TableNextColumn();
e->song.ordersLen=ordLen; ImGui::SetNextItemWidth(avail);
} ImGui::InputScalar("##Highlight2",ImGuiDataType_U8,&e->song.hilightB,&_ONE,&_THREE);
ImGui::Text("Rate"); ImGui::TableNextRow();
ImGui::SameLine(); ImGui::TableNextColumn();
ImGui::SetNextItemWidth(120.0f*dpiScale); ImGui::Text("Pattern Length");
int setHz=e->song.hz; ImGui::TableNextColumn();
if (ImGui::InputInt("##Rate",&setHz)) { ImGui::SetNextItemWidth(avail);
if (setHz<10) setHz=10; int patLen=e->song.patLen;
if (setHz>999) setHz=999; if (ImGui::InputInt("##PatLength",&patLen,1,3)) {
e->setSongRate(setHz,setHz<52); if (patLen<1) patLen=1;
} if (patLen>256) patLen=256;
if (e->song.hz==50) { e->song.patLen=patLen;
ImGui::SameLine(); }
ImGui::Text("PAL");
}
if (e->song.hz==60) {
ImGui::SameLine();
ImGui::Text("NTSC");
}
ImGui::Text("Tuning (A-4)"); ImGui::TableNextRow();
ImGui::SameLine(); ImGui::TableNextColumn();
float tune=e->song.tuning; ImGui::Text("Song Length");
ImGui::SetNextItemWidth(120.0f*dpiScale); ImGui::TableNextColumn();
if (ImGui::InputFloat("##Tuning",&tune,1.0f,3.0f,"%g")) { ImGui::SetNextItemWidth(avail);
if (tune<220.0f) tune=220.0f; int ordLen=e->song.ordersLen;
if (tune>880.0f) tune=880.0f; if (ImGui::InputInt("##OrdLength",&ordLen,1,3)) {
e->song.tuning=tune; if (ordLen<1) ordLen=1;
if (ordLen>127) ordLen=127;
e->song.ordersLen=ordLen;
}
ImGui::TableNextRow();
ImGui::TableNextColumn();
ImGui::Text("Tick Rate");
ImGui::TableNextColumn();
ImGui::SetNextItemWidth(avail);
int setHz=e->song.hz;
if (ImGui::InputInt("##Rate",&setHz)) {
if (setHz<10) setHz=10;
if (setHz>999) setHz=999;
e->setSongRate(setHz,setHz<52);
}
if (e->song.hz==50) {
ImGui::TableNextColumn();
ImGui::Text("PAL");
}
if (e->song.hz==60) {
ImGui::TableNextColumn();
ImGui::Text("NTSC");
}
ImGui::TableNextRow();
ImGui::TableNextColumn();
ImGui::Text("Tuning (A-4)");
ImGui::TableNextColumn();
float tune=e->song.tuning;
ImGui::SetNextItemWidth(avail);
if (ImGui::InputFloat("##Tuning",&tune,1.0f,3.0f,"%g")) {
if (tune<220.0f) tune=220.0f;
if (tune>880.0f) tune=880.0f;
e->song.tuning=tune;
}
ImGui::EndTable();
} }
} }
if (ImGui::IsWindowFocused()) curWindow=GUI_WINDOW_SONG_INFO; if (ImGui::IsWindowFocused()) curWindow=GUI_WINDOW_SONG_INFO;
@ -1299,6 +1337,7 @@ void FurnaceGUI::drawInsEdit() {
int asInt[256]; int asInt[256];
float loopIndicator[256]; float loopIndicator[256];
if (ImGui::BeginTabItem("FM")) { if (ImGui::BeginTabItem("FM")) {
/*
ImGui::Columns(3,NULL,false); ImGui::Columns(3,NULL,false);
P(ImGui::SliderScalar(FM_NAME(FM_FB),ImGuiDataType_U8,&ins->fm.fb,&_ZERO,&_SEVEN)); P(ImGui::SliderScalar(FM_NAME(FM_FB),ImGuiDataType_U8,&ins->fm.fb,&_ZERO,&_SEVEN));
ImGui::NextColumn(); ImGui::NextColumn();
@ -1309,14 +1348,16 @@ void FurnaceGUI::drawInsEdit() {
P(ImGui::SliderScalar(FM_NAME(FM_FMS),ImGuiDataType_U8,&ins->fm.fms,&_ZERO,&_SEVEN)); P(ImGui::SliderScalar(FM_NAME(FM_FMS),ImGuiDataType_U8,&ins->fm.fms,&_ZERO,&_SEVEN));
ImGui::NextColumn(); ImGui::NextColumn();
P(ImGui::SliderScalar(FM_NAME(FM_AMS),ImGuiDataType_U8,&ins->fm.ams,&_ZERO,&_THREE)); P(ImGui::SliderScalar(FM_NAME(FM_AMS),ImGuiDataType_U8,&ins->fm.ams,&_ZERO,&_THREE));
ImGui::Columns(1); ImGui::NextColumn();
if (ImGui::BeginTable("FMOperators",2)) { ImGui::Columns(1);*/
if (ImGui::BeginTable("FMOperators",2,ImGuiTableFlags_SizingStretchSame)) {
for (int i=0; i<4; i++) { for (int i=0; i<4; i++) {
DivInstrumentFM::Operator& op=ins->fm.op[opOrder[i]]; DivInstrumentFM::Operator& op=ins->fm.op[opOrder[i]];
if ((i+1)&1) ImGui::TableNextRow(); if ((i+1)&1) ImGui::TableNextRow();
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::PushID(fmt::sprintf("op%d",i).c_str()); ImGui::PushID(fmt::sprintf("op%d",i).c_str());
ImGui::Dummy(ImVec2(dpiScale,dpiScale));
ImGui::Text("Operator %d",i+1); ImGui::Text("Operator %d",i+1);
P(ImGui::SliderScalar(FM_NAME(FM_AR),ImGuiDataType_U8,&op.ar,&_ZERO,&_THIRTY_ONE)); P(ImGui::SliderScalar(FM_NAME(FM_AR),ImGuiDataType_U8,&op.ar,&_ZERO,&_THIRTY_ONE));
P(ImGui::SliderScalar(FM_NAME(FM_DR),ImGuiDataType_U8,&op.dr,&_ZERO,&_THIRTY_ONE)); P(ImGui::SliderScalar(FM_NAME(FM_DR),ImGuiDataType_U8,&op.dr,&_ZERO,&_THIRTY_ONE));