Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
[BETA][C#] Makemenu - menus en batch - TSnake41
Auteur Message
Répondre en citant
Message [BETA][C#] Makemenu - menus en batch - TSnake41 
Bonjour,

je vous présente une de mes créations qui permet de faire facilement des menus.



Téléchargement : https://1drv.ms/f/s!Ao64nlgUfTexg_EzMfF-Aynag0YPGw

Syntaxe: Makemenu [/e:{Expression}] ou [/f:{Fichier contenant une expression}]
NOTE: Les expressions peuvent contenir des espaces sans causer de problème.

La commande retourne un errorlevel en fonction de l'item sélectionné.


Format d'un item: [argumentx],[autre argument],[Et plein d'autre encore],'Texte'
NOTE: Le texte peut être placé n'importe ou dans l'item tant qu'une virgule sépare chaque argument.

Un item peut contenir les arguments suivants:
    a: Alignement (peut être: LeftAlign RightAlign ou Center)
    fc: Couleur des caractères (couleur hexadécimale comme cmd)
    ffc: Couleur des caractères (quand item sélectionné) (couleur hexadécimale comme cmd)
    bc: Couleur de fond (couleur hexadécimale comme cmd)
    fbc: Couleur de fond (quand item sélectionné) (couleur hexadécimale comme cmd)
    l: Longueur de la ligne
    cc: Item actuel.
    jump: Saut de ligne.


Format d'une expression:
Code:
[Item];[Item2];[Item3];[ItemX]...

Afin d'éviter les répétition, si un argument n'est pas défini dans un item, on prend celui de l'item d'avant.

Par exemple:
Code:
a:Center,l:50,jump:1,'SinglePlayer';'Multiplayer';'Options';'Exit game'

donnera: http://i.imgur.com/9x4KmCh.png

Code:
@Echo off
:: Main menu in batch.
:: All is easy with makemenu !

mode CON LINES=14 COLS=52
set Res=ResX*ResY
set VSYNC_STATE=OFF
setlocal EnableDelayedExpansion
:Mainmenu
cls
title Mainmenu sample
echo.
echo               Menu principal de test
echo.
MakeMenu /e:a:Center,l:50,jump:1,'SinglePlayer';'Multiplayer';'Options';'Exit game'
call:%Errorlevel%
goto Mainmenu

:1
cls
echo You choose SinglePlayer.
pause
goto:eof

:2
cls
echo You choose Multiplayer.
pause
goto:eof

:3
cls
echo                      Options
echo.
title Mainmenu sample:Options
MakeMenu /e:cc:%Errorlevel%,a:Center,l:50,jump:1,'V-Sync:%VSYNC_STATE%';'Resolution:%Res%';'^<---'

if %ERRORLEVEL% EQU 3 goto:EOF
if %ERRORLEVEL% EQU 1 (
   if %VSYNC_STATE%==OFF (set VSYNC_STATE=ON) else (set VSYNC_STATE=OFF)
)
if %ERRORLEVEL% EQU 2 (
   set Res=%random%*%random%
)
goto 3

:4
exit
Code:
/* Makemenu command by TSnake41 (Astie Teddy), used for create a menu in command prompt. */
/* Under MIT/X11 licence. */

/*
   The MIT License (MIT)

   Copyright (c) 2015 Astie Teddy

   Permission is hereby granted, free of charge, to any person obtaining a copy
   of this software and associated documentation files (the "Software"), to deal
   in the Software without restriction, including without limitation the rights
   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   copies of the Software, and to permit persons to whom the Software is
   furnished to do so, subject to the following conditions:

   The above copyright notice and this permission notice shall be included in all
   copies or substantial portions of the Software.

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
   SOFTWARE.

*/

using System;
using System.Collections.Generic;
using System.IO;

namespace MakeMenu
{
    class Program
    {
        static List<MenuItem> menuitems = new List<MenuItem>();
        static int curretitem = 0;

        static int Main(string[] args)
        {
            #region // Arguments processing
            string argline = string.Join(" ",args);
            string Expression = "";

            if (args[0].StartsWith("/f"))
                Expression = File.ReadAllText(argline.Split(':')[1]);
            else if (args[0].StartsWith("/e"))
                Expression = argline.Substring(argline.IndexOf(':')+1);
            else
                throw new ArgumentException("Arguments are invalid !");

            // Treatement with char by char.
            string curretText = "";

            ConsoleColor curretbc = Console.BackgroundColor;
            ConsoleColor curretfc = Console.ForegroundColor;
            ConsoleColor curretfbc = Console.BackgroundColor;
            ConsoleColor curretffc = ConsoleColor.Gray;
            TextAlignement curreta = TextAlignement.LeftAlign;
            int curretjump = 0;
            int curretl = 10;

            string temp = "";
            bool InString = false;

            for (int i = 0; i < Expression.Length; i++)
                switch (Expression[i])
                {
                    // String beguining caracter.
                    case '\'':
                        if (InString)
                            curretText = temp;
                        else
                            temp = "";

                        InString = !InString;
                        break;

                    // Escape character.
                    case '\\':
                        i++;
                        temp += Expression[i];
                        break;
                    // Item separating character.
                    case ';':
                        menuitems.Add(new MenuItem() {
                            BackgroundColor = curretbc,
                            ForegroundColor = curretfc,
                            Alignement = curreta,
                            Text = curretText,
                            FocusedBackgroundColor = curretfbc,
                            FocusedForegroundColor = curretffc,
                            Length = curretl,
                            Jump = curretjump
                        });
                        temp = "";
                        break;
                   
                    // Item data separating character.
                    case ',':
                        // If it is not the text.
                        temp = temp.Trim();
                        if (temp.Contains(":"))
                        {
                            string type = temp.Split(':')[0];
                            string value = temp.Split(':')[1];

                            switch (type.ToLower())
                            {
                                case "a":
                                    curreta = (TextAlignement)Enum.Parse(typeof(TextAlignement), value);
                                    break;
                                case "fc":
                                    curretfc = (ConsoleColor)Convert.ToInt32(value, 16);
                                    break;
                                case "bc":
                                    curretbc = (ConsoleColor)Convert.ToInt32(value, 16);
                                    break;
                                case "ffc":
                                    curretffc = (ConsoleColor)Convert.ToInt32(value, 16);
                                    break;
                                case "fbc":
                                    curretfbc = (ConsoleColor)Convert.ToInt32(value, 16);
                                    break;
                                case "l":
                                    curretl = int.Parse(value);
                                    break;
                                case "cc":
                                    curretitem = int.Parse(value)-1;
                                    break;
                                case "jump":
                                    curretjump = int.Parse(value);
                                    break;
                                default:
                                    break;
                            }
                            temp = "";
                        }
                        break;
                    default:
                        temp += Expression[i];
                        break;
                }

            temp = temp.Trim();
            if (temp.Contains(":"))
            {
                try
                {
                    string type = temp.Split(':')[0];
                    string value = temp.Split(':')[1];

                    switch (type.ToLower())
                    {
                        case "a":
                            curreta = (TextAlignement)Enum.Parse(typeof(TextAlignement), value);
                            break;
                        case "fc":
                            curretfc = (ConsoleColor)Convert.ToInt32(value, 16);
                            break;
                        case "bc":
                            curretbc = (ConsoleColor)Convert.ToInt32(value, 16);
                            break;
                        case "ffc":
                            curretffc = (ConsoleColor)Convert.ToInt32(value, 16);
                            break;
                        case "fbc":
                            curretfbc = (ConsoleColor)Convert.ToInt32(value, 16);
                            break;
                        case "l":
                            curretl = int.Parse(value);
                            break;
                        case "cc":
                            curretitem = int.Parse(value);
                            break;
                        case "jump":
                            curretjump = int.Parse(value);
                            break;

                    }
                }
                catch { }
            }
            menuitems.Add(new MenuItem()
            {
                BackgroundColor = curretbc,
                ForegroundColor = curretfc,
                Alignement = curreta,
                Text = curretText,
                FocusedBackgroundColor = curretfbc,
                FocusedForegroundColor = curretffc,
                Length = curretl,
                Jump = curretjump
            });

            #endregion

            return Choice();
        }

        static int Choice()
        {
            int comx = Console.CursorLeft, comy = Console.CursorTop;


            while (true)
            {
                #region Rendering
                Console.SetCursorPosition(comx, comy);

                for (int i = 0; i < menuitems.Count; i++)
                {
                    string text = menuitems[i].Text;
                    List<char> line = new List<char>();

                    for (int i2 = 0; i2 < menuitems[i].Length; i2++)
                        line.Add(' ');

                    if (i == curretitem)
                    {
                        Console.ForegroundColor = menuitems[i].FocusedForegroundColor;
                        Console.BackgroundColor = menuitems[i].FocusedBackgroundColor;
                    }
                    else
                    {
                        Console.ForegroundColor = menuitems[i].ForegroundColor;
                        Console.BackgroundColor = menuitems[i].BackgroundColor;
                    }

                    switch (menuitems[i].Alignement)
                    {
                        case TextAlignement.LeftAlign:
                            for (int i2 = 0; i2 < menuitems[i].Length && i2 < text.Length; i2++)
                                line[i2] = text[i2];
                            break;
                        case TextAlignement.RightAlign:
                            for (int i2 = 0; i2 < text.Length && i2 < menuitems[i].Length; i2++)
                                line[menuitems[i].Length - text.Length + i2] = text[i2];
                            break;
                        case TextAlignement.Center:
                            for (int i2 = 0; i2 < text.Length && i2 < menuitems[i].Length; i2++)
                                try
                                {
                                    line[(menuitems[i].Length - text.Length) / 2 + i2] = text[i2];
                                }
                                catch { }
                            break;
                    }
                    Console.WriteLine(new string(line.ToArray()));

                    for (int j = 0; j < menuitems[i].Jump; j++)
                        Console.WriteLine();

                    Console.ResetColor();
                }
                #endregion
                #region Input
                switch (Console.ReadKey(true).Key)
                {
                    case ConsoleKey.UpArrow:
                        curretitem--;
                        if (curretitem <= 0)
                            curretitem = 0;
                        break;
                    case ConsoleKey.DownArrow:
                        curretitem++;
                        if (curretitem > menuitems.Count - 1)
                            curretitem = menuitems.Count - 1;
                        break;
                    case ConsoleKey.PageDown:
                        curretitem = menuitems.Count - 1;
                        break;
                    case ConsoleKey.PageUp:
                        curretitem = 0;
                        break;
                    case ConsoleKey.Enter:
                        return curretitem + 1;
                }
                #endregion
            }
        }
    }

    struct MenuItem
    {
        public ConsoleColor ForegroundColor;
        public ConsoleColor BackgroundColor;
        public ConsoleColor FocusedBackgroundColor;
        public ConsoleColor FocusedForegroundColor;
        public TextAlignement Alignement;
        public int Length;
        public string Text;
        public int Jump;
    }

    enum TextAlignement
    {
        LeftAlign,
        RightAlign,
        Center
    }
}


Mise a jour !:

    [FIX] Correction du bug lors de l'utilisation de plusieurs couleurs dans un menu.
    [Changement] Un ';' n'est plus requis a la fin de l'expression, il cause donc maintenant un doublon !
    [Changement] Changement de la couleur par defaut quand l'item est séléctionné (White -> Gray)



Exemple remis conforme aux changement.



Dernière édition par TSnake41 le Mar 12 Juil 2016 - 21:23; édité 8 fois

______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message [BETA][C#] Makemenu - menus en batch - TSnake41 
Superbe TS !!!

Okay




______________________________________________________
AffPng.exe , StringBetween.exe , Hex2Png.exe
Répondre en citant
Message [BETA][C#] Makemenu - menus en batch - TSnake41 
Vraiment bien Wink je vais test Okay




______________________________________________________
Visiter le site web du posteur
Répondre en citant
Message [BETA][C#] Makemenu - menus en batch - TSnake41 
Comme je te le disais sur le chat, c'est super !
#windows10

@+




______________________________________________________
Une question ? N'hésitez pas à me contacter par Message Privé ou via le topique concerné.
Visiter le site web du posteur
Répondre en citant
Message [BETA][C#] Makemenu - menus en batch - TSnake41 
Mise a jour !:

    [FIX] Correction du bug lors de l'utilisation de plusieurs couleurs dans un menu.
    [Changement] Un ';' n'est plus requis a la fin de l'expression, il cause donc maintenant un doublon !
    [Changement] Changement de la couleur par defaut quand l'item est séléctionné (White -> Gray)





______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Répondre en citant
Message [BETA][C#] Makemenu - menus en batch - TSnake41 
Je veut bien test mais je n'arrive pas a me la procurer Crying or Very sad




______________________________________________________
The batch is not a simple language of invite of command or interpreter, it is a program of execution of codes pushed


Visiter le site web du posteur Skype
Répondre en citant
Message Re: [BETA][C#] Makemenu - menus en batch - TSnake41 
IronBatcher a écrit:
Je veut bien test mais je n'arrive pas a me la procurer Crying or Very sad


Pourtant le téléchargement marche bien : https://up1.ca/#_y8l8R1ad0i-8MrTlnONBA

EDIT: Un autre lien par SendSpace : https://www.sendspace.com/file/kpg5bx




______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Répondre en citant
Message [BETA][C#] Makemenu - menus en batch - TSnake41 
Les téléchargements via OneDrive : https://1drv.ms/f/s!Ao64nlgUfTexg_EzMfF-Aynag0YPGw
PS : De la même façon que AgrafV2, vous pouvez prendre le _src.7z et très facilement avoir un .exe avec (démarrer build.bat et vous récupérez le .exe, vous pouviez aussi réutiliser les fichiers dans vos batchs ^^), de plus, il est plus compact (ba oui, la bande passante coute cher).




______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Message [BETA][C#] Makemenu - menus en batch - TSnake41 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch