6 // © 2019 Underground Software
21 #define C_XPOS ((VIRTUAL_SCREEN_WIDTH - C_WIDTH) / 2)
22 #define C_YPOS ((VIRTUAL_SCREEN_HEIGHT - C_HEIGHT) / 2)
24 static SDL_Texture * window = NULL;
25 //static uint32_t windowPixels[C_WIDTH * C_HEIGHT];
26 static SDL_Texture * cardTex[3] = { 0 };
27 static SDL_Texture * cardBay = NULL;
28 bool Config::showWindow = false;
30 std::vector<void *> objList;
32 static bool dragging = false;
33 static bool entered = false;
34 static bool refresh = false;
35 //static bool cb1Checked = false;
36 static bool cb2Checked = false;
37 //static bool cb3Checked = false;
38 static bool cb4Checked = false;
39 static bool cbnChecked = false;
40 static char le1[512] = { 0 };
42 static const char cb1Text[] = "Automatically save state on exit";
43 static const char cb2Text[] = "Enable hard drive";
44 static const char cb3Text[] = "Run Apple2 in full screen mode";
45 static const char cb4Text[] = "Automatically switch to Apple ][ mode for games that require it";
46 static const char cbnText[] = "Don't check this box";
47 static const char le1Text[] = "HD1 location:";
49 static const char cbChecked[(9 * 11) + 1] =
62 static const char cbUnchecked[(9 * 11) + 1] =
75 static const char slotNum[7][(5 * 5) + 1] =
120 //static uint8_t card1[(96 * 11) + 1] = { 0 };
123 void Config::Init(SDL_Renderer * renderer)
125 window = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ABGR8888,
126 SDL_TEXTUREACCESS_TARGET, C_WIDTH, C_HEIGHT);
130 WriteLog("GUI (Config): Could not create window!\n");
134 if (SDL_SetTextureBlendMode(window, SDL_BLENDMODE_BLEND) == -1)
135 WriteLog("GUI (Config): Could not set blend mode for window.\n");
137 for(int t=0; t<3; t++)
139 cardTex[t] = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
140 SDL_TEXTUREACCESS_TARGET, 96, 11);
141 SDL_SetTextureBlendMode(cardTex[t], SDL_BLENDMODE_BLEND);
143 SDL_SetRenderTarget(renderer, cardTex[t]);
144 SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
145 SDL_RenderClear(renderer);
147 SDL_SetRenderDrawColor(renderer, 0x00, 0xAA, 0x00, 0xFF);
149 for(int j=3; j<8; j++)
150 for(int i=0; i<96; i++)
151 SDL_RenderDrawPoint(renderer, i, j);
154 SDL_SetRenderTarget(renderer, cardTex[0]);
155 GUI::DrawString(renderer, 4, 0, "Disk ][");
156 SDL_SetRenderTarget(renderer, cardTex[1]);
157 GUI::DrawString(renderer, 2, 0, "Mockingboard");
158 SDL_SetRenderTarget(renderer, cardTex[2]);
159 GUI::DrawString(renderer, 6, 0, "SCSI");
161 cardBay = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 123, 99);
162 SDL_SetTextureBlendMode(cardBay, SDL_BLENDMODE_BLEND);
163 SDL_SetRenderTarget(renderer, cardBay);
164 SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
165 SDL_RenderClear(renderer);
167 GUI::DrawBox(renderer, 5, 5, 118, 88, 0xFF, 0xFF, 0xFF);
168 GUI::DrawStringVert(renderer, 5, 33 + 21, " SLOTS ");
170 for(int t=0; t<7; t++)
172 GUI::DrawBox(renderer, FONT_WIDTH * 2, (FONT_HEIGHT * (t + 1)) + 3, 96, 5, 0xFF, 0xFF, 0xFF);
173 GUI::DrawCharArray(renderer, slotNum[t], 112, (FONT_HEIGHT * (t + 1)) + 3, 5, 5, 0xFF, 0xFF, 0xFF);
176 SDL_SetRenderTarget(renderer, NULL);
178 objList.push_back(new CheckBox(1, 1, &cb1Checked, cb1Text));
179 objList.push_back(new CheckBox(1, 1, &settings.autoStateSaving, cb1Text));
180 objList.push_back(new CheckBox(1, 2, &cb2Checked, cb2Text));
181 objList.push_back(new CheckBox(1, 3, &settings.fullscreen, cb3Text));
182 objList.push_back(new CheckBox(1, 4, &cb4Checked, cb4Text));
184 objList.push_back(new CheckBox(1, 27, &cbnChecked, cbnText));
186 objList.push_back(new LineEdit(1, 6, le1, 48, le1Text));
187 objList.push_back(new Draggable(1 * FONT_WIDTH, 8 * FONT_HEIGHT, 96, 11, cardTex[0]));
188 objList.push_back(new Draggable(1 * FONT_WIDTH, 9 * FONT_HEIGHT, 96, 11, cardTex[0]));
189 objList.push_back(new Draggable(1 * FONT_WIDTH, 10 * FONT_HEIGHT, 96, 11, cardTex[1]));
190 objList.push_back(new Draggable(1 * FONT_WIDTH, 11 * FONT_HEIGHT, 96, 11, cardTex[1]));
191 objList.push_back(new Draggable(1 * FONT_WIDTH, 12 * FONT_HEIGHT, 96, 11, cardTex[2]));
195 void Config::ShowWindow(void)
203 void Config::HideWindow(void)
210 void Config::MouseDown(int32_t x, int32_t y, uint32_t buttons)
212 if (!showWindow || !entered)
216 std::vector<void *>::iterator i;
218 for(i=objList.begin(); i!=objList.end(); i++)
220 Object * obj = (Object *)(*i);
226 CheckBox * cb = (CheckBox *)obj;
230 *(cb->state) = !(*(cb->state));
239 Draggable * d = (Draggable *)obj;
257 void Config::MouseUp(int32_t x, int32_t y, uint32_t buttons)
263 std::vector<void *>::iterator i;
265 for(i=objList.begin(); i!=objList.end(); i++)
267 Object * obj = (Object *)(*i);
273 Draggable * d = (Draggable *)obj;
279 if ((d->r.x > 120) && (d->r.x < 220) && (d->r.y > (8 * FONT_HEIGHT)) && (d->r.y < (15 * FONT_HEIGHT)))
281 d->spot = ((d->r.y - (8 * FONT_HEIGHT)) / FONT_HEIGHT) + 1;
283 d->r.y = (7 + d->spot) * FONT_HEIGHT;
302 static int32_t oldx, oldy;
303 void Config::MouseMove(int32_t x, int32_t y, uint32_t buttons)
308 int32_t nx = x - C_XPOS, ny = y - C_YPOS;
310 // Check to see if C has been hovered yet, and, if so, set a flag to show
312 if (!entered && ((nx >= 0) && (nx <= C_WIDTH) && (ny >= 0)
313 && (ny <= C_HEIGHT)))
316 // Check to see if the C, since being hovered, is now no longer being
318 //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...
319 if (entered && ((nx < 0) || (nx > C_WIDTH) || (ny < 0) || (ny > C_HEIGHT)))
326 // Bail out if the C hasn't been entered yet
330 std::vector<void *>::iterator i;
332 for(i=objList.begin(); i!=objList.end(); i++)
334 Object * obj = (Object *)(*i);
340 CheckBox * cb = (CheckBox *)obj;
341 bool oldHover = cb->hovered;
342 cb->hovered = (((nx >= ((cb->r.x * FONT_WIDTH) + 1))
343 && (nx <= ((cb->r.x * FONT_WIDTH) + 6))
344 && (ny >= ((cb->r.y * FONT_HEIGHT) + 3))
345 && (ny <= ((cb->r.y * FONT_HEIGHT) + 8))) ? true : false);
347 if (oldHover != cb->hovered)
355 LineEdit * le = (LineEdit *)obj;
356 uint32_t labelLen = strlen(le->label);
357 bool oldHover = le->hovered;
358 le->hovered = (((nx >= ((le->r.x + labelLen + 1) * FONT_WIDTH))
359 && (nx <= ((le->r.x + labelLen + 1 + le->size) * FONT_WIDTH))
360 && (ny >= ((le->r.y * FONT_HEIGHT)))
361 && (ny <= ((le->r.y + 1) * FONT_HEIGHT))) ? true : false);
363 if (oldHover != le->hovered)
371 Draggable * d = (Draggable *)obj;
375 bool oldHover = d->hovered;
376 d->hovered = (((nx >= d->r.x) && (nx < (d->r.x + d->r.w))
377 && (ny >= d->r.y) && (ny < (d->r.y + d->r.h)))
380 if (oldHover != d->hovered)
385 d->r.x += (nx - oldx);
386 d->r.y += (ny - oldy);
403 bool Config::KeyDown(uint32_t key)
408 // bool response = false;
409 std::vector<void *>::iterator i;
411 for(i=objList.begin(); i!=objList.end(); i++)
413 Object * obj = (Object *)(*i);
419 LineEdit * le = (LineEdit *)obj;
423 uint32_t textLen = strlen(le->text);
424 le->text[textLen] = key;
426 WriteLog("Config: textLen=%u, key=%02X\n", textLen, key);
442 void Config::DrawElements(SDL_Renderer * renderer)
444 SDL_SetRenderDrawColor(renderer, 0x7F, 0x3F, 0x00, 0xEF);
445 SDL_RenderClear(renderer);
447 SDL_Rect cbRect = { 108, FONT_HEIGHT * 7, 123, 99 };
448 SDL_RenderCopy(renderer, cardBay, NULL, &cbRect);
450 std::vector<void *>::iterator i;
452 for(i=objList.begin(); i!=objList.end(); i++)
454 Object * obj = (Object *)(*i);
460 CheckBox * cb = (CheckBox *)obj;
461 uint8_t r = 0x00, g = 0xAA, b = 0x00;
464 r = 0x20, g = 0xFF, b = 0x20;
466 GUI::DrawCharArray(renderer, (*(cb->state) ? cbChecked : cbUnchecked), cb->r.x * FONT_WIDTH, (cb->r.y * FONT_HEIGHT) - 2, 9, 11, r, g, b);
467 GUI::DrawString(renderer, cb->r.x + 2, cb->r.y, cb->text);
473 LineEdit * le = (LineEdit *)obj;
474 GUI::DrawString(renderer, le->r.x, le->r.y, le->label);
475 uint32_t labelLen = strlen(le->label);
476 uint8_t r = 0x00, g = 0xAA, b = 0x00;
479 r = 0x20, g = 0xFF, b = 0x20;
481 GUI::DrawBox(renderer, FONT_WIDTH * (le->r.x + labelLen + 1), FONT_HEIGHT * le->r.y, FONT_WIDTH * le->size, FONT_HEIGHT, r, g, b);
482 GUI::DrawString(renderer, le->r.x + labelLen + 1, le->r.y, le->text);
488 Draggable * d = (Draggable *)obj;
489 SDL_RenderCopy(renderer, d->img, NULL, &d->r);
500 void Config::Render(SDL_Renderer * renderer)
502 if (!(window && showWindow))
507 SDL_SetRenderTarget(renderer, window);
508 DrawElements(renderer);
512 SDL_SetRenderTarget(renderer, NULL);
514 SDL_Rect dst = { C_XPOS, C_YPOS, C_WIDTH, C_HEIGHT };
515 SDL_RenderCopy(renderer, window, NULL, &dst);