GUI: allow order input
This commit is contained in:
parent
b66918bf62
commit
86f0ec45fa
|
|
@ -414,9 +414,10 @@ void FurnaceGUI::drawOrders() {
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,prevSpacing);
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,prevSpacing);
|
||||||
ImGui::TableSetupScrollFreeze(1,1);
|
ImGui::TableSetupScrollFreeze(1,1);
|
||||||
float lineHeight=(ImGui::GetTextLineHeight()+4*dpiScale);
|
float lineHeight=(ImGui::GetTextLineHeight()+4*dpiScale);
|
||||||
|
int curOrder=e->getOrder();
|
||||||
if (e->isPlaying()) {
|
if (e->isPlaying()) {
|
||||||
if (followOrders) {
|
if (followOrders) {
|
||||||
ImGui::SetScrollY((e->getOrder()+1)*lineHeight-(ImGui::GetContentRegionAvail().y/2));
|
ImGui::SetScrollY((curOrder+1)*lineHeight-(ImGui::GetContentRegionAvail().y/2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::TableNextRow(0,lineHeight);
|
ImGui::TableNextRow(0,lineHeight);
|
||||||
|
|
@ -439,13 +440,16 @@ void FurnaceGUI::drawOrders() {
|
||||||
}
|
}
|
||||||
if (ImGui::Selectable(selID)) {
|
if (ImGui::Selectable(selID)) {
|
||||||
e->setOrder(i);
|
e->setOrder(i);
|
||||||
|
curNibble=false;
|
||||||
|
orderCursor=-1;
|
||||||
}
|
}
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
for (int j=0; j<e->getTotalChannelCount(); j++) {
|
for (int j=0; j<e->getTotalChannelCount(); j++) {
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
snprintf(selID,64,"%.2x##O_%.2x_%.2x",e->song.orders.ord[j][i],j,i);
|
snprintf(selID,64,"%.2x##O_%.2x_%.2x",e->song.orders.ord[j][i],j,i);
|
||||||
if (ImGui::Selectable(selID)) {
|
if (ImGui::Selectable(selID,(orderEditMode!=0 && curOrder==i && orderCursor==j))) {
|
||||||
if (e->getOrder()==i) {
|
if (curOrder==i) {
|
||||||
|
if (orderEditMode==0) {
|
||||||
prepareUndo(GUI_ACTION_CHANGE_ORDER);
|
prepareUndo(GUI_ACTION_CHANGE_ORDER);
|
||||||
if (changeAllOrders) {
|
if (changeAllOrders) {
|
||||||
for (int k=0; k<e->getTotalChannelCount(); k++) {
|
for (int k=0; k<e->getTotalChannelCount(); k++) {
|
||||||
|
|
@ -455,12 +459,21 @@ void FurnaceGUI::drawOrders() {
|
||||||
if (e->song.orders.ord[j][i]<0x7f) e->song.orders.ord[j][i]++;
|
if (e->song.orders.ord[j][i]<0x7f) e->song.orders.ord[j][i]++;
|
||||||
}
|
}
|
||||||
makeUndo(GUI_ACTION_CHANGE_ORDER);
|
makeUndo(GUI_ACTION_CHANGE_ORDER);
|
||||||
|
} else {
|
||||||
|
orderCursor=j;
|
||||||
|
curNibble=false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
e->setOrder(i);
|
e->setOrder(i);
|
||||||
|
if (orderEditMode!=0) {
|
||||||
|
orderCursor=j;
|
||||||
|
curNibble=false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
||||||
if (e->getOrder()==i) {
|
if (curOrder==i) {
|
||||||
|
if (orderEditMode==0) {
|
||||||
prepareUndo(GUI_ACTION_CHANGE_ORDER);
|
prepareUndo(GUI_ACTION_CHANGE_ORDER);
|
||||||
if (changeAllOrders) {
|
if (changeAllOrders) {
|
||||||
for (int k=0; k<e->getTotalChannelCount(); k++) {
|
for (int k=0; k<e->getTotalChannelCount(); k++) {
|
||||||
|
|
@ -470,8 +483,16 @@ void FurnaceGUI::drawOrders() {
|
||||||
if (e->song.orders.ord[j][i]>0) e->song.orders.ord[j][i]--;
|
if (e->song.orders.ord[j][i]>0) e->song.orders.ord[j][i]--;
|
||||||
}
|
}
|
||||||
makeUndo(GUI_ACTION_CHANGE_ORDER);
|
makeUndo(GUI_ACTION_CHANGE_ORDER);
|
||||||
|
} else {
|
||||||
|
orderCursor=j;
|
||||||
|
curNibble=false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
e->setOrder(i);
|
e->setOrder(i);
|
||||||
|
if (orderEditMode!=0) {
|
||||||
|
orderCursor=j;
|
||||||
|
curNibble=false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -534,6 +555,7 @@ void FurnaceGUI::drawOrders() {
|
||||||
if (ImGui::Button(orderEditModeLabel)) {
|
if (ImGui::Button(orderEditModeLabel)) {
|
||||||
orderEditMode++;
|
orderEditMode++;
|
||||||
if (orderEditMode>3) orderEditMode=0;
|
if (orderEditMode>3) orderEditMode=0;
|
||||||
|
curNibble=false;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
if (orderEditMode==3) {
|
if (orderEditMode==3) {
|
||||||
|
|
@ -548,7 +570,7 @@ void FurnaceGUI::drawOrders() {
|
||||||
}
|
}
|
||||||
ImGui::PopStyleVar();
|
ImGui::PopStyleVar();
|
||||||
}
|
}
|
||||||
if (ImGui::IsWindowFocused()) curWindow=GUI_WINDOW_ORDERS;
|
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_ORDERS;
|
||||||
oldOrder1=e->getOrder();
|
oldOrder1=e->getOrder();
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
@ -2703,12 +2725,14 @@ void FurnaceGUI::doRedo() {
|
||||||
void FurnaceGUI::play() {
|
void FurnaceGUI::play() {
|
||||||
e->play();
|
e->play();
|
||||||
curNibble=false;
|
curNibble=false;
|
||||||
|
orderNibble=false;
|
||||||
activeNotes.clear();
|
activeNotes.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUI::stop() {
|
void FurnaceGUI::stop() {
|
||||||
e->stop();
|
e->stop();
|
||||||
curNibble=false;
|
curNibble=false;
|
||||||
|
orderNibble=false;
|
||||||
activeNotes.clear();
|
activeNotes.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2791,6 +2815,32 @@ void FurnaceGUI::keyDown(SDL_Event& ev) {
|
||||||
}
|
}
|
||||||
// PER-WINDOW KEYS
|
// PER-WINDOW KEYS
|
||||||
switch (curWindow) {
|
switch (curWindow) {
|
||||||
|
case GUI_WINDOW_ORDERS: {
|
||||||
|
if (orderEditMode!=0) {
|
||||||
|
try {
|
||||||
|
int num=valueKeys.at(ev.key.keysym.sym);
|
||||||
|
if (orderCursor>=0 && orderCursor<e->getTotalChannelCount()) {
|
||||||
|
int curOrder=e->getOrder();
|
||||||
|
e->song.orders.ord[orderCursor][curOrder]=((e->song.orders.ord[orderCursor][curOrder]<<4)|num)&0x7f;
|
||||||
|
if (orderEditMode==2 || orderEditMode==3) {
|
||||||
|
curNibble=!curNibble;
|
||||||
|
if (!curNibble) {
|
||||||
|
if (orderEditMode==2) {
|
||||||
|
orderCursor++;
|
||||||
|
if (orderCursor>=e->getTotalChannelCount()) orderCursor=0;
|
||||||
|
} else if (orderEditMode==3) {
|
||||||
|
if (curOrder<e->song.ordersLen-1) {
|
||||||
|
e->setOrder(curOrder+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (std::out_of_range& e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case GUI_WINDOW_PATTERN: {
|
case GUI_WINDOW_PATTERN: {
|
||||||
if (ev.key.keysym.mod&KMOD_CTRL) {
|
if (ev.key.keysym.mod&KMOD_CTRL) {
|
||||||
switch (ev.key.keysym.sym) {
|
switch (ev.key.keysym.sym) {
|
||||||
|
|
@ -3187,6 +3237,12 @@ int FurnaceGUI::load(String path) {
|
||||||
}
|
}
|
||||||
curFileName=path;
|
curFileName=path;
|
||||||
modified=false;
|
modified=false;
|
||||||
|
curNibble=false;
|
||||||
|
orderNibble=false;
|
||||||
|
orderCursor=-1;
|
||||||
|
selStart=SelectionPoint();
|
||||||
|
selEnd=SelectionPoint();
|
||||||
|
cursor=SelectionPoint();
|
||||||
lastError="everything OK";
|
lastError="everything OK";
|
||||||
undoHist.clear();
|
undoHist.clear();
|
||||||
redoHist.clear();
|
redoHist.clear();
|
||||||
|
|
@ -3352,6 +3408,12 @@ bool FurnaceGUI::loop() {
|
||||||
redoHist.clear();
|
redoHist.clear();
|
||||||
curFileName="";
|
curFileName="";
|
||||||
modified=false;
|
modified=false;
|
||||||
|
curNibble=false;
|
||||||
|
orderNibble=false;
|
||||||
|
orderCursor=-1;
|
||||||
|
selStart=SelectionPoint();
|
||||||
|
selEnd=SelectionPoint();
|
||||||
|
cursor=SelectionPoint();
|
||||||
updateWindowTitle();
|
updateWindowTitle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3663,6 +3725,12 @@ bool FurnaceGUI::loop() {
|
||||||
redoHist.clear();
|
redoHist.clear();
|
||||||
curFileName="";
|
curFileName="";
|
||||||
modified=false;
|
modified=false;
|
||||||
|
curNibble=false;
|
||||||
|
orderNibble=false;
|
||||||
|
orderCursor=-1;
|
||||||
|
selStart=SelectionPoint();
|
||||||
|
selEnd=SelectionPoint();
|
||||||
|
cursor=SelectionPoint();
|
||||||
updateWindowTitle();
|
updateWindowTitle();
|
||||||
break;
|
break;
|
||||||
case GUI_WARN_OPEN:
|
case GUI_WARN_OPEN:
|
||||||
|
|
@ -3890,6 +3958,7 @@ FurnaceGUI::FurnaceGUI():
|
||||||
editStep(1),
|
editStep(1),
|
||||||
exportLoops(0),
|
exportLoops(0),
|
||||||
orderEditMode(0),
|
orderEditMode(0),
|
||||||
|
orderCursor(-1),
|
||||||
editControlsOpen(true),
|
editControlsOpen(true),
|
||||||
ordersOpen(true),
|
ordersOpen(true),
|
||||||
insListOpen(true),
|
insListOpen(true),
|
||||||
|
|
@ -3905,6 +3974,7 @@ FurnaceGUI::FurnaceGUI():
|
||||||
mixerOpen(false),
|
mixerOpen(false),
|
||||||
selecting(false),
|
selecting(false),
|
||||||
curNibble(false),
|
curNibble(false),
|
||||||
|
orderNibble(false),
|
||||||
extraChannelButtons(false),
|
extraChannelButtons(false),
|
||||||
followOrders(true),
|
followOrders(true),
|
||||||
followPattern(true),
|
followPattern(true),
|
||||||
|
|
|
||||||
|
|
@ -211,12 +211,12 @@ class FurnaceGUI {
|
||||||
|
|
||||||
char finalLayoutPath[4096];
|
char finalLayoutPath[4096];
|
||||||
|
|
||||||
int curIns, curWave, curSample, curOctave, oldRow, oldOrder, oldOrder1, editStep, exportLoops, orderEditMode;
|
int curIns, curWave, curSample, curOctave, oldRow, oldOrder, oldOrder1, editStep, exportLoops, orderEditMode, orderCursor;
|
||||||
bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen;
|
bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen;
|
||||||
bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen;
|
bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen;
|
||||||
bool mixerOpen;
|
bool mixerOpen;
|
||||||
SelectionPoint selStart, selEnd, cursor, orderCursor;
|
SelectionPoint selStart, selEnd, cursor;
|
||||||
bool selecting, curNibble, extraChannelButtons, followOrders, followPattern, changeAllOrders;
|
bool selecting, curNibble, orderNibble, extraChannelButtons, followOrders, followPattern, changeAllOrders;
|
||||||
FurnaceGUIWindows curWindow;
|
FurnaceGUIWindows curWindow;
|
||||||
|
|
||||||
struct ActiveNote {
|
struct ActiveNote {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue