Home   Archive   Permalink

Would anybody like to revise my program ?

This is a program I wrote to implement into a POS program which I am writing for a restaurant. It is used to restrict access to certain functions in the POS for different security levels, e.g the dishwasher is not allowed to take orders.
R E B O L [
     Title: 'Access Code'
     Note: 'Adapted from Jeff Kreis', Allen Kamp's, and Carl Sassenrath's Calculator'
     Author: 'Andrew'
     License: 'GNU GPL whatever the latest v is'
trim-last: func ['Removes last value of a string' thing [string!]] [
     remove back tail thing
employeeCodes: [
     '1' 'Bob' 'level 1' 'Dishwasher'
     '2' 'George' 'level 2' 'Chef'
     '3' 'George' 'level 3' 'Server'
     '4' 'Fred' 'level 4' 'Manager'
     '5' 'George' 'level 5' 'Owner'
     '6' 'Andrew' '100' 'Programmer'
     '7' 'Nick' 'over 9000 !' 'Rebol Guru'
clear-code: does [
     clear head inputCode
     clear head l/text
     show l
inputCode: ''
checkCode: false
gui: layout [
     ;all of the weird colors are just for fun while testing
     backdrop effect [gradient sky reblue]
     style b1 button effect [gradient cyan pink] 160x120 bold font-size 36
     style b2 button effect [gradient pink teal] 160x120 bold font-size 36
     style c button effect [gradient 1x1 crimson brick] 160x60 bold font-size 36 [if equal? checkCode false [clear-code]]
     style k button effect [gradient 1x1 wheat rebolor] 160x120 bold font-size 48 [if equal? checkCode false [append inputCode face/text append l/text '*' show l]]
     l: label 328x50 with [font: [valign: 'top]] bold font-size 76 black center '' return
     c 'Clear' keycode [#'C' #'c']
     k '7' #'7' k '8' #'8' k '9' #'9' return
     k '4' #'4' k '5' #'5' k '6' #'6' return
     k '1' #'1' k '2' #'2' k '3' #'3' return
     b1 'Exit' #'^(ESC)' [
         if equal? checkCode false [unview]
     k '0' #'0'
     b2 'Submit' #'^M' [
         if equal? checkCode false [
             either find employeeCodes inputCode [
                 checkCode: true
                 alert rejoin ['Welcome, ' select employeeCodes inputCode '. Your security is ' select employeeCodes select employeeCodes inputCode '; ' select employeeCodes select employeeCodes select employeeCodes inputCode]
                 checkCode: false
             ] [
                 if not equal? inputCode '' [checkCode: true alert 'Invalid access code' checkCode: false]
     key keycode [#'^H'] [if equal? checkCode false [trim-last inputCode trim-last l/text show l]]
view/options center-face gui [no-title no-border]
;is it possible to make the 'alert' funstion display with the same [no-title no-border] options ?

posted by:   Andrew     4-May-2017/21:46:16-7:00

At first look, your code runs great. You can make your own alert function:
R E B O L [title: "alrt"]
alrt: func [txt] [
    view/new/options center-face layout [
     backdrop effect [gradient sky reblue]
     at 20x20 text (txt)
     btn "OK" [unview]
    ][no-title no-border]
view layout [
    btn "alrt" [alrt "asdf"]

posted by:   Nick     5-May-2017/0:42:16-7:00

*gasp* Complimented by Nick ! *faints* (assuming it's Nick Antonaccio)
Thanks for the alrt function, Nick. Would you know how to make the window created by alrt keep the focus until it is closed ? What I mean is if you try to click on a button behind the 'alert' window, nothing happens. Even if you minimize the alert window, you can't click on any buttons behind it until it is closed.

posted by:   Andrew     5-May-2017/1:31:51-7:00

Enter 100 as a code?
Maybe not a good idea to defeat the focus of the alert. But,one might be able to hide the custom alert on a face click.
I cut back the code some, not found a bug yet.
inputCode: make string! 4
employeeCodes: [
     1     "Bob"     "1"         "Dishwasher"
     2     "George"     "2"         "Chef"
     3     "George"     "3"         "Server"
     4     "Fred"     "4"         "Manager"
     5     "George"     "5"         "Owner"
     6     "Andrew"     "100"         "Programmer"
     7     "Nick"     "over 9000!"     "Rebol Guru"
clear-code: [
     clear inputCode
     reset-face pin
gui: layout [
     backdrop effect [gradient sky reblue]
     style key button effect [gradient 1x1 wheat rebolor] 180x120 bold font-size 48 [
            append inputCode to-integer face/text
            append pin/text "*"
            show pin
     pin: label 328x50 bold font-size 76 black
     key effect [gradient 1x1 crimson brick] "Clear" #"c" [do clear-code] return
     key "7" #"7" key "8" #"8" key "9" #"9" return
     key "4" #"4" key "5" #"5" key "6" #"6" return
     key "1" #"1" key "2" #"2" key "3" #"3" return
     key effect [gradient 1x1 cyan pink] "Exit" #"^(ESC)" [ quit ]
     key "0" #"0"
     key effect [gradient 1x1 cyan pink] "Submit" #"^s" [
             either (find employeeCodes to-integer inputCode) [
    peg: index? find employeeCodes to-integer inputCode
                 alert rejoin [
        "Welcome. "                     employeeCodes/(peg + 1)
                        ", your security level is " employeeCodes/(peg + 2) " "
                                                     employeeCodes/(peg + 3) "."]
             ] [        
    alert "Invalid access code"
             do clear-code    
pin/font/valign: pin/font/align: 'center
view/options center-face gui [no-title no-border]

posted by:   JB     5-May-2017/1:51:39-7:00

I think the "inform" function makes a window that must be attended to.

posted by:   Steven White     5-May-2017/8:28:05-7:00

Which REBOL version are you using ?

posted by:   Giuseppe Chillemi     5-May-2017/16:15:01-7:00

The version I use is REBOL/View 1-Jan-2011, not sure who the question was addressed to.

posted by:   JB     5-May-2017/18:39:47-7:00

Here are some functions I wrote to help align values on thermal printer paper.
lol: func ["adds a second zero past the decimal" thing [string!]] [;only works if you to-string a decimal
     reverse thing
     either not equal? third thing #"." [
         reverse thing
         append thing "0"
     ] [
         reverse thing
rofl: func ["adds empty space in front of a string until the string is a certain length" thing [string!]] [
     if not equal? length? thing 7 [until [reverse thing append thing "^ " reverse thing equal? length? thing 7]]
A problem I have is that if a value is 1.00, rebol will print it as 1.0. If you have two numbers, 100.00 and 10.0 right aligned and printed on different lines, they won't line up to the decimal. If they are left aligned, then they still won't be aligned to the decimal.
I suppose you could just convert the values to money and remove the $....
I can't figure out how to right-align some characters and left-align other characters on the same line, so I have to print certain values at the column number which is their length subtracted from the max character length of the line. Putting the blank spaces in front of each value just makes it easier because some values are up to 1000.00 (7) and others are only 0.00 (4).

posted by:   Andrew     11-May-2017/0:08:48-7:00

There are various functions around to PAD and/or JUSTIFY a field to a specific length, left or right aligned.
One example from Gregg:

posted by:   Sunanda     11-May-2017/8:29:32-7:00

You'll need this at some point too:

posted by:   Nick     11-May-2017/20:50:53-7:00

To make a modal window which keeps others from processing events:
source alert
you'll see that 'alert is a shortcut for request/ok/type
source request
you'll see it uses 'inform
source inform
you'll see it uses 'show-popup
source show-popup
All the tricks are in that source.
My first inclination would be to just hide any window in which I didn't want activity.

posted by:   Nick     11-May-2017/21:00:21-7:00