Hi everyone, recently I found this amazing programming language and have started to play with it, I can say that I am having some fun I was thinking to develop a text-based rpg with ansi graphics and I came across the module "terminal" of Nim and the bearlibterminal wrapper of the omonimous lib but I can't decide on which one I should use. I understand that the "terminal" module use the system console directly, where I'd like more a graphical frontend that simulates a terminal window, maybe for more portability. In this case what is better, the native module with basic functionality or a wrapper to a more advanced library? Maybe there is a third way which I am unaware of?

Thanks for the advices

2017-09-10 20:17:07
bearlibterminal is a great lib. I'd recommend it. Maybe, if you don't feel comfortable you could start with the terminal module. 2017-09-11 08:00:32
Thanks! 2017-09-11 12:37:49

Hi everyone! For learning purpose I'm porting some python examples to nim that use the library blt, so far I got this:

import
  blt,
  tables

var keyNames = {
  0: "",
  TK_MOUSE_LEFT: "LMB",
  TK_MOUSE_RIGHT: "RMB",
  TK_MOUSE_MIDDLE: "MMB",
  TK_CLOSE: "Close",
  TK_BACKSPACE: "Backspace",
  TK_TAB: "Tab",
  TK_RETURN: "Enter",
  TK_SHIFT: "Shift",
  TK_CONTROL: "Ctrl",
  TK_PAUSE: "Pause",
  TK_ESCAPE: "Escape",
  TK_PAGEUP: "Page Up",
  TK_PAGEDOWN: "Page Down",
  TK_END: "End",
  TK_HOME: "Home",
  TK_LEFT: "Left",
  TK_UP: "Up",
  TK_RIGHT: "Right",
  TK_DOWN: "Down",
  TK_INSERT: "Insert",
  TK_DELETE: "Delete",
  TK_F1: "F1",
  TK_F2: "F2",
  TK_F3: "F3",
  TK_F4: "F4",
  TK_F5: "F5",
  TK_F6: "F6",
  TK_F7: "F7",
  TK_F8: "F8",
  TK_F9: "F9",
  TK_F10: "F10",
  TK_F11: "F11",
  TK_F12: "F12",
  TK_KP_DIVIDE: "Keypad /",
  TK_KP_MULTIPLY: "Keypad *",
  TK_KP_MINUS: "Keypad -",
  TK_KP_PLUS: "Keypad +",
  TK_KP_ENTER: "Keypad Enter",
  TK_KP_0: "Keypad 0",
  TK_KP_1: "Keypad 1",
  TK_KP_2: "Keypad 2",
  TK_KP_3: "Keypad 3",
  TK_KP_4: "Keypad 4",
  TK_KP_5: "Keypad 5",
  TK_KP_6: "Keypad 6",
  TK_KP_7: "Keypad 7",
  TK_KP_8: "Keypad 8",
  TK_KP_9: "Keypad 9",
  TK_KP_PERIOD: "Keypad .",
}.toTable()

proc drawFrame(x,y,w,h:int) =
  terminal_clear_area(x.cint,y.cint,w.cint,h.cint)
  
  for i in x..(x+w)-1:
    discard terminal_print(i.cint, y.cint, "─")
    discard terminal_print(i.cint, (y+h-1).cint,"─")
  
  for j in y..y+h-1:
    discard terminal_print(x.cint, j.cint, "│")
    discard terminal_print((x+w-1).cint, j.cint, "│")
  
  discard terminal_print(x.cint, y.cint, "┌")
  discard terminal_print((x+w-1).cint, y.cint ,"┐")
  discard terminal_print(x.cint, (y+h-1).cint,"└")
  discard terminal_print((x+w-1).cint, (y+h-1).cint,"┘")

discard terminal_open()
discard terminal_set("window: size=80x25, cellsize=auto, title='Omni: menu;font: default'")
terminal_color(color_from_name("white"))
terminal_composition(TK_OFF)
terminal_refresh()

var
  key : int
  max_chars = 32
  text = ""
  character = ' '
  result : int
  char_result = 0

while true:
  terminal_clear()
  terminal_color(color_from_name("white"))
  
  discard terminal_print(2, 1, "Select different input tests by pressing corresponding number:")
  
  discard terminal_print(2, 3, "[color=orange]1.[/color] read_str")
  drawFrame(5, 4, max_chars + 2, 3)
  discard terminal_printf(6,5, "$1", text)
  discard terminal_printf((5 + max_chars + 2 + 1).cint, 5.cint, "[color=gray] $1", (if result >= 0: "OK" else: "Cancelled"))
  
  discard terminal_print(2, 8, "[color=orange]2.[/color] read_char")
  drawFrame(5, 9, 5, 3)
  terminal_put(7, 10, character.cint)
  discard terminal_printf(11, 10, "[color=gray]$1", (if keyNames.hasKey(char_result): keyNames[char_result] else: $chr(char_result)))
  
  terminal_refresh()
  
  key = terminal_read()
  
  if key in [TK_CLOSE, TK_ESCAPE]:
    break
  elif key == TK_1:
    terminal_color(color_from_name("orange"))
    drawFrame(5, 4, max_chars + 2, 3)
    result = terminal_read_str(6, 5, text, max_chars.cint)
  elif key == TK_2:
    terminal_color(color_from_name("orange"))
    drawFrame(5, 9, 5, 3)
    while true:
      terminal_put(7, 10, ord(character))
      terminal_clear_area(11, 10, 16, 1)
      discard terminal_printf(11, 10, "[color=gray]$1", (if keyNames.hasKey(char_result): keyNames[char_result] else: $(char_result)))
      terminal_refresh()
      
      character = ' '
      key = terminal_read()
      if key in [TK_ESCAPE, TK_CLOSE, TK_RETURN]:
        break
      elif bool(terminal_check(TK_WCHAR)):
        character = chr(terminal_state(TK_WCHAR))
        char_result = key
      elif key < TK_KEY_RELEASED:
        char_result = key

terminal_close()

converted from here https://github.com/ibatugow/blt_samples/blob/master/Python/text_input.py

The example is working except for the read_str function: when I finished inserting the string, it prints always just the first character of the string. I suppose the error is in this line:

discard terminal_printf(6,5, "$1", text)

but it seems legit to me. Anyone can help me? What's wrong?

Thanks!

2017-10-02 01:49:25