Raspberry BASIC

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - John Spikowski

Pages: [1] 2 3 ... 11
1
BBC BASIC / Re: BBC BASIC for SDL 2.0 version 1.09a released
« on: January 20, 2020, 02:09:08 AM »
Quote
One valuable side-effect of all these add-ons being themselves coded in BASIC

Couldn't agree more. That is why the C extension modules I write are done in C BASIC.

The reason Nim is attractive is that it's extension are written in Nim.

2
BBC BASIC / Re: BBC BASIC for SDL 2.0 version 1.09a released
« on: January 18, 2020, 06:16:29 PM »
Great to hear you're approaching production stable status.

ScriptBasic core hasn't changed since 2005.

 If I don't see more members joining the forums I facilitate,  I may put the $130 a month I spend for a AWS server to better use and move everything to GitLab.

3
BBC BASIC / Re: BBC BASIC for SDL 2.0 version 1.09a released
« on: January 18, 2020, 08:25:06 AM »
Thanks Richard for the update!

Glad you're hanging in there keeping BASIC in the forefront.

4
Programming Challenges / Re: GUI Login
« on: January 03, 2020, 02:38:56 AM »
Nim Update

I had to rename the db_sqlite open/close procs to sqlopen/sqlclose to prevent a naming conflict with niup.

