Launcher: Move a little bit away from the idea of there only being one pointer

This commit is contained in:
UnknownShadow200 2020-12-27 15:55:47 +11:00
parent 44773bc28e
commit 06b4595e95
4 changed files with 51 additions and 48 deletions

View File

@ -30,9 +30,9 @@ CC_NOINLINE static int LScreen_IndexOf(struct LScreen* s, void* w) {
return -1; return -1;
} }
CC_NOINLINE static struct LWidget* LScreen_WidgetAt(struct LScreen* s, int x, int y) { CC_NOINLINE static struct LWidget* LScreen_WidgetAt(struct LScreen* s, int idx) {
struct LWidget* w; struct LWidget* w;
int i = 0; int i = 0, x = Pointers[idx].x, y = Pointers[idx].y;
for (i = 0; i < s->numWidgets; i++) { for (i = 0; i < s->numWidgets; i++) {
w = s->widgets[i]; w = s->widgets[i];
@ -103,11 +103,11 @@ static void LScreen_KeyDown(struct LScreen* s, int key, cc_bool was) {
if (was) return; if (was) return;
if (s->selectedWidget && s->selectedWidget->OnClick) { if (s->selectedWidget && s->selectedWidget->OnClick) {
s->selectedWidget->OnClick(s->selectedWidget, Mouse_X, Mouse_Y); s->selectedWidget->OnClick(s->selectedWidget, 0);
} else if (s->hoveredWidget && s->hoveredWidget->OnClick) { } else if (s->hoveredWidget && s->hoveredWidget->OnClick) {
s->hoveredWidget->OnClick(s->hoveredWidget, Mouse_X, Mouse_Y); s->hoveredWidget->OnClick(s->hoveredWidget, 0);
} else if (s->onEnterWidget) { } else if (s->onEnterWidget) {
s->onEnterWidget->OnClick(s->onEnterWidget, Mouse_X, Mouse_Y); s->onEnterWidget->OnClick(s->onEnterWidget, 0);
} }
} else if (s->selectedWidget) { } else if (s->selectedWidget) {
if (!s->selectedWidget->VTABLE->KeyDown) return; if (!s->selectedWidget->VTABLE->KeyDown) return;
@ -127,28 +127,28 @@ static void LScreen_TextChanged(struct LScreen* s, const cc_string* str) {
s->selectedWidget->VTABLE->TextChanged(s->selectedWidget, str); s->selectedWidget->VTABLE->TextChanged(s->selectedWidget, str);
} }
static void LScreen_MouseDown(struct LScreen* s, int btn) { static void LScreen_MouseDown(struct LScreen* s, int idx) {
struct LWidget* over = LScreen_WidgetAt(s, Mouse_X, Mouse_Y); struct LWidget* over = LScreen_WidgetAt(s, idx);
struct LWidget* prev = s->selectedWidget; struct LWidget* prev = s->selectedWidget;
if (prev && over != prev) LScreen_UnselectWidget(s, prev); if (prev && over != prev) LScreen_UnselectWidget(s, prev);
if (over) LScreen_SelectWidget(s, over, over == prev); if (over) LScreen_SelectWidget(s, over, over == prev);
} }
static void LScreen_MouseUp(struct LScreen* s, int btn) { static void LScreen_MouseUp(struct LScreen* s, int idx) {
struct LWidget* over = LScreen_WidgetAt(s, Mouse_X, Mouse_Y); struct LWidget* over = LScreen_WidgetAt(s, idx);
struct LWidget* prev = s->selectedWidget; struct LWidget* prev = s->selectedWidget;
/* if user moves mouse away, it doesn't count */ /* if user moves mouse away, it doesn't count */
if (over != prev) { if (over != prev) {
LScreen_UnselectWidget(s, prev); LScreen_UnselectWidget(s, prev);
} else if (over && over->OnClick) { } else if (over && over->OnClick) {
over->OnClick(over, Mouse_X, Mouse_Y); over->OnClick(over, idx);
} }
} }
static void LScreen_MouseMove(struct LScreen* s, int deltaX, int deltaY) { static void LScreen_MouseMove(struct LScreen* s, int idx, int deltaX, int deltaY) {
struct LWidget* over = LScreen_WidgetAt(s, Mouse_X, Mouse_Y); struct LWidget* over = LScreen_WidgetAt(s, idx);
struct LWidget* prev = s->hoveredWidget; struct LWidget* prev = s->hoveredWidget;
cc_bool overSame = prev == over; cc_bool overSame = prev == over;
@ -200,12 +200,12 @@ CC_NOINLINE static void LScreen_Reset(struct LScreen* s) {
s->selectedWidget = NULL; s->selectedWidget = NULL;
} }
static void SwitchToChooseMode(void* w, int x, int y) { ChooseModeScreen_SetActive(false); } static void SwitchToChooseMode(void* w, int idx) { ChooseModeScreen_SetActive(false); }
static void SwitchToColours(void* w, int x, int y) { ColoursScreen_SetActive(); } static void SwitchToColours(void* w, int idx) { ColoursScreen_SetActive(); }
static void SwitchToDirectConnect(void* w, int x, int y) { DirectConnectScreen_SetActive(); } static void SwitchToDirectConnect(void* w, int idx) { DirectConnectScreen_SetActive(); }
static void SwitchToMain(void* w, int x, int y) { MainScreen_SetActive(); } static void SwitchToMain(void* w, int idx) { MainScreen_SetActive(); }
static void SwitchToSettings(void* w, int x, int y) { SettingsScreen_SetActive(); } static void SwitchToSettings(void* w, int idx) { SettingsScreen_SetActive(); }
static void SwitchToUpdates(void* w, int x, int y) { UpdatesScreen_SetActive(); } static void SwitchToUpdates(void* w, int idx) { UpdatesScreen_SetActive(); }
/*########################################################################################################################* /*########################################################################################################################*
@ -237,9 +237,9 @@ CC_NOINLINE static void ChooseMode_Click(cc_bool classic, cc_bool classicHacks)
MainScreen_SetActive(); MainScreen_SetActive();
} }
static void UseModeEnhanced(void* w, int x, int y) { ChooseMode_Click(false, false); } static void UseModeEnhanced(void* w, int idx) { ChooseMode_Click(false, false); }
static void UseModeClassicHax(void* w, int x, int y) { ChooseMode_Click(true, true); } static void UseModeClassicHax(void* w, int idx) { ChooseMode_Click(true, true); }
static void UseModeClassic(void* w, int x, int y) { ChooseMode_Click(true, false); } static void UseModeClassic(void* w, int idx) { ChooseMode_Click(true, false); }
static void ChooseModeScreen_Init(struct LScreen* s_) { static void ChooseModeScreen_Init(struct LScreen* s_) {
struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_; struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_;
@ -412,7 +412,7 @@ static void ColoursScreen_KeyDown(struct LScreen* s, int key, cc_bool was) {
} }
} }
static void ColoursScreen_ResetAll(void* w, int x, int y) { static void ColoursScreen_ResetAll(void* w, int idx) {
Launcher_ResetSkin(); Launcher_ResetSkin();
Launcher_SaveSkin(); Launcher_SaveSkin();
ColoursScreen_UpdateAll(&ColoursScreen_Instance); ColoursScreen_UpdateAll(&ColoursScreen_Instance);
@ -534,7 +534,7 @@ static void DirectConnectScreen_Load(struct DirectConnectScreen* s) {
LInput_SetText(&s->iptMppass, &mppass); LInput_SetText(&s->iptMppass, &mppass);
} }
static void DirectConnectScreen_StartClient(void* w, int x, int y) { static void DirectConnectScreen_StartClient(void* w, int idx) {
static const cc_string loopbackIp = String_FromConst("127.0.0.1"); static const cc_string loopbackIp = String_FromConst("127.0.0.1");
static const cc_string defMppass = String_FromConst("(none)"); static const cc_string defMppass = String_FromConst("(none)");
const cc_string* user = &DirectConnectScreen_Instance.iptUsername.text; const cc_string* user = &DirectConnectScreen_Instance.iptUsername.text;
@ -625,11 +625,11 @@ static struct MFAScreen {
} MFAScreen_Instance; } MFAScreen_Instance;
static void MainScreen_DoLogin(void); static void MainScreen_DoLogin(void);
static void MFAScreen_SignIn(void* w, int x, int y) { static void MFAScreen_SignIn(void* w, int idx) {
MainScreen_SetActive(); MainScreen_SetActive();
MainScreen_DoLogin(); MainScreen_DoLogin();
} }
static void MFAScreen_Cancel(void* w, int x, int y) { static void MFAScreen_Cancel(void* w, int idx) {
MFAScreen_Instance.iptCode.text.length = 0; MFAScreen_Instance.iptCode.text.length = 0;
MainScreen_SetActive(); MainScreen_SetActive();
} }
@ -747,14 +747,14 @@ static void MainScreen_DoLogin(void) {
LWidget_Redraw(&s->lblStatus); LWidget_Redraw(&s->lblStatus);
s->signingIn = true; s->signingIn = true;
} }
static void MainScreen_Login(void* w, int x, int y) { MainScreen_DoLogin(); } static void MainScreen_Login(void* w, int idx) { MainScreen_DoLogin(); }
static void MainScreen_Register(void* w, int x, int y) { static void MainScreen_Register(void* w, int idx) {
static const cc_string ccUrl = String_FromConst("https://www.classicube.net/acc/register/"); static const cc_string ccUrl = String_FromConst("https://www.classicube.net/acc/register/");
Process_StartOpen(&ccUrl); Process_StartOpen(&ccUrl);
} }
static void MainScreen_Resume(void* w, int x, int y) { static void MainScreen_Resume(void* w, int idx) {
struct ResumeInfo info; struct ResumeInfo info;
MainScreen_GetResume(&info, true); MainScreen_GetResume(&info, true);
@ -762,7 +762,7 @@ static void MainScreen_Resume(void* w, int x, int y) {
Launcher_StartGame(&info.user, &info.mppass, &info.ip, &info.port, &info.server); Launcher_StartGame(&info.user, &info.mppass, &info.ip, &info.port, &info.server);
} }
static void MainScreen_Singleplayer(void* w, int x, int y) { static void MainScreen_Singleplayer(void* w, int idx) {
static const cc_string defUser = String_FromConst("Singleplayer"); static const cc_string defUser = String_FromConst("Singleplayer");
const cc_string* user = &MainScreen_Instance.iptUsername.text; const cc_string* user = &MainScreen_Instance.iptUsername.text;
@ -1003,8 +1003,8 @@ static struct CheckResourcesScreen {
struct LWidget* _widgets[5]; struct LWidget* _widgets[5];
} CheckResourcesScreen_Instance; } CheckResourcesScreen_Instance;
static void CheckResourcesScreen_Yes(void* w, int x, int y) { FetchResourcesScreen_SetActive(); } static void CheckResourcesScreen_Yes(void* w, int idx) { FetchResourcesScreen_SetActive(); }
static void CheckResourcesScreen_Next(void* w, int x, int y) { static void CheckResourcesScreen_Next(void* w, int idx) {
static const cc_string optionsTxt = String_FromConst("options.txt"); static const cc_string optionsTxt = String_FromConst("options.txt");
Http_ClearPending(); Http_ClearPending();
@ -1179,7 +1179,7 @@ static void FetchResourcesScreen_Tick(struct LScreen* s_) {
if (Fetcher_Failed) { FetchResourcesScreen_Error(s); return; } if (Fetcher_Failed) { FetchResourcesScreen_Error(s); return; }
Launcher_TryLoadTexturePack(); Launcher_TryLoadTexturePack();
CheckResourcesScreen_Next(NULL, 0, 0); CheckResourcesScreen_Next(NULL, 0);
} }
void FetchResourcesScreen_SetActive(void) { void FetchResourcesScreen_SetActive(void) {
@ -1207,7 +1207,7 @@ static struct ServersScreen {
float tableAcc; float tableAcc;
} ServersScreen_Instance; } ServersScreen_Instance;
static void ServersScreen_Connect(void* w, int x, int y) { static void ServersScreen_Connect(void* w, int idx) {
struct LTable* table = &ServersScreen_Instance.table; struct LTable* table = &ServersScreen_Instance.table;
cc_string* hash = &ServersScreen_Instance.iptHash.text; cc_string* hash = &ServersScreen_Instance.iptHash.text;
@ -1217,7 +1217,7 @@ static void ServersScreen_Connect(void* w, int x, int y) {
Launcher_ConnectToServer(hash); Launcher_ConnectToServer(hash);
} }
static void ServersScreen_Refresh(void* w, int x, int y) { static void ServersScreen_Refresh(void* w, int idx) {
struct LButton* btn; struct LButton* btn;
if (FetchServersTask.Base.working) return; if (FetchServersTask.Base.working) return;
@ -1370,10 +1370,10 @@ static void ServersScreen_KeyDown(struct LScreen* s_, int key, cc_bool was) {
} }
} }
static void ServersScreen_MouseUp(struct LScreen* s_, int btn) { static void ServersScreen_MouseUp(struct LScreen* s_, int idx) {
struct ServersScreen* s = (struct ServersScreen*)s_; struct ServersScreen* s = (struct ServersScreen*)s_;
s->table.VTABLE->OnUnselect(&s->table); s->table.VTABLE->OnUnselect(&s->table);
LScreen_MouseUp(s_, btn); LScreen_MouseUp(s_, idx);
} }
void ServersScreen_SetActive(void) { void ServersScreen_SetActive(void) {
@ -1591,10 +1591,10 @@ static void UpdatesScreen_FetchTick(struct UpdatesScreen* s) {
} }
} }
static void UpdatesScreen_RelD3D9(void* w, int x, int y) { UpdatesScreen_Get(true, true); } static void UpdatesScreen_RelD3D9(void* w, int idx) { UpdatesScreen_Get(true, true); }
static void UpdatesScreen_RelOpenGL(void* w, int x, int y) { UpdatesScreen_Get(true, false); } static void UpdatesScreen_RelOpenGL(void* w, int idx) { UpdatesScreen_Get(true, false); }
static void UpdatesScreen_DevD3D9(void* w, int x, int y) { UpdatesScreen_Get(false, true); } static void UpdatesScreen_DevD3D9(void* w, int idx) { UpdatesScreen_Get(false, true); }
static void UpdatesScreen_DevOpenGL(void* w, int x, int y) { UpdatesScreen_Get(false, false); } static void UpdatesScreen_DevOpenGL(void* w, int idx) { UpdatesScreen_Get(false, false); }
static void UpdatesScreen_Init(struct LScreen* s_) { static void UpdatesScreen_Init(struct LScreen* s_) {
struct UpdatesScreen* s = (struct UpdatesScreen*)s_; struct UpdatesScreen* s = (struct UpdatesScreen*)s_;

View File

@ -19,9 +19,9 @@ typedef void (*LWidget_Func)(struct LScreen* s, struct LWidget* w);
LScreen_Func Tick; /* Repeatedly called multiple times every second. */ \ LScreen_Func Tick; /* Repeatedly called multiple times every second. */ \
void (*KeyDown)(struct LScreen* s, int key, cc_bool wasDown); \ void (*KeyDown)(struct LScreen* s, int key, cc_bool wasDown); \
void (*KeyPress)(struct LScreen* s, char c); \ void (*KeyPress)(struct LScreen* s, char c); \
void (*MouseDown)(struct LScreen* s, int btn); \ void (*MouseDown)(struct LScreen* s, int idx); \
void (*MouseUp)(struct LScreen* s, int btn); \ void (*MouseUp)(struct LScreen* s, int idx); \
void (*MouseMove)(struct LScreen* s, int deltaX, int deltaY); \ void (*MouseMove)(struct LScreen* s, int idx, int deltaX, int deltaY); \
void (*MouseWheel)(struct LScreen* s, float delta); \ void (*MouseWheel)(struct LScreen* s, float delta); \
void (*TextChanged)(struct LScreen* s, const cc_string* str); \ void (*TextChanged)(struct LScreen* s, const cc_string* str); \
LWidget_Func HoverWidget; /* Called when mouse is moved over a given widget. */ \ LWidget_Func HoverWidget; /* Called when mouse is moved over a given widget. */ \

View File

@ -42,7 +42,7 @@ struct LWidgetVTABLE {
cc_bool tabSelectable; /* Whether this widget gets selected when pressing tab */ \ cc_bool tabSelectable; /* Whether this widget gets selected when pressing tab */ \
cc_uint8 horAnchor, verAnchor; /* Specifies the reference point for when this widget is resized */ \ cc_uint8 horAnchor, verAnchor; /* Specifies the reference point for when this widget is resized */ \
int xOffset, yOffset; /* Offset from the reference point */ \ int xOffset, yOffset; /* Offset from the reference point */ \
void (*OnClick)(void* widget, int x, int y); /* Called when widget is clicked */ \ void (*OnClick)(void* widget, int idx); /* Called when widget is clicked */ \
Rect2D last; /* Widget's last drawn area */ Rect2D last; /* Widget's last drawn area */
/* Represents an individual 2D gui component in the launcher. */ /* Represents an individual 2D gui component in the launcher. */

View File

@ -43,6 +43,7 @@ static void CloseActiveScreen(void) {
} }
void Launcher_SetScreen(struct LScreen* screen) { void Launcher_SetScreen(struct LScreen* screen) {
int i;
CloseActiveScreen(); CloseActiveScreen();
activeScreen = screen; activeScreen = screen;
if (!screen->numWidgets) screen->Init(screen); if (!screen->numWidgets) screen->Init(screen);
@ -50,7 +51,9 @@ void Launcher_SetScreen(struct LScreen* screen) {
screen->Show(screen); screen->Show(screen);
screen->Layout(screen); screen->Layout(screen);
/* for hovering over active button etc */ /* for hovering over active button etc */
screen->MouseMove(screen, 0, 0); for (i = 0; i < Pointers_Count; i++) {
screen->MouseMove(screen, i, 0, 0);
}
Launcher_Redraw(); Launcher_Redraw();
} }
@ -209,16 +212,16 @@ static void OnMouseWheel(void* obj, float delta) {
} }
static void OnPointerDown(void* obj, int idx) { static void OnPointerDown(void* obj, int idx) {
activeScreen->MouseDown(activeScreen, 0); activeScreen->MouseDown(activeScreen, idx);
} }
static void OnPointerUp(void* obj, int idx) { static void OnPointerUp(void* obj, int idx) {
activeScreen->MouseUp(activeScreen, 0); activeScreen->MouseUp(activeScreen, idx);
} }
static void OnPointerMove(void* obj, int idx, int deltaX, int deltaY) { static void OnPointerMove(void* obj, int idx, int deltaX, int deltaY) {
if (!activeScreen) return; if (!activeScreen) return;
activeScreen->MouseMove(activeScreen, deltaX, deltaY); activeScreen->MouseMove(activeScreen, idx, deltaX, deltaY);
} }