src/gba/context/gui-runner.c (view raw)
1/* Copyright (c) 2013-2015 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#include "gui-runner.h"
7
8#include "util/gui/file-select.h"
9#include "util/gui/font.h"
10#include "util/gui/menu.h"
11
12enum {
13 RUNNER_CONTINUE,
14 RUNNER_EXIT
15};
16
17void GBAGUIInit(struct GBAGUIRunner* runner, const char* port) {
18 GUIInit(&runner->params);
19 GBAContextInit(&runner->context, port);
20 if (runner->setup) {
21 runner->setup(runner);
22 }
23}
24
25void GBAGUIDeinit(struct GBAGUIRunner* runner) {
26 if (runner->teardown) {
27 runner->teardown(runner);
28 }
29 GBAContextDeinit(&runner->context);
30}
31
32void GBAGUIRunloop(struct GBAGUIRunner* runner) {
33 struct GUIMenu pauseMenu = {
34 .title = "Game Paused",
35 .index = 0,
36 };
37 GUIMenuItemListInit(&pauseMenu.items, 0);
38 *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Unpause", .data = (void*) RUNNER_CONTINUE };
39 *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Exit game", .data = (void*) RUNNER_EXIT };
40
41 while (true) {
42 if (runner->params.guiPrepare) {
43 runner->params.guiPrepare();
44 }
45 char path[256];
46 if (!GUISelectFile(&runner->params, path, sizeof(path), GBAIsROM)) {
47 if (runner->params.guiFinish) {
48 runner->params.guiFinish();
49 }
50 GUIMenuItemListDeinit(&pauseMenu.items);
51 return;
52 }
53
54 // TODO: Message box API
55 runner->params.drawStart();
56 GUIFontPrint(runner->params.font, runner->params.width / 2, (GUIFontHeight(runner->params.font) + runner->params.height) / 2, GUI_TEXT_CENTER, 0xFFFFFFFF, "Loading...");
57 runner->params.drawEnd();
58 runner->params.drawStart();
59 GUIFontPrint(runner->params.font, runner->params.width / 2, (GUIFontHeight(runner->params.font) + runner->params.height) / 2, GUI_TEXT_CENTER, 0xFFFFFFFF, "Loading...");
60 runner->params.drawEnd();
61
62 if (!GBAContextLoadROM(&runner->context, path, true)) {
63 int i;
64 for (i = 0; i < 300; ++i) {
65 runner->params.drawStart();
66 GUIFontPrint(runner->params.font, runner->params.width / 2, (GUIFontHeight(runner->params.font) + runner->params.height) / 2, GUI_TEXT_CENTER, 0xFFFFFFFF, "Load failed!");
67 runner->params.drawEnd();
68 }
69 }
70 if (runner->params.guiFinish) {
71 runner->params.guiFinish();
72 }
73 GBAContextStart(&runner->context);
74 if (runner->gameLoaded) {
75 runner->gameLoaded(runner);
76 }
77 bool running = true;
78 while (running) {
79 while (true) {
80 int guiKeys = runner->params.pollInput();
81 if (guiKeys & (1 << GUI_INPUT_CANCEL)) {
82 break;
83 }
84 uint16_t keys = runner->pollGameInput(runner);
85 if (runner->prepareForFrame) {
86 runner->prepareForFrame(runner);
87 }
88 GBAContextFrame(&runner->context, keys);
89 if (runner->drawFrame) {
90 runner->drawFrame(runner, false);
91 }
92 }
93
94 if (runner->params.guiPrepare) {
95 runner->params.guiPrepare();
96 }
97 GUIInvalidateKeys(&runner->params);
98 while (true) {
99 struct GUIMenuItem item;
100 enum GUIMenuExitReason reason = GUIShowMenu(&runner->params, &pauseMenu, &item);
101 if (reason == GUI_MENU_EXIT_ACCEPT) {
102 if (item.data == (void*) RUNNER_EXIT) {
103 running = false;
104 break;
105 }
106 if (item.data == (void*) RUNNER_CONTINUE) {
107 int keys = -1;
108 while (keys) {
109 GUIPollInput(&runner->params, 0, &keys);
110 }
111 break;
112 }
113 } else {
114 int keys = -1;
115 while (keys) {
116 GUIPollInput(&runner->params, 0, &keys);
117 }
118 break;
119 }
120 }
121 if (runner->params.guiFinish) {
122 runner->params.guiFinish();
123 }
124 }
125 GBAContextStop(&runner->context);
126 if (runner->gameUnloaded) {
127 runner->gameUnloaded(runner);
128 }
129 GBAContextUnloadROM(&runner->context);
130 }
131 GUIMenuItemListDeinit(&pauseMenu.items);
132}