Code: Text
  1. # Nim 1.0.4 / IUP 3.28 - Login - JRS
  2.  
  3. import niup
  4. import niupext
  5. import db_sqlite
  6. import os
  7. import md5
  8.  
  9. var initdb:bool = existsFile("user.db")
  10. let usrdb = sqlopen("user.db", "", "", "")
  11. if initdb == false:
  12.   usrdb.exec(sql"CREATE TABLE user (UserID VARCHAR NOT NULL, Password VARCHAR NOT NULL, CONSTRAINT user_pk PRIMARY KEY (UserID));")
  13.  
  14. var uidtxt,showpwd,pwdtxt1,pwdtxt2,errlbl,zbtxt,newusr,loginbut:PIhandle
  15. var newusr_cb:string
  16.  
  17. proc Init_Form() =
  18.   Hide(errlbl)
  19.   SetAttribute(uidtxt, "VALUE", "")
  20.   SetAttribute(pwdtxt1, "VALUE", "")
  21.   SetAttribute(pwdtxt2, "VALUE", "")
  22.   SetAttribute(showpwd, "VALUE", "OFF")
  23.   SetAttribute(newusr, "VALUE", "OFF")
  24.   SetAttribute(zbtxt, "VALUE", "pwdtxt1")
  25.   SetAttribute(loginbut, "TITLE", "Login")
  26.   newusr_cb = "OFF"
  27.   SetFocus(uidtxt)
  28.  
  29. proc login_clicked(ih:PIhandle):cint {.cdecl.}=
  30.   var uid:cstring
  31.   var pswd:cstring
  32.   uid = GetAttribute(uidtxt,"VALUE")
  33.   if GetAttribute(showpwd, "VALUE") == "OFF":
  34.     pswd = GetAttribute(pwdtxt1,"VALUE")
  35.   else:
  36.     pswd = GetAttribute(pwdtxt2,"VALUE")
  37.   # *** NEW USER ***
  38.   if newusr_cb == "ON":
  39.     if uid != "" and pswd != "":
  40.       let rtnmsg = usrdb.tryInsertId(sql"INSERT INTO user (UserID, Password) VALUES (?, ?)", uid, getMD5($pswd))
  41.       if rtnmsg == -1:
  42.         SetAttribute(errlbl, "TITLE", "Duplicate User ID")
  43.         Show(errlbl)
  44.         SetFocus(uidtxt)
  45.         return IUP_DEFAULT
  46.       Message("Login",  "User Added")
  47.       Init_Form()
  48.       return
  49.     else:
  50.       Show(errlbl)
  51.       SetFocus(uidtxt)
  52.       return IUP_DEFAULT
  53.  
  54.   # *** LOGIN VERIFY ***
  55.   SetAttribute(errlbl, "TITLE", "User ID / Password Incorrect")
  56.   let dbpw = usrdb.getValue(sql"SELECT Password FROM user WHERE UserID=?", uid)
  57.   if dbpw != "":
  58.     if dbpw == getMD5($pswd):
  59.       Hide(errlbl)
  60.       Message("Login",  "Login Successful")
  61.       Init_Form()
  62.       return IUP_DEFAULT
  63.   Show(errlbl)
  64.   SetFocus(uidtxt)
  65.   return IUP_DEFAULT
  66.  
  67. proc show_password(ih:PIhandle; state: bool):cint {.cdecl.}=
  68.   var pwd1,pwd2:cstring
  69.   if state:
  70.     pwd1 = GetAttribute(pwdtxt1,"VALUE")
  71.     SetAttribute(pwdtxt2, "VALUE", pwd1)
  72.     SetAttribute(zbtxt, "VALUE", "pwdtxt2")
  73.   else:
  74.     pwd2 = GetAttribute(pwdtxt2,"VALUE")
  75.     SetAttribute(pwdtxt1, "VALUE", pwd2)
  76.     SetAttribute(zbtxt, "VALUE", "pwdtxt1")
  77.     return IUP_DEFAULT
  78.  
  79. proc new_user(ih:PIhandle; state: bool):cint {.cdecl.}=
  80.   if state:
  81.     newusr_cb = "ON"
  82.     SetAttribute(loginbut, "TITLE", "Add User")
  83.   else:
  84.     newusr_cb = "OFF"
  85.     SetAttribute(loginbut, "TITLE", "Login")
  86.   return IUP_DEFAULT
  87.  
  88. # *** MAIN ***
  89.  
  90. Open()
  91.  
  92. # *** DIALOG ***
  93. var dlg = Create("dialog")
  94. SetAttributes(dlg,
  95.   "TITLE=\"Login\", " &
  96.   "SIZE=200x200, " &
  97.   "MAXBOX=NO, " &
  98.   "MINBOX=NO, " &
  99.   "RESIZE=NO, " &
  100.   "DEFAULTENTER=\"loginbut\"")
  101.  
  102. # *** CONTAINER ***
  103. var vb = Create("vbox")
  104.  
  105. # *** IMAGE ***
  106. var hb1 = Create("hbox")
  107. var piclbl = Create("label")
  108. SetAttributes(piclbl,
  109.   "IMAGE=\"login.png\", " &
  110.   "EXPAND=HORIZONTAL, " &
  111.   "ALIGNMENT=ACENTER:ATOP")
  112. discard Append(hb1, piclbl)
  113. discard Append(vb, hb1)
  114.  
  115. # *** ERROR ***
  116. var hb2 = Create("hbox")
  117. errlbl = Create("label")
  118. SetAttributes(errlbl,
  119.   "TITLE=\"User ID / Password Incorrect\", " &
  120.   "FGCOLOR=\"#ff0000\", " &
  121.   "EXPAND=HORIZONTAL, " &
  122.   "ALIGNMENT=ACENTER")
  123. Hide(errlbl)
  124. discard Append(hb2, errlbl)
  125. discard Append(vb, hb2)
  126.  
  127. # *** ENTRY ***
  128. var hb3 = Create("hbox")
  129. SetAttributes(hb3,
  130.   "MARGIN=20x10, " &
  131.   "GAP=5")
  132. var vb1 = Create("vbox")
  133. SetAttribute(vb1, "GAP", "15")
  134. var uidlbl = Create("label")
  135. SetAttribute(uidlbl, "TITLE", "User ID")
  136. discard Append(vb1, uidlbl)
  137. var pwdlbl = Create("label")
  138. SetAttribute(pwdlbl, "TITLE", "Password")
  139. discard Append(vb1, pwdlbl)
  140. discard Append(hb3, vb1)
  141. var vb2 = Create("vbox")
  142. uidtxt = Create("text")
  143. SetAttribute(uidtxt, "SIZE", "85x")
  144. discard Append(vb2, uidtxt)
  145. pwdtxt1 = Create("text")
  146. SetAttributes(pwdtxt1,
  147.   "PASSWORD=YES, " &
  148.   "SIZE=85x")
  149. pwdtxt2 = Create("text")
  150. SetAttribute(pwdtxt2, "SIZE", "85x")
  151. SetHandle("pwdtxt1", pwdtxt1)
  152. SetHandle("pwdtxt2", pwdtxt2)
  153. zbtxt = Zbox(pwdtxt1, pwdtxt2, nil)
  154. SetHandle("zbtxt", zbtxt)
  155. discard Append(vb2, zbtxt)
  156. discard Append(hb3, vb2)
  157. discard Append(vb, hb3)
  158.  
  159. # *** SHOW/HIDE ***
  160. var hb4 = Create("hbox")
  161. SetAttributes(hb4,
  162.   "MARGIN=35x, " &
  163.   "GAP=40")
  164. showpwd = Create("toggle")
  165. SetAttributes(showpwd,
  166.   "TITLE=\"Show Password\", " &
  167.   "CANFOCUS=NO")
  168. newusr = Create("toggle")
  169. SetAttributes(newusr,
  170.   "TITLE=\"New User\", " &
  171.   "CANFOCUS=NO")
  172. discard Append(hb4, showpwd)
  173. discard Append(hb4, newusr)
  174. discard Append(vb, hb4)
  175.  
  176. # *** LOGIN ***
  177. var hb5 = Create("hbox")
  178. SetAttribute(hb5, "MARGIN", "40x10")
  179. loginbut = Create("button")
  180. SetAttributes(loginbut,
  181.   "TITLE=\"Login\", " &
  182.   "EXPAND=HORIZONTAL")
  183. SetHandle("loginbut", loginbut)
  184. discard Append(hb5, loginbut)
  185. discard Append(vb, hb5)
  186.  
  187. # *** ATTACH CONTAINER ***
  188. discard Append(dlg, vb)
  189.  
  190. # *** CALLBACKS ***
  191. SetCallback(loginbut, "ACTION", login_clicked)
  192. SetCallback(showpwd, "ACTION", show_password)
  193. SetCallback(newusr, "ACTION", new_user)
  194.  
  195. # *** PROCESS ***
  196. Show(dlg)
  197. MainLoop()
  198. sqlclose(usrdb)
  199. Close()
  200.  


ubuntu@rpi4b:~/guilc/nim-dev$ scriba showdb.sb
John   -   0b7efaa91a48ccd6c1dd58e3d69ea1a0
AIR   -   4de6ff4050222c488aa16286c39a605b
ubuntu@rpi4b:~/guilc/nim-dev$


Note: The screenshots are the same as the latest ScriptBasic submission.


5
Programming Challenges / Re: GUI Login
« on: December 31, 2019, 10:15:55 PM »
ScriptBasic Update

This version adds Jalih's suggestion of maintaining a database of UserID and Password (encrypted) as an extension to the base challenge.

Change Log
  • Added check for duplicate UserID's. 12/31
  • Fixed MD5 hex string to be a constant 32 bytes. 12/31
  • Reset error message to login error after a duplicate user add. 1/1

