Processing key input on a do loop
#6
(04-21-2023, 02:37 AM)TerryRitchie Wrote: Ok, this is really rough but it does work.

Back in 2012 I wrote a Graphics Line Input library and was wondering if I could make it work for your situation, and it does. Please excuse the crudeness of the code but I bit-banged it together over a 4 hour period.

- You can move the cursor around the cells using the arrow keys.
- F12 saves the cells and exits the program

To modify a cell: (This acts very much like an Excel spreadsheet)

- Just start typing numbers (or a period) wherever the cursor is.
- While entering a value the normal modifier keys work as expected (right/left arrow, back space, INSERT, DELETE, etc..)
- When finished entering a value either press ENTER or the UP or DOWN ARROW keys
- To change a value simply move the cursor over a value and start typing

Again, the code is rough and very little error checking is done. I didn't write any UP/DOWN or side scrolling in to the fields. The cursor simply stops when the top/bottom/right/left is reached. Just a quick demo of what's possible.

You are more than welcome to either use the library as is or tear out pieces of the code you want to add to your project. This little demo should help you with some ideas on how to enter data into your cells.

Included in the ZIP file attached is the library files, library documentation, font files I used, some library demo code, and the code shown in the code box below (Gradebook_Example.BAS).

Code: (Select All)
'$INCLUDE:'GLINPUTTOP.BI'

CONST FALSE = 0, TRUE = NOT FALSE
CONST BLACK = _RGB32(0, 0, 0)
CONST GRAY = _RGB32(211, 211, 211)
CONST DARKBLUE = _RGB32(0, 0, 139)
CONST YELLOW = _RGB32(255, 255, 0)
CONST GREEN = _RGB32(0, 255, 0)
CONST CYAN = _RGB32(173, 216, 230)
CONST BLUE = _RGB32(0, 0, 255)
CONST BROWN = _RGB32(82, 39, 25)

'CONST UPARROW = 18432
'CONST DOWNARROW = 20480
'CONST LEFTARROW = 19200
'CONST RIGHTARROW = 19712


CONST BUTTONUP = 329
CONST BUTTONLEFT = 332
CONST BUTTONDOWN = 337
CONST BUTTONRIGHT = 334

TYPE TYPE_ASSIGNMENT
    Aname AS STRING * 9 ' assignment name
    Image AS LONG '       rotated header image
END TYPE

TYPE TYPE_CELL
    Value AS SINGLE '     numeric value of cell
    x AS INTEGER '        x location of cell on screen
    y AS INTEGER '        y location of cell on screen
END TYPE

REDIM Student(0) AS STRING * 15
REDIM Assignment(0) AS TYPE_ASSIGNMENT
DIM Cell(23, 20) AS TYPE_CELL
DIM Background AS LONG
DIM DataName AS STRING
DIM Counter AS INTEGER
DIM MonoFont28 AS LONG
DIM TNRFont20 AS LONG
DIM TNRFont26 AS LONG
DIM TempImage AS LONG
DIM x AS INTEGER
DIM y AS INTEGER
DIM Toggle AS INTEGER
DIM EnterCell AS INTEGER
DIM Leave AS INTEGER
DIM DownArrowHeld AS INTEGER
DIM UpArrowHeld AS INTEGER
DIM LeftArrowheld AS INTEGER
DIM rightArrowHeld AS INTEGER
DIM yy AS INTEGER
DIM xx AS INTEGER
DIM i AS INTEGER
DIM CellInput AS INTEGER

MonoFont28 = _LOADFONT("lucon.ttf", 28, "MONOSPACE")
TNRFont20 = _LOADFONT("times.ttf", 20)
TNRFont26 = _LOADFONT("times.ttf", 26)

'+-----------------------+
'| Read in student names |
'+-----------------------+
DO '                                                                            begin name loop
    READ DataName '                                                             read a name from data statement
    IF DataName <> "**" THEN '                                                  end of names?
        REDIM _PRESERVE Student(UBOUND(Student) + 1) AS STRING * 15 '           no, increase array size
        Student(UBOUND(Student)) = DataName '                                   save student name
    END IF
LOOP UNTIL DataName = "**" '                                                    leave at end of names

'+--------------------------+
'| Read in assignment names |
'+--------------------------+
DO '                                                                            begin assignment loop
    READ DataName '                                                             read a name from data statement
    IF DataName <> "**" THEN '                                                  end of assignments?
        REDIM _PRESERVE Assignment(UBOUND(Assignment) + 1) AS TYPE_ASSIGNMENT ' no, increase array size
        Assignment(UBOUND(Assignment)).Aname = DataName '                       save assignment name
        Assignment(UBOUND(Assignment)).Image = _NEWIMAGE(60, 175, 32) '         create vertical image holder
        TempImage = _NEWIMAGE(175, 60, 32) '                                    create temp image to hold assignment name
        _DEST TempImage '                                                       switch to temp image
        _FONT MonoFont28, TempImage '                                           give temp image a font
        CLS , GRAY '                                                            clear the temp image in gray
        COLOR BLACK, GRAY '                                                     black text on gray background
        _PRINTSTRING (10, 18), DataName '                                       print assignment
        _DEST Assignment(UBOUND(Assignment)).Image '                            switch to assignment image
        _SOURCE TempImage '                                                     get image info from temp image
        FOR x = 0 TO 174 '                                                      cycle the width of temp image
            FOR y = 0 TO 59 '                                                   cycle the height of temp image
                PSET (y, 174 - x), POINT(x, y) '                                set pixel on vertical image that matches temp image
            NEXT y
        NEXT x
        _DEST 0 '                                                               back to default destination
        _SOURCE 0 '                                                             back to default source
        _FREEIMAGE TempImage '                                                  temp image no longer needed
    END IF
LOOP UNTIL DataName = "**" '                                                    leave at end of assignments

'+------------------------------------+
'| Create mock-up of background image |
'+------------------------------------+

Background = _NEWIMAGE(1580, 870, 32) '                                         create background image holder
_DEST Background '                                                              switch to background image
CLS , GRAY '                                                                    clear the background imgae in gray
y = 175 '                                                                       set y start
Toggle = 1 '                                                                    set line color toggle
FOR x = 1 TO 21 '                                                               draw 21 lines
    LINE (0, y)-(1579, y), BLACK '                                              draw line border
    IF Toggle = 1 THEN '                                                        draw cyan bar?
        LINE (1, y + 1)-(1578, y + 30), CYAN, BF '                              yes, create cyan bar
    ELSE '                                                                      no, blue bar
        LINE (1, y + 1)-(1578, y + 30), BLUE, BF '                              create blue bar
    END IF
    Toggle = -Toggle '                                                          toggle bar color
    IF x < 21 THEN '                                                            only 20 actual bars wanted
        COLOR BLACK, GRAY '                                                     black text on gray background
        _FONT TNRFont20 '                                                       set font
        _PRINTMODE _KEEPBACKGROUND '                                            keep background color
        _PRINTSTRING (5, y + 5), _TRIM$(Student(x)) '                           print student name
    END IF
    y = y + 31 '                                                                set y to next line
NEXT x
x = 175 '                                                                       set x start
FOR y = 1 TO 23 '                                                               draw 23 columns
    _PUTIMAGE (x, 0), Assignment(y).Image '                                     draw assignment image
    LINE (x, 0)-(x, 795), BLACK '                                               draw vertical line border
    x = x + 61 '                                                                set x to next column
NEXT y
LINE (0, 0)-(1579, 795), BLACK, B '                                             border everything
LINE (0, 796)-(1579, 869), DARKBLUE, BF '                                       create blue help areas
_FONT TNRFont26 '                                                               set font
COLOR YELLOW, GRAY '                                                            yellow text on gray background
_PRINTMODE _KEEPBACKGROUND '                                                    keep background color
_PRINTSTRING (10, 805), "F1 Help   F2 Add Assignment   F3 Copy Assignment   F4 Modify Assignment    F5 Copy Grades    F6 Clear Grades"
_PRINTSTRING (10, 835), "PgUp/PgDn Quick Student Scroll   +/- Quick Assignment Scroll   F7 Add Comments   F8 Remove Assignment   F9 Add/Remove Flags"
COLOR GREEN, GRAY '                                                             green text on gray background
_PRINTSTRING (1465, 805), "F12 Save" '
_PRINTSTRING (1465, 835), "and Close"
_DEST 0 '                                                                       back to default destination

