i'm getting
somewhere...
CLICK ME
quick and dirty:
// Project: SearchResults
// Created: 2022-07-25
// By: Virtual Nomad
// show all errors
SetErrorMode(2)
// set window properties
SetWindowTitle( "SearchResults" )
SetWindowSize( 360,640, 1 )
SetWindowAllowResize( 1 )
// set display properties
SetVirtualResolution( 360,640)
SetOrientationAllowed( 1, 1, 1, 1 )
SetSyncRate( 30, 0 )
SetScissor( 0,0,0,0 )
UseNewDefaultFonts( 1 )
SetPrintSize(24)
GLOBAL File$ = "inventory.dat"
Type Item
ID$, ItemNum$, ItemName$, ItemDetails$
EndType
GLOBAL Inventory as Item []
Type Result
SprID, TextID, ID$, ItemNum$, ItemName$, ItemDetails$
EndType
GetInventory() // Make/Load Inventory
GLOBAL SearchBUT = 1
AddVirtualButton(SearchBUT,25,25,50)
SetVirtualButtonText(SearchBUT,"SEARCH")
GLOBAL GoBUT = 2
AddVirtualButton(GoBut,335,25,50)
SetVirtualButtonText(GoBUT, "GO")
SetVirtualButtonColor(GoBUT, 0,255,0)
SetVirtualButtonVisible(GoBUT,0)
SetVirtualButtonActive(GoBUT,0)
GLOBAL ClearBUT = 3
AddVirtualButton(ClearBUT,285,25,50)
SetVirtualButtonText(ClearBUT, "CLEAR")
SetVirtualButtonColor(ClearBUT, 255,0,0)
SetVirtualButtonVisible(ClearBUT,0)
SetVirtualButtonActive(ClearBUT,0)
GLOBAL ReturnBUT = 4
AddVirtualButton(ReturnBUT,25,25,50)
SetVirtualButtonText(ReturnBUT, "RETURN")
SetVirtualButtonColor(ReturnBUT, 255,0,255)
SetVirtualButtonVisible(ReturnBUT,0)
SetVirtualButtonActive(ReturnBUT,0)
GLOBAL SearchBox
SearchBox = CreateEditBox() : FixEditBoxToScreen(SearchBox,1)
SetEditBoxText(SearchBox,"Enter ID")
SetEditBoxSize(SearchBox,210,50)
SetEditBoxPosition(SearchBox,50,0)
SetEditBoxInputType(SearchBox,1)
SetEditBoxTextSize( SearchBox, 36 )
SetEditBoxCursorColor(SearchBox,0,0,0)
SetEditBoxMaxChars(SearchBox,6)
SetEditBoxActive(SearchBox,0)
SetEditBoxVisible(SearchBox,0)
GLOBAL Results as Result []
do
If GetRawKeyPressed(27) then End
If GetVirtualButtonPressed(SearchBUT) then Search()
Print( Inventory.Length)
Sync()
loop
Function Search()
SetViewOffset(0,0)
SetVirtualButtonVisible(SearchBUT,0) : SetVirtualButtonActive(SearchBUT,0)
SetSearchActive(1)
Repeat
If GetVirtualButtonReleased(ReturnBUT)
SetSearchActive(0)
ExitFunction
EndIf
Sync()
Until GetEditBoxHasFocus(SearchBox)
If GetEditBoxHasFocus(SearchBox)
SetEditBoxText(SearchBox,"")
Repeat
If GetVirtualButtonReleased(ClearBUT)
SetEditBoxText(SearchBox,"")
SetEditBoxFocus(SearchBox,1)
EndIf
//Ensure Numeric Only
If LEN(GetEditBoxText(SearchBox)) > 0
LastChar$ = MID( GetEditBoxText(SearchBox), LEN(GetEditBoxText(SearchBox)),1)
While ASC(LastChar$) < 48 or ASC(LastChar$) > 57 and LEN(GetEditBoxText(SearchBox)) > 0
SetEditBoxText(SearchBox, LEFT( GetEditBoxText(SearchBox), LEN(GetEditBoxText(SearchBox))-1))
If LEN(GetEditBoxText(SearchBox))
LastChar$ = MID( GetEditBoxText(SearchBox), LEN(GetEditBoxText(SearchBox)),1)
EndIf
Sync()
EndWhile
EndIf
Sync()
Until GetVirtualButtonReleased(GoBUT) or GetRawKeyPressed(13) //ESC
EndIf
If LEN( GetEditBoxText(SearchBox) ) > 0
DoSearch(GetEditBoxText(SearchBox))
EndIf
EndFunction
Function DoSearch(ThisSearch$)
SetViewOffset(0,0)
YOff = 0
For x = 0 to Inventory.Length
If Inventory[x].ID$ = ThisSearch$
INC Yoff, 50
ThisItem as Result
ThisItem.SprID = CreateSprite(0)
If Results.Length = 0 or MOD(Results.Length,2) = 0
SetSpriteColor(ThisItem.SprID,192,192,192,255)
EndIf
SetSpriteSize(ThisItem.SprID, 360,50)
SetSpriteY(ThisItem.SprID, Yoff)
`SetSpriteScissor(ThisItem.SprID,0,50,360,640)
SetSpriteDepth(ThisItem.SprID,100)
ThisItem.TextID = CreateText(Inventory[x].ItemNum$ + "|" + Inventory[x].ItemName$)
SetTextSize(ThisItem.TextID,32)
SetTextAlignment(ThisItem.TextID,0)
SetTextY(ThisItem.TextID,Yoff)
SetTextColor(ThisItem.TextID,0,0,0,255)
`SetTextScissor(ThisItem.TextID,0,50,360,640)
SetTextDepth(ThisItem.TextID,99)
ThisItem.ID$ = ThisSearch$
ThisItem.ItemNum$ = Inventory[x].ItemNum$
ThisItem.ItemName$ = Inventory[x].ItemName$
ThisItem.ItemDetails$ = Inventory[x].ItemDetails$
Results.InsertSorted(ThisItem)
EndIf
Next x
SetSearchActive(0)
YOff = 0
Repeat
Print(Results.Length)
YOff = Yoff - GetRawMouseWheelDelta()*5
If Yoff < 0 then Yoff = 0
If Yoff > (Results.Length-10)*50 then Yoff = (Results.Length-10)*50
SetViewOffset(0,Yoff)
If GetPointerPressed()
ThisPick = GetSpriteHit(GetPointerX(), GetPointerY()+YOff )
EndIf
Sync()
Until ThisPick > 0 or GetRawKeyPressed(27)
If ThisPick > 0
ShowDetails( Results.Find(ThisPick) )
EndIf
For x = Results.Length to 0 Step -1
If GetSpriteExists(Results[x].SprID) then DeleteSprite(Results[x].SprID)
If GetTextExists(Results[x].TextID) then DeleteText(Results[x].TextID)
Results.Remove(x)
Next x
EndFunction
Function ShowDetails(Index)
SetViewOffset(0,0)
Back = CreateSprite(0) : SetSpriteColor(Back,128,0,0,255)
SetSpriteDepth(Back,50) : SetSpriteSize(Back,360,640)
TXT = CreateText( Results[Index].ItemDetails$)
SetTextSize(TXT,24) : SetTextDepth(TXT,49)
SetTextPosition(TXT,0,50)
Repeat
Sync()
Until GetVirtualButtonPressed(SearchBUT)
DeleteSprite(Back)
DeleteText(TXT)
EndFunction
Function SetSearchActive(Flag)
SetVirtualButtonVisible(ReturnBUT,Flag) : SetVirtualButtonActive(ReturnBUT,Flag)
SetVirtualButtonVisible(GoBUT,Flag) : SetVirtualButtonActive(GoBUT,Flag)
SetVirtualButtonVisible(ClearBUT,Flag) : SetVirtualButtonActive(ClearBUT,Flag)
SetEditBoxActive(SearchBox,Flag)
SetEditBoxVisible(SearchBox,Flag)
If Flag = 0 then Flag = 1 Else Flag = 0
SetVirtualButtonVisible(SearchBUT,Flag) : SetVirtualButtonActive(SearchBUT,Flag)
EndFunction
Function GetInventory()
If GetFileExists(File$)
LoadInventory()
Else
GenerateInventory()
LoadInventory()
EndIf
EndFunction
Function GenerateInventory()
ThisFile = OpenToWrite(File$)
For x = 1 to 500 //ID$, ItemNum#, ItemName$, ItemDetails$
ID$ = STR(Random(1,20)) //Searchable
//Pad Item #s to 6 digits 100001-100100 for uniformity (my preference, not necessary :) )
x$ = STR(x)
While LEN(x$) < 3
x$ = "0" + x$
EndWhile
ItemNum$ = "100"+x$
ItemName$ = "Item #" + ItemNum$
ItemDetails$ = "Details for " + ItemName$ + " (" + ItemNum$ + ")"
WriteLine(ThisFile,ID$+","+ItemNum$+","+ItemName$+","+ItemDetails$)
Next x
CloseFile(ThisFile)
EndFunction
Function LoadInventory()
ThisFile = OpenToRead(File$)
Repeat
ThisLine$ = ReadLine(ThisFile)
If ThisLine$ <> "" //Not sure why it's adding a blank line to the end of the file when Generated...
ThisItem as Item
ThisItem.ID$ = GetStringToken(ThisLine$,",",1)
ThisItem.ItemNum$ = GetStringToken(ThisLine$,",",2)
ThisItem.ItemName$ = GetStringToken(ThisLine$,",",3)
ThisItem.ItemDetails$ = GetStringToken(ThisLine$,",",4)
Inventory.InsertSorted(ThisItem) //will only help so much.
EndIf
Until FileEOF(ThisFile)
CloseFile(ThisFile)
EndFunction
note this line:
ID$ = STR(Random(1,20)) //Searchable
so, when you go to search, you should enter a number in that range.
use the mousewheel to scroll through search results (for now) and click the result to direct to item details.
rinse and repeat (kinda... as it stands, it's not returning to search results which would be ideal).
hopefully you'll get the concept. i'm sure we can do what you're looking for.
more: if you want this on
mobile, consider converting the data to .json where any sizable datafile like this (thousands of items/lines) is going to load much slower on mobile otherwise.
AGK arrays can cater directly to .json; see the bottom portion of
this guide.