Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Close All Frames within a GUI?

Asked by
hwlq 2
4 years ago
Edited 4 years ago

I have a GUI with multiple frames in it, and want to make all of them close when I press the menu button.

Here is how my Gui is set up

Gui
    Menu Button
        Script
    Frame 1
        Script
        Button 1
        Button 2
            Script
    Frame 2
        Buttons within Frame 2

The script in the Menu Button

local MenuSelect = script.parent.parent.MenuSelect
local Menubtn = script.parent

script.Parent.MouseButton1Click:Connect(function()
    local Buttons = script.Parent.Parent.Buttons
    if Buttons.Visible == false then
        Buttons.Visible = true
    else
        Buttons.Visible = false
    end
end)

Basically what this does is open Frame 1

Script in button 2

local Emotes = script.Parent

script.Parent.MouseButton1Click:Connect(function()
    local EmotesGUI = script.Parent.Parent.Parent.EmotesGUI
    if EmotesGUI.Visible == false then
    EmotesGUI.Visible = true
    else
        EmotesGUI.Visible = false
    end
end)


This opens frame 2 to the side

I want the Menu button to close ALL frames,

I've tried using something like this

if Button2.Visible == false then Frame2.Visible = false

which basically means since the menu button closes button 2, it should close frame 2 aswell, but I cant get it to work.

Any ideas?

0
Simply change the ScreenGui's "Enabled" property to false and all GUI's in that ScreenGui, including Frames, will close Sulu710 142 — 4y

3 answers

Log in to vote
1
Answered by 4 years ago
Edited 4 years ago

You can do this quite easily by setting the ScreenGUI's Enabled property to false, which makes every GUI Instance within invisible.

If you don't want to use that, use this:

local names = {
   Names_of = true, 
   the_GUIs = true, 
   you_want = true, 
   to_close = true,
};

function closeAll()
   for i,v in pairs(script.Parent.Parent.Parent.EmotesGUI:GetDescendants()) do
       if(names[v.Name] and v:IsA("Frame")) then
          v.Visible = false;
       end
   end
end

Just call closeAll() everytime you want to close all the GUIs in EmotesGUI.

0
thank you after some messing with it we got the general idea of how it works hwlq 2 — 4y
Ad
Log in to vote
0
Answered by 4 years ago

This code will loop through all children of your Gui one by one and check if it is a Frame. If so, it will change the Visible property to the opposite of what it is. So if it is true, it will become false. Whithout having to use any if statements.

So this should be the code in the LocalScript, in the button that you want to close all the Frames in your Gui. Though I have designed it to fit your Menu Button Script.

local guiChildren = script.Parent.Parent:GetChildren()

script.Parent.MouseButton1Click:Connect(function()
    for i, v in pairs(guiChildren) do
        if v:IsA("Frame") then
            v.Visible = not v.Visible
        end
    end
end)
Log in to vote
0
Answered by
ArtBlart 533 Moderation Voter
4 years ago

You can use an iterator like pairs to loop through every child in the GUI. You can then check type to see if it's a frame and if it is, set it's visible property to false. It should look something like this.

for _,Object in pairs(path_to_gui:GetChildren()) do
    if Object.ClassName == "Frame" then
        Object.Visible = false
    end
end

note: you can make _ and Object anything you want. It's user defined but it helps to make them something meaningful.

Answer this question