ref: 22c28f1c0de3a76cac067309abfd77f8d508c2bb
dir: /src/ft2_pushbuttons.c/
// for finding memory leaks in debug mode with Visual Studio
#if defined _DEBUG && defined _MSC_VER
#include <crtdbg.h>
#endif
#include <stdio.h>
#include <stdbool.h>
#include "ft2_header.h"
#include "ft2_gui.h"
#include "ft2_about.h"
#include "ft2_video.h"
#include "ft2_config.h"
#include "ft2_audioselector.h"
#include "ft2_audio.h"
#include "ft2_help.h"
#include "ft2_sample_ed.h"
#include "ft2_nibbles.h"
#include "ft2_inst_ed.h"
#include "ft2_pattern_ed.h"
#include "ft2_sample_loader.h"
#include "ft2_diskop.h"
#include "ft2_wav_renderer.h"
#include "ft2_trim.h"
#include "ft2_sampling.h"
#include "ft2_module_loader.h"
#include "ft2_midi.h"
#include "ft2_midi.h"
#include "ft2_mouse.h"
#include "ft2_edit.h"
#include "ft2_sample_ed_features.h"
#include "ft2_palette.h"
#include "ft2_structs.h"
pushButton_t pushButtons[NUM_PUSHBUTTONS] =
{
// ------ RESERVED PUSHBUTTONS ------
{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
/*
** -- STRUCT INFO: --
** x = x position
** y = y position
** w = width
** h = height
** p (0,1,2) = button delay after the first trigger (f.ex. used on scrollbar buttons)
** 0 = no delay, 1 = normal delay, 2 = two-phase delay
** d = function call repeat delay while button is being held down (number of frames)
** text #1 = text line #1
** text #2 = text line #2 (if present, it will be rendered below text #1)
** funcOnDown = function to call when pressed
** funcOnUp = function to call when released
*/
// ------ POSITION EDITOR PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 55, 2, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbPosEdPosDown, NULL },
{ 55, 36, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbPosEdPosUp, NULL },
{ 74, 2, 35, 16, 1, 6, "Ins.", NULL, pbPosEdIns, NULL },
{ 74, 19, 18, 13, 1, 6, ARROW_UP_STRING, NULL, pbPosEdPattUp, NULL },
{ 91, 19, 18, 13, 1, 6, ARROW_DOWN_STRING, NULL, pbPosEdPattDown, NULL },
{ 74, 33, 35, 16, 1, 6, "Del.", NULL, pbPosEdDel, NULL },
{ 74, 50, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbPosEdLenUp, NULL },
{ 91, 50, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbPosEdLenDown, NULL },
{ 74, 62, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbPosEdRepSUp, NULL },
{ 91, 62, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbPosEdRepSDown, NULL },
// ------ SONG/PATTERN PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 168, 34, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbBPMUp, NULL },
{ 185, 34, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbBPMDown, NULL },
{ 168, 48, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbSpeedUp, NULL },
{ 185, 48, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbSpeedDown, NULL },
{ 168, 62, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbIncAdd, NULL },
{ 185, 62, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbDecAdd, NULL },
{ 253, 34, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbEditPattUp, NULL },
{ 270, 34, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbEditPattDown, NULL },
{ 253, 48, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbPattLenUp, NULL },
{ 270, 48, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbPattLenDown, NULL },
{ 209, 62, 40, 13, 0, 0, "Expd.", NULL, NULL, expandPattern },
{ 248, 62, 40, 13, 0, 0, "Srnk.", NULL, NULL, shrinkPattern },
// ------ LOGO PUSHBUTTON ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 112, 0, 154, 32, 0, 0, NULL, NULL, NULL, pbToggleLogo },
{ 266, 0, 25, 32, 0, 0, NULL, NULL, NULL, pbToggleBadge },
// ------ MAIN SCREEN PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 294, 2, 59, 16, 0, 0, "About", NULL, NULL, showAboutScreen },
{ 294, 19, 59, 16, 0, 0, "Nibbles", NULL, NULL, pbNibbles },
{ 294, 36, 59, 16, 0, 0, "Zap", NULL, NULL, pbZap },
{ 294, 53, 59, 16, 0, 0, "Trim", NULL, NULL, toggleTrimScreen },
{ 294, 70, 59, 16, 0, 0, "Extend", NULL, NULL, patternEditorExtended },
{ 294, 87, 59, 16, 0, 0, "Transps.", NULL, NULL, toggleTranspose },
{ 294, 104, 59, 16, 0, 0, "I.E.Ext.", NULL, NULL, toggleInstEditorExt },
{ 294, 121, 59, 16, 0, 0, "S.E.Ext.", NULL, NULL, toggleSampleEditorExt },
{ 294, 138, 59, 16, 0, 0, "Adv. Edit", NULL, NULL, toggleAdvEdit },
{ 294, 155, 30, 16, 0, 0, "Add", NULL, NULL, pbAddChan },
{ 323, 155, 30, 16, 0, 0, "Sub", NULL, NULL, pbSubChan },
{ 359, 2, 59, 16, 0, 0, "Play sng.", NULL, NULL, pbPlaySong },
{ 359, 19, 59, 16, 0, 0, "Play ptn.", NULL, NULL, pbPlayPtn },
{ 359, 36, 59, 16, 0, 0, "Stop", NULL, NULL, stopPlaying },
{ 359, 53, 59, 16, 0, 0, "Rec. sng.", NULL, NULL, pbRecSng },
{ 359, 70, 59, 16, 0, 0, "Rec. ptn.", NULL, NULL, pbRecPtn },
{ 359, 87, 59, 16, 0, 0, "Disk op.", NULL, NULL, toggleDiskOpScreen },
{ 359, 104, 59, 16, 0, 0, "Instr. Ed.", NULL, NULL, toggleInstEditor },
{ 359, 121, 59, 16, 0, 0, "Smp. Ed.", NULL, NULL, toggleSampleEditor },
{ 359, 138, 59, 16, 0, 0, "Config", NULL, NULL, showConfigScreen },
{ 359, 155, 59, 16, 0, 0, "Help", NULL, NULL, showHelpScreen },
{ 115, 35, 46, 16, 0, 0, "Exit", NULL, NULL, exitPatternEditorExtended },
// ------ INSTRUMENT SWITCHER PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 590, 2, 39, 16, 0, 0, "01-08", NULL, NULL, pbSetInstrBank1 },
{ 590, 19, 39, 16, 0, 0, "09-10", NULL, NULL, pbSetInstrBank2 },
{ 590, 36, 39, 16, 0, 0, "11-18", NULL, NULL, pbSetInstrBank3 },
{ 590, 53, 39, 16, 0, 0, "19-20", NULL, NULL, pbSetInstrBank4 },
{ 590, 73, 39, 16, 0, 0, "21-28", NULL, NULL, pbSetInstrBank5 },
{ 590, 90, 39, 16, 0, 0, "29-30", NULL, NULL, pbSetInstrBank6 },
{ 590, 107, 39, 16, 0, 0, "31-38", NULL, NULL, pbSetInstrBank7 },
{ 590, 124, 39, 16, 0, 0, "39-40", NULL, NULL, pbSetInstrBank8 },
{ 590, 2, 39, 16, 0, 0, "41-48", NULL, NULL, pbSetInstrBank9 },
{ 590, 19, 39, 16, 0, 0, "49-50", NULL, NULL, pbSetInstrBank10 },
{ 590, 36, 39, 16, 0, 0, "51-58", NULL, NULL, pbSetInstrBank11 },
{ 590, 53, 39, 16, 0, 0, "59-60", NULL, NULL, pbSetInstrBank12 },
{ 590, 73, 39, 16, 0, 0, "61-68", NULL, NULL, pbSetInstrBank13,},
{ 590, 90, 39, 16, 0, 0, "69-70", NULL, NULL, pbSetInstrBank14 },
{ 590, 107, 39, 16, 0, 0, "71-78", NULL, NULL, pbSetInstrBank15 },
{ 590, 124, 39, 16, 0, 0, "79-80", NULL, NULL, pbSetInstrBank16 },
{ 590, 144, 39, 27, 0, 0, "Swap", "Bank", NULL, pbSwapInstrBank },
{ 566, 99, 18, 13, 1, 4, ARROW_UP_STRING, NULL, sampleListScrollUp, NULL },
{ 566, 140, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, sampleListScrollDown, NULL },
// ------ NIBBLES SCREEN PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 568, 104, 61, 16, 0, 0, "Play", NULL, NULL, nibblesPlay },
{ 568, 121, 61, 16, 0, 0, "Help", NULL, NULL, nibblesHelp },
{ 568, 138, 61, 16, 0, 0, "Highs", NULL, NULL, nibblesHighScore },
{ 568, 155, 61, 16, 0, 0, "Exit", NULL, NULL, nibblesExit },
// ------ ADVANCED EDIT PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 3, 138, 51, 16, 0, 0, "Track", NULL, NULL, remapTrack },
{ 55, 138, 52, 16, 0, 0, "Pattern", NULL, NULL, remapPattern },
{ 3, 155, 51, 16, 0, 0, "Song", NULL, NULL, remapSong },
{ 55, 155, 52, 16, 0, 0, "Block", NULL, NULL, remapBlock },
// ------ ABOUT SCREEN PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 4, 153, 59, 16, 0, 0, "Exit", NULL, NULL, exitAboutScreen },
// ------ HELP SCREEN PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 3, 155, 59, 16, 0, 0, "Exit", NULL, NULL, exitHelpScreen },
{ 611, 2, 18, 13, 1, 3, ARROW_UP_STRING, NULL, helpScrollUp, NULL },
{ 611, 158, 18, 13, 1, 3, ARROW_DOWN_STRING, NULL, helpScrollDown, NULL },
// ------ PATTERN EDITOR PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 3, 385, 25, 13, 1, 4, ARROW_LEFT_STRING, NULL, scrollChannelLeft, NULL },
{ 604, 385, 25, 13, 1, 4, ARROW_RIGHT_STRING, NULL, scrollChannelRight, NULL },
// ------ TRANSPOSE PUSHBUTTONS ------
//x, y, w, h, p, d, text #1,text #2, funcOnDown, funcOnUp
{ 56, 110, 21, 16, 0, 0, "up", NULL, NULL, trackTranspCurInsUp },
{ 76, 110, 21, 16, 0, 0, "dn", NULL, NULL, trackTranspCurInsDn },
{ 98, 110, 36, 16, 0, 0, "12up", NULL, NULL, trackTranspCurIns12Up },
{ 133, 110, 36, 16, 0, 0, "12dn", NULL, NULL, trackTranspCurIns12Dn },
{ 175, 110, 21, 16, 0, 0, "up", NULL, NULL, trackTranspAllInsUp },
{ 195, 110, 21, 16, 0, 0, "dn", NULL, NULL, trackTranspAllInsDn },
{ 217, 110, 36, 16, 0, 0, "12up", NULL, NULL, trackTranspAllIns12Up },
{ 252, 110, 36, 16, 0, 0, "12dn", NULL, NULL, trackTranspAllIns12Dn },
{ 56, 125, 21, 16, 0, 0, "up", NULL, NULL, pattTranspCurInsUp },
{ 76, 125, 21, 16, 0, 0, "dn", NULL, NULL, pattTranspCurInsDn },
{ 98, 125, 36, 16, 0, 0, "12up", NULL, NULL, pattTranspCurIns12Up },
{ 133, 125, 36, 16, 0, 0, "12dn", NULL, NULL, pattTranspCurIns12Dn },
{ 175, 125, 21, 16, 0, 0, "up", NULL, NULL, pattTranspAllInsUp },
{ 195, 125, 21, 16, 0, 0, "dn", NULL, NULL, pattTranspAllInsDn },
{ 217, 125, 36, 16, 0, 0, "12up", NULL, NULL, pattTranspAllIns12Up },
{ 252, 125, 36, 16, 0, 0, "12dn", NULL, NULL, pattTranspAllIns12Dn },
{ 56, 140, 21, 16, 0, 0, "up", NULL, NULL, songTranspCurInsUp },
{ 76, 140, 21, 16, 0, 0, "dn", NULL, NULL, songTranspCurInsDn },
{ 98, 140, 36, 16, 0, 0, "12up", NULL, NULL, songTranspCurIns12Up },
{ 133, 140, 36, 16, 0, 0, "12dn", NULL, NULL, songTranspCurIns12Dn },
{ 175, 140, 21, 16, 0, 0, "up", NULL, NULL, songTranspAllInsUp },
{ 195, 140, 21, 16, 0, 0, "dn", NULL, NULL, songTranspAllInsDn },
{ 217, 140, 36, 16, 0, 0, "12up", NULL, NULL, songTranspAllIns12Up },
{ 252, 140, 36, 16, 0, 0, "12dn", NULL, NULL, songTranspAllIns12Dn },
{ 56, 155, 21, 16, 0, 0, "up", NULL, NULL, blockTranspCurInsUp },
{ 76, 155, 21, 16, 0, 0, "dn", NULL, NULL, blockTranspCurInsDn },
{ 98, 155, 36, 16, 0, 0, "12up", NULL, NULL, blockTranspCurIns12Up },
{ 133, 155, 36, 16, 0, 0, "12dn", NULL, NULL, blockTranspCurIns12Dn },
{ 175, 155, 21, 16, 0, 0, "up", NULL, NULL, blockTranspAllInsUp },
{ 195, 155, 21, 16, 0, 0, "dn", NULL, NULL, blockTranspAllInsDn },
{ 217, 155, 36, 16, 0, 0, "12up", NULL, NULL, blockTranspAllIns12Up },
{ 252, 155, 36, 16, 0, 0, "12dn", NULL, NULL, blockTranspAllIns12Dn },
// ------ SAMPLE EDITOR PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 3, 331, 23, 13, 1, 3, ARROW_LEFT_STRING, NULL, scrollSampleDataLeft, NULL },
{ 606, 331, 23, 13, 1, 3, ARROW_RIGHT_STRING, NULL, scrollSampleDataRight, NULL },
{ 38, 356, 18, 13, 1, 4, ARROW_UP_STRING, NULL, sampPlayNoteUp, NULL },
{ 38, 368, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, sampPlayNoteDown, NULL },
{ 3, 382, 53, 16, 0, 0, "Stop", NULL, NULL, smpEdStop},
{ 57, 348, 55, 16, 0, 0, "Wave", NULL, NULL, sampPlayWave },
{ 57, 365, 55, 16, 0, 0, "Range", NULL, NULL, sampPlayRange },
{ 57, 382, 55, 16, 0, 0, "Display", NULL, NULL, sampPlayDisplay },
{ 118, 348, 63, 16, 0, 0, "Show r.", NULL, NULL, showRange },
{ 118, 365, 63, 16, 0, 0, "Range all", NULL, NULL, rangeAll },
{ 118, 382, 63, 16, 0, 0, "Sample", NULL, NULL, startSampling },
{ 182, 348, 63, 16, 0, 0, "Zoom out", NULL, NULL, zoomOut },
{ 182, 365, 63, 16, 0, 0, "Show all", NULL, NULL, showAll },
{ 182, 382, 63, 16, 0, 0, "Save rng.", NULL, NULL, saveRange },
{ 251, 348, 43, 16, 0, 0, "Cut", NULL, NULL, sampCut },
{ 251, 365, 43, 16, 0, 0, "Copy", NULL, NULL, sampCopy },
{ 251, 382, 43, 16, 0, 0, "Paste", NULL, NULL, sampPaste },
{ 300, 348, 50, 16, 0, 0, "Crop", NULL, NULL, sampCrop },
{ 300, 365, 50, 16, 0, 0, "Volume", NULL, NULL, pbSampleVolume },
{ 300, 382, 50, 16, 0, 0, "X-Fade", NULL, NULL, sampXFade },
{ 430, 348, 54, 16, 0, 0, "Exit", NULL, NULL, exitSampleEditor },
{ 594, 348, 35, 13, 0, 0, "Clr S.", NULL, NULL, clearSample },
{ 594, 360, 35, 13, 0, 0, "Min.", NULL, NULL, sampMin },
{ 594, 373, 18, 13, 2, 4, ARROW_UP_STRING, NULL, sampRepeatUp, NULL },
{ 611, 373, 18, 13, 2, 4, ARROW_DOWN_STRING, NULL, sampRepeatDown, NULL },
{ 594, 385, 18, 13, 2, 4, ARROW_UP_STRING, NULL, sampReplenUp, NULL },
{ 611, 385, 18, 13, 2, 4, ARROW_DOWN_STRING, NULL, sampReplenDown, NULL },
// ------ SAMPLE EDITOR EXTENSION PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 3, 138, 52, 16, 0, 0, "Clr. c.bf", NULL, NULL, clearCopyBuffer },
{ 56, 138, 49, 16, 0, 0, "Conv", NULL, NULL, sampleConv },
{ 106, 138, 49, 16, 0, 0, "Echo", NULL, NULL, pbSampleEcho },
{ 3, 155, 52, 16, 0, 0, "Backw.", NULL, NULL, sampleBackwards },
{ 56, 155, 49, 16, 0, 0, "Conv W", NULL, NULL, sampleConvW },
{ 106, 155, 49, 16, 0, 0, "Fix DC", NULL, NULL, fixDC },
{ 161, 121, 60, 16, 0, 0, "Copy ins.", NULL, NULL, copyInstr },
{ 222, 121, 66, 16, 0, 0, "Copy smp.", NULL, NULL, copySmp },
{ 161, 138, 60, 16, 0, 0, "Xchg ins.", NULL, NULL, xchgInstr },
{ 222, 138, 66, 16, 0, 0, "Xchg smp.", NULL, NULL, xchgSmp },
{ 161, 155, 60, 16, 0, 0, "Resample", NULL, NULL, pbSampleResample },
{ 222, 155, 66, 16, 0, 0, "Mix smp.", NULL, NULL, pbSampleMix },
// ------ INSTRUMENT EDITOR PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 200, 175, 23, 12, 0, 0, SMALL_1_STRING, NULL, NULL, volPreDef1 },
{ 222, 175, 24, 12, 0, 0, SMALL_2_STRING, NULL, NULL, volPreDef2 },
{ 245, 175, 24, 12, 0, 0, SMALL_3_STRING, NULL, NULL, volPreDef3 },
{ 268, 175, 24, 12, 0, 0, SMALL_4_STRING, NULL, NULL, volPreDef4 },
{ 291, 175, 24, 12, 0, 0, SMALL_5_STRING, NULL, NULL, volPreDef5 },
{ 314, 175, 24, 12, 0, 0, SMALL_6_STRING, NULL, NULL, volPreDef6 },
{ 200, 262, 23, 12, 0, 0, SMALL_1_STRING, NULL, NULL, panPreDef1 },
{ 222, 262, 24, 12, 0, 0, SMALL_2_STRING, NULL, NULL, panPreDef2 },
{ 245, 262, 24, 12, 0, 0, SMALL_3_STRING, NULL, NULL, panPreDef3 },
{ 268, 262, 24, 12, 0, 0, SMALL_4_STRING, NULL, NULL, panPreDef4 },
{ 291, 262, 24, 12, 0, 0, SMALL_5_STRING, NULL, NULL, panPreDef5 },
{ 314, 262, 24, 12, 0, 0, SMALL_6_STRING, NULL, NULL, panPreDef6 },
{ 570, 276, 59, 16, 0, 0, "Exit", NULL, NULL, exitInstEditor },
{ 341, 175, 47, 16, 1, 4, "Add", NULL, volEnvAdd, NULL },
{ 389, 175, 46, 16, 1, 4, "Del", NULL, volEnvDel, NULL },
{ 398, 204, 19, 13, 1, 4, ARROW_UP_STRING, NULL, volEnvSusUp, NULL },
{ 416, 204, 19, 13, 1, 4, ARROW_DOWN_STRING, NULL, volEnvSusDown, NULL },
{ 398, 231, 19, 13, 1, 4, ARROW_UP_STRING, NULL, volEnvRepSUp, NULL },
{ 416, 231, 19, 13, 1, 4, ARROW_DOWN_STRING, NULL, volEnvRepSDown, NULL },
{ 398, 245, 19, 13, 1, 4, ARROW_UP_STRING, NULL, volEnvRepEUp, NULL },
{ 416, 245, 19, 13, 1, 4, ARROW_DOWN_STRING, NULL, volEnvRepEDown, NULL },
{ 341, 262, 47, 16, 1, 4, "Add", NULL, panEnvAdd, NULL },
{ 389, 262, 46, 16, 1, 4, "Del", NULL, panEnvDel, NULL },
{ 398, 291, 19, 13, 1, 4, ARROW_UP_STRING, NULL, panEnvSusUp, NULL },
{ 416, 291, 19, 13, 1, 4, ARROW_DOWN_STRING, NULL, panEnvSusDown, NULL },
{ 398, 318, 19, 13, 1, 4, ARROW_UP_STRING, NULL, panEnvRepSUp, NULL },
{ 416, 318, 19, 13, 1, 4, ARROW_DOWN_STRING, NULL, panEnvRepSDown, NULL },
{ 398, 332, 19, 13, 1, 4, ARROW_UP_STRING, NULL, panEnvRepEUp, NULL },
{ 416, 332, 19, 13, 1, 4, ARROW_DOWN_STRING, NULL, panEnvRepEDown, NULL },
{ 521, 175, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, volDown, NULL },
{ 606, 175, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, volUp, NULL },
{ 521, 189, 23, 13, 2, 4, ARROW_LEFT_STRING, NULL, panDown, NULL },
{ 606, 189, 23, 13, 2, 4, ARROW_RIGHT_STRING, NULL, panUp, NULL },
{ 521, 203, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, ftuneDown, NULL },
{ 606, 203, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, ftuneUp, NULL },
{ 521, 220, 23, 13, 2, 4, ARROW_LEFT_STRING, NULL, fadeoutDown, NULL },
{ 606, 220, 23, 13, 2, 4, ARROW_RIGHT_STRING, NULL, fadeoutUp, NULL },
{ 521, 234, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, vibSpeedDown, NULL },
{ 606, 234, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, vibSpeedUp, NULL },
{ 521, 248, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, vibDepthDown, NULL },
{ 606, 248, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, vibDepthUp, NULL },
{ 521, 262, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, vibSweepDown, NULL },
{ 606, 262, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, vibSweepUp, NULL },
{ 441, 312, 94, 16, 1, 4, "Octave up", NULL, relToneOctUp, NULL },
{ 536, 312, 93, 16, 1, 4, "Halftone up", NULL, relToneUp, NULL },
{ 441, 329, 94, 16, 1, 4, "Octave down", NULL, relToneOctDown, NULL },
{ 536, 329, 93, 16, 1, 4, "Halftone down", NULL, relToneDown, NULL },
// ------ INSTRUMENT EDITOR EXTENSION PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 172, 130, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, midiChDown, NULL },
{ 265, 130, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, midiChUp, NULL },
{ 172, 144, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, midiPrgDown, NULL },
{ 265, 144, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, midiPrgUp, NULL },
{ 172, 158, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, midiBendDown, NULL },
{ 265, 158, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, midiBendUp, NULL },
// ------ TRIM SCREEN PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 139, 155, 74, 16, 0, 0, "Calculate", NULL, NULL, pbTrimCalc },
{ 214, 155, 74, 16, 0, 0, "Trim", NULL, NULL, pbTrimDoTrim },
// ------ CONFIG LEFT PANEL PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 3, 104, 104, 16, 0, 0, "Reset config", NULL, NULL, resetConfig },
{ 3, 121, 104, 16, 0, 0, "Load config", NULL, NULL, loadConfig2 },
{ 3, 138, 104, 16, 0, 0, "Save config", NULL, NULL, saveConfig2 },
{ 3, 155, 104, 16, 0, 0, "Exit", NULL, NULL, exitConfigScreen },
// ------ CONFIG AUDIO PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 326, 2, 57, 13, 0, 0, "Re-scan", NULL, NULL, rescanAudioDevices },
{ 365, 16, 18, 13, 1, 4, ARROW_UP_STRING, NULL, scrollAudOutputDevListUp, NULL },
{ 365, 72, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, scrollAudOutputDevListDown, NULL },
{ 365, 103, 18, 13, 1, 4, ARROW_UP_STRING, NULL, scrollAudInputDevListUp, NULL },
{ 365, 137, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, scrollAudInputDevListDown, NULL },
{ 508, 132, 21, 13, 1, 4, ARROW_LEFT_STRING, NULL, configAmpDown, NULL },
{ 608, 132, 21, 13, 1, 4, ARROW_RIGHT_STRING, NULL, configAmpUp, NULL },
{ 508, 158, 21, 13, 1, 0, ARROW_LEFT_STRING, NULL, configMasterVolDown, NULL },
{ 608, 158, 21, 13, 1, 0, ARROW_RIGHT_STRING, NULL, configMasterVolUp, NULL },
// ------ CONFIG LAYOUT PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 513, 15, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, configPalRDown, NULL },
{ 606, 15, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, configPalRUp, NULL },
{ 513, 29, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, configPalGDown, NULL },
{ 606, 29, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, configPalGUp, NULL },
{ 513, 43, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, configPalBDown, NULL },
{ 606, 43, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, configPalBUp, NULL },
{ 513, 71, 23, 13, 1, 4, ARROW_LEFT_STRING, NULL, configPalContDown, NULL },
{ 606, 71, 23, 13, 1, 4, ARROW_RIGHT_STRING, NULL, configPalContUp, NULL },
// ------ CONFIG MISCELLANEOUS PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 113, 155, 93, 16, 0, 0, ui.fullscreenButtonText, NULL, NULL, toggleFullScreen },
{ 370, 121, 18, 13, 1, 4, ARROW_UP_STRING, NULL, configQuantizeUp, NULL },
{ 387, 121, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, configQuantizeDown, NULL },
{ 594, 106, 18, 13, 1, 4, ARROW_UP_STRING, NULL, configMIDIChnUp, NULL },
{ 611, 106, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, configMIDIChnDown, NULL },
{ 594, 120, 18, 13, 1, 4, ARROW_UP_STRING, NULL, configMIDITransUp, NULL },
{ 611, 120, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, configMIDITransDown, NULL },
{ 556, 158, 22, 13, 1, 4, ARROW_LEFT_STRING, NULL, configMIDISensDown, NULL },
{ 607, 158, 22, 13, 1, 4, ARROW_RIGHT_STRING, NULL, configMIDISensUp, NULL },
#ifdef HAS_MIDI
// ------ CONFIG MIDI PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 483, 2, 18, 13, 1, 4, ARROW_UP_STRING, NULL, scrollMidiInputDevListUp, NULL },
{ 483, 158, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, scrollMidiInputDevListDown, NULL },
#endif
// ------ DISK OP. PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 70, 2, 58, 16, 0, 0, "Save", NULL, NULL, pbDiskOpSave },
{ 70, 19, 58, 16, 0, 0, "Delete", NULL, NULL, pbDiskOpDelete },
{ 70, 36, 58, 16, 0, 0, "Rename", NULL, NULL, pbDiskOpRename },
{ 70, 53, 58, 16, 0, 0, "Make dir.", NULL, NULL, pbDiskOpMakeDir },
{ 70, 70, 58, 16, 0, 0, "Refresh", NULL, NULL, pbDiskOpRefresh },
{ 70, 87, 58, 16, 0, 0, "Set path", NULL, NULL, pbDiskOpSetPath },
{ 70, 104, 58, 16, 0, 0, "Show all", NULL, NULL, pbDiskOpShowAll },
{ 70, 121, 58, 19, 0, 0, "Exit", NULL, NULL, pbDiskOpExit },
#ifdef _WIN32
{ 134, 2, 31, 13, 0, 0, ".\001", NULL, NULL, pbDiskOpParent },
{ 134, 16, 31, 12, 0, 0, "\\", NULL, NULL, pbDiskOpRoot },
{ 134, 29, 31, 13, 0, 0, NULL, NULL, NULL, pbDiskOpDrive1 },
{ 134, 43, 31, 13, 0, 0, NULL, NULL, NULL, pbDiskOpDrive2 },
{ 134, 57, 31, 13, 0, 0, NULL, NULL, NULL, pbDiskOpDrive3 },
{ 134, 71, 31, 13, 0, 0, NULL, NULL, NULL, pbDiskOpDrive4 },
{ 134, 85, 31, 13, 0, 0, NULL, NULL, NULL, pbDiskOpDrive5 },
{ 134, 99, 31, 13, 0, 0, NULL, NULL, NULL, pbDiskOpDrive6 },
{ 134, 113, 31, 13, 0, 0, NULL, NULL, NULL, pbDiskOpDrive7 },
{ 134, 127, 31, 13, 0, 0, NULL, NULL, NULL, pbDiskOpDrive8 },
#else
{ 134, 2, 31, 13, 0, 0, "../", NULL, NULL, pbDiskOpParent },
{ 134, 16, 31, 12, 0, 0, "/", NULL, NULL, pbDiskOpRoot },
#endif
{ 335, 2, 18, 13, 1, 3, ARROW_UP_STRING, NULL, pbDiskOpListUp, NULL },
{ 335, 158, 18, 13, 1, 3, ARROW_DOWN_STRING, NULL, pbDiskOpListDown, NULL },
// ------ WAV RENDERER PUSHBUTTONS ------
//x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
{ 3, 111, 73, 43, 0, 0, "RECORD", NULL, NULL, pbWavRender },
{ 3, 155, 73, 16, 0, 0, "Exit", NULL, NULL, pbWavExit },
{ 253, 114, 18, 13, 1, 6, ARROW_UP_STRING, NULL, pbWavFreqUp, NULL },
{ 270, 114, 18, 13, 1, 6, ARROW_DOWN_STRING, NULL, pbWavFreqDown, NULL },
{ 253, 128, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbWavAmpUp, NULL },
{ 270, 128, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbWavAmpDown, NULL },
{ 253, 142, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbWavSongStartUp, NULL },
{ 270, 142, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbWavSongStartDown, NULL },
{ 253, 156, 18, 13, 1, 4, ARROW_UP_STRING, NULL, pbWavSongEndUp, NULL },
{ 270, 156, 18, 13, 1, 4, ARROW_DOWN_STRING, NULL, pbWavSongEndDown, NULL }
};
static uint32_t tmpCounter;
void drawPushButton(uint16_t pushButtonID)
{
uint8_t state;
uint16_t x, y, w, h, textX, textY, textW;
pushButton_t *b;
assert(pushButtonID < NUM_PUSHBUTTONS);
b = &pushButtons[pushButtonID];
if (!b->visible)
return;
state = b->state;
x = b->x;
y = b->y;
w = b->w;
h = b->h;
assert(x < SCREEN_W && y < SCREEN_H && w >= 4 && h >= 4);
if (b->bitmapFlag)
{
blitFast(x, y, (state == PUSHBUTTON_UNPRESSED) ? b->bitmapUnpressed : b->bitmapPressed, w, h);
return;
}
// fill button background
fillRect(x + 1, y + 1, w - 2, h - 2, PAL_BUTTONS);
// draw outer border
hLine(x, y, w, PAL_BCKGRND);
hLine(x, y + h - 1, w, PAL_BCKGRND);
vLine(x, y, h, PAL_BCKGRND);
vLine(x + w - 1, y, h, PAL_BCKGRND);
//draw inner borders
if (state == PUSHBUTTON_UNPRESSED)
{
// top left corner inner border
hLine(x + 1, y + 1, w - 3, PAL_BUTTON1);
vLine(x + 1, y + 2, h - 4, PAL_BUTTON1);
// bottom right corner inner border
hLine(x + 1 - 0, y + h - 2, w - 2, PAL_BUTTON2);
vLine(x + w - 2, y + 1 - 0, h - 3, PAL_BUTTON2);
}
else
{
// top left corner inner border
hLine(x + 1, y + 1, w - 2, PAL_BUTTON2);
vLine(x + 1, y + 2, h - 3, PAL_BUTTON2);
}
// render button text(s)
if (b->caption != NULL && *b->caption != '\0')
{
// button text #2
if (b->caption2 != NULL && *b->caption2 != '\0')
{
textW = textWidth(b->caption2);
textX = x + ((w - textW) / 2);
textY = y + 6 + ((h - (FONT1_CHAR_H - 2)) / 2);
if (state == PUSHBUTTON_PRESSED)
textOut(textX + 1, textY + 1, PAL_BTNTEXT, b->caption2);
else
textOut(textX, textY, PAL_BTNTEXT, b->caption2);
y -= 5; // if two text lines, bias y position of first (upper) text
}
// button text #1
textW = textWidth(b->caption);
textX = x + ((w - textW) / 2);
textY = y + ((h - (FONT1_CHAR_H - 2)) / 2);
if (state == PUSHBUTTON_PRESSED)
textOut(textX + 1, textY + 1, PAL_BTNTEXT, b->caption);
else
textOut(textX, textY, PAL_BTNTEXT, b->caption);
}
}
void showPushButton(uint16_t pushButtonID)
{
assert(pushButtonID < NUM_PUSHBUTTONS);
pushButtons[pushButtonID].visible = true;
drawPushButton(pushButtonID);
}
void hidePushButton(uint16_t pushButtonID)
{
assert(pushButtonID < NUM_PUSHBUTTONS);
pushButtons[pushButtonID].state = 0;
pushButtons[pushButtonID].visible = false;
}
void handlePushButtonsWhileMouseDown(void)
{
int8_t buttonDelay;
pushButton_t *pushButton;
assert(mouse.lastUsedObjectID >= 0 && mouse.lastUsedObjectID < NUM_PUSHBUTTONS);
pushButton = &pushButtons[mouse.lastUsedObjectID];
if (!pushButton->visible)
return;
pushButton->state = PUSHBUTTON_UNPRESSED;
if (mouse.x >= pushButton->x && mouse.x < pushButton->x+pushButton->w &&
mouse.y >= pushButton->y && mouse.y < pushButton->y+pushButton->h)
{
pushButton->state = PUSHBUTTON_PRESSED;
}
if (mouse.lastX != mouse.x || mouse.lastY != mouse.y)
{
mouse.lastX = mouse.x;
mouse.lastY = mouse.y;
drawPushButton(mouse.lastUsedObjectID);
}
// long delay before repeat
if (pushButton->preDelay && mouse.firstTimePressingButton)
{
tmpCounter = 0;
if (++mouse.buttonCounter >= BUTTON_DOWN_DELAY)
{
mouse.buttonCounter = 0;
mouse.firstTimePressingButton = false;
}
else
{
return; // we're delaying
}
}
if (pushButton->state == PUSHBUTTON_PRESSED)
{
// button delay stuff
if (mouse.rightButtonPressed)
buttonDelay = pushButton->delayFrames >> 1;
else if (pushButton->preDelay == 2 && (!mouse.firstTimePressingButton && ++tmpCounter >= 50)) // special mode
buttonDelay = 0;
else
buttonDelay = pushButton->delayFrames;
// main repeat delay
if (++mouse.buttonCounter >= buttonDelay)
{
mouse.buttonCounter = 0;
if (pushButton->callbackFuncOnDown != NULL)
pushButton->callbackFuncOnDown();
}
}
}
bool testPushButtonMouseDown(void)
{
uint16_t start, end;
pushButton_t *pushButton;
if (ui.sysReqShown)
{
// if a system request is open, only test the first eight pushbuttons (reserved)
start = 0;
end = 8;
}
else
{
start = 8;
end = NUM_PUSHBUTTONS;
}
for (uint16_t i = start; i < end; i++)
{
pushButton = &pushButtons[i];
if (!pushButton->visible)
continue;
if (mouse.x >= pushButton->x && mouse.x < pushButton->x+pushButton->w &&
mouse.y >= pushButton->y && mouse.y < pushButton->y+pushButton->h)
{
mouse.lastUsedObjectID = i;
mouse.lastUsedObjectType = OBJECT_PUSHBUTTON;
if (!mouse.rightButtonPressed)
{
mouse.firstTimePressingButton = true;
mouse.buttonCounter = 0;
pushButton->state = PUSHBUTTON_PRESSED;
drawPushButton(i);
if (pushButton->callbackFuncOnDown != NULL)
pushButton->callbackFuncOnDown();
}
return true;
}
}
return false;
}
int16_t testPushButtonMouseRelease(bool runCallback)
{
pushButton_t *pushButton;
if (mouse.lastUsedObjectType != OBJECT_PUSHBUTTON || mouse.lastUsedObjectID == OBJECT_ID_NONE)
return -1;
assert(mouse.lastUsedObjectID < NUM_PUSHBUTTONS);
pushButton = &pushButtons[mouse.lastUsedObjectID];
if (!pushButton->visible)
return -1;
if (mouse.x >= pushButton->x && mouse.x < pushButton->x+pushButton->w &&
mouse.y >= pushButton->y && mouse.y < pushButton->y+pushButton->h)
{
pushButton->state = PUSHBUTTON_UNPRESSED;
drawPushButton(mouse.lastUsedObjectID);
if (runCallback)
{
if (pushButton->callbackFuncOnUp != NULL)
pushButton->callbackFuncOnUp();
}
return mouse.lastUsedObjectID;
}
return -1;
}