Construction de widgets Studio

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Studio vous donne le pouvoir de créer des widgets personnalisés et de les utiliser comme outils et extensions Studio. Ces widgets se comportent comme des fenêtres/panneaux personnalisés dans Studio, et vous pouvez les déverrouiller à l'intérieur de votre interface ou les flotter en tant que fenêtres séparées.

Créer des interfaces utilisateur de widget

Tous les widgets Studio commencent comme DockWidgetPluginGui objets que vous pouvez remplir avec GuiObjects, tels que les étiquettes de texte et les boutons. Pour créer une interface utilisateur graphiquede widget vide, appelez la fonction CreateDockWidgetPluginGui(), en passant un ID et

Notez que le Datatype.DockWidgetPluginGuiInfo.new() constructeur s'attend à ce que ses paramètres dans un ordre spécifique comme suivant :

#PropriétéTypeDescription
1Enum.InitialDockStateEntréeUne des listes Enum.InitialDockState.
2InitialEnabledBooléenL'état initial activé (visible) de la interface utilisateur graphiquedu widget.
3InitialEnabledShouldOverrideRestoreBooléenSi oui, la valeur de InitialEnabled écrase l'état activé précédemment enregistré.
4FloatingXSizeEntierLa largeur initiale de la GUI lorsque InitialDockState est réglé sur Enum.InitialDockState.Float.
5FloatingYSizeEntierLa hauteur initiale de la GUI lorsque InitialDockState est réglée sur Enum.InitialDockState.Float.
6MinWidthEntierLa largeur minimum de la interface utilisateur graphique, avec des variantes spécifiques de la plate-forme.
7MinHeightEntierLa hauteur minimale de la interface utilisateur graphique, avec quelques variantes de plate-forme.

-- Créer un nouvel objet "DockWidgetPluginGuiInfo"
local widgetInfo = DockWidgetPluginGuiInfo.new(
Enum.InitialDockState.Float, -- Le widget sera initialisé dans le panneau flottant
true, -- Le widget sera initialement activé
false, -- Ne pas modifier l'état actif précédent
200, -- Largeur par défaut de la fenêtre flottante
300, -- Hauteur par défaut de la fenêtre flottante
150, -- Largeur minimale de la fenêtre flottante
150 -- Hauteur minimale de la fenêtre flottante
)
-- Créer une nouvelle interface utilisateur graphiquede widget
local testWidget = plugin:CreateDockWidgetPluginGui("TestWidget", widgetInfo)
testWidget.Title = "Test Widget" -- Optional widget title

Personnalisation de l'interface utilisateur du widget

Une fois que vous avez créé un widget, vous pouvez personnaliser son interface utilisateur avec GuiObjects tels que des informations sur TextLabels ou des interfaces interactives sur ImageButtons. Par exemple, le code suivant ajoute une base de 1> Class.TextButton1> à la fenêtre GUI :


-- Créer une nouvelle interface utilisateur graphiquede widget
local testWidget = plugin:CreateDockWidgetPluginGui("TestWidget", widgetInfo)
testWidget.Title = "Test Widget" -- Titre de widget facultatif
local testButton = Instance.new("TextButton")
testButton.BorderSizePixel = 0
testButton.TextSize = 20
testButton.TextColor3 = Color3.new(1,0.2,0.4)
testButton.AnchorPoint = Vector2.new(0.5,0.5)
testButton.Size = UDim2.new(1,0,1,0)
testButton.Position = UDim2.new(0.5,0,0.5,0)
testButton.SizeConstraint = Enum.SizeConstraint.RelativeYY
testButton.Text = "Click Me"
testButton.Parent = testWidget

Changer les thèmes de couleur du studio

Les widgets Studio idéalement correspondent à la configuration thème Studio et s'ajustent dynamiquement lorsque le thème change. Par instance, si un développeur utilise le thème sombre, la couleur de l'arrière-plan, les images et les textes de l'onglet de widget devraient bien s'ajuster aux couleurs thème natives de Studio.

La fonction suivante utilise une fonction syncGuiColors() qui est initialement appelée avec une table d'objets GUI pour synchroniser. Dans la fonction, un boucle de fonction setColors() à travers les


