mirror of
https://github.com/robmcmullen/apple2.git
synced 2024-09-27 12:54:40 +00:00
Added missing files from last commit. :-/
This commit is contained in:
parent
c970c23a2e
commit
331bbf2080
517
src/gui/config.cpp
Normal file
517
src/gui/config.cpp
Normal file
@ -0,0 +1,517 @@
|
||||
//
|
||||
// config.cpp
|
||||
//
|
||||
// Configuration GUI
|
||||
// by James Hammons
|
||||
// © 2019 Underground Software
|
||||
//
|
||||
|
||||
#include "config.h"
|
||||
#include <vector>
|
||||
#include "elements.h"
|
||||
#include "font10pt.h"
|
||||
#include "gui.h"
|
||||
#include "log.h"
|
||||
#include "settings.h"
|
||||
#include "video.h"
|
||||
|
||||
|
||||
#define C_WIDTH 402
|
||||
#define C_HEIGHT 322
|
||||
#define C_XPOS ((VIRTUAL_SCREEN_WIDTH - C_WIDTH) / 2)
|
||||
#define C_YPOS ((VIRTUAL_SCREEN_HEIGHT - C_HEIGHT) / 2)
|
||||
|
||||
static SDL_Texture * window = NULL;
|
||||
//static uint32_t windowPixels[C_WIDTH * C_HEIGHT];
|
||||
static SDL_Texture * cardTex[3] = { 0 };
|
||||
static SDL_Texture * cardBay = NULL;
|
||||
bool Config::showWindow = false;
|
||||
|
||||
std::vector<void *> objList;
|
||||
|
||||
static bool dragging = false;
|
||||
static bool entered = false;
|
||||
static bool refresh = false;
|
||||
//static bool cb1Checked = false;
|
||||
static bool cb2Checked = false;
|
||||
//static bool cb3Checked = false;
|
||||
static bool cb4Checked = false;
|
||||
static bool cbnChecked = false;
|
||||
static char le1[512] = { 0 };
|
||||
|
||||
static const char cb1Text[] = "Automatically save state on exit";
|
||||
static const char cb2Text[] = "Enable hard drive";
|
||||
static const char cb3Text[] = "Run Apple2 in full screen mode";
|
||||
static const char cb4Text[] = "Automatically switch to Apple ][ mode for games that require it";
|
||||
static const char cbnText[] = "Don't check this box";
|
||||
static const char le1Text[] = "HD1 location:";
|
||||
|
||||
static const char cbChecked[(9 * 11) + 1] =
|
||||
" @@"
|
||||
" @@"
|
||||
" @@ "
|
||||
" @@ "
|
||||
" @@ "
|
||||
" @@ @@ "
|
||||
"@@ @@ "
|
||||
" @@ @@ "
|
||||
" @@@ @ "
|
||||
" @ @@ @ "
|
||||
" @@ @@ ";
|
||||
|
||||
static const char cbUnchecked[(9 * 11) + 1] =
|
||||
" "
|
||||
" "
|
||||
" "
|
||||
" "
|
||||
" "
|
||||
" @@@@@@ "
|
||||
" @ @ "
|
||||
" @ @ "
|
||||
" @ @ "
|
||||
" @ @ "
|
||||
" @@@@@@ ";
|
||||
|
||||
static const char slotNum[7][(5 * 5) + 1] =
|
||||
{
|
||||
" @ "
|
||||
"@@@ "
|
||||
" @ "
|
||||
" @ "
|
||||
"@@@@@",
|
||||
|
||||
"@@@@ "
|
||||
" @"
|
||||
" @@@ "
|
||||
"@ "
|
||||
"@@@@@",
|
||||
|
||||
"@@@@ "
|
||||
" @"
|
||||
" @@@ "
|
||||
" @"
|
||||
"@@@@ ",
|
||||
|
||||
"@ @ "
|
||||
"@ @ "
|
||||
"@@@@@"
|
||||
" @ "
|
||||
" @ ",
|
||||
|
||||
"@@@@@"
|
||||
"@ "
|
||||
"@@@@ "
|
||||
" @"
|
||||
"@@@@",
|
||||
|
||||
" @@@@"
|
||||
"@ "
|
||||
"@@@@ "
|
||||
"@ @"
|
||||
" @@@ ",
|
||||
|
||||
"@@@@@"
|
||||
" @"
|
||||
" @ "
|
||||
" @ "
|
||||
" @ "
|
||||
};
|
||||
|
||||
//static uint8_t card1[(96 * 11) + 1] = { 0 };
|
||||
|
||||
|
||||
void Config::Init(SDL_Renderer * renderer)
|
||||
{
|
||||
window = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ABGR8888,
|
||||
SDL_TEXTUREACCESS_TARGET, C_WIDTH, C_HEIGHT);
|
||||
|
||||
if (!window)
|
||||
{
|
||||
WriteLog("GUI (Config): Could not create window!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (SDL_SetTextureBlendMode(window, SDL_BLENDMODE_BLEND) == -1)
|
||||
WriteLog("GUI (Config): Could not set blend mode for window.\n");
|
||||
|
||||
for(int t=0; t<3; t++)
|
||||
{
|
||||
cardTex[t] = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
|
||||
SDL_TEXTUREACCESS_TARGET, 96, 11);
|
||||
SDL_SetTextureBlendMode(cardTex[t], SDL_BLENDMODE_BLEND);
|
||||
|
||||
SDL_SetRenderTarget(renderer, cardTex[t]);
|
||||
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
|
||||
SDL_RenderClear(renderer);
|
||||
|
||||
SDL_SetRenderDrawColor(renderer, 0x00, 0xAA, 0x00, 0xFF);
|
||||
|
||||
for(int j=3; j<8; j++)
|
||||
for(int i=0; i<96; i++)
|
||||
SDL_RenderDrawPoint(renderer, i, j);
|
||||
}
|
||||
|
||||
SDL_SetRenderTarget(renderer, cardTex[0]);
|
||||
GUI::DrawString(renderer, 4, 0, "Disk ][");
|
||||
SDL_SetRenderTarget(renderer, cardTex[1]);
|
||||
GUI::DrawString(renderer, 2, 0, "Mockingboard");
|
||||
SDL_SetRenderTarget(renderer, cardTex[2]);
|
||||
GUI::DrawString(renderer, 6, 0, "SCSI");
|
||||
|
||||
cardBay = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 123, 99);
|
||||
SDL_SetTextureBlendMode(cardBay, SDL_BLENDMODE_BLEND);
|
||||
SDL_SetRenderTarget(renderer, cardBay);
|
||||
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
|
||||
SDL_RenderClear(renderer);
|
||||
|
||||
GUI::DrawBox(renderer, 5, 5, 118, 88, 0xFF, 0xFF, 0xFF);
|
||||
GUI::DrawStringVert(renderer, 5, 33 + 21, " SLOTS ");
|
||||
|
||||
for(int t=0; t<7; t++)
|
||||
{
|
||||
GUI::DrawBox(renderer, FONT_WIDTH * 2, (FONT_HEIGHT * (t + 1)) + 3, 96, 5, 0xFF, 0xFF, 0xFF);
|
||||
GUI::DrawCharArray(renderer, slotNum[t], 112, (FONT_HEIGHT * (t + 1)) + 3, 5, 5, 0xFF, 0xFF, 0xFF);
|
||||
}
|
||||
|
||||
SDL_SetRenderTarget(renderer, NULL);
|
||||
|
||||
objList.push_back(new CheckBox(1, 1, &cb1Checked, cb1Text));
|
||||
objList.push_back(new CheckBox(1, 1, &settings.autoStateSaving, cb1Text));
|
||||
objList.push_back(new CheckBox(1, 2, &cb2Checked, cb2Text));
|
||||
objList.push_back(new CheckBox(1, 3, &settings.fullscreen, cb3Text));
|
||||
objList.push_back(new CheckBox(1, 4, &cb4Checked, cb4Text));
|
||||
|
||||
objList.push_back(new CheckBox(1, 27, &cbnChecked, cbnText));
|
||||
|
||||
objList.push_back(new LineEdit(1, 6, le1, 48, le1Text));
|
||||
objList.push_back(new Draggable(1 * FONT_WIDTH, 8 * FONT_HEIGHT, 96, 11, cardTex[0]));
|
||||
objList.push_back(new Draggable(1 * FONT_WIDTH, 9 * FONT_HEIGHT, 96, 11, cardTex[0]));
|
||||
objList.push_back(new Draggable(1 * FONT_WIDTH, 10 * FONT_HEIGHT, 96, 11, cardTex[1]));
|
||||
objList.push_back(new Draggable(1 * FONT_WIDTH, 11 * FONT_HEIGHT, 96, 11, cardTex[1]));
|
||||
objList.push_back(new Draggable(1 * FONT_WIDTH, 12 * FONT_HEIGHT, 96, 11, cardTex[2]));
|
||||
}
|
||||
|
||||
|
||||
void Config::ShowWindow(void)
|
||||
{
|
||||
entered = false;
|
||||
showWindow = true;
|
||||
refresh = true;
|
||||
}
|
||||
|
||||
|
||||
void Config::HideWindow(void)
|
||||
{
|
||||
showWindow = false;
|
||||
refresh = true;
|
||||
}
|
||||
|
||||
|
||||
void Config::MouseDown(int32_t x, int32_t y, uint32_t buttons)
|
||||
{
|
||||
if (!showWindow || !entered)
|
||||
return;
|
||||
|
||||
dragging = true;
|
||||
std::vector<void *>::iterator i;
|
||||
|
||||
for(i=objList.begin(); i!=objList.end(); i++)
|
||||
{
|
||||
Object * obj = (Object *)(*i);
|
||||
|
||||
switch (obj->type)
|
||||
{
|
||||
case OTCheckBox:
|
||||
{
|
||||
CheckBox * cb = (CheckBox *)obj;
|
||||
|
||||
if (cb->hovered)
|
||||
{
|
||||
*(cb->state) = !(*(cb->state));
|
||||
refresh = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case OTDraggable:
|
||||
{
|
||||
Draggable * d = (Draggable *)obj;
|
||||
|
||||
if (d->hovered)
|
||||
{
|
||||
d->dragging = true;
|
||||
refresh = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Config::MouseUp(int32_t x, int32_t y, uint32_t buttons)
|
||||
{
|
||||
if (!showWindow)
|
||||
return;
|
||||
|
||||
dragging = false;
|
||||
std::vector<void *>::iterator i;
|
||||
|
||||
for(i=objList.begin(); i!=objList.end(); i++)
|
||||
{
|
||||
Object * obj = (Object *)(*i);
|
||||
|
||||
switch (obj->type)
|
||||
{
|
||||
case OTDraggable:
|
||||
{
|
||||
Draggable * d = (Draggable *)obj;
|
||||
|
||||
if (d->dragging)
|
||||
{
|
||||
d->dragging = false;
|
||||
|
||||
if ((d->r.x > 120) && (d->r.x < 220) && (d->r.y > (8 * FONT_HEIGHT)) && (d->r.y < (15 * FONT_HEIGHT)))
|
||||
{
|
||||
d->spot = ((d->r.y - (8 * FONT_HEIGHT)) / FONT_HEIGHT) + 1;
|
||||
d->r.x = 120;
|
||||
d->r.y = (7 + d->spot) * FONT_HEIGHT;
|
||||
}
|
||||
else
|
||||
{
|
||||
d->r.x = d->homex;
|
||||
d->r.y = d->homey;
|
||||
d->spot = 0;
|
||||
}
|
||||
|
||||
refresh = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int32_t oldx, oldy;
|
||||
void Config::MouseMove(int32_t x, int32_t y, uint32_t buttons)
|
||||
{
|
||||
if (!showWindow)
|
||||
return;
|
||||
|
||||
int32_t nx = x - C_XPOS, ny = y - C_YPOS;
|
||||
|
||||
// Check to see if C has been hovered yet, and, if so, set a flag to show
|
||||
// that it has
|
||||
if (!entered && ((nx >= 0) && (nx <= C_WIDTH) && (ny >= 0)
|
||||
&& (ny <= C_HEIGHT)))
|
||||
entered = true;
|
||||
|
||||
// Check to see if the C, since being hovered, is now no longer being
|
||||
// hovered
|
||||
//N.B.: Should probably make like a 1/2 to 1 second timeout to allow for overshooting the edge of the thing, maybe have the window fade out gradually and let it come back if you enter before it leaves...
|
||||
if (entered && ((nx < 0) || (nx > C_WIDTH) || (ny < 0) || (ny > C_HEIGHT)))
|
||||
{
|
||||
showWindow = false;
|
||||
refresh = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Bail out if the C hasn't been entered yet
|
||||
if (!entered)
|
||||
return;
|
||||
|
||||
std::vector<void *>::iterator i;
|
||||
|
||||
for(i=objList.begin(); i!=objList.end(); i++)
|
||||
{
|
||||
Object * obj = (Object *)(*i);
|
||||
|
||||
switch (obj->type)
|
||||
{
|
||||
case OTCheckBox:
|
||||
{
|
||||
CheckBox * cb = (CheckBox *)obj;
|
||||
bool oldHover = cb->hovered;
|
||||
cb->hovered = (((nx >= ((cb->r.x * FONT_WIDTH) + 1))
|
||||
&& (nx <= ((cb->r.x * FONT_WIDTH) + 6))
|
||||
&& (ny >= ((cb->r.y * FONT_HEIGHT) + 3))
|
||||
&& (ny <= ((cb->r.y * FONT_HEIGHT) + 8))) ? true : false);
|
||||
|
||||
if (oldHover != cb->hovered)
|
||||
refresh = true;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case OTLineEdit:
|
||||
{
|
||||
LineEdit * le = (LineEdit *)obj;
|
||||
uint32_t labelLen = strlen(le->label);
|
||||
bool oldHover = le->hovered;
|
||||
le->hovered = (((nx >= ((le->r.x + labelLen + 1) * FONT_WIDTH))
|
||||
&& (nx <= ((le->r.x + labelLen + 1 + le->size) * FONT_WIDTH))
|
||||
&& (ny >= ((le->r.y * FONT_HEIGHT)))
|
||||
&& (ny <= ((le->r.y + 1) * FONT_HEIGHT))) ? true : false);
|
||||
|
||||
if (oldHover != le->hovered)
|
||||
refresh = true;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case OTDraggable:
|
||||
{
|
||||
Draggable * d = (Draggable *)obj;
|
||||
|
||||
if (!d->dragging)
|
||||
{
|
||||
bool oldHover = d->hovered;
|
||||
d->hovered = (((nx >= d->r.x) && (nx < (d->r.x + d->r.w))
|
||||
&& (ny >= d->r.y) && (ny < (d->r.y + d->r.h)))
|
||||
? true : false);
|
||||
|
||||
if (oldHover != d->hovered)
|
||||
refresh = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
d->r.x += (nx - oldx);
|
||||
d->r.y += (ny - oldy);
|
||||
refresh = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
oldx = nx;
|
||||
oldy = ny;
|
||||
}
|
||||
|
||||
|
||||
bool Config::KeyDown(uint32_t key)
|
||||
{
|
||||
if (!showWindow)
|
||||
return false;
|
||||
|
||||
// bool response = false;
|
||||
std::vector<void *>::iterator i;
|
||||
|
||||
for(i=objList.begin(); i!=objList.end(); i++)
|
||||
{
|
||||
Object * obj = (Object *)(*i);
|
||||
|
||||
switch (obj->type)
|
||||
{
|
||||
case OTLineEdit:
|
||||
{
|
||||
LineEdit * le = (LineEdit *)obj;
|
||||
|
||||
if (le->hovered)
|
||||
{
|
||||
uint32_t textLen = strlen(le->text);
|
||||
le->text[textLen] = key;
|
||||
refresh = true;
|
||||
WriteLog("Config: textLen=%u, key=%02X\n", textLen, key);
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void Config::DrawElements(SDL_Renderer * renderer)
|
||||
{
|
||||
SDL_SetRenderDrawColor(renderer, 0x7F, 0x3F, 0x00, 0xEF);
|
||||
SDL_RenderClear(renderer);
|
||||
|
||||
SDL_Rect cbRect = { 108, FONT_HEIGHT * 7, 123, 99 };
|
||||
SDL_RenderCopy(renderer, cardBay, NULL, &cbRect);
|
||||
|
||||
std::vector<void *>::iterator i;
|
||||
|
||||
for(i=objList.begin(); i!=objList.end(); i++)
|
||||
{
|
||||
Object * obj = (Object *)(*i);
|
||||
|
||||
switch (obj->type)
|
||||
{
|
||||
case OTCheckBox:
|
||||
{
|
||||
CheckBox * cb = (CheckBox *)obj;
|
||||
uint8_t r = 0x00, g = 0xAA, b = 0x00;
|
||||
|
||||
if (cb->hovered)
|
||||
r = 0x20, g = 0xFF, b = 0x20;
|
||||
|
||||
GUI::DrawCharArray(renderer, (*(cb->state) ? cbChecked : cbUnchecked), cb->r.x * FONT_WIDTH, (cb->r.y * FONT_HEIGHT) - 2, 9, 11, r, g, b);
|
||||
GUI::DrawString(renderer, cb->r.x + 2, cb->r.y, cb->text);
|
||||
break;
|
||||
}
|
||||
|
||||
case OTLineEdit:
|
||||
{
|
||||
LineEdit * le = (LineEdit *)obj;
|
||||
GUI::DrawString(renderer, le->r.x, le->r.y, le->label);
|
||||
uint32_t labelLen = strlen(le->label);
|
||||
uint8_t r = 0x00, g = 0xAA, b = 0x00;
|
||||
|
||||
if (le->hovered)
|
||||
r = 0x20, g = 0xFF, b = 0x20;
|
||||
|
||||
GUI::DrawBox(renderer, FONT_WIDTH * (le->r.x + labelLen + 1), FONT_HEIGHT * le->r.y, FONT_WIDTH * le->size, FONT_HEIGHT, r, g, b);
|
||||
GUI::DrawString(renderer, le->r.x + labelLen + 1, le->r.y, le->text);
|
||||
break;
|
||||
}
|
||||
|
||||
case OTDraggable:
|
||||
{
|
||||
Draggable * d = (Draggable *)obj;
|
||||
SDL_RenderCopy(renderer, d->img, NULL, &d->r);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Config::Render(SDL_Renderer * renderer)
|
||||
{
|
||||
if (!(window && showWindow))
|
||||
return;
|
||||
|
||||
if (refresh)
|
||||
{
|
||||
SDL_SetRenderTarget(renderer, window);
|
||||
DrawElements(renderer);
|
||||
refresh = false;
|
||||
}
|
||||
|
||||
SDL_SetRenderTarget(renderer, NULL);
|
||||
|
||||
SDL_Rect dst = { C_XPOS, C_YPOS, C_WIDTH, C_HEIGHT };
|
||||
SDL_RenderCopy(renderer, window, NULL, &dst);
|
||||
}
|
||||
|
29
src/gui/config.h
Normal file
29
src/gui/config.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef __CONFIG_H__
|
||||
#define __CONFIG_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
class Config
|
||||
{
|
||||
public:
|
||||
Config() {}
|
||||
~Config() {}
|
||||
|
||||
// Everything is class methods/variables
|
||||
static void Init(SDL_Renderer *);
|
||||
static void ShowWindow(void);
|
||||
static void HideWindow(void);
|
||||
static void MouseDown(int32_t, int32_t, uint32_t);
|
||||
static void MouseUp(int32_t, int32_t, uint32_t);
|
||||
static void MouseMove(int32_t, int32_t, uint32_t);
|
||||
static bool KeyDown(uint32_t);
|
||||
static void DrawElements(SDL_Renderer *);
|
||||
static void Render(SDL_Renderer *);
|
||||
|
||||
public:
|
||||
static bool showWindow;
|
||||
};
|
||||
|
||||
#endif // __CONFIG_H__
|
||||
|
50
src/gui/elements.h
Normal file
50
src/gui/elements.h
Normal file
@ -0,0 +1,50 @@
|
||||
#ifndef __ELEMENTS_H__
|
||||
#define __ELEMENTS_H__
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
#include <stdint.h>
|
||||
|
||||
enum ObjectType { OTNone = 0, OTCheckBox, OTLineEdit, OTDraggable, OTCount };
|
||||
|
||||
#define OBJECT_COMMON \
|
||||
int type; \
|
||||
SDL_Rect r; \
|
||||
bool hovered;
|
||||
|
||||
struct Object {
|
||||
OBJECT_COMMON;
|
||||
};
|
||||
|
||||
struct CheckBox {
|
||||
OBJECT_COMMON;
|
||||
bool * state;
|
||||
const char * text;
|
||||
|
||||
CheckBox(): type(OTCheckBox), hovered(false), state(0), text(0) { r.x = r.y = 0; }
|
||||
CheckBox(int32_t xx, int32_t yy, bool * s = 0, const char * t = 0): type(OTCheckBox), hovered(false), state(s), text(t) { r.x = xx; r.y = yy; }
|
||||
};
|
||||
|
||||
struct LineEdit {
|
||||
OBJECT_COMMON;
|
||||
char * text;
|
||||
uint8_t size;
|
||||
const char * label;
|
||||
|
||||
LineEdit(): type(OTLineEdit), hovered(false), text(0), size(12), label(0) { r.x = r.y = 0; }
|
||||
LineEdit(int32_t xx, int32_t yy, char * t = 0, uint8_t sz = 12, const char * lb = 0): type(OTLineEdit), hovered(false), text(t), size(sz), label(lb) { r.x = xx; r.y = yy; }
|
||||
};
|
||||
|
||||
struct Draggable {
|
||||
OBJECT_COMMON;
|
||||
int32_t homex, homey;
|
||||
bool dragging;
|
||||
SDL_Texture * img;
|
||||
SDL_Rect dest;
|
||||
uint8_t spot;
|
||||
|
||||
Draggable(): type(OTDraggable), hovered(false), homex(0), homey(0), dragging(false), img(0), spot(0) { r.x = r.y = r.w = r.h = 0; }
|
||||
Draggable(int32_t xx, int32_t yy, int32_t w, int32_t h, SDL_Texture * i = 0): type(OTDraggable), hovered(false), homex(xx), homey(yy), dragging(false), img(i), spot(0) { r.x = xx; r.y = yy; r.w = w; r.h = h; }
|
||||
};
|
||||
|
||||
#endif // __ELEMENTS_H__
|
||||
|
Loading…
Reference in New Issue
Block a user