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, &settings.autoStateSaving, cb1Text));
179 objList.push_back(new CheckBox(1, 2, &cb2Checked, cb2Text));
180 objList.push_back(new CheckBox(1, 3, &settings.fullscreen, cb3Text));
181 objList.push_back(new CheckBox(1, 4, &cb4Checked, cb4Text));
183 objList.push_back(new CheckBox(1, 27, &cbnChecked, cbnText));
185 objList.push_back(new LineEdit(1, 6, le1, 48, le1Text));
186 objList.push_back(new Draggable(1 * FONT_WIDTH, 8 * FONT_HEIGHT, 96, 11, cardTex[0]));
187 objList.push_back(new Draggable(1 * FONT_WIDTH, 9 * FONT_HEIGHT, 96, 11, cardTex[0]));
188 objList.push_back(new Draggable(1 * FONT_WIDTH, 10 * FONT_HEIGHT, 96, 11, cardTex[1]));
189 objList.push_back(new Draggable(1 * FONT_WIDTH, 11 * FONT_HEIGHT, 96, 11, cardTex[1]));
190 objList.push_back(new Draggable(1 * FONT_WIDTH, 12 * FONT_HEIGHT, 96, 11, cardTex[2]));
194 void Config::ShowWindow(void)
202 void Config::HideWindow(void)
209 void Config::MouseDown(int32_t x, int32_t y, uint32_t buttons)
211 if (!showWindow || !entered)
215 std::vector<void *>::iterator i;
217 for(i=objList.begin(); i!=objList.end(); i++)
219 Object * obj = (Object *)(*i);
225 CheckBox * cb = (CheckBox *)obj;
229 *(cb->state) = !(*(cb->state));
238 Draggable * d = (Draggable *)obj;
256 void Config::MouseUp(int32_t x, int32_t y, uint32_t buttons)
262 std::vector<void *>::iterator i;
264 for(i=objList.begin(); i!=objList.end(); i++)
266 Object * obj = (Object *)(*i);
272 Draggable * d = (Draggable *)obj;
278 if ((d->r.x > 120) && (d->r.x < 220) && (d->r.y > (8 * FONT_HEIGHT)) && (d->r.y < (15 * FONT_HEIGHT)))
280 d->spot = ((d->r.y - (8 * FONT_HEIGHT)) / FONT_HEIGHT) + 1;
282 d->r.y = (7 + d->spot) * FONT_HEIGHT;
301 static int32_t oldx, oldy;
302 void Config::MouseMove(int32_t x, int32_t y, uint32_t buttons)
307 int32_t nx = x - C_XPOS, ny = y - C_YPOS;
309 // Check to see if C has been hovered yet, and, if so, set a flag to show
311 if (!entered && ((nx >= 0) && (nx <= C_WIDTH) && (ny >= 0)
312 && (ny <= C_HEIGHT)))
315 // Check to see if the C, since being hovered, is now no longer being
317 //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...
318 if (entered && ((nx < 0) || (nx > C_WIDTH) || (ny < 0) || (ny > C_HEIGHT)))
325 // Bail out if the C hasn't been entered yet
329 std::vector<void *>::iterator i;
331 for(i=objList.begin(); i!=objList.end(); i++)
333 Object * obj = (Object *)(*i);
339 CheckBox * cb = (CheckBox *)obj;
340 bool oldHover = cb->hovered;
341 cb->hovered = (((nx >= ((cb->r.x * FONT_WIDTH) + 1))
342 && (nx <= ((cb->r.x * FONT_WIDTH) + 6))
343 && (ny >= ((cb->r.y * FONT_HEIGHT) + 3))
344 && (ny <= ((cb->r.y * FONT_HEIGHT) + 8))) ? true : false);
346 if (oldHover != cb->hovered)
354 LineEdit * le = (LineEdit *)obj;
355 uint32_t labelLen = strlen(le->label);
356 bool oldHover = le->hovered;
357 le->hovered = (((nx >= ((le->r.x + labelLen + 1) * FONT_WIDTH))
358 && (nx <= ((le->r.x + labelLen + 1 + le->size) * FONT_WIDTH))
359 && (ny >= ((le->r.y * FONT_HEIGHT)))
360 && (ny <= ((le->r.y + 1) * FONT_HEIGHT))) ? true : false);
362 if (oldHover != le->hovered)
370 Draggable * d = (Draggable *)obj;
374 bool oldHover = d->hovered;
375 d->hovered = (((nx >= d->r.x) && (nx < (d->r.x + d->r.w))
376 && (ny >= d->r.y) && (ny < (d->r.y + d->r.h)))
379 if (oldHover != d->hovered)
384 d->r.x += (nx - oldx);
385 d->r.y += (ny - oldy);
402 bool Config::KeyDown(uint32_t key)
407 // bool response = false;
408 std::vector<void *>::iterator i;
410 for(i=objList.begin(); i!=objList.end(); i++)
412 Object * obj = (Object *)(*i);
418 LineEdit * le = (LineEdit *)obj;
422 uint32_t textLen = strlen(le->text);
423 le->text[textLen] = key;
425 WriteLog("Config: textLen=%u, key=%02X\n", textLen, key);
441 void Config::DrawElements(SDL_Renderer * renderer)
443 SDL_SetRenderDrawColor(renderer, 0x7F, 0x3F, 0x00, 0xEF);
444 SDL_RenderClear(renderer);
446 SDL_Rect cbRect = { 108, FONT_HEIGHT * 7, 123, 99 };
447 SDL_RenderCopy(renderer, cardBay, NULL, &cbRect);
449 std::vector<void *>::iterator i;
451 for(i=objList.begin(); i!=objList.end(); i++)
453 Object * obj = (Object *)(*i);
459 CheckBox * cb = (CheckBox *)obj;
460 uint8_t r = 0x00, g = 0xAA, b = 0x00;
463 r = 0x20, g = 0xFF, b = 0x20;
465 GUI::DrawCharArray(renderer, (*(cb->state) ? cbChecked : cbUnchecked), cb->r.x * FONT_WIDTH, (cb->r.y * FONT_HEIGHT) - 2, 9, 11, r, g, b);
466 GUI::DrawString(renderer, cb->r.x + 2, cb->r.y, cb->text);
472 LineEdit * le = (LineEdit *)obj;
473 GUI::DrawString(renderer, le->r.x, le->r.y, le->label);
474 uint32_t labelLen = strlen(le->label);
475 uint8_t r = 0x00, g = 0xAA, b = 0x00;
478 r = 0x20, g = 0xFF, b = 0x20;
480 GUI::DrawBox(renderer, FONT_WIDTH * (le->r.x + labelLen + 1), FONT_HEIGHT * le->r.y, FONT_WIDTH * le->size, FONT_HEIGHT, r, g, b);
481 GUI::DrawString(renderer, le->r.x + labelLen + 1, le->r.y, le->text);
487 Draggable * d = (Draggable *)obj;
488 SDL_RenderCopy(renderer, d->img, NULL, &d->r);
499 void Config::Render(SDL_Renderer * renderer)
501 if (!(window && showWindow))
506 SDL_SetRenderTarget(renderer, window);
507 DrawElements(renderer);
511 SDL_SetRenderTarget(renderer, NULL);
513 SDL_Rect dst = { C_XPOS, C_YPOS, C_WIDTH, C_HEIGHT };
514 SDL_RenderCopy(renderer, window, NULL, &dst);