Code: Script BASIC
  1. ' ScriptBasic / IUP - Login - JRS
  2.  
  3. IMPORT iup.bas
  4. IMPORT sqlite.bas
  5. DECLARE SUB MD5 ALIAS "md5fun" LIB "t"
  6.  
  7. initdb = FILELEN("user.db")
  8. usrdb = sqlite::open("user.db")
  9. IF initdb = 0 THEN
  10.   sqlite::execute(usrdb,"CREATE TABLE user (" & _
  11.     "UserID VARCHAR NOT NULL, " & _
  12.     "Password VARCHAR NOT NULL, " & _
  13.     "CONSTRAINT user_pk PRIMARY KEY (UserID));")
  14. END IF
  15.  
  16. SUB login_clicked
  17.   uid = Iup::GetAttribute(uidtxt,"VALUE")
  18.   IF Iup::GetAttribute(showpwd, "VALUE") = "OFF" THEN
  19.     pwd = Iup::GetAttribute(pwdtxt1,"VALUE")
  20.   ELSE
  21.     pwd = Iup::GetAttribute(pwdtxt2,"VALUE")
  22.   END IF
  23.   ' *** NEW USER ***
  24.  IF newusr_cb = "ON" THEN
  25.     IF uid <> "" AND pwd <> "" THEN
  26.       rtnmsg = sqlite::execute(usrdb,"INSERT INTO user VALUES ('" & uid & "', '" & MD5STR(pwd) & "');")
  27.       IF rtnmsg = 19 THEN
  28.         Iup::SetAttribute errlbl, "TITLE", "Duplicate User ID"
  29.         Iup::Show errlbl
  30.         Iup::SetFocus uidtxt
  31.         EXIT SUB
  32.       END IF
  33.       Iup::Message "Login",  "User Added"
  34.       GOSUB Init_Form
  35.       EXIT SUB
  36.     ELSE
  37.       Iup::Show errlbl
  38.       Iup::SetFocus uidtxt
  39.       EXIT SUB
  40.     END IF
  41.   END IF
  42.   ' *** LOGIN VERIFY ***
  43.  Iup::SetAttribute errlbl, "TITLE", "User ID / Password Incorrect"
  44.   stmt = sqlite::query(usrdb,"SELECT Password FROM user WHERE UserID = '" & uid & "';")
  45.   IF sqlite::row(stmt) = sqlite::SQLITE3_ROW THEN
  46.     sqlite::fetchhash(stmt, col)
  47.     IF col{"Password"} = MD5STR(pwd) THEN
  48.       Iup::Hide errlbl
  49.       Iup::Message "Login",  "Login Successful"
  50.       GOSUB Init_Form
  51.       EXIT SUB
  52.     END IF
  53.   END IF
  54.   Iup::Show errlbl
  55.   Iup::SetFocus uidtxt
  56.   EXIT SUB
  57.   Init_Form:
  58.     Iup::Hide errlbl
  59.     Iup::SetAttribute uidtxt, "VALUE", ""
  60.     Iup::SetAttribute pwdtxt1, "VALUE", ""
  61.     Iup::SetAttribute pwdtxt2, "VALUE", ""
  62.     Iup::SetAttribute showpwd, "VALUE", "OFF"
  63.     Iup::SetAttribute newusr, "VALUE", "OFF"
  64.     Iup::SetAttribute zbtxt, "VALUE", "pwdtxt1"
  65.     Iup::SetAttribute loginbut, "TITLE", "Login"
  66.     newusr_cb = "OFF"
  67.     Iup::SetFocus uidtxt
  68.   RETURN
  69. END SUB
  70.  
  71. FUNCTION MD5STR(txtstr)
  72.   LOCAL tmpstr, hexstr, x
  73.   tmpstr = MD5(txtstr)
  74.   FOR x = 1 TO 16
  75.     hexstr &= RIGHT("0" & HEX(ASC(MID(tmpstr, x, 1))), 2)
  76.   NEXT
  77.   MD5STR = hexstr
  78. END FUNCTION
  79.  
  80. SUB show_password
  81.   IF Iup::GetAttribute(showpwd, "VALUE") = "OFF" THEN
  82.     pwd2 = Iup::GetAttribute(pwdtxt2,"VALUE")
  83.     Iup::SetAttribute pwdtxt1, "VALUE", pwd2
  84.     Iup::SetAttribute zbtxt, "VALUE", "pwdtxt1"
  85.   ELSE
  86.     pwd1 = Iup::GetAttribute(pwdtxt1,"VALUE")
  87.     Iup::SetAttribute pwdtxt2, "VALUE", pwd1
  88.     Iup::SetAttribute zbtxt, "VALUE", "pwdtxt2"
  89.   END IF
  90. END SUB
  91.  
  92. SUB new_user
  93.   newusr_cb =Iup::GetAttribute(newusr, "VALUE")
  94.   IF newusr_cb = "ON" THEN
  95.     Iup::SetAttribute loginbut, "TITLE", "Add User"
  96.   ELSE
  97.     Iup::SetAttribute loginbut, "TITLE", "Login"
  98.   END IF
  99. END SUB  
  100.  
  101. SUB Win_exit
  102.   Iup::ExitLoop = TRUE
  103. END SUB
  104.  
  105. ' *** DIALOG ***
  106. Iup::Open
  107. dlg = Iup::Create("dialog")
  108. Iup::SetAttributes dlg, _
  109.   "TITLE=\"Login\", " & _
  110.   "SIZE=200x200, " & _
  111.   "MAXBOX=NO, " & _
  112.   "MINBOX=NO, " & _
  113.   "RESIZE=NO, " & _
  114.   "DEFAULTENTER=\"loginbut\""
  115.  
  116. ' *** CONTAINER ***
  117. vb = Iup::Create("vbox")
  118.  
  119. ' *** IMAGE ***
  120. hb1 = Iup::Create("hbox")
  121. piclbl = Iup::Create("label")
  122. Iup::SetAttributes piclbl, _
  123.   "IMAGE=\"./login.png\", " & _
  124.   "EXPAND=HORIZONTAL, " & _
  125.   "ALIGNMENT=ACENTER:ATOP"
  126. Iup::Append hb1, piclbl
  127. Iup::Append vb, hb1
  128.  
  129. ' *** ERROR ***
  130. hb2 = Iup::Create("hbox")
  131. errlbl = Iup::Create("label")
  132. Iup::SetAttributes errlbl, _
  133.   "TITLE=\"User ID / Password Incorrect\", " & _
  134.   "FGCOLOR=\"#ff0000\", " & _
  135.   "EXPAND=HORIZONTAL, " & _
  136.   "ALIGNMENT=ACENTER"
  137. Iup::Hide errlbl
  138. Iup::Append hb2, errlbl
  139. Iup::Append vb, hb2
  140.  
  141. ' *** ENTRY ***
  142. hb3 = Iup::Create("hbox")
  143. Iup::SetAttributes hb3, _
  144.   "MARGIN=20x10, " & _
  145.   "GAP=5"
  146. vb1 = Iup::Create("vbox")
  147. Iup::SetAttribute vb1, "GAP", "15"
  148. uidlbl = Iup::Create("label")
  149. Iup::SetAttribute uidlbl, "TITLE", "User ID"
  150. Iup::Append vb1, uidlbl
  151. pwdlbl = Iup::Create("label")
  152. Iup::SetAttribute pwdlbl, "TITLE", "Password"
  153. Iup::Append vb1, pwdlbl
  154. Iup::Append hb3, vb1
  155. vb2 = Iup::Create("vbox")
  156. uidtxt = Iup::Create("text")
  157. Iup::SetAttribute uidtxt, "SIZE", "85x"
  158. Iup::Append vb2, uidtxt
  159. pwdtxt1 = Iup::Create("text")
  160. Iup::SetAttributes pwdtxt1, _
  161.   "PASSWORD=YES, " & _
  162.   "SIZE=85x"
  163. pwdtxt2 = Iup::Create("text")
  164. Iup::SetAttribute pwdtxt2, "SIZE", "85x"
  165. Iup::SetHandle "pwdtxt1", pwdtxt1
  166. Iup::SetHandle "pwdtxt2", pwdtxt2
  167. zbtxt = Iup::Zbox(pwdtxt1, pwdtxt2)
  168. Iup::SetHandle "zbtxt", zbtxt
  169. Iup::Append vb2, zbtxt
  170. Iup::Append hb3, vb2
  171. Iup::Append vb, hb3
  172.  
  173. ' *** SHOW/HIDE ***
  174. hb4 = Iup::Create("hbox")
  175. Iup::SetAttributes hb4, _
  176.  "MARGIN=35x, " & _
  177.  "GAP=40"
  178. showpwd = Iup::Create("toggle")
  179. Iup::SetAttributes showpwd, _
  180.   "TITLE=\"Show Password\", " & _
  181.   "CANFOCUS=NO"
  182. newusr = Iup::Create("toggle")
  183. Iup::SetAttributes newusr, _
  184.   "TITLE=\"New User\", " & _
  185.   "CANFOCUS=NO"
  186. Iup::Append hb4, showpwd
  187. Iup::Append hb4, newusr
  188. Iup::Append vb, hb4
  189.  
  190. ' *** LOGIN ***
  191. hb5 = Iup::Create("hbox")
  192. Iup::SetAttribute hb5, "MARGIN", "40x10"
  193. loginbut = Iup::Create("button")
  194. Iup::SetAttributes loginbut, _
  195.   "TITLE=\"Login\", " & _
  196.   "EXPAND=HORIZONTAL"
  197. Iup::SetHandle "loginbut", loginbut
  198. iup::Append hb5, loginbut
  199. iup::Append vb, hb5
  200.  
  201. ' *** ATTACH CONTAINER ***
  202. iup::Append  dlg, vb
  203.  
  204. ' *** CALLBACKS ***
  205. Iup::SetCallback dlg,"CLOSE_CB",ADDRESS(Win_exit())
  206. Iup::SetCallback loginbut, "ACTION", ADDRESS(login_clicked())
  207. Iup::SetCallback showpwd, "ACTION", ADDRESS(show_password())
  208. Iup::SetCallback newusr, "ACTION", ADDRESS(new_user())
  209.  
  210. ' *** PROCESS ***
  211. ' Iup::Show(Iup::LayoutDialog(dlg))
  212. Iup::Show(dlg)
  213. Iup::MainLoop
  214. Iup::Close
  215. sqlite::Close(usrdb)
  216.  


