From 2807ff55213176b789797e6cf4868dae4be8e305 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Wed, 27 Apr 2022 19:34:50 -0500 Subject: [PATCH] Browser is now browsing! --- client/src/browser.c | 263 +++++++++++++++++++++++++++++++-------- client/src/gui/gui.c | 27 +++- client/src/gui/gui.h | 1 + client/src/gui/picture.c | 5 + client/src/gui/picture.h | 1 + 5 files changed, 242 insertions(+), 55 deletions(-) diff --git a/client/src/browser.c b/client/src/browser.c index d877d86..f24ca6f 100644 --- a/client/src/browser.c +++ b/client/src/browser.c @@ -64,20 +64,25 @@ static ListboxT *_lstInfo = NULL; static uint8_t _channel = 0; static char *_lastSearchText = NULL; - +static char *_nextZoomImage = NULL; static GameT _selectedGame = { 0 }; static void btnTabClick(WidgetT *widget); +static void btnZoomCloseClick(WidgetT *widget); static void fraBoxShow(void); +static void fraBoxReady(char *file); static void fraDescriptionShow(void); +static void fraDescriptionReady(char *file); static void fraInfoShow(void); static void fraScreensShow(void); static void fraScreensReady(char *file); static void packetHandler(PacketDecodeDataT *packet); +static void picClick(WidgetT *widget); static void tabsBusySet(uint8_t busy); static void timSearchUpdate(WidgetT *widget); static void updateSelectedGame(void); +static void winZoomReady(char *file); void browserHide(void) { @@ -90,8 +95,6 @@ void browserHide(void) { void browserShow(void) { - //char **lines = NULL; - TagItemT uiBrowser[] = { T_START, T_WINDOW, O(_winBrowser), @@ -162,27 +165,33 @@ void browserShow(void) { T_PICTURE, O(_picThumb[0]), // Thumbs are 160x100 T_X, 1, T_Y, 5, T_CACHENAME, P("browser:no-screen.png"), + T_CLICK, P(picClick), T_PICTURE, T_DONE, T_PICTURE, O(_picThumb[1]), T_X, 167, T_Y, 5, T_CACHENAME, P("browser:no-screen.png"), + T_CLICK, P(picClick), T_PICTURE, T_DONE, T_PICTURE, O(_picThumb[2]), T_X, 333, T_Y, 5, T_CACHENAME, P("browser:no-screen.png"), + T_CLICK, P(picClick), T_PICTURE, T_DONE, T_PICTURE, O(_picThumb[3]), T_X, 1, T_Y, 116, T_CACHENAME, P("browser:no-screen.png"), + T_CLICK, P(picClick), T_PICTURE, T_DONE, T_PICTURE, O(_picThumb[4]), T_X, 167, T_Y, 116, T_CACHENAME, P("browser:no-screen.png"), + T_CLICK, P(picClick), T_PICTURE, T_DONE, T_PICTURE, O(_picThumb[5]), T_X, 333, T_Y, 116, T_CACHENAME, P("browser:no-screen.png"), + T_CLICK, P(picClick), T_PICTURE, T_DONE, T_FRAME, T_DONE, @@ -203,10 +212,12 @@ void browserShow(void) { T_PICTURE, O(_picBox[0]), // Thumbs are 240x210 T_X, 1, T_Y, 5, T_CACHENAME, P("browser:no-box.png"), + T_CLICK, P(picClick), T_PICTURE, T_DONE, T_PICTURE, O(_picBox[1]), T_X, 250, T_Y, 5, T_CACHENAME, P("browser:no-box.png"), + T_CLICK, P(picClick), T_PICTURE, T_DONE, T_FRAME, T_DONE, @@ -245,49 +256,15 @@ void browserShow(void) { guiFocusSet(W(_txtSearch)); _channel = netChannelGet(packetHandler); + // This forces the background timer to run the search. _lastSearchText = strdup("x"); - /* - guiDebugAreaShow(W(_fraSearch)); - - lines = utilWrapText( - "The Post-Terran Minerals Corporation (PTMC) digs up minerals on all nine planets of the solar system, " - "employing humans and robots to do its job. Unfortunately, the mining robots are now being controlled by a hacker, " - "and have taken the human workers hostage. The PTMC has tried to get the robots back under their control, but " - "communication with the mining stations has been lost. In desperation, the PTMC modifies a Pyro-GX ship for combat " - "and hires a mercenary, codenamed 'Material Defender', to fly it. The mission is to destroy the infected mines and " - "rescue human hostages, destroying any hostile robot that gets in the way.", 57); - while (arrlen(lines) > 0) { - listboxItemAdd(_lstDescription, lines[0]); - DEL(lines[0]); - arrdel(lines, 0); - } - - listboxItemAdd(_lstResults, "123456789012345678901234567890123456789012345678901234567"); - listboxItemAdd(_lstResults, "2"); - listboxItemAdd(_lstResults, "3"); - listboxItemAdd(_lstResults, "4"); - listboxItemAdd(_lstResults, "5"); - listboxItemAdd(_lstResults, "6"); - listboxItemAdd(_lstResults, "7"); - listboxItemAdd(_lstResults, "8"); - listboxItemAdd(_lstResults, "9"); - listboxItemAdd(_lstResults, "10"); - listboxItemAdd(_lstResults, "11"); - listboxItemAdd(_lstResults, "12"); - listboxItemAdd(_lstResults, "13"); - listboxItemAdd(_lstResults, "14"); - listboxItemAdd(_lstResults, "15"); - listboxItemAdd(_lstResults, "16"); - listboxItemAdd(_lstResults, "17"); - */ + guiDebugAreaShow(W(_btnBoxTab)); } static void btnTabClick(WidgetT *widget) { - tabsBusySet(1); - // Hide everything. widgetVisibleSet(W(_fraBox), 0); widgetVisibleSet(W(_fraDescription), 0); @@ -302,28 +279,153 @@ static void btnTabClick(WidgetT *widget) { if (widget == W(_btnDescriptionTab)) fraDescriptionShow(); if (widget == W(_btnInfoTab)) fraInfoShow(); if (widget == W(_btnScreensTab)) fraScreensShow(); - if (widget == W(_btnSearchTab)) { - widgetVisibleSet(W(_fraSearch), 1); - tabsBusySet(0); - } + if (widget == W(_btnSearchTab)) widgetVisibleSet(W(_fraSearch), 1); +} + + +static void btnZoomCloseClick(WidgetT *widget) { + WindowT *w = (WindowT *)guiParentGet(widget); + + guiDelete(D(w)); } static void fraBoxShow(void) { - widgetVisibleSet(W(_fraBox), 1); - tabsBusySet(0); + char **fileList = NULL; + char *temp; + uint8_t i; + + tabsBusySet(1); + + // Build list of box filenames needed. + for (i=0; i<_selectedGame.boxes; i++) { + temp = utilCreateString("games:%c:%s:box%d.png", _selectedGame.shortName[0], _selectedGame.shortName, i + 1); + utilStringToLower(temp); + arrput(fileList, temp); + temp = utilCreateString("games:%c:%s:box%d-thumb.png", _selectedGame.shortName[0], _selectedGame.shortName, i + 1); + utilStringToLower(temp); + arrput(fileList, temp); + } + + if (fileList) { + fileCacheCheckArr(fraBoxReady, fileList); + } else { + fraBoxReady(NULL); + } } -static void fraDescriptionShow(void) { - widgetVisibleSet(W(_fraDescription), 1); +static void fraBoxReady(char *file) { + + uint8_t i; + + // Is this a file update notice? If so, exit. + if (file) return; + tabsBusySet(0); + + // Are there boxes? + if (_selectedGame.boxes == 0) { + // Nope. + pictureReplace(_picBox[0], "browser:no-box.png"); + widgetVisibleSet(W(_picBox[1]), 0); + } else { + for (i=0; i<2; i++) { + if (i < _selectedGame.boxes) { + snprintf(_scratch, SCRATCH_SIZE, "games:%c:%s:box%d-thumb.png", _selectedGame.shortName[0], _selectedGame.shortName, i + 1); + utilStringToLower(_scratch); + pictureReplace(_picBox[i], _scratch); + widgetVisibleSet(W(_picBox[i]), 1); + } else { + widgetVisibleSet(W(_picBox[i]), 0); + } + } + } + + // Display us. + widgetVisibleSet(W(_fraBox), 1); +} + +static void fraDescriptionShow(void) { + char **fileList = NULL; + char *temp; + + tabsBusySet(1); + + temp = utilCreateString("games:%c:%s:banner.png", _selectedGame.shortName[0], _selectedGame.shortName); + utilStringToLower(temp); + arrput(fileList, temp); + + fileCacheCheckArr(fraDescriptionReady, fileList); +} + + +static void fraDescriptionReady(char *file) { + + char **lines = NULL; + + // Is this a file update notice? If so, exit. + if (file) return; + + tabsBusySet(0); + + snprintf(_scratch, SCRATCH_SIZE, "games:%c:%s:banner.png", _selectedGame.shortName[0], _selectedGame.shortName); + utilStringToLower(_scratch); + pictureReplace(_picBanner, _scratch); + + listboxItemsClear(_lstDescription); + lines = utilWrapText(_selectedGame.description, 57); + while (arrlen(lines) > 0) { + listboxItemAdd(_lstDescription, lines[0]); + DEL(lines[0]); + arrdel(lines, 0); + } + + // Show us. + widgetVisibleSet(W(_fraDescription), 1); } static void fraInfoShow(void) { + + listboxItemsClear(_lstInfo); + + snprintf(_scratch, SCRATCH_SIZE, " Title: %s", _selectedGame.title); + listboxItemAdd(_lstInfo, _scratch); + + snprintf(_scratch, SCRATCH_SIZE, "Developer: %s", _selectedGame.developer); + listboxItemAdd(_lstInfo, _scratch); + + snprintf(_scratch, SCRATCH_SIZE, "Publisher: %s", _selectedGame.publisher); + listboxItemAdd(_lstInfo, _scratch); + + snprintf(_scratch, SCRATCH_SIZE, " Released: %s", _selectedGame.releaseDate); + listboxItemAdd(_lstInfo, _scratch); + + snprintf(_scratch, SCRATCH_SIZE, " Rating: %s", _selectedGame.rating); + listboxItemAdd(_lstInfo, _scratch); + + snprintf(_scratch, SCRATCH_SIZE, " Series: %s", _selectedGame.series); + listboxItemAdd(_lstInfo, _scratch); + + snprintf(_scratch, SCRATCH_SIZE, " Source: %s", _selectedGame.origin); + listboxItemAdd(_lstInfo, _scratch); + + snprintf(_scratch, SCRATCH_SIZE, " Type: %s", + _selectedGame.type == GAME_TYPE_DOOR ? "BBS Door" : + _selectedGame.type == GAME_TYPE_SERIAL ? "Modem or Serial" : + _selectedGame.type == GAME_TYPE_IPX ? "IPX Network" : + _selectedGame.type == GAME_TYPE_FICTION ? "Interactive Fiction" : "Unknown" + ); + listboxItemAdd(_lstInfo, _scratch); + + snprintf(_scratch, SCRATCH_SIZE, " Players: %d", _selectedGame.maxPlayers); + listboxItemAdd(_lstInfo, _scratch); + + snprintf(_scratch, SCRATCH_SIZE, " Joinable: %s", _selectedGame.joinable ? "Yes" : "No"); + listboxItemAdd(_lstInfo, _scratch); + widgetVisibleSet(W(_fraInfo), 1); - tabsBusySet(0); } @@ -332,6 +434,8 @@ static void fraScreensShow(void) { char *temp; uint8_t i; + tabsBusySet(1); + // Build list of screen filenames needed. for (i=0; i<_selectedGame.screens; i++) { temp = utilCreateString("games:%c:%s:screen%d.png", _selectedGame.shortName[0], _selectedGame.shortName, i + 1); @@ -357,6 +461,8 @@ static void fraScreensReady(char *file) { // Is this a file update notice? If so, exit. if (file) return; + tabsBusySet(0); + // Are there screenshots? if (_selectedGame.screens == 0) { // Nope. @@ -369,7 +475,6 @@ static void fraScreensReady(char *file) { if (i < _selectedGame.screens) { snprintf(_scratch, SCRATCH_SIZE, "games:%c:%s:screen%d-thumb.png", _selectedGame.shortName[0], _selectedGame.shortName, i + 1); utilStringToLower(_scratch); - logWrite("Loading screen: %s\n", _scratch); pictureReplace(_picThumb[i], _scratch); widgetVisibleSet(W(_picThumb[i]), 1); } else { @@ -380,7 +485,6 @@ static void fraScreensReady(char *file) { // Display us. widgetVisibleSet(W(_fraScreens), 1); - tabsBusySet(0); } @@ -389,6 +493,38 @@ static void packetHandler(PacketDecodeDataT *packet) { } +static void picClick(WidgetT *widget) { + PictureT *p = (PictureT *)widget; + char *c = NULL; + char **fileList = NULL; + + _nextZoomImage = strdup(pictureFilenameGet(p)); + + if (strcmp(_nextZoomImage, "browser:no-box.png") == 0 || strcmp(_nextZoomImage, "browser:no-screen.png") == 0) { + // Can't zoom nothing! + DEL(_nextZoomImage); + return; + } + + c = strstr(_nextZoomImage, "-thumb.png"); + if (!c) { + // Someone didn't follow naming rules! + DEL(_nextZoomImage); + return; + } + + c[0] = '.'; + c[1] = 'p'; + c[2] = 'n'; + c[3] = 'g'; + c[4] = 0; + + tabsBusySet(1); + arrput(fileList, _nextZoomImage); + fileCacheCheckArr(winZoomReady, fileList); +} + + static void tabsBusySet(uint8_t busy) { uint8_t enabled = busy ? 0 : 1; @@ -501,3 +637,30 @@ static void updateSelectedGame(void) { } } } + + +static void winZoomReady(char *file) { + WindowT *winZoom = NULL; + PictureT *picZoom = NULL; + ButtonT *btnClose = NULL; + uint16_t w; + uint16_t h; + + // Is this a file update notice? If so, exit. + if (file) return; + + tabsBusySet(0); + + picZoom = pictureNew(1, 1, _nextZoomImage); + w = widgetWidthGet(W(picZoom)) + 7 + 8 + 2; + h = widgetHeightGet(W(picZoom)) + 26 + 8 + 22 + 6; + + btnClose = buttonNew(w - 77, widgetHeightGet(W(picZoom)) + 3, "Close", btnZoomCloseClick); + + winZoom = windowNew(vbeDisplayWidthGet() / 2 - w / 2, vbeDisplayHeightGet() / 2 - h / 2, w, h, "Image"); + guiAttach(W(winZoom), W(picZoom)); + guiAttach(W(winZoom), W(btnClose)); + guiAttach(guiRootGet(), W(winZoom)); + + DEL(_nextZoomImage); +} diff --git a/client/src/gui/gui.c b/client/src/gui/gui.c index cb9782c..99d2903 100644 --- a/client/src/gui/gui.c +++ b/client/src/gui/gui.c @@ -218,7 +218,6 @@ void guiDelayedFree(void **pointer) { // Delayed Free allows freeing of data that may be in use by the // GUI system at a safe time. (After compositing.) arrput(_guiPendingFrees, *pointer); - *pointer = NULL; } @@ -231,7 +230,6 @@ void guiDelete(WidgetT **widget) { // that is also handled in the paint event. arrput(_guiDeleteList, widget); - *widget = NULL; } @@ -239,7 +237,7 @@ static void guiDeleteList(void) { WidgetT **w = NULL; WindowT *win = NULL; - if (_guiDeleteList) { + if (_guiDeleteList != NULL) { while (arrlen(_guiDeleteList) > 0) { w = arrpop(_guiDeleteList); guiDeleteListItem(w); @@ -261,12 +259,17 @@ static void guiDeleteList(void) { static void guiDeleteListItem(WidgetT **widget) { WidgetT *w = *widget; - size_t len = arrlenu(w->children); - size_t plen = arrlen(w->parent != NULL ? w->parent->children : 0); + size_t len = 0; + size_t plen = 0; size_t x = 0; uint8_t nuke = 1; static uint16_t depth = 0; + if (!w) return; + + len = arrlenu(w->children); + plen = arrlen(w->parent != NULL ? w->parent->children : 0); + // Delete children. if (len > 0) { for (x=0; x