Would anybody like to revise my program ?
Started by Andrew on 4-May-2017/21:46:16-7:00
Andrew — 4-May-2017/21:46:16-7:00
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]]
guide
l: label 328x50 with [font: [valign: 'top]] bold font-size 76 black center '' return
c 'Clear' keycode [#'C' #'c']
across
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]
]
clear-code
]
]
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 ?
Nick — 5-May-2017/0:42: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"]
]
Andrew — 5-May-2017/1:31:51-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.
JB — 5-May-2017/1:51:39-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
]
across
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]
Steven White — 5-May-2017/8:28:05-7:00
I think the "inform" function makes a window that must be attended to.
Giuseppe Chillemi — 5-May-2017/16:15:01-7:00
Which REBOL version are you using ?/
JB — 5-May-2017/18:39:47-7:00
The version I use is REBOL/View 2.7.8.3.1 1-Jan-2011, not sure who the question was addressed to.
Andrew — 11-May-2017/0:08:48-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).
Sunanda — 11-May-2017/8:29:32-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:
http://www.rebol.org/ml-display-message.r?m=rmlCZGQ
Nick — 11-May-2017/20:50:53-7:00
You'll need this at some point too:
http://www.rebol.org/view-script.r?script=format-decimal.r
Nick — 11-May-2017/21:00:21-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.
Reply