ubuntu@rpi4b:~/guilc/sb-dev$ scriba showdb.sb
John  -  FAF43E604E6A820CAAAB88BF7E2328C7
AIR   -  99B69173F38EB9F24FA4C05B4BE47CD7
Jalih -  78020D21C627349463D88142DC51F9B9
Peter -  0C5213856A47300D1E6D30CA00FAFFC1
ubuntu@rpi4b:~/guilc/sb-dev$




6
Programming Challenges / Re: GUI Login
« on: December 31, 2019, 03:03:38 AM »
It turns out my .bmp image needed to be 24 bit color depth. The conversion from .png to .bmp didn't maintain the transparency of the background.

I also learned how to create Windows executables rather than default console apps.

nim --app:gui c login.nim

I'm going to start a thread on AllBASIC for the Windows / Nim / IUP direction. Maybe Mike will show some interest.




7
Programming Challenges / Re: GUI Login
« on: December 31, 2019, 12:57:34 AM »
I had a little better luck with ScriptBasic and IUP. I still can't get the image to  show even by making a .bmp file of it. The IUP I'm running is pretty old so I'm  going to update to 3.28 and see if that helps.

8
Programming Challenges / Re: GUI Login
« on: December 30, 2019, 11:41:22 PM »
I wanted to try Nim / IUP on Windows 10 and I was able to get the login.nim to compile. I seem to be having a problem getting the image to load.