'+--------------------+
'| Create input cells |
'+--------------------+

FOR y = 1 TO 20
    FOR x = 1 TO 23
        Cell(x, y).Value = 0
        Cell(x, y).x = 176 + (x - 1) * 61 '                                     x location of cell on screen
        Cell(x, y).y = 176 + (y - 1) * 31 '                                     y location of cell on screen
    NEXT x
NEXT y

'+-----------------------+
'| MAIN CODE STARTS HERE | <<<-----------------------
'+-----------------------+

SCREEN _NEWIMAGE(1580, 870, 32) '                                               main screen
x = _DEVICES '                                                                  activate controller commands
x = 1 '                                                                         set cell coordinate
y = 1

DO '                                                                            begin main loop
    EnterCell = FALSE '                                                         reset enter cell flag
    Leave = FALSE '                                                             reset leave via F12 flag
    DO '                                                                        begin cursor movement loop
        '+--------------------------------+
        '| Move solid cursor block around |
        '+--------------------------------+

        _LIMIT 30 '                                                             don't hog the CPU
        _PUTIMAGE , Background '                                                refresh mockup image
        WHILE _DEVICEINPUT(1): WEND '                                           get latest keyboard button status
        IF _BUTTON(BUTTONDOWN) AND DownArrowHeld = FALSE THEN '                 down arrow and not being held?
            y = y + 1 '                                                         yes, move cursor down
            IF y > 20 THEN y = 20 '                                             keep cursor at bottom
            DownArrowHeld = TRUE '                                              remember down arrow is pressed
        ELSEIF _BUTTON(BUTTONUP) AND UpArrowHeld = FALSE THEN
            y = y - 1 '                                                         cursor up
            IF y < 1 THEN y = 1
            UpArrowHeld = TRUE
        ELSEIF _BUTTON(BUTTONLEFT) AND LeftArrowheld = FALSE THEN
            x = x - 1 '                                                         cursor left
            IF x < 1 THEN x = 1
            LeftArrowheld = TRUE
        ELSEIF _BUTTON(BUTTONRIGHT) AND rightArrowHeld = FALSE THEN
            x = x + 1 '                                                         cursor right
            IF x > 23 THEN x = 23
            rightArrowHeld = TRUE
        END IF
        IF NOT _BUTTON(BUTTONDOWN) THEN DownArrowHeld = FALSE '                 set release flags when keys released
        IF NOT _BUTTON(BUTTONUP) THEN UpArrowHeld = FALSE
        IF NOT _BUTTON(BUTTONLEFT) THEN LeftArrowheld = FALSE
        IF NOT _BUTTON(BUTTONRIGHT) THEN rightArrowHeld = FALSE
        LINE (Cell(x, y).x, Cell(x, y).y)-(Cell(x, y).x + 59, Cell(x, y).y + 29), BROWN, BF ' draw cursor

        '+----------------+
        '| Display values |
        '+----------------+

        FOR yy = 1 TO 20 '                                                      display saved values
            FOR xx = 1 TO 23
                _PRINTMODE _KEEPBACKGROUND
                IF Cell(xx, yy).Value <> 0 THEN _PRINTSTRING (Cell(xx, yy).x + 2, Cell(xx, yy).y + 6), _TRIM$(STR$(Cell(xx, yy).Value))
            NEXT xx
        NEXT yy

        '+----------------------------------------+
        '| Scan for numeric, period, and F12 keys |
        '+----------------------------------------+

        FOR i = 3 TO 12 '                                                       key 1 through 0 being pressed?
            IF _BUTTON(i) THEN EnterCell = TRUE '                               yes, enter cell to modify
        NEXT i
        IF _BUTTON(53) THEN EnterCell = TRUE '                                  enter cell if period key being pressed as well
        IF _BUTTON(89) THEN Leave = TRUE '                                      set flag if F12 pressed
        _DISPLAY
    LOOP UNTIL Leave OR EnterCell '                                             leave cursor movement if entering cell or exiting program
    LINE (Cell(x, y).x, Cell(x, y).y)-(Cell(x, y).x + 59, Cell(x, y).y + 29), BLACK, BF ' change cursor to black

    IF EnterCell THEN '                                                                   entering cell?

        '+-------------------------------+
        '| Modifying the value in a cell |
        '+-------------------------------+

        CellInput = GLIINPUT(Cell(x, y).x + 2, Cell(x, y).y + 6, GLINUMERIC, "", TRUE) '  yes, set up a graphics line input in this cell
        DO '                                                                              begin cell mod loop
            GLICLEAR '                                                                    restore background image
            WHILE _DEVICEINPUT(1): WEND '                                                 get latest keyboard update
            IF _BUTTON(BUTTONDOWN) OR _BUTTON(BUTTONUP) THEN EnterCell = FALSE '          leave cell if UP or DOWN arrow key pressed
            GLIUPDATE '                                                                   display graphics line input on screen
            _DISPLAY '                                                                    update screen with changes
        LOOP UNTIL GLIENTERED(CellInput) OR (EnterCell = FALSE) '                         leave when ENTER, UP ARROW, or DOWN ARROW pressed
        Cell(x, y).Value = VAL(GLIOUTPUT$(CellInput)) '                                   save the value of this cell
        GLICLOSE CellInput, TRUE '                                                        close the graphics line input
    END IF
