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 };
127 m zorched to D ($6D -> $44) [0110 1101 -> 0100 0100]
131 void Config::Init(SDL_Renderer * renderer)
133 window = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ABGR8888,
134 SDL_TEXTUREACCESS_TARGET, C_WIDTH, C_HEIGHT);
138 WriteLog("GUI (Config): Could not create window!\n");
142 if (SDL_SetTextureBlendMode(window, SDL_BLENDMODE_BLEND) == -1)
143 WriteLog("GUI (Config): Could not set blend mode for window.\n");
145 for(int t=0; t<3; t++)
147 cardTex[t] = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
148 SDL_TEXTUREACCESS_TARGET, 96, 11);
149 SDL_SetTextureBlendMode(cardTex[t], SDL_BLENDMODE_BLEND);
151 SDL_SetRenderTarget(renderer, cardTex[t]);
152 SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
153 SDL_RenderClear(renderer);
155 SDL_SetRenderDrawColor(renderer, 0x00, 0xAA, 0x00, 0xFF);
157 for(int j=3; j<8; j++)
158 for(int i=0; i<96; i++)
159 SDL_RenderDrawPoint(renderer, i, j);
162 SDL_SetRenderTarget(renderer, cardTex[0]);
163 GUI::DrawString(renderer, 4, 0, "Disk ][");
164 SDL_SetRenderTarget(renderer, cardTex[1]);
165 GUI::DrawString(renderer, 2, 0, "Mockingboard");
166 SDL_SetRenderTarget(renderer, cardTex[2]);
167 GUI::DrawString(renderer, 6, 0, "SCSI");
169 cardBay = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 123, 99);
170 SDL_SetTextureBlendMode(cardBay, SDL_BLENDMODE_BLEND);
171 SDL_SetRenderTarget(renderer, cardBay);
172 SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
173 SDL_RenderClear(renderer);
175 GUI::DrawBox(renderer, 5, 5, 118, 88, 0xFF, 0xFF, 0xFF);
176 GUI::DrawStringVert(renderer, 5, 33 + 21, " SLOTS ");
178 for(int t=0; t<7; t++)
180 GUI::DrawBox(renderer, FONT_WIDTH * 2, (FONT_HEIGHT * (t + 1)) + 3, 96, 5, 0xFF, 0xFF, 0xFF);
181 GUI::DrawCharArray(renderer, slotNum[t], 112, (FONT_HEIGHT * (t + 1)) + 3, 5, 5, 0xFF, 0xFF, 0xFF);
184 SDL_SetRenderTarget(renderer, NULL);
186 objList.push_back(new CheckBox(1, 1, &settings.autoStateSaving, cb1Text));
187 objList.push_back(new CheckBox(1, 2, &cb2Checked, cb2Text));
188 objList.push_back(new CheckBox(1, 3, &settings.fullscreen, cb3Text));
189 objList.push_back(new CheckBox(1, 4, &cb4Checked, cb4Text));
191 objList.push_back(new CheckBox(1, 27, &cbnChecked, cbnText));
193 objList.push_back(new LineEdit(1, 6, le1, 48, le1Text));
194 objList.push_back(new Draggable(1 * FONT_WIDTH, 8 * FONT_HEIGHT, 96, 11, &settings.cardSlot[0], cardTex[0]));
195 objList.push_back(new Draggable(1 * FONT_WIDTH, 9 * FONT_HEIGHT, 96, 11, &settings.cardSlot[1], cardTex[0]));
196 objList.push_back(new Draggable(1 * FONT_WIDTH, 10 * FONT_HEIGHT, 96, 11, &settings.cardSlot[2], cardTex[1]));
197 objList.push_back(new Draggable(1 * FONT_WIDTH, 11 * FONT_HEIGHT, 96, 11, &settings.cardSlot[3], cardTex[1]));
198 objList.push_back(new Draggable(1 * FONT_WIDTH, 12 * FONT_HEIGHT, 96, 11, &settings.cardSlot[4], cardTex[2]));
202 void Config::ShowWindow(void)
210 void Config::HideWindow(void)
217 void Config::MouseDown(int32_t x, int32_t y, uint32_t buttons)
219 if (!showWindow || !entered)
223 std::vector<void *>::iterator i;
225 for(i=objList.begin(); i!=objList.end(); i++)
227 Object * obj = (Object *)(*i);
233 CheckBox * cb = (CheckBox *)obj;
237 *(cb->state) = !(*(cb->state));
246 Draggable * d = (Draggable *)obj;
264 void Config::MouseUp(int32_t x, int32_t y, uint32_t buttons)
270 std::vector<void *>::iterator i;
272 for(i=objList.begin(); i!=objList.end(); i++)
274 Object * obj = (Object *)(*i);
280 Draggable * d = (Draggable *)obj;
286 if ((d->r.x > 120) && (d->r.x < 220)
287 && (d->r.y > (8 * FONT_HEIGHT))
288 && (d->r.y < (15 * FONT_HEIGHT)))
290 *(d->spot) = ((d->r.y - (8 * FONT_HEIGHT)) / FONT_HEIGHT) + 1;
292 d->r.y = (7 + *(d->spot)) * FONT_HEIGHT;
311 static int32_t oldx, oldy;
312 void Config::MouseMove(int32_t x, int32_t y, uint32_t buttons)
317 int32_t nx = x - C_XPOS, ny = y - C_YPOS;
319 // Check to see if C has been hovered yet, and, if so, set a flag to show
321 if (!entered && ((nx >= 0) && (nx <= C_WIDTH) && (ny >= 0)
322 && (ny <= C_HEIGHT)))
325 // Check to see if the C, since being hovered, is now no longer being
327 //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...
328 if (entered && ((nx < 0) || (nx > C_WIDTH) || (ny < 0) || (ny > C_HEIGHT)))
335 // Bail out if the C hasn't been entered yet
339 std::vector<void *>::iterator i;
341 for(i=objList.begin(); i!=objList.end(); i++)
343 Object * obj = (Object *)(*i);
349 CheckBox * cb = (CheckBox *)obj;
350 bool oldHover = cb->hovered;
351 cb->hovered = (((nx >= ((cb->r.x * FONT_WIDTH) + 1))
352 && (nx <= ((cb->r.x * FONT_WIDTH) + 6))
353 && (ny >= ((cb->r.y * FONT_HEIGHT) + 3))
354 && (ny <= ((cb->r.y * FONT_HEIGHT) + 8))) ? true : false);
356 if (oldHover != cb->hovered)
364 LineEdit * le = (LineEdit *)obj;
365 uint32_t labelLen = strlen(le->label);
366 bool oldHover = le->hovered;
367 le->hovered = (((nx >= ((le->r.x + labelLen + 1) * FONT_WIDTH))
368 && (nx <= ((le->r.x + labelLen + 1 + le->size) * FONT_WIDTH))
369 && (ny >= ((le->r.y * FONT_HEIGHT)))
370 && (ny <= ((le->r.y + 1) * FONT_HEIGHT))) ? true : false);
372 if (oldHover != le->hovered)
380 Draggable * d = (Draggable *)obj;
384 bool oldHover = d->hovered;
385 d->hovered = (((nx >= d->r.x) && (nx < (d->r.x + d->r.w))
386 && (ny >= d->r.y) && (ny < (d->r.y + d->r.h)))
389 if (oldHover != d->hovered)
394 d->r.x += (nx - oldx);
395 d->r.y += (ny - oldy);
412 bool Config::KeyDown(uint32_t key)
417 // bool response = false;
418 std::vector<void *>::iterator i;
420 for(i=objList.begin(); i!=objList.end(); i++)
422 Object * obj = (Object *)(*i);
428 LineEdit * le = (LineEdit *)obj;
432 uint32_t textLen = strlen(le->text);
433 le->text[textLen] = key;
435 WriteLog("Config: textLen=%u, key=%02X\n", textLen, key);
451 void Config::DrawElements(SDL_Renderer * renderer)
453 SDL_SetRenderDrawColor(renderer, 0x7F, 0x3F, 0x00, 0xEF);
454 SDL_RenderClear(renderer);
456 SDL_Rect cbRect = { 108, FONT_HEIGHT * 7, 123, 99 };
457 SDL_RenderCopy(renderer, cardBay, NULL, &cbRect);
459 std::vector<void *>::iterator i;
461 for(i=objList.begin(); i!=objList.end(); i++)
463 Object * obj = (Object *)(*i);
469 CheckBox * cb = (CheckBox *)obj;
470 uint8_t r = 0x00, g = 0xAA, b = 0x00;
473 r = 0x20, g = 0xFF, b = 0x20;
475 GUI::DrawCharArray(renderer, (*(cb->state) ? cbChecked : cbUnchecked), cb->r.x * FONT_WIDTH, (cb->r.y * FONT_HEIGHT) - 2, 9, 11, r, g, b);
476 GUI::DrawString(renderer, cb->r.x + 2, cb->r.y, cb->text);
482 LineEdit * le = (LineEdit *)obj;
483 GUI::DrawString(renderer, le->r.x, le->r.y, le->label);
484 uint32_t labelLen = strlen(le->label);
485 uint8_t r = 0x00, g = 0xAA, b = 0x00;
488 r = 0x20, g = 0xFF, b = 0x20;
490 GUI::DrawBox(renderer, FONT_WIDTH * (le->r.x + labelLen + 1), FONT_HEIGHT * le->r.y, FONT_WIDTH * le->size, FONT_HEIGHT, r, g, b);
491 GUI::DrawString(renderer, le->r.x + labelLen + 1, le->r.y, le->text);
497 Draggable * d = (Draggable *)obj;
498 SDL_RenderCopy(renderer, d->img, NULL, &d->r);
509 void Config::Render(SDL_Renderer * renderer)
511 if (!(window && showWindow))
516 SDL_SetRenderTarget(renderer, window);
517 DrawElements(renderer);
521 SDL_SetRenderTarget(renderer, NULL);
523 SDL_Rect dst = { C_XPOS, C_YPOS, C_WIDTH, C_HEIGHT };
524 SDL_RenderCopy(renderer, window, NULL, &dst);