9
Programming Challenges / Re: GUI Login
« on: December 30, 2019, 06:39:37 AM »
You can create your dialog layout using the IupLayoutDialog() function in realtime. I use it to experiment with attributes (properties) without having to change/create any code. The function also will generate the code for your layout in C, Lua or LED.



10
Programming Challenges / Re: GUI Login
« on: December 30, 2019, 05:38:42 AM »
This is how IUP sees its layout via the IupLayoutDialog() function.

11
Programming Challenges / Re: GUI Login
« on: December 29, 2019, 04:50:09 AM »
Nim / IUP Update

Change Log
  • Used state of toggle from callback rather than using GetAttriute to obtain it.
  • Defaulted the ENTER key to click the  Login button.
Note: I've attached the login.png  used in the login program if someone would like to try the script on  their system.

Code: Text
  1. # Nim 1.0.4 / IUP 3.28 - Login - JRS
  2.  
  3. import niup
  4. import niupext
  5.  
  6. var uidtxt,showpwd,pwdtxt1,pwdtxt2,errlbl,zbtxt:PIhandle
  7.  
  8. proc login_clicked(ih:PIhandle):cint {.cdecl.}=
  9.   var uid,pswd:cstring
  10.   uid = GetAttribute(uidtxt,"VALUE")
  11.   if GetAttribute(showpwd, "VALUE") == "OFF":
  12.     pswd = GetAttribute(pwdtxt1,"VALUE")
  13.   else:
  14.     pswd = GetAttribute(pwdtxt2,"VALUE")
  15.  
  16.   if uid == "John" and pswd == "Spikowski":
  17.     Hide(errlbl)
  18.     Message("Login",  "Login Successful")
  19.     return IUP_CLOSE
  20.   else:
  21.     Show(errlbl)
  22.     SetFocus(uidtxt)
  23.     return IUP_DEFAULT
  24.  
  25. proc show_password(ih:PIhandle; state: bool):cint {.cdecl.}=
  26.   var pwd1,pwd2:cstring
  27.   if state:  
  28.     pwd1 = GetAttribute(pwdtxt1,"VALUE")
  29.     SetAttribute(pwdtxt2, "VALUE", pwd1)
  30.     SetAttribute(zbtxt, "VALUE", "pwdtxt2")
  31.   else:
  32.     pwd2 = GetAttribute(pwdtxt2,"VALUE")
  33.     SetAttribute(pwdtxt1, "VALUE", pwd2)
  34.     SetAttribute(zbtxt, "VALUE", "pwdtxt1")
  35.     return IUP_DEFAULT
  36.  
  37. # *** MAIN ***
  38.  
  39. Open()
  40.  
  41. # *** DIALOG ***
  42. var dlg = Create("dialog")
  43. SetAttributes(dlg,
  44.   "TITLE=\"Login\", " &
  45.   "SIZE=200x200, " &
  46.   "MAXBOX=NO, " &
  47.   "MINBOX=NO, " &
  48.   "RESIZE=NO, " &
  49.   "DEFAULTENTER=\"loginbut\"")
  50.  
  51. # *** CONTAINER ***
  52. var vb = Create("vbox")
  53.  
  54. # *** IMAGE ***
  55. var hb1 = Create("hbox")
  56. var piclbl = Create("label")
  57. SetAttributes(piclbl,  
  58.   "IMAGE=\"login.png\", " &
  59.   "EXPAND=HORIZONTAL, " &
  60.   "ALIGNMENT=ACENTER:ATOP")
  61. discard Append(hb1, piclbl)
  62. discard Append(vb, hb1)
  63.  
  64. # *** ERROR ***
  65. var hb2 = Create("hbox")
  66. errlbl = Create("label")
  67. SetAttributes(errlbl,
  68.   "TITLE=\"User ID / Password Incorrect\", " &
  69.   "FGCOLOR=\"#ff0000\", " &
  70.   "EXPAND=HORIZONTAL, " &
  71.   "ALIGNMENT=ACENTER")
  72. Hide(errlbl)
  73. discard Append(hb2, errlbl)
  74. discard Append(vb, hb2)
  75.  
  76. # *** ENTRY ***
  77. var hb3 = Create("hbox")
  78. SetAttributes(hb3,
  79.   "MARGIN=20x10, " &
  80.   "GAP=5")
  81. var vb1 = Create("vbox")
  82. SetAttribute(vb1, "GAP", "15")
  83. var uidlbl = Create("label")
  84. SetAttribute(uidlbl, "TITLE", "User ID")
  85. discard Append(vb1, uidlbl)
  86. var pwdlbl = Create("label")
  87. SetAttribute(pwdlbl, "TITLE", "Password")
  88. discard Append(vb1, pwdlbl)
  89. discard Append(hb3, vb1)
  90. var vb2 = Create("vbox")
  91. uidtxt = Create("text")
  92. SetAttribute(uidtxt, "SIZE", "85x")
  93. discard Append(vb2, uidtxt)
  94. pwdtxt1 = Create("text")
  95. SetAttributes(pwdtxt1,
  96.   "PASSWORD=YES, " &
  97.   "SIZE=85x")
  98. pwdtxt2 = Create("text")
  99. SetAttribute(pwdtxt2, "SIZE", "85x")
  100. SetHandle("pwdtxt1", pwdtxt1)
  101. SetHandle("pwdtxt2", pwdtxt2)
  102. zbtxt = Zbox(pwdtxt1, pwdtxt2, nil)
  103. SetHandle("zbtxt", zbtxt)
  104. discard Append(vb2, zbtxt)
  105. discard Append(hb3, vb2)
  106. discard Append(vb, hb3)
  107.  
  108. # *** SHOW/HIDE ***
  109. var hb4 = Create("hbox")
  110. SetAttribute(hb4, "MARGIN", "35x")
  111. showpwd = Create("toggle")
  112. SetAttributes(showpwd,
  113.   "TITLE=\"Show Password?\", " &
  114.   "CANFOCUS=NO")
  115. discard Append(hb4, showpwd)
  116. discard Append(vb, hb4)
  117.  
  118. # *** LOGIN ***
  119. var hb5 = Create("hbox")
  120. SetAttribute(hb5, "MARGIN", "40x10")
  121. var loginbut = Create("button")
  122. SetAttributes(loginbut,
  123.   "TITLE=\"Login\", " &
  124.   "EXPAND=HORIZONTAL")
  125. SetHandle("loginbut", loginbut)
  126. discard Append(hb5, loginbut)
  127. discard Append(vb, hb5)
  128.  
  129. # *** ATTACH CONTAINER ***
  130. discard Append(dlg, vb)
  131.  
  132. # *** CALLBACKS ***
  133. SetCallback(loginbut, "ACTION", login_clicked)
  134. SetCallback(showpwd, "ACTION", show_password)
  135.  
  136. # *** PROCESS ***
  137. Show(dlg)
  138. MainLoop()
  139. Close()
  140.  