testButton.Parent = testWidget
local function syncGuiColors(objects)
local function setColors()
for _, guiObject in objects do
-- Synchronisation de la couleur de l'arrière-plan
guiObject.BackgroundColor3 = settings().Studio.Theme:GetColor(Enum.StudioStyleGuideColor.MainBackground)
-- Synchronisation de la couleur du texte
guiObject.TextColor3 = settings().Studio.Theme:GetColor(Enum.StudioStyleGuideColor.MainText)
end
end
-- Exécutez la fonction « setColors() » pour initialiser la synchronisation des couleurs
setColors()
-- Connectez l'événement « ThemeChanged » à la fonction « setColors() »
settings().Studio.ThemeChanged:Connect(setColors)
end
-- Exécutez la fonction 'SyncColorGuiColors()' pour synchroniser les couleurs des objets fournis
syncGuiColors({testButton})

Personnalisation des pointeurs de souris

Pour améliorer l'interaction avec les éléments de widget, vous pouvez configurer des curseurs de souris spécifiques au système dans les événements GUI, tels que MouseEnter et Class.GuiObject


local function setCursor(cursorAsset)
plugin:GetMouse().Icon = cursorAsset
end
testButton.MouseEnter:Connect(function()
setCursor("rbxasset://SystemCursors/PointingHand")
end)
testButton.MouseLeave:Connect(function()
setCursor("")
end)

Référez-vous à la table suivante pour une liste de curseurs de souris et de leurs cas d'utilisation potentiels :

Icône de curseur de sourisRessourceUtiliser le cas
rbxasset://SystemCursors/ArrowCliquez et sélectionnez par défaut.
rbxasset://SystemCursors/PointingHandSurvole d'un lien/bouton actif.
rbxasset://SystemCursors/OpenHandSurvole d'un itemfaisable.
rbxasset://SystemCursors/ClosedHandFaire glisser un item.
rbxasset://SystemCursors/IBeamSurvole dans un champ de texte.
rbxasset://SystemCursors/SizeNSPassez la souris sur une poignée de redimensionnement verticale.
rbxasset://SystemCursors/SizeEWPassez la souris sur une contrôleurde redimensionnement horizontale.
rbxasset://SystemCursors/SizeNESWSurvolez une poignée de contrôleurd'un coin.
rbxasset://SystemCursors/SizeNWSESurvolez une poignée de contrôleurd'un coin.
rbxasset://SystemCursors/SizeAllPassez la souris sur une poignée de redimensionnement contrôleur.
rbxasset://SystemCursors/SplitNSSurvole d'une contrôleurverticale « split ».
rbxasset://SystemCursors/SplitEWSurvole d'une contrôleurhorizontale « diviser ».
rbxasset://SystemCursors/ForbiddenPassez la souris sur un itemverrouillé/interdit.
rbxasset://SystemCursors/WaitIndiquer qu'une action est en cours.
rbxasset://SystemCursors/BusyIndication que le système est occupé.
rbxasset://SystemCursors/CrossSurvole d'une zone de sélection de pin.

Récupération de l'entrée de l'utilisateur

Les éléments de l'interface utilisateur tels que TextBox et TextButton fonctionnent normalement dans les widgets Studio, et vous pouvez construire des interfaces comme vous le feriez normalement sur Roblox. Cependant, UserInputService et 1> Class.ContextActionService1> ne fonctionnent pas car ces services attendent que la fenêtre principale soit en focus.

L'un des workarounds pour les événements d'entrée génériques est de créer un Frame transparent et de le superposer sur l'ensemble de l'écran. Le code suivant crée un cadre, et lorsque l'utilisateur clique sur le cadre, l'événement GuiObject.InputBegan capture l'entrée du clavier sur le cadre jusqu'à ce que l'utilisateur clique :


local frame = Instance.new("Frame")
frame.BackgroundTransparency = 1 -- Cacher le cadre
frame.Size = UDim2.new(1, 0, 1, 0) -- Couvrez l'écran
frame.Position = UDim2.new(0, 0, 0, 0)
frame.Parent = testWidget
local function onInputBegan(inputObject)
-- Traitement de l'objet d'entrée ici, par exemple pour détecter les presses clavier
end
frame.InputBegan:Connect(onInputBegan)

