[BB] Selectable Color Palet Class

Started by Filax, March 09, 2025, 21:41:55

Previous topic - Next topic

Filax

; ----------------------------------------
; Name : Create selectable Color Palet
; Date : (C)2025
; Site : https://github.com/BlackCreepyCat
; ----------------------------------------

; Type pour représenter une palette de couleurs
Type PaletteCouleurs
    Field x#, y#            ; Position de la palette
    Field largeur#, hauteur# ; Dimensions totales de la palette

    Field nbColonnes%       ; Nombre de colonnes
    Field nbLignes%         ; Nombre de lignes

    Field tailleCelluleX#   ; Taille d'une cellule en X
    Field tailleCelluleY#   ; Taille d'une cellule en Y

    Field couleurSelectionneeR% ; Couleur sélectionnée (R)
    Field couleurSelectionneeG% ; Couleur sélectionnée (G)
    Field couleurSelectionneeB% ; Couleur sélectionnée (B)
End Type

; Fonction pour créer une palette de couleurs
Function CreerPalette.PaletteCouleurs(x#, y#, largeur#, hauteur#, nbColonnes%, nbLignes%)
    Local p.PaletteCouleurs = New PaletteCouleurs
    p\x# = x#
    p\y# = y#
    p\largeur# = largeur#
    p\hauteur# = hauteur#
    p\nbColonnes% = nbColonnes%
    p\nbLignes% = nbLignes%
    p\tailleCelluleX# = largeur# / Float(nbColonnes%)
    p\tailleCelluleY# = hauteur# / Float(nbLignes%)
    p\couleurSelectionneeR% = -1 ; -1 signifie aucune couleur sélectionnée
    p\couleurSelectionneeG% = -1
    p\couleurSelectionneeB% = -1
    Return p
End Function

; Fonction pour dessiner la palette
Function DessinerPalette(p.PaletteCouleurs)
    If p = Null Then Return
   
    ; Dessiner chaque cellule avec une couleur interpolée
    For ligne = 0 To p\nbLignes% - 1
        For colonne = 0 To p\nbColonnes% - 1
            ; Calculer les composantes RGB en fonction de la position dans la grille
            Local r% = (colonne * 255) / (p\nbColonnes% - 1) ; Rouge varie horizontalement
            Local g% = (ligne * 255) / (p\nbLignes% - 1)     ; Vert varie verticalement
            Local b% = 128                                    ; Bleu fixé (modifiable)
           
            ; S'assurer que les valeurs restent dans [0, 255]
            If p\nbColonnes% = 1 Then r% = 255
            If p\nbLignes% = 1 Then g% = 255
           
            ; Position de la cellule
            Local cellX# = p\x# + colonne * p\tailleCelluleX#
            Local cellY# = p\y# + ligne * p\tailleCelluleY#
           
            ; Dessiner la cellule
            Color r%, g%, b%
            Rect cellX#, cellY#, p\tailleCelluleX#, p\tailleCelluleY#, 1
           
            ; Surligner la couleur sélectionnée
            If p\couleurSelectionneeR% = r% And p\couleurSelectionneeG% = g% And p\couleurSelectionneeB% = b%
                Color 255, 255, 255 ; Bordure blanche
                Rect cellX#, cellY#, p\tailleCelluleX#, p\tailleCelluleY#, 0 ; Contour seulement
            EndIf
        Next
    Next
End Function

; Fonction pour gérer les clics et sélectionner une couleur
Function SelectionnerCouleurPalette(p.PaletteCouleurs)
    If p = Null Then Return False
   
    ; Vérifier si la souris est dans la palette
    Local mx# = MouseX()
    Local my# = MouseY()
   
    If mx# >= p\x# And mx# <= p\x# + p\largeur# And my# >= p\y# And my# <= p\y# + p\hauteur#

        If MouseHit(1) ; Clic gauche
            ; Calculer la cellule cliquée
            Local colonne# = Floor((mx# - p\x#) / p\tailleCelluleX#)
            Local ligne# = Floor((my# - p\y#) / p\tailleCelluleY#)
           
            ; Calculer la couleur correspondante
            p\couleurSelectionneeR% = (colonne# * 255) / (p\nbColonnes% - 1)
            p\couleurSelectionneeG% = (ligne# * 255) / (p\nbLignes% - 1)
            p\couleurSelectionneeB% = 128 ; Fixe, mais pourrait être personnalisé
           
            ; S'assurer que les valeurs sont valides
            If p\nbColonnes% = 1 Then p\couleurSelectionneeR% = 255
            If p\nbLignes% = 1 Then p\couleurSelectionneeG% = 255
           
            Return True ; Indique qu'une couleur a été sélectionnée
        EndIf

    EndIf

    Return False
End Function

; Exemple d'utilisation
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

; Créer une palette (par exemple 8x8 cellules)
Global maPalette.PaletteCouleurs = CreerPalette(100, 100, 400, 400, 16, 16)

While Not KeyHit(1)
    Cls
   
    ; Dessiner la palette
    DessinerPalette(maPalette)
   
    ; Gérer la sélection
    If SelectionnerCouleurPalette(maPalette)
        ; Afficher la couleur sélectionnée
        Color 255, 255, 255
        Text 10, 10, "Couleur sélectionnée : R=" + maPalette\couleurSelectionneeR% + " G=" + maPalette\couleurSelectionneeG% + " B=" + maPalette\couleurSelectionneeB%
    EndIf
   
    ; Afficher un rectangle avec la couleur sélectionnée
    If maPalette\couleurSelectionneeR% >= 0
        Color maPalette\couleurSelectionneeR%, maPalette\couleurSelectionneeG%, maPalette\couleurSelectionneeB%
        Rect 550, 100, 100, 100, 1
    EndIf
   
    Flip
Wend
End