The screen shots for Nim are identical to  the ones  posted for ScriptBasic.

12
Nim / Re: Nim Manual
« on: December 28, 2019, 06:32:51 PM »
I ran into another Nim language reference from MIT that is a good resource.

Nim Language Reference

13
Programming Challenges / Re: GUI Login
« on: December 28, 2019, 06:58:11 AM »
ScriptBasic Update

Change Log
  • Fixed hide/show password
  • Skip Show Password? checkbox in ZORDER
  • Removed dialog max / min titlebar buttons
  • ENTER key clicks the Login button
  • Optimize and tidy code.

Code: Script BASIC
  1. ' ScriptBasic / IUP - Login - JRS
  2.  
  3. IMPORT iup.bas
  4.  
  5. SUB login_clicked
  6.   uid = Iup::GetAttribute(uidtxt,"VALUE")
  7.   IF Iup::GetAttribute(showpwd, "VALUE") = "OFF" THEN
  8.     pwd = Iup::GetAttribute(pwdtxt1,"VALUE")
  9.   ELSE
  10.     pwd = Iup::GetAttribute(pwdtxt2,"VALUE")
  11.   END IF
  12.   IF uid = "John" AND pwd = "Spikowski" THEN
  13.     Iup::Hide errlbl
  14.     Iup::Message "Login",  "Login Successful"
  15.     Iup::ExitLoop = TRUE
  16.   ELSE
  17.     Iup::Show errlbl
  18.     Iup::SetFocus uidtxt
  19.   END IF
  20. END SUB
  21.  
  22. SUB show_password
  23.   IF Iup::GetAttribute(showpwd, "VALUE") = "OFF" THEN
  24.     pwd2 = Iup::GetAttribute(pwdtxt2,"VALUE")
  25.     Iup::SetAttribute pwdtxt1, "VALUE", pwd2
  26.     Iup::SetAttribute zbtxt, "VALUE", "pwdtxt1"
  27.   ELSE
  28.     pwd1 = Iup::GetAttribute(pwdtxt1,"VALUE")
  29.     Iup::SetAttribute pwdtxt2, "VALUE", pwd1
  30.     Iup::SetAttribute zbtxt, "VALUE", "pwdtxt2"
  31.   END IF
  32. END SUB
  33.  
  34. SUB Win_exit
  35.   Iup::ExitLoop = TRUE
  36. END SUB
  37.  
  38. ' *** DIALOG ***
  39. Iup::Open
  40. dlg = Iup::Create("dialog")
  41. Iup::SetAttributes dlg, _
  42.   "TITLE=\"Login\", " & _
  43.   "SIZE=200x200, " & _
  44.   "MAXBOX=NO, " & _
  45.   "MINBOX=NO, " & _
  46.   "RESIZE=NO, " & _
  47.   "DEFAULTENTER=\"loginbut\""
  48.  
  49. ' *** CONTAINER ***
  50. vb = Iup::Create("vbox")
  51.  
  52. ' *** IMAGE ***
  53. hb1 = Iup::Create("hbox")
  54. piclbl = Iup::Create("label")
  55. Iup::SetAttributes piclbl, _
  56.   "IMAGE=\"./login.png\", " & _
  57.   "EXPAND=HORIZONTAL, " & _
  58.   "ALIGNMENT=ACENTER:ATOP"
  59. Iup::Append hb1, piclbl
  60. Iup::Append vb, hb1
  61.  
  62. ' *** ERROR ***
  63. hb2 = Iup::Create("hbox")
  64. errlbl = Iup::Create("label")
  65. Iup::SetAttributes errlbl, _
  66.   "TITLE=\"User ID / Password Incorrect\", " & _
  67.   "FGCOLOR=\"#ff0000\", " & _
  68.   "EXPAND=HORIZONTAL, " & _
  69.   "ALIGNMENT=ACENTER"
  70. Iup::Hide errlbl
  71. Iup::Append hb2, errlbl
  72. Iup::Append vb, hb2
  73.  
  74. ' *** ENTRY ***
  75. hb3 = Iup::Create("hbox")
  76. Iup::SetAttributes hb3, _
  77.   "MARGIN=20x10, " & _
  78.   "GAP=5"
  79. vb1 = Iup::Create("vbox")
  80. Iup::SetAttribute vb1, "GAP", "15"
  81. uidlbl = Iup::Create("label")
  82. Iup::SetAttribute uidlbl, "TITLE", "User ID"
  83. Iup::Append vb1, uidlbl
  84. pwdlbl = Iup::Create("label")
  85. Iup::SetAttribute pwdlbl, "TITLE", "Password"
  86. Iup::Append vb1, pwdlbl
  87. Iup::Append hb3, vb1
  88. vb2 = Iup::Create("vbox")
  89. uidtxt = Iup::Create("text")
  90. Iup::SetAttribute uidtxt, "SIZE", "85x"
  91. Iup::Append vb2, uidtxt
  92. pwdtxt1 = Iup::Create("text")
  93. Iup::SetAttributes pwdtxt1, _
  94.   "PASSWORD=YES, " & _
  95.   "SIZE=85x"
  96. pwdtxt2 = Iup::Create("text")
  97. Iup::SetAttribute pwdtxt2, "SIZE", "85x"
  98. Iup::SetHandle "pwdtxt1", pwdtxt1
  99. Iup::SetHandle "pwdtxt2", pwdtxt2
  100. zbtxt = Iup::Zbox(pwdtxt1, pwdtxt2)
  101. Iup::SetHandle "zbtxt", zbtxt
  102. Iup::Append vb2, zbtxt
  103. Iup::Append hb3, vb2
  104. Iup::Append vb, hb3
  105.  
  106. ' *** SHOW/HIDE ***
  107. hb4 = Iup::Create("hbox")
  108. Iup::SetAttribute hb4, "MARGIN", "35x"
  109. showpwd = Iup::Create("toggle")
  110. Iup::SetAttributes showpwd, _
  111.   "TITLE=\"Show Password?\", " & _
  112.   "CANFOCUS=NO"
  113. Iup::Append hb4, showpwd
  114. Iup::Append vb, hb4
  115.  
  116. ' *** LOGIN ***
  117. hb5 = Iup::Create("hbox")
  118. Iup::SetAttribute hb5, "MARGIN", "40x10"
  119. loginbut = Iup::Create("button")
  120. Iup::SetAttributes loginbut, _
  121.   "TITLE=\"Login\", " & _
  122.   "EXPAND=HORIZONTAL"
  123. Iup::SetHandle "loginbut", loginbut
  124. iup::Append hb5, loginbut
  125. iup::Append vb, hb5
  126.  
  127. ' *** ATTACH CONTAINER ***
  128. iup::Append  dlg, vb
  129.  
  130. ' *** CALLBACKS ***
  131. Iup::SetCallback dlg,"CLOSE_CB",ADDRESS(Win_exit())
  132. Iup::SetCallback loginbut, "ACTION", ADDRESS(login_clicked())
  133. Iup::SetCallback showpwd, "ACTION", ADDRESS(show_password())
  134.  
  135. ' *** PROCESS ***
  136. Iup::Show dlg
  137. Iup::MainLoop
  138. Iup::Close
  139.  