LOOP UNTIL Leave '                                                              leave when F12 pressed

CLS '                                                                           print a quick chart showing all values were saved
PRINT
PRINT " Values have been saved"
PRINT
FOR yy = 1 TO 20
    FOR xx = 1 TO 23
        _PRINTMODE _KEEPBACKGROUND
        PRINT Cell(xx, yy).Value;
    NEXT xx
    PRINT
NEXT yy


'+--------------------+
'| Student Names (40) |
'+--------------------+
DATA "Yury Gagarin","Alan Shepard","Gherman Titov","John Glenn","Pavel Popovich","Valentina Tereshkova","Boris Yegorov","Aleksey Leonov"
DATA "Roger Chaffee","Virgil Grisson","Edward White","Vladmir Komarov","William Anders","Frank Borman","James Lovell","Neil Armstrong"
DATA "Edwin Aldrin","Fred Haise","Jack Swigart","Viktor Patsayev","Eugene Cernan","Harrison Schmitt","Vance Brand","Donald Slayton"
DATA "Thomas Stafford","Valery Kubasov","Sigmund Jahn","Jean-Loup Chretien","Sally Ride","Guion Bluford","Ulf Merbold","Rakesh Sharma"
DATA "Marc Garneau","Franklin Chang-Diaz","Christa McAuliffe","Akiyama Tohiro","Helen Sharman","Mae Jemison","Ellen Ochoa","Valery Polyakov"
DATA "**"

'+-----------------------+
'| Assignment Names (32) |
'+-----------------------+
DATA "MATH U310","MATH U320","MATH U330","MATH U340","MATH U350","ENGL A100","ENGL A101","ENGL A102","ENGL A103","ENGL A104","ENGL A105"
DATA "PHYS B220","PHYS B230","PHYS B240","PHYS B250","PHYS B260","BIOL C100","CIOL C101","BIOL C102","BIOL C103","BIOL C104","BIOL C105"
DATA "SCIE D210","SCIE D220","SCIE D230","SCIE D240","SCIE D250","CISS B100","CISS B200","CISS B300","CISS B400","CISS B500","**"


'$INCLUDE:'GLINPUT.BI'

Awesome! I will take a look at this today. I have add mouse capability since I asked. I am assuming that the mouse won't conflict here but I will see. I will take a read through the code and post any questions I may have along the way! This is way more than I expected  Heart I will let you know how it goes  Cool

The plan is to click and relase for moving the cursor but I want to make sure all my highlights worked before I do that. Here is the current loop as of now.

