ref: abd9a5425c804261dead29a365ca2e2916ed8c47
dir: /src/pt2_posed.c/
#include <stdint.h>
#include <stdbool.h>
#include "pt2_textout.h"
#include "pt2_visuals.h"
#include "pt2_helpers.h"
#include "pt2_replayer.h"
#include "pt2_bmp.h"
#include "pt2_mouse.h"
#include "pt2_edit.h"
#include "pt2_textedit.h"
#include "pt2_posed.h"
static char posEdNames[MAX_PATTERNS][16];
void posEdClearNames(void)
{
memset(posEdNames, 0, sizeof (posEdNames));
if (ui.posEdScreenShown)
ui.updatePosEd = true;
}
void posEdEditName(void)
{
if (editor.currMode == MODE_IDLE || editor.currMode == MODE_EDIT)
{
const uint8_t pattern = (uint8_t)song->header.patternTable[song->currPos & 0x7F];
textEdit.textStartPtr = posEdNames[pattern];
textEdit.textEndPtr = posEdNames[pattern] + 15;
textEdit.numBlocks = 15;
textEdit.cursorStartX = 184;
textEdit.cursorStartY = 58;
textEdit.scrollable = true;
enterTextEditMode(PTB_PE_PATTNAME);
}
}
void posEdInsert(void)
{
if ((editor.currMode == MODE_IDLE || editor.currMode == MODE_EDIT) && song->header.songLength < 128)
{
for (int32_t i = 0; i < 127-song->currPos; i++)
song->header.patternTable[127-i] = song->header.patternTable[(127-i)-1];
song->header.patternTable[song->currPos] = 0;
song->header.songLength++;
if (song->currPos > song->header.songLength-1)
editor.currPosEdPattDisp = &song->header.patternTable[song->header.songLength-1];
updateWindowTitle(MOD_IS_MODIFIED);
ui.updateSongSize = true;
ui.updateSongLength = true;
ui.updateSongPattern = true;
if (ui.posEdScreenShown)
ui.updatePosEd = true;
}
}
void posEdDelete(void)
{
if ((editor.currMode == MODE_IDLE || editor.currMode == MODE_EDIT) && song->header.songLength > 1)
{
for (int32_t i = 0; i < 128-song->currPos; i++)
song->header.patternTable[song->currPos+i] = song->header.patternTable[song->currPos+i+1];
song->header.patternTable[127] = 0;
song->header.songLength--;
if (song->currPos > song->header.songLength-1)
editor.currPosEdPattDisp = &song->header.patternTable[song->header.songLength-1];
updateWindowTitle(MOD_IS_MODIFIED);
ui.updateSongSize = true;
ui.updateSongLength = true;
ui.updateSongPattern = true;
if (ui.posEdScreenShown)
ui.updatePosEd = true;
}
}
void posEdToggle(void)
{
ui.posEdScreenShown ^= 1;
if (ui.posEdScreenShown)
{
renderPosEdScreen();
ui.updatePosEd = true;
}
else
{
displayMainScreen();
}
}
void renderPosEdScreen(void)
{
blit32(120, 0, 200, 99, posEdBMP);
ui.updatePosEd = true;
}
static void drawPosEdName(int32_t entry, int32_t y, bool selected)
{
const uint8_t pattern = (uint8_t)song->header.patternTable[entry & 0x7F];
for (int32_t i = 0; i < 15; i++)
{
const int32_t x = 184 + (i * FONT_CHAR_W);
char ch;
if (ui.editTextFlag)
ch = posEdNames[pattern][textEdit.scrollOffset + i];
else
ch = posEdNames[pattern][i];
if (ch == '\0')
break;
if (selected)
charOut(x, y, ch, video.palette[PAL_GENTXT]);
else
charOut(x, y, ch, video.palette[PAL_QADSCP]);
}
}
void updatePosEd(void)
{
if (!ui.updatePosEd || !ui.posEdScreenShown || ui.askBoxShown)
return;
ui.updatePosEd = false;
// clear entries first
fillRect(128, 23, (22*FONT_CHAR_W)-1, ((FONT_CHAR_H+1)*5)-1, video.palette[PAL_BACKGRD]);
fillRect(128, 53, (22*FONT_CHAR_W)-1, FONT_CHAR_H, video.palette[PAL_GENBKG]);
fillRect(128, 59, (22*FONT_CHAR_W)-1, ((FONT_CHAR_H+1)*6)-1, video.palette[PAL_BACKGRD]);
for (int32_t i = 0; i < POSED_LIST_SIZE; i++)
{
const int32_t entry = song->currPos - (5 - i);
if (entry < 0 || entry >= song->header.songLength)
continue;
const int32_t pattern = song->header.patternTable[entry];
const int32_t yPos = 23 + (i * (FONT_CHAR_H+1));
const bool selected = (i == 5);
const uint32_t textColor = selected ? video.palette[PAL_GENTXT] : video.palette[PAL_QADSCP];
printThreeDecimals(128, yPos, entry, textColor);
printTwoDecimals(160, yPos, selected ? *editor.currPosEdPattDisp : pattern, textColor);
drawPosEdName(entry, yPos, selected);
}
// kludge to fix bottom part of text edit marker
if (ui.editTextFlag && (textEdit.object == PTB_PE_PATT || textEdit.object == PTB_PE_PATTNAME))
renderTextEditCursor();
}