14
Programming Challenges / Re: GUI Login
« on: December 27, 2019, 10:10:53 PM »
8th Update (Jalih submission)

Code: Text
  1. requires gui
  2.  
  3. var gui
  4.  
  5. { guest: "pa$$w0rd!" } constant passwords
  6.  
  7. : authenticate
  8.   "edit1" g:child g:text? passwords swap m:@ nip null? if
  9.     drop
  10.     "lbl0" g:child
  11.     "User not found!" g:text drop
  12.   else
  13.     swap
  14.     "edit2" g:child g:text? rot s:= if
  15.      "Authenticated!" . cr
  16.      bye
  17.     else
  18.       "lbl0" g:child
  19.       "Username and password don't match!" g:text drop
  20.     then
  21.   then ;
  22.  
  23. {
  24.   kind: "win",
  25.   buttons: 0,
  26.   native-title-bar: false,
  27.   title: "Login",
  28.   wide: 520,
  29.   high: 200,
  30.   resizable: false,
  31.   center: true,
  32.   init: ( gui ! ),
  33.   children:
  34.   [
  35.     {
  36.       kind: "box",
  37.       name: "frame",
  38.       bounds: "0, 0, parent.width, parent.height",
  39.       bg: "gray",
  40.       children:
  41.       [
  42.         {
  43.           kind: "image",
  44.           bounds: "parent.left+10, parent.top+10, left+128, top+128",
  45.           img: "8thlogo.png",
  46.           name: "logo"    
  47.         },
  48.         {
  49.           kind: "label",
  50.           fg: "blue",
  51.           font: 20,
  52.           label: "",
  53.           bounds: "logo.right+20, parent.top+10, parent.width-10, top+24 ",
  54.           justify: ["hcenter"],
  55.           name: "lbl0"
  56.         },
  57.         {
  58.           kind: "label",
  59.           label: "Username:",
  60.           bounds: "logo.right+20, lbl0.bottom+20, left+80, top+24 ",
  61.           name: "lbl1"
  62.         },
  63.         {
  64.           kind: "edit",
  65.           bounds: "lbl1.right+10, lbl1.top, parent.width-20, top+24",
  66.           name: "edit1",
  67.           max-text: 32
  68.         },
  69.         {
  70.           kind: "label",
  71.           label: "Password:",
  72.           bounds: "lbl1.left, lbl1.bottom+10, left+80, top+24",
  73.           name: "lbl2"
  74.         },
  75.         {
  76.           kind: "edit",
  77.           bounds: "edit1.left, lbl2.top, parent.width-20, top+24",
  78.           name: "edit2",
  79.           max-text: 32,
  80.           password-char: "*"
  81.         },
  82.         {
  83.           kind: "btn",
  84.           label: "Login",
  85.           bg: "darkgray",
  86.           bounds: "lbl2.left, lbl2.bottom+20, edit2.right, top+30",
  87.           name: "button",
  88.           tooltip: "Login to account",
  89.           click: ' authenticate
  90.         }
  91.       ]
  92.     }
  93.   ]
  94. } var, gui-desc
  95.  
  96. : app:main
  97.   gui-desc @ g:new ;
  98.  