Code: (Select All)
    'Main Gradebook loop
    PAUSE TIME
    DO

        'Inital highlight and execute command loop
        MOUSE "Inital"
        Sel.X = 1: Sel.Y = 1
        LoopX = LongName + 11: LoopY = StartY - 4
        PauseFlag = FALSE
        GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
        PUT (LoopX, LoopY), HL(), PRESET

        'Selection loop
        DO
            LIMIT LIMITRATE

            'Down case
            IF KEYDOWN(20480) OR KEYDOWN(13) THEN
                GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                PUT (LoopX, LoopY), HL(), PRESET
                IF Sel.Y < CurrentPageCount THEN LoopY = LoopY + FONTHEIGHT + 8: Sel.Y = Sel.Y + 1
                GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                PUT (LoopX, LoopY), HL(), PRESET
                PauseFlag = TRUE
            END IF

            'Up case
            IF KEYDOWN(18432) THEN
                GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                PUT (LoopX, LoopY), HL(), PRESET
                IF Sel.Y > 1 THEN LoopY = LoopY - FONTHEIGHT - 8: Sel.Y = Sel.Y - 1
                GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                PUT (LoopX, LoopY), HL(), PRESET
                PauseFlag = TRUE
            END IF

            'Right case
            IF KEYDOWN(19712) THEN
                GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                PUT (LoopX, LoopY), HL(), PRESET
                IF Sel.X < GridCount THEN LoopX = LoopX + 50: Sel.X = Sel.X + 1
                GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                PUT (LoopX, LoopY), HL(), PRESET
                PauseFlag = TRUE
            END IF

            'Left case
            IF KEYDOWN(19200) THEN
                GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                PUT (LoopX, LoopY), HL(), PRESET
                IF Sel.X > 1 THEN LoopX = LoopX - 50: Sel.X = Sel.X - 1
                GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                PUT (LoopX, LoopY), HL(), PRESET
                PauseFlag = TRUE
            END IF

            'Checking for mouse input
            MOUSE "Poll"
            MOUSE "Release"
            IF M.X <> M.OldX AND M.Y <> M.OldY OR MLButAct THEN 'Check if our mouse is moving or a button is being held
                FOR CounterX = 1 TO GridCount
                    FOR CounterY = 1 TO CurrentPageCount
                        IF M.X > GBMouse(CounterX, CounterY).X1 AND M.X < GBMouse(CounterX, CounterY).X2 AND M.Y > GBMouse(CounterX, CounterY).Y1 AND M.Y < GBMouse(CounterX, CounterY).Y2 THEN
                            GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                            PUT (LoopX, LoopY), HL(), PRESET
                            Sel.X = CounterX
                            Sel.Y = CounterY
                            LoopX = GBMouse(CounterX, CounterY).X1
                            LoopY = GBMouse(CounterX, CounterY).Y1
                           
                            'Debugging code
                            LOCATE 1, 1: PRINT (LoopX - LongName - 11) / 50 + 1, INT((LoopY - StartY + 6) / (FONTHEIGHT + 8)) + 1
                            LOCATE 2, 1: PRINT LoopX, LoopY
                            LOCATE 3, 1: PRINT CounterX, CounterY
                            'End debugging code          

                            GET (LoopX, LoopY)-(LoopX + 48, LoopY + FONTHEIGHT + 7), HL()
                            PUT (LoopX, LoopY), HL(), PRESET
                        END IF
                    NEXT CounterY
                NEXT CounterX

            'MLButAct = Mouse Left Button Action   
            IF MLButAct THEN
                   
                END IF
            END IF

            MOUSE "Loop"

            IF PauseFlag THEN PAUSE TIME: PauseFlag = FALSE

            DISPLAY
        LOOP UNTIL KEYDOWN(34304)
        PAUSE TIME
    LOOP UNTIL KEYDOWN(34304) 'F12 key to close the gradebook
Reply


Messages In This Thread
Processing key input on a do loop - by NasaCow - 04-20-2023, 11:39 AM
RE: Processing key input on a do loop - by NasaCow - 04-22-2023, 09:46 AM



Users browsing this thread: 3 Guest(s)