Skip to content

Commit 223848d

Browse files
committed
Added border resizing, and other fixes.
1 parent d6fadb5 commit 223848d

File tree

6 files changed

+241
-35
lines changed

6 files changed

+241
-35
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ node_modules/
88
*.rbxm
99
*.rbxmx
1010
*.lock
11+
dev.*.lua
1112
package*
1213

1314
sourcemap.json

lib/Types.lua

+8
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ export type WidgetUtility = {
303303
MULTIPLICATION_SIGN: string,
304304
BOTTOM_RIGHT_CORNER: string,
305305
CHECK_MARK: string,
306+
BORDER: string,
306307
ALPHA_BACKGROUND_TEXTURE: string,
307308
UNKNOWN_TEXTURE: string,
308309
},
@@ -446,6 +447,13 @@ export type Config = {
446447
PlotHistogramHoveredColor: Color3,
447448
PlotHistogramHoveredTransparency: number,
448449

450+
ResizeGripColor: Color3,
451+
ResizeGripTransparency: number,
452+
ResizeGripHoveredColor: Color3,
453+
ResizeGripHoveredTransparency: number,
454+
ResizeGripActiveColor: Color3,
455+
ResizeGripActiveTransparency: number,
456+
449457
HoverColor: Color3,
450458
HoverTransparency: number,
451459

lib/config.lua

+14
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ local TemplateConfig = {
102102
PlotHistogramTransparency = 0,
103103
PlotHistogramHoveredColor = Color3.fromRGB(255, 153, 0),
104104
PlotHistogramHoveredTransparency = 0,
105+
106+
ResizeGripColor = Color3.fromRGB(66, 150, 250),
107+
ResizeGripTransparency = 0.8,
108+
ResizeGripHoveredColor = Color3.fromRGB(66, 150, 250),
109+
ResizeGripHoveredTransparency = 0.33,
110+
ResizeGripActiveColor = Color3.fromRGB(66, 150, 250),
111+
ResizeGripActiveTransparency = 0.05,
105112
},
106113
colorLight = { -- Dear, ImGui default light
107114
TextColor = Color3.fromRGB(0, 0, 0),
@@ -206,6 +213,13 @@ local TemplateConfig = {
206213
PlotHistogramTransparency = 0,
207214
PlotHistogramHoveredColor = Color3.fromRGB(255, 153, 0),
208215
PlotHistogramHoveredTransparency = 0,
216+
217+
ResizeGripColor = Color3.fromRGB(89, 89, 89),
218+
ResizeGripTransparency = 0.83,
219+
ResizeGripHoveredColor = Color3.fromRGB(66, 150, 250),
220+
ResizeGripHoveredTransparency = 0.33,
221+
ResizeGripActiveColor = Color3.fromRGB(66, 150, 250),
222+
ResizeGripActiveTransparency = 0.05,
209223
},
210224

211225
sizeDefault = { -- Dear, ImGui default

lib/widgets/Plot.lua

+3-3
Original file line numberDiff line numberDiff line change
@@ -379,9 +379,9 @@ return function(Iris: Types.Internal, widgets: Types.WidgetUtility)
379379
end
380380

381381
-- only update the hovered block if it exists.
382-
if thisWidget.HoveredLine then
383-
updateLine(thisWidget)
384-
end
382+
-- if thisWidget.HoveredLine then
383+
-- updateLine(thisWidget)
384+
-- end
385385
end
386386
end,
387387
Discard = function(thisWidget: Types.PlotLines)

lib/widgets/Window.lua

+213-31
Original file line numberDiff line numberDiff line change
@@ -217,13 +217,14 @@ return function(Iris: Types.Internal, widgets: Types.WidgetUtility)
217217
end
218218
local WindowButton = Window.WindowButton :: TextButton
219219
local ResizeBorder: TextButton = WindowButton.ResizeBorder
220-
if ResizeBorder and widgets.isPosInsideRect(position, ResizeBorder.AbsolutePosition, ResizeBorder.AbsolutePosition + ResizeBorder.AbsoluteSize) then
220+
if ResizeBorder and widgets.isPosInsideRect(position, ResizeBorder.AbsolutePosition - widgets.GuiOffset, ResizeBorder.AbsolutePosition - widgets.GuiOffset + ResizeBorder.AbsoluteSize) then
221221
inWindow = true
222222
break
223223
end
224224
end
225225

226226
if not inWindow then
227+
print("Outside")
227228
Iris.SetFocusedWindow(nil)
228229
end
229230
end
@@ -630,32 +631,67 @@ return function(Iris: Types.Internal, widgets: Types.WidgetUtility)
630631

631632
local ResizeButtonSize: number = Iris._config.TextSize + Iris._config.FramePadding.X
632633

633-
local ResizeGrip = Instance.new("ImageButton")
634-
ResizeGrip.Name = "ResizeGrip"
635-
ResizeGrip.AnchorPoint = Vector2.one
636-
ResizeGrip.Size = UDim2.fromOffset(ResizeButtonSize, ResizeButtonSize)
637-
ResizeGrip.Position = UDim2.fromScale(1, 1)
638-
ResizeGrip.Rotation = 90
639-
ResizeGrip.AutoButtonColor = false
640-
ResizeGrip.BorderSizePixel = 0
641-
ResizeGrip.BackgroundTransparency = 1
642-
ResizeGrip.Image = widgets.ICONS.BOTTOM_RIGHT_CORNER
643-
ResizeGrip.ImageColor3 = Iris._config.ButtonColor
644-
ResizeGrip.ImageTransparency = Iris._config.ButtonTransparency
645-
ResizeGrip.Selectable = false
646-
ResizeGrip.ZIndex = 3
647-
ResizeGrip.Parent = WindowButton
648-
649-
widgets.applyInteractionHighlights("Image", ResizeGrip, ResizeGrip, {
650-
Color = Iris._config.ButtonColor,
651-
Transparency = Iris._config.ButtonTransparency,
652-
HoveredColor = Iris._config.ButtonHoveredColor,
653-
HoveredTransparency = Iris._config.ButtonHoveredTransparency,
654-
ActiveColor = Iris._config.ButtonActiveColor,
655-
ActiveTransparency = Iris._config.ButtonActiveTransparency,
634+
local LeftResizeGrip = Instance.new("ImageButton")
635+
LeftResizeGrip.Name = "LeftResizeGrip"
636+
LeftResizeGrip.AnchorPoint = Vector2.yAxis
637+
LeftResizeGrip.Rotation = 180
638+
LeftResizeGrip.Size = UDim2.fromOffset(ResizeButtonSize, ResizeButtonSize)
639+
LeftResizeGrip.Position = UDim2.fromScale(0, 1)
640+
LeftResizeGrip.BackgroundTransparency = 1
641+
LeftResizeGrip.BorderSizePixel = 0
642+
LeftResizeGrip.Image = widgets.ICONS.BOTTOM_RIGHT_CORNER
643+
LeftResizeGrip.ImageColor3 = Iris._config.ResizeGripColor
644+
LeftResizeGrip.ImageTransparency = 1
645+
LeftResizeGrip.AutoButtonColor = false
646+
LeftResizeGrip.ZIndex = 3
647+
LeftResizeGrip.Parent = WindowButton
648+
649+
widgets.applyInteractionHighlights("Image", LeftResizeGrip, LeftResizeGrip, {
650+
Color = Iris._config.ResizeGripColor,
651+
Transparency = 1,
652+
HoveredColor = Iris._config.ResizeGripHoveredColor,
653+
HoveredTransparency = Iris._config.ResizeGripHoveredTransparency,
654+
ActiveColor = Iris._config.ResizeGripActiveColor,
655+
ActiveTransparency = Iris._config.ResizeGripActiveTransparency,
656+
})
657+
658+
widgets.applyButtonDown(LeftResizeGrip, function()
659+
if not anyFocusedWindow or not (focusedWindow == thisWidget) then
660+
Iris.SetFocusedWindow(thisWidget)
661+
-- mitigating wrong focus when clicking on buttons inside of a window without clicking the window itself
662+
end
663+
isResizing = true
664+
resizeFromTopBottom = Enum.TopBottom.Bottom
665+
resizeFromLeftRight = Enum.LeftRight.Left
666+
resizeWindow = thisWidget
667+
end)
668+
669+
-- each border uses an image, allowing it to have a visible borde which is larger than the UI
670+
local RightResizeGrip = Instance.new("ImageButton")
671+
RightResizeGrip.Name = "RightResizeGrip"
672+
RightResizeGrip.AnchorPoint = Vector2.one
673+
RightResizeGrip.Rotation = 90
674+
RightResizeGrip.Size = UDim2.fromOffset(ResizeButtonSize, ResizeButtonSize)
675+
RightResizeGrip.Position = UDim2.fromScale(1, 1)
676+
RightResizeGrip.BackgroundTransparency = 1
677+
RightResizeGrip.BorderSizePixel = 0
678+
RightResizeGrip.Image = widgets.ICONS.BOTTOM_RIGHT_CORNER
679+
RightResizeGrip.ImageColor3 = Iris._config.ResizeGripColor
680+
RightResizeGrip.ImageTransparency = Iris._config.ResizeGripTransparency
681+
RightResizeGrip.AutoButtonColor = false
682+
RightResizeGrip.ZIndex = 3
683+
RightResizeGrip.Parent = WindowButton
684+
685+
widgets.applyInteractionHighlights("Image", RightResizeGrip, RightResizeGrip, {
686+
Color = Iris._config.ResizeGripColor,
687+
Transparency = Iris._config.ResizeGripTransparency,
688+
HoveredColor = Iris._config.ResizeGripHoveredColor,
689+
HoveredTransparency = Iris._config.ResizeGripHoveredTransparency,
690+
ActiveColor = Iris._config.ResizeGripActiveColor,
691+
ActiveTransparency = Iris._config.ResizeGripActiveTransparency,
656692
})
657693

658-
widgets.applyButtonDown(ResizeGrip, function()
694+
widgets.applyButtonDown(RightResizeGrip, function()
659695
if not anyFocusedWindow or not (focusedWindow == thisWidget) then
660696
Iris.SetFocusedWindow(thisWidget)
661697
-- mitigating wrong focus when clicking on buttons inside of a window without clicking the window itself
@@ -666,6 +702,114 @@ return function(Iris: Types.Internal, widgets: Types.WidgetUtility)
666702
resizeWindow = thisWidget
667703
end)
668704

705+
local LeftResizeBorder: ImageButton = Instance.new("ImageButton")
706+
LeftResizeBorder.Name = "LeftResizeBorder"
707+
LeftResizeBorder.AnchorPoint = Vector2.new(1, .5)
708+
LeftResizeBorder.Position = UDim2.fromScale(0, .5)
709+
LeftResizeBorder.Size = UDim2.new(0, Iris._config.WindowResizePadding.X, 1, 2 * Iris._config.WindowBorderSize)
710+
LeftResizeBorder.Transparency = 1
711+
LeftResizeBorder.Image = widgets.ICONS.BORDER
712+
LeftResizeBorder.ResampleMode = Enum.ResamplerMode.Pixelated
713+
LeftResizeBorder.ScaleType = Enum.ScaleType.Slice
714+
LeftResizeBorder.SliceCenter = Rect.new(0, 0, 1, 1)
715+
LeftResizeBorder.ImageRectOffset = Vector2.new(2, 2)
716+
LeftResizeBorder.ImageRectSize = Vector2.new(2, 1)
717+
LeftResizeBorder.ImageTransparency = 1
718+
LeftResizeBorder.ZIndex = 4
719+
LeftResizeBorder.AutoButtonColor = false
720+
721+
LeftResizeBorder.Parent = WindowButton
722+
723+
local RightResizeBorder: ImageButton = Instance.new("ImageButton")
724+
RightResizeBorder.Name = "RightResizeBorder"
725+
RightResizeBorder.AnchorPoint = Vector2.new(0, .5)
726+
RightResizeBorder.Position = UDim2.fromScale(1, .5)
727+
RightResizeBorder.Size = UDim2.new(0, Iris._config.WindowResizePadding.X, 1, 2 * Iris._config.WindowBorderSize)
728+
RightResizeBorder.Transparency = 1
729+
RightResizeBorder.Image = widgets.ICONS.BORDER
730+
RightResizeBorder.ResampleMode = Enum.ResamplerMode.Pixelated
731+
RightResizeBorder.ScaleType = Enum.ScaleType.Slice
732+
RightResizeBorder.SliceCenter = Rect.new(1, 0, 2, 1)
733+
RightResizeBorder.ImageRectOffset = Vector2.new(1, 2)
734+
RightResizeBorder.ImageRectSize = Vector2.new(2, 1)
735+
RightResizeBorder.ImageTransparency = 1
736+
RightResizeBorder.ZIndex = 4
737+
RightResizeBorder.AutoButtonColor = false
738+
739+
RightResizeBorder.Parent = WindowButton
740+
741+
local TopResizeBorder: ImageButton = Instance.new("ImageButton")
742+
TopResizeBorder.Name = "TopResizeBorder"
743+
TopResizeBorder.AnchorPoint = Vector2.new(.5, 1)
744+
TopResizeBorder.Position = UDim2.fromScale(.5, 0)
745+
TopResizeBorder.Size = UDim2.new(1, 2 * Iris._config.WindowBorderSize, 0, Iris._config.WindowResizePadding.Y)
746+
TopResizeBorder.Transparency = 1
747+
TopResizeBorder.Image = widgets.ICONS.BORDER
748+
TopResizeBorder.ResampleMode = Enum.ResamplerMode.Pixelated
749+
TopResizeBorder.ScaleType = Enum.ScaleType.Slice
750+
TopResizeBorder.SliceCenter = Rect.new(0, 0, 1, 1)
751+
TopResizeBorder.ImageRectOffset = Vector2.new(2, 2)
752+
TopResizeBorder.ImageRectSize = Vector2.new(1, 2)
753+
TopResizeBorder.ImageTransparency = 1
754+
TopResizeBorder.ZIndex = 4
755+
TopResizeBorder.AutoButtonColor = false
756+
757+
TopResizeBorder.Parent = WindowButton
758+
759+
local BottomResizeBorder: ImageButton = Instance.new("ImageButton")
760+
BottomResizeBorder.Name = "BottomResizeBorder"
761+
BottomResizeBorder.AnchorPoint = Vector2.new(.5, 0)
762+
BottomResizeBorder.Position = UDim2.fromScale(.5, 1)
763+
BottomResizeBorder.Size = UDim2.new(1, 2 * Iris._config.WindowBorderSize, 0, Iris._config.WindowResizePadding.Y)
764+
BottomResizeBorder.Transparency = 1
765+
BottomResizeBorder.Image = widgets.ICONS.BORDER
766+
BottomResizeBorder.ResampleMode = Enum.ResamplerMode.Pixelated
767+
BottomResizeBorder.ScaleType = Enum.ScaleType.Slice
768+
BottomResizeBorder.SliceCenter = Rect.new(0, 1, 1, 2)
769+
BottomResizeBorder.ImageRectOffset = Vector2.new(2, 1)
770+
BottomResizeBorder.ImageRectSize = Vector2.new(1, 2)
771+
BottomResizeBorder.ImageTransparency = 1
772+
BottomResizeBorder.ZIndex = 4
773+
BottomResizeBorder.AutoButtonColor = false
774+
775+
BottomResizeBorder.Parent = WindowButton
776+
777+
widgets.applyInteractionHighlights("Image", LeftResizeBorder, LeftResizeBorder, {
778+
Color = Iris._config.ResizeGripColor,
779+
Transparency = 1,
780+
HoveredColor = Iris._config.ResizeGripHoveredColor,
781+
HoveredTransparency = Iris._config.ResizeGripHoveredTransparency,
782+
ActiveColor = Iris._config.ResizeGripActiveColor,
783+
ActiveTransparency = Iris._config.ResizeGripActiveTransparency,
784+
})
785+
786+
widgets.applyInteractionHighlights("Image", RightResizeBorder, RightResizeBorder, {
787+
Color = Iris._config.ResizeGripColor,
788+
Transparency = 1,
789+
HoveredColor = Iris._config.ResizeGripHoveredColor,
790+
HoveredTransparency = Iris._config.ResizeGripHoveredTransparency,
791+
ActiveColor = Iris._config.ResizeGripActiveColor,
792+
ActiveTransparency = Iris._config.ResizeGripActiveTransparency,
793+
})
794+
795+
widgets.applyInteractionHighlights("Image", TopResizeBorder, TopResizeBorder, {
796+
Color = Iris._config.ResizeGripColor,
797+
Transparency = 1,
798+
HoveredColor = Iris._config.ResizeGripHoveredColor,
799+
HoveredTransparency = Iris._config.ResizeGripHoveredTransparency,
800+
ActiveColor = Iris._config.ResizeGripActiveColor,
801+
ActiveTransparency = Iris._config.ResizeGripActiveTransparency,
802+
})
803+
804+
widgets.applyInteractionHighlights("Image", BottomResizeBorder, BottomResizeBorder, {
805+
Color = Iris._config.ResizeGripColor,
806+
Transparency = 1,
807+
HoveredColor = Iris._config.ResizeGripHoveredColor,
808+
HoveredTransparency = Iris._config.ResizeGripHoveredTransparency,
809+
ActiveColor = Iris._config.ResizeGripActiveColor,
810+
ActiveTransparency = Iris._config.ResizeGripActiveTransparency,
811+
})
812+
669813
local ResizeBorder: Frame = Instance.new("Frame")
670814
ResizeBorder.Name = "ResizeBorder"
671815
ResizeBorder.Size = UDim2.new(1, Iris._config.WindowResizePadding.X * 2, 1, Iris._config.WindowResizePadding.Y * 2)
@@ -687,6 +831,14 @@ return function(Iris: Types.Internal, widgets: Types.WidgetUtility)
687831
isInsideResize = false
688832
end
689833
end)
834+
widgets.applyInputBegan(ResizeBorder, function(input: InputObject)
835+
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Keyboard then
836+
return
837+
end
838+
if thisWidget.state.isUncollapsed.value then
839+
Iris.SetFocusedWindow(thisWidget)
840+
end
841+
end)
690842

691843
widgets.applyMouseEnter(WindowButton, function()
692844
if focusedWindow == thisWidget then
@@ -710,12 +862,27 @@ return function(Iris: Types.Internal, widgets: Types.WidgetUtility)
710862
local TitleBar = Content.TitleBar :: Frame
711863
local Title: TextLabel = TitleBar.Title
712864
local MenuBar: Frame? = Content:FindFirstChild("MenuBar")
713-
local ResizeGrip: TextButton = WindowButton.ResizeGrip
865+
local LeftResizeGrip: TextButton = WindowButton.LeftResizeGrip
866+
local RightResizeGrip: TextButton = WindowButton.RightResizeGrip
867+
local LeftResizeBorder: Frame = WindowButton.LeftResizeBorder
868+
local RightResizeBorder: Frame = WindowButton.RightResizeBorder
869+
local TopResizeBorder: Frame = WindowButton.TopResizeBorder
870+
local BottomResizeBorder: Frame = WindowButton.BottomResizeBorder
714871

715872
if thisWidget.arguments.NoResize ~= true then
716-
ResizeGrip.Visible = true
873+
LeftResizeGrip.Visible = true
874+
RightResizeGrip.Visible = true
875+
LeftResizeBorder.Visible = true
876+
RightResizeBorder.Visible = true
877+
TopResizeBorder.Visible = true
878+
BottomResizeBorder.Visible = true
717879
else
718-
ResizeGrip.Visible = false
880+
LeftResizeGrip.Visible = false
881+
RightResizeGrip.Visible = false
882+
LeftResizeBorder.Visible = false
883+
RightResizeBorder.Visible = false
884+
TopResizeBorder.Visible = false
885+
BottomResizeBorder.Visible = false
719886
end
720887
if thisWidget.arguments.NoScrollbar then
721888
ChildContainer.ScrollBarThickness = 0
@@ -796,7 +963,12 @@ return function(Iris: Types.Internal, widgets: Types.WidgetUtility)
796963
local Content = WindowButton.Content :: Frame
797964
local TitleBar = Content.TitleBar :: Frame
798965
local MenuBar: Frame? = Content:FindFirstChild("MenuBar")
799-
local ResizeGrip: TextButton = WindowButton.ResizeGrip
966+
local LeftResizeGrip: TextButton = WindowButton.LeftResizeGrip
967+
local RightResizeGrip: TextButton = WindowButton.RightResizeGrip
968+
local LeftResizeBorder: Frame = WindowButton.LeftResizeBorder
969+
local RightResizeBorder: Frame = WindowButton.RightResizeBorder
970+
local TopResizeBorder: Frame = WindowButton.TopResizeBorder
971+
local BottomResizeBorder: Frame = WindowButton.BottomResizeBorder
800972

801973
WindowButton.Size = UDim2.fromOffset(stateSize.X, stateSize.Y)
802974
WindowButton.Position = UDim2.fromOffset(statePosition.X, statePosition.Y)
@@ -828,7 +1000,12 @@ return function(Iris: Types.Internal, widgets: Types.WidgetUtility)
8281000
end
8291001
ChildContainer.Visible = true
8301002
if thisWidget.arguments.NoResize ~= true then
831-
ResizeGrip.Visible = true
1003+
LeftResizeGrip.Visible = true
1004+
RightResizeGrip.Visible = true
1005+
LeftResizeBorder.Visible = true
1006+
RightResizeBorder.Visible = true
1007+
TopResizeBorder.Visible = true
1008+
BottomResizeBorder.Visible = true
8321009
end
8331010
WindowButton.AutomaticSize = Enum.AutomaticSize.None
8341011
thisWidget.lastUncollapsedTick = Iris._cycleTick + 1
@@ -840,7 +1017,12 @@ return function(Iris: Types.Internal, widgets: Types.WidgetUtility)
8401017
MenuBar.Visible = false
8411018
end
8421019
ChildContainer.Visible = false
843-
ResizeGrip.Visible = false
1020+
LeftResizeGrip.Visible = false
1021+
RightResizeGrip.Visible = false
1022+
LeftResizeBorder.Visible = false
1023+
RightResizeBorder.Visible = false
1024+
TopResizeBorder.Visible = false
1025+
BottomResizeBorder.Visible = false
8441026
WindowButton.Size = UDim2.fromOffset(stateSize.X, collapsedHeight)
8451027
thisWidget.lastCollapsedTick = Iris._cycleTick + 1
8461028
end

0 commit comments

Comments
 (0)