Interaction avec les glissières

Utiliser les interactions de glisser-déposer pour vos widgets est un moyen simple d'améliorer le flux de données. Pour créer cette interaction, vous devez définir l'élément à glisser, initialiser le glisser, créer une cible de dérive et traiter l'action de dérive.

Créer une source de glisser

Vous pouvez commencer une action de déplacement en appelant Plugin:StartDrag() lorsque l'utilisateur appuie sur un bouton de souris dans un élément de l'interface utilisateur, généralement un TextButton ou un ImageButton dans un widget. Le code suivant crée un seul widget de fenêtre avec un bouton de texte à l'intérieur.


-- Créer le widget d'abord
local widgetInfo = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 300, 200)
local dragSourceWidget = plugin:CreateDockWidgetPluginGui("Drag Source", widgetInfo)
dragSourceWidget.Title = "Drag Source"
-- Créez un bouton de texte qui initialisera le déplacement
local dragButton = Instance.new("TextButton")
dragButton.Size = UDim2.new(1, 0, 1, 0)
dragButton.Text = "Drag me!"
dragButton.Parent = dragSourceWidget

Initiation du déplacement

Lorsque l'utilisateur clique sur le TextButton, vous pouvez initialiser le déplacement via l'événement MouseButton1Down() qui se déclenche dès que l'utilisateur appuie sur le bouton de la souris.

Dans la fonction connectée, déterminez les données à déplacer. Le type de données est reflété dans la clé MimeType, le contenu de la drag doit être reflété dans la clé Data , et le sendeur doit se décrire dans la clé 1>4> Class.Plugin


local function onButton1Down()
local dragInfo = {
Data = "Hello, world", -- Les données qui sont traînées
MimeType = "text/plain", -- Décrire le type MIME des données
Sender = "SomeDragSource", -- Décrire d'où viennent les données
MouseIcon = "", -- Contenu d'image à utiliser pour le curseur
DragIcon = "", -- Contenu de l'image à rendre sous le curseur pendant le déplacement
HotSpot = Vector2.zero -- Où sur le DragIcon pour centrer le curseur
}
plugin:StartDrag(dragInfo)
end
dragButton.MouseButton1Down:Connect(onButton1Down)

Créer une cible de décharge

L'événement PluginGui.PluginDragDropped se déclenche lorsque l'utilisateur relâche sa souris sur une fenêtre pendant un déplacement. Lorsque cela se produit, vous devez définir un lâcher la cible comme une deuxième widget avec un TextLabel pour détecter les lancers.


local dragTargetWidget = plugin:CreateDockWidgetPluginGui("Drop Target", widgetInfo)
dragTargetWidget.Title = "Drop Target"
-- Cette étiquette de texte affichera ce qui est tombé
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, 0, 1, 0)
textLabel.Text = "Drop here..."
textLabel.Parent = dragTargetWidget

Traiter l'action de suppression

Après avoir créé une cible de décharge, connectez l'événement PluginGui.PluginDragDropped sur le widget de cible de décharge :


local function onDragDrop(dragData)
print("PluginDragDropped")
if dragData.MimeType == "text/plain" then
textLabel.Text = dragData.Data
else
textLabel.Text = dragData.MimeType
end
end
dragTargetWidget.PluginDragDropped:Connect(onDragDrop)

Alors qu'une traînée est toujours en cours, ces trois événements se déclenchent lorsque l'utilisateur déplace sa souris sur un widget :

  • PluginDragEntered – se déclenche lorsque l'utilisateur passe la souris sur une fenêtre
  • PluginDragMoved – se déclenche répétitivement lorsque l'utilisateur déplace sa souris sur une fenêtre. Ceci est utile pour afficher un message « Drop here! ».
  • PluginDragLeft – se déclenche lorsque le curseur de l'utilisateur quitte une fenêtre. Ceci est utile pour cacher un message « Drop here! ».