15
Programming Challenges / Re: GUI Login
« on: December 27, 2019, 03:17:03 PM »
C Update (AIR submission)

Code: C
  1. * logon2.c
  2.  *
  3.  * version 1.1
  4.  *
  5.  * GUI Logon Screen Challenge Submission
  6.  * C version, using GTK+-3.0
  7.  *
  8.  * Written by Armando I. Rivera (AIR)
  9.  *
  10.  * Compile:  gcc logon2.c $(pkg-config --libs --cflags gtk+-3.0) -o logon2
  11. */
  12.  
  13.  
  14. #include <gtk/gtk.h>
  15.  
  16. GtkWidget *err_label;
  17.  
  18. void onClick( GtkWidget *widget, gpointer   data ) {
  19.     gchar *stupid_password = "pa$$w0rd!";
  20.     gchar *user_password;
  21.     g_object_get(data,"text",&user_password,NULL);
  22.  
  23.     if (g_strcmp0 (stupid_password,user_password) == 0) {
  24.         g_print("Your are now logged in!\n");
  25.         gtk_main_quit();
  26.     }else{
  27.         gtk_label_set_markup(GTK_LABEL(err_label), "<span color=\"red\" font_desc=\"16.0\">** Invalid Password **</span>");
  28.         g_print("Username or Password is Incorrect!\n");
  29.  
  30.     }
  31. }
  32.  
  33. int main( int argc, char *argv[])
  34. {
  35.     GtkWidget *window, *layout, *image, *btnLogin;
  36.     GtkWidget *lblUser, *lblPass, *txtUser, *txtPass;
  37.  
  38.     gtk_init(&argc, &argv);
  39.    
  40.     layout = gtk_layout_new(NULL, NULL);
  41.  
  42.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  43.     g_object_set(window,
  44.                 "title","Login",
  45.                 "default-width",660,
  46.                 "default-height",370,
  47.                 "resizable",FALSE,
  48.                 "window-position",GTK_WIN_POS_CENTER,
  49.                 "child",layout,
  50.                 "decorated",0,
  51.                 NULL);
  52.  
  53.  
  54.     image = gtk_image_new_from_file("logon.png");
  55.     g_object_set(layout,"child",image,"margin",10,NULL);
  56.    
  57.     lblUser = gtk_label_new("");
  58.     lblPass = gtk_label_new("");
  59.     err_label = gtk_label_new("");
  60.     g_object_set(err_label,"width-request",270,NULL);
  61.    
  62.     gtk_label_set_markup(GTK_LABEL(lblUser), "<span font_desc=\"16.0\">Username:</span>");
  63.     gtk_label_set_markup(GTK_LABEL(lblPass), "<span font_desc=\"16.0\">Password:</span>");
  64.    
  65.     txtUser = gtk_entry_new();
  66.     txtPass = gtk_entry_new();
  67.    
  68.    
  69.     g_object_set(txtPass,"visibility", FALSE,NULL);
  70.    
  71.     btnLogin = gtk_button_new_with_label("Login");
  72.     g_object_set(btnLogin,"width-request",170,NULL);
  73.  
  74.  
  75.     gtk_layout_put(GTK_LAYOUT(layout), lblUser, 330, 112);
  76.     gtk_layout_put(GTK_LAYOUT(layout), lblPass, 330, 162);
  77.     gtk_layout_put(GTK_LAYOUT(layout), txtUser, 460, 110);
  78.     gtk_layout_put(GTK_LAYOUT(layout), txtPass, 460, 160);
  79.     gtk_layout_put(GTK_LAYOUT(layout), btnLogin, 460, 210);
  80.     gtk_layout_put(GTK_LAYOUT(layout), err_label, 300, 16);
  81.  
  82.     g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
  83.     g_signal_connect (btnLogin, "clicked", G_CALLBACK (onClick), txtPass);
  84.  
  85.     gtk_widget_show_all(window);
  86.  
  87.     gtk_main();
  88.  
  89.     return 0;
  90. }
  91.  

Pages: [1] 2 3 ... 11