nim_designer icon indicating copy to clipboard operation
nim_designer copied to clipboard

designer TUI nim-lang

Designer TUI

dépendance : Termkey Termcurs

Testing 2022-04-09 12h15

  • change FULL 2022-03-30 23h15 voir "Issues" du 2022-03-30
  • change Remove GRID 2022-03-31 2h44
  • change position posx posy rown grig 2022-04-05 16h27
  • change procurs setPageGrid calcul nbr page and isPanelkey test button actif 202-04-07 15h40
  • update TERMCURS 2022-04-08 TERMKEY 2022-04-08
  • update TERMCURS 2022-04-09
  • refonte du "projet" prise en compte de la fonction ioFMT(PANEL,GRIDSFL,select,pos(index grid) ) et plus

but:

Soulager la compréhention par la visualisation des Formulaires puis de générer le code.

Créer des programmes en pure NIM,sans lib externe et occupant peu de place mémoire.

l'utilisation de Termvte , crée une fenêtre terminale, beaucoup plus souple à gérer que xterm etc...

elle peut fonctionner dans un terminal que vous paramétrez.

vidéo

tutoreil vidéo

utilisation du logiciel:

Utiliser la souris pour naviguer, sélectionner, positionner...

New permet de créer un formulaire

titleTerm.: Nom étendu du fichier comprenant l'ensemble des panels

fileTerm..: Nom du fichier (exemple.dspf)

F9 enregistre

F12 abandon

Recovery

Recharge le display file en mémoire. Apporter toutes les modifications jugées nécéssaires.


création du panel

  • [X] choix : créer = "999 add panel" sinon cliquer sur une ligne

Saisie de la structure du panel

fonction saisie clavier: up / down -- tab / tabs -- enter, pour valider la zone de saisie et passer à la zone suivante.

si il y a une erreur de saisie appuyez sur la touche "Escape" pour corriger

field fonction
Name Obligatoire, le référencement et le panel sont lier voir exemple dans le source
PosX,Y récupération du positionement de la souris
Heights nombre de lignes verticales
Width nombre de caractères horizontals
Cadre appuyer sur une touche, le choix apparaît ---- combo: ligne = 1 ligne =2
Title Titre du panel
F1..F24 appuyer sur la bar d'espacemant pour activé la fonction
Check Field associer le controle par défault des zones comprise dans le panel

F3 n'a pas besoin de crontôle ex: = exit programe

F9 F11 on besoin de faire le contrôle car les données ont des conséquences

vous pouvez dans le source affecter à la main d'autre valeur ex CtrlV

leurs donner un text plus explicite ex F9 = F9 Enrg.

si vous ne mettez pas de text la fonction n'est pas visible à l'écran mais active

ne pas ce servir CrtlH qui est réserver à la saisie.

ex:defButton(TKey.F3,"F3 Exit.",false) defButton(TKey.F9,"F9 Enrg.",true) defButton(TKey.CtrlV,"",true)


paneaux de définition des labels Fields Menus Combo/Grid

pointer la souris pour positioner l'objet que vous voulez décrire.

key Fonction
AltL Label puis tapez votre label CtrlV valide le label
AltT Titre idem label
AltF Field
AltM Menu
AltP display de tous les menus
AltG Combo/Grid
AltD affichage des objet Label Field Menu
AltO réordonner les objet Label Field
AltR remove les objet Label Field Menu Combo/Grid
AltS réaffichage du terminal
CtrlQ fermeture du panel retour au menu principal
CtrlH réserver à la saisie pour Help field

AltT -> Titre

CtrlV -> validation

AltL -> Label Idem Titre ex nom....:


AltF -> définition FIELD

choix ajouter ou modifier

veuillez valider chaque zone

field fonction
Name nom du buffer
PosX,Y défini au moment du clique de la souris
Ref.Type combo: détermine le mode de sasie
With nombre d'entier
Scal Nombre de décimal après la virgule
Empty on -> Vide off -> la zone est obligatoire
Error message ce rapportant à la zone de saisie
Help aide avec la touche CtrlH
Edt.Char code par exemple : € $ ¥ ₪ £ %
Protect falg interdisant la saisie ou modification

Field Hiden

pnlF1.hiden.add(defStringH("zone10",DATE_ISO, "2020-04-24"))                # full String
pnlF1.hiden.add(defSwitchH("zone15", SWITCH,true))                          # specifique switch
pnlF1.hiden.add(defStringH("zone8",DECIMAL, "256.05"))                      # full String

exemple : Decimal

exemple : appel process appel automatiquement la procédure ex: un combo ou calcul avec retour de donnés...

AltG - > Définition du Combo/Grid

field fonction
Form Combo / Grid
Name nom du process
PosX,Y défini au moment du clique de la souris
Rows Nombre de ligne horizontale
Separateur combo: sepStyle noStyle

pensez à l'association de la zone process et name.combo

AltC -> Définiton des titres des colonnes

field fonction
text titre de la colonne
long nombre de caractères
PosX,Y défini au moment du clique de la souris
Type combo TEXT_FREE DIGIT ....
Color combo color
Car code par exemple : € $ ¥ ₪ £ %

AltI-> Item

enregistrement data des colonnes

key Fonction
AltC Header Colonne
AltI Item uniquement combo
AltP liste colonne
AltR remove colonne
AltD display combo/grid
AltS recharge à la Définition du Combo/Grid
CtrlV sauvegarde le combo/grid
AltQ quitter l'envirronement de définition combo/grid

