nim_designer
                                
                                 nim_designer copied to clipboard
                                
                                    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é:
- le proc faisant appel à la fonction FCALL n'est pas defini
- la gestion du grid vous est laissé à faire à la main un exemple complet dans exemple
- 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
- creer un dossier placer le programme TermSDA et le programme procSDA dans ce dossier Idem pour TSource
- creer un sous dossier dspf et obj->(pour compiler TermSDA.ccp fenêtre window)
- 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