Résultat :


AltM -> Menu:

key Fonction
CtrlV validation
CtrlP display menu
AltP display full menu
AltS refresh saisie menu

F9 enregistrement

F12 return

field fonction
Name nom du menu
PosX,Y défini au moment du clique de la souris
.... Item
cadre combo: 1 ligne 2 lignes
.... combo: Vertical ou Horizontal

exemple:


sauvegarde:

dans la sous directorie ./dspf

"name.dspf" Génère un fichier json

dans la directorie du programme TermSDA "Source.nim" que vous pouvez compiler


envirronement de travail

TermSDA et Tsource son des executables des terminaux fait avec C++ GTK libvte ex: Tsource vous permez d'excuter Source dans une fenêtre terminal

Particularité:

  1. le proc faisant appel à la fonction FCALL n'est pas defini
  2. la gestion du grid vous est laissé à faire à la main un exemple complet dans exemple
  3. nim c -f --gc:orc -d:useMalloc --passc:-flto --passC:-fno-builtin-memcpy --verbosity:0 --hints:off --threads:on -d:release -o:procSDA procSDA.nim
  4. creer un dossier placer le programme TermSDA et le programme procSDA dans ce dossier Idem pour TSource
  5. creer un sous dossier dspf et obj->(pour compiler TermSDA.ccp fenêtre window)
  6. les dossiers: .vscode -les procedures et envirronement VSCODE exemple -programme nim src -programme terminal ccp proc...
programme Text
procCurs interne(termcurs)
procField definition Field
procLabel definition Label
procGrid definition Grid/Combo
procMenu definition Menu
procPanel definition Panel
procInit ouveture programme SDA
callqry combo commun
procJson lecture / écriture JSON
procSDA programme Principal
makefile outil pour compiler ccp

VSCODE :

Task Manager extension

exemple source généré:

import termkey
import termcurs
import tables


var callQuery: Table[string, proc(fld : var FIELD)]


type
  FIELD_Fcli00a {.pure.}= enum
    cliNom,
    decimal,
    tproc
const P1: array[FIELD_Fcli00a, int] = [0,1,2]


# MENU -> TEST
var Table = new(MENU)
Table = newMenu("Table", 10, 44, vertical, @["Définition", "Visualisation", "Liste"], line1)


# Panel Fcli00a

var Fcli00a= new(PANEL)

# description
proc dscFcli00a() =
  Fcli00a = newPanel("Fcli00a",1,1,32,132,@[defButton(TKey.F3,"F3",false,true), defButton(TKey.F9,"F9",true,true), defButton(TKey.F10,"F10",true,true)],line1,"Fiche Client")

  # LABEL  -> Fcli00a

  Fcli00a.label.add(defTitle("L02002", 2, 2, "Fiche Client"))
  Fcli00a.label.add(deflabel("L04002", 4, 2, "Nom.......:"))
  Fcli00a.label.add(deflabel("L06002", 6, 2, "Décimal...:"))
  Fcli00a.label.add(deflabel("L09002", 9, 2, "Proc......:"))

  # FIELD -> Fcli00a

  Fcli00a.field.add(defString("cliNom", 4, 14, ALPHA_UPPER,30,"", FILL, "Obligatoire","Nom du client"))
  Fcli00a.field.add(defNumeric("decimal", 6, 14, DECIMAL,9,2,"", EMPTY,"", ""))
  setEdtCar(Fcli00a.field[P1[decimal]], "€")
  Fcli00a.field.add(defString("tproc", 9, 14, FPROC,10,"", EMPTY, "","appel procedure"))
  setProcess(Fcli00a.field[P1[tproc]],"myproc")


#===================================================
proc myproc(fld : var FIELD) =
  var Cell_pos : int = -1
  var Xcombo  = newGRID("myproc",9,14,14,sepStyle)
  var Cell_Pays = defCell("Pays",10,TEXT_FREE,"Cyan")
  setHeaders(Xcombo, @[Cell_Pays])
  addRows(Xcombo, @[ "France" ])
  addRows(Xcombo, @[ "Espagne" ])
  addRows(Xcombo, @[ "Italie" ])

  printGridHeader(Xcombo)
  case fld.text
    of "France"   : Cell_pos = 0
    of "Espagne"   : Cell_pos = 1
    of "Italie"   : Cell_pos = 2
    else : discard

  while true :
    let (keys, val) = ioGrid(Xcombo,Cell_pos)
    case keys
      of TKey.Enter :
        restorePanel(Fcli00a,Xcombo)
        fld.text  = $val[0]
        break
      else: discard

callQuery["myproc"] = myproc
#===================================================




proc main() =
  initTerm(32,132)

  dscFcli00a()
  printPanel(Fcli00a)
  displayPanel(Fcli00a)

  # ONLY -> FOR TEST
  dspMenuItem(Fcli00a,Table,0)
  let nTest = ioMenu(Fcli00a,Table,0)


  #Exemple ------

  while true:
    let  key = ioPanel(Fcli00a)
    case key
      of TKey.PROC :  # for field Process
        if isProcess(Fcli00a,Index(Fcli00a)):
          callQuery[getProcess(Fcli00a,Index(Fcli00a))](Fcli00a.field[Index(Fcli00a)])
      of TKey.F3:
        break
      of TKey.F9:
        break
      of TKey.F10:
        break
      else : discard

  closeTerm()



main()

Projet Contact: exemple