Implemented default docking layout. Console windows are automatically docked to the bottom panel of the application.

This commit is contained in:
Jakob Friedl
2025-09-11 12:03:02 +02:00
parent 8968c797ac
commit c2b388fbf2
4 changed files with 82 additions and 310 deletions

View File

@@ -1,330 +1,75 @@
[Window][Dockspace]
Pos=0,0
Size=2868,1695
Collapsed=0
[Window][Debug##Default]
Pos=289,253
Size=449,261
Collapsed=0
[Window][Dear ImGui Demo]
Pos=1884,43
Size=974,624
Collapsed=0
DockId=0x00000006,1
[Window][Agents [Table View]]
Pos=10,43
Size=1187,946
Collapsed=0
DockId=0x00000005,0
[Window][Agents [Graph View]]
Pos=10,43
Size=1888,473
Collapsed=0
DockId=0x00000005,1
[Window][Eventlog]
Pos=1884,43
Size=974,624
Collapsed=0
DockId=0x00000006,0
[Window][Example: Assets Browser]
Pos=60,60
Size=800,480
Collapsed=0
[Window][Example: Console]
Pos=60,60
Size=520,600
Collapsed=0
[Window][Example: Log]
Pos=171,222
Size=1150,550
Collapsed=0
[Window][Dear ImGui Debug Log]
Pos=10,698
Size=2528,651
Collapsed=0
DockId=0x00000005,1
[Window][Dear ImGui Metrics/Debugger]
Pos=60,60
Size=564,669
Collapsed=0
[Window][Sessions [Table View]] [Window][Sessions [Table View]]
Pos=10,43 Pos=10,43
Size=1872,624 Size=1477,305
Collapsed=0 Collapsed=0
DockId=0x00000005,0 DockId=0x00000003,0
[Window][Dear ImGui Demo/ResizableChild_478B81A3] [Window][Listeners]
IsChild=1 Pos=10,350
Size=1136,248 Size=1888,639
[Window][Dear ImGui Demo/Red_BEEF922B]
IsChild=1
Size=200,100
[Window][Dear ImGui Demo/##Basket_956142B6]
IsChild=1
Size=1115,540
[Window][Dear ImGui Demo/##Basket_8B4CCC3E]
IsChild=1
Size=1115,540
[Window][Dear ImGui Demo/##Basket_10C9C799]
IsChild=1
Size=1115,540
[Window][Dear ImGui Demo/##Tree_EC99B1DE]
IsChild=1
Size=1115,540
[Window][Sessions [Graph View]]
Pos=10,518
Size=1453,471
Collapsed=0 Collapsed=0
DockId=0x00000002,0 DockId=0x00000002,0
[Window][Dear ImGui Demo/##Basket_87771727] [Window][Eventlog]
IsChild=1 Pos=1489,43
Size=614,540 Size=409,305
[Window][Listeners]
Pos=10,765
Size=2848,920
Collapsed=0 Collapsed=0
DockId=0x00000004,0 DockId=0x00000004,0
[Window][G1H2I3J4] [Window][Dear ImGui Demo]
Pos=10,866 Pos=1489,43
Size=2848,819 Size=409,305
Collapsed=0 Collapsed=0
DockId=0x00000008,1 DockId=0x00000004,1
[Window][C9D8E7F6] [Window][Dockspace]
Pos=10,866 Pos=0,0
Size=2848,819 Size=1908,999
Collapsed=0 Collapsed=0
DockId=0x00000008,2
[Window][FACEDEAD]
Pos=10,866
Size=2848,819
Collapsed=0
DockId=0x00000008,3
[Window][["C9D8E7F6"] charlie@SERVER-03]
Pos=10,866
Size=2848,819
Collapsed=0
DockId=0x00000008,1
[Window][[G1H2I3J4] diana@WORKSTATION-04]
Pos=10,669
Size=2848,1016
Collapsed=0
DockId=0x00000008,1
[Window][[FACEDEAD] bob@LAPTOP-02] [Window][[FACEDEAD] bob@LAPTOP-02]
Pos=10,669 Pos=10,350
Size=2848,1016 Size=1888,639
Collapsed=0 Collapsed=0
DockId=0x00000008,0 DockId=0x00000002,2
[Window][[C9D8E7F6] charlie@SERVER-03] [Window][[C9D8E7F6] charlie@SERVER-03]
Pos=10,669 Pos=10,350
Size=2848,1016 Size=1888,639
Collapsed=0 Collapsed=0
DockId=0x00000008,2 DockId=0x00000002,0
[Window][Debug##Default]
Pos=60,60
Size=400,400
Collapsed=0
[Window][[G1H2I3J5] diana@WORKSTATION-04]
Pos=10,350
Size=1888,639
Collapsed=0
DockId=0x00000002,1
[Window][[DEADBEEF] alice@DESKTOP-01] [Window][[DEADBEEF] alice@DESKTOP-01]
Pos=10,669 Pos=10,350
Size=2848,1016 Size=1888,639
Collapsed=0 Collapsed=0
DockId=0x00000008,1 DockId=0x00000002,1
[Table][0xB6880529,2]
RefScale=27
Column 0 Sort=0v
[Table][0x951FCC8A,6]
RefScale=27
Column 0 Width=48
Column 1 Width=112 Sort=0v
Column 2 Width=108
Column 3 Width=136
Column 4 Weight=1.0000
Column 5 Width=-1
[Table][0x32886A44,8] [Table][0x32886A44,8]
Column 0 Weight=0.6558 Column 0 Weight=0.6570
Column 1 Weight=0.9747 Column 1 Weight=0.9786
Column 2 Weight=0.6558 Column 2 Weight=0.6570
Column 3 Weight=0.8804 Column 3 Weight=1.1429
Column 4 Weight=1.8057 Column 4 Weight=1.5466
Column 5 Weight=1.1454 Column 5 Weight=1.1429
Column 6 Weight=0.3324 Column 6 Weight=0.3285
Column 7 Weight=1.5497 Column 7 Weight=1.5466
[Table][0x51D6F5EA,3]
Column 0 Weight=1.0000
Column 1 Weight=1.0000
Column 2 Weight=1.0000
[Table][0xE102187A,3]
RefScale=27
Column 0 Width=134
Column 1 Width=108
Column 2 Width=108
[Table][0xF1421304,3]
RefScale=27
Column 0 Width=108
Column 1 Width=108
Column 2 Weight=1.0000
[Table][0xE212E0F0,6]
RefScale=27
Column 0 Width=108
Column 1 Width=108
Column 2 Width=-1
Column 3 Weight=1.0000
Column 4 Weight=1.0000
Column 5 Weight=-1.0000
[Table][0x86C9FC97,3]
Column 0 Weight=0.6856
Column 1 Weight=0.7387
Column 2 Weight=1.5757
[Table][0x95990F63,3]
RefScale=27
Column 0 Width=108
Column 1 Width=108
Column 2 Width=108
[Table][0xEB78AB2C,3]
Column 0 Weight=1.0000
Column 1 Weight=1.0000
Column 2 Weight=1.0000
[Table][0x603C335E,2]
Column 0 Weight=1.0000
Column 1 Weight=1.0000
[Table][0xA6C6558A,2]
Column 0 Weight=1.0000
Column 1 Weight=1.0000
[Table][0xAED4F161,3]
RefScale=27
Column 0 Weight=1.0000
Column 1 Width=839 Sort=0v
Column 2 Width=-1
[Table][0x3A20F3F3,3]
RefScale=27
Column 0 Width=96
Column 1 Width=96
Column 2 Width=96
[Table][0x29CD9FF7,3]
[Table][0x302651AD,14]
RefScale=27
Column 0 Width=96
Column 1 Width=33
Column 2 Width=33
Column 3 Width=33
Column 4 Width=33
Column 5 Width=33
Column 6 Width=33
Column 7 Width=33
Column 8 Width=33
Column 9 Width=33
Column 10 Width=33
Column 11 Width=33
Column 12 Width=33
Column 13 Width=33
[Table][0x369EB90F,3]
Column 0 Weight=1.0000
Column 1 Weight=1.0000
Column 2 Weight=1.0000
[Table][0x2ACCE68A,3]
RefScale=27
Column 0 Width=136
Column 1 Width=136
Column 2 Width=136
[Table][0x6655AF53,4]
RefScale=27
Column 0 Width=48
Column 1 Width=72 Sort=0^
Column 2 Width=72
Column 3 Weight=1.0000
[Table][0x5145577A,3]
Column 0 Weight=1.0000
Column 1 Weight=1.0000
Column 2 Weight=1.0000
[Table][0x127BEAD2,7]
RefScale=27
Column 0 Width=155
Column 1 Width=155
Column 2 Width=155
Column 3 Width=156
Column 4 Width=156
Column 5 Width=156
Column 6 Width=474
[Table][0x755BE644,3]
RefScale=27
Column 0 Width=84
Column 1 Width=83
Column 2 Width=84
[Table][0xBE0D9DE1,3]
RefScale=27
Column 0 Width=84
Column 1 Width=84
Column 2 Width=217
[Table][0xDE11CCC7,8]
Column 0 Weight=0.7758
Column 1 Weight=1.1556
Column 2 Weight=0.7758
Column 3 Weight=0.9616
Column 4 Weight=0.9616
Column 5 Weight=1.1556
Column 6 Weight=0.3879
Column 7 Weight=1.8263
[Table][0x61294EC1,3]
RefScale=27
Column 0 Width=119
Column 1 Width=119
Column 2 Width=119
[Docking][Data] [Docking][Data]
DockSpace ID=0x85940918 Window=0x260A4489 Pos=10,43 Size=2848,1642 Split=Y DockSpace ID=0x85940918 Window=0x260A4489 Pos=10,43 Size=1888,946 Split=Y
DockNode ID=0x00000007 Parent=0x85940918 SizeRef=2848,624 Split=Y DockNode ID=0x00000001 Parent=0x85940918 SizeRef=1024,159 Split=X
DockNode ID=0x00000003 Parent=0x00000007 SizeRef=2848,720 Split=Y DockNode ID=0x00000003 Parent=0x00000001 SizeRef=613,159 CentralNode=1 Selected=0x61E02D75
DockNode ID=0x00000001 Parent=0x00000003 SizeRef=1453,473 Split=X Selected=0x61E02D75 DockNode ID=0x00000004 Parent=0x00000001 SizeRef=409,159 Selected=0x5E5F7166
DockNode ID=0x00000005 Parent=0x00000001 SizeRef=1872,674 CentralNode=1 Selected=0x61E02D75 DockNode ID=0x00000002 Parent=0x85940918 SizeRef=1024,639 Selected=0x8D780333
DockNode ID=0x00000006 Parent=0x00000001 SizeRef=974,674 Selected=0x5E5F7166
DockNode ID=0x00000002 Parent=0x00000003 SizeRef=1453,471 Selected=0x6D7E7D39
DockNode ID=0x00000004 Parent=0x00000007 SizeRef=2848,920 Selected=0x6BE22050
DockNode ID=0x00000008 Parent=0x85940918 SizeRef=2848,1016 Selected=0xD3469193

View File

@@ -11,10 +11,16 @@ proc main() =
showConquest = true showConquest = true
showSessionsTable = true showSessionsTable = true
showSessionsGraph = false showSessionsGraph = false
showListeners = false showListeners = true
showEventlog = true showEventlog = true
consoles: Table[string, ConsoleComponent] consoles: Table[string, ConsoleComponent]
var
dockTop: ImGuiID = 0
dockBottom: ImGuiID = 0
dockTopLeft: ImGuiID = 0
dockTopRight: ImGuiID = 0
views["Sessions [Table View]"] = addr showSessionsTable views["Sessions [Table View]"] = addr showSessionsTable
views["Sessions [Graph View]"] = addr showSessionsGraph views["Sessions [Graph View]"] = addr showSessionsGraph
views["Listeners"] = addr showListeners views["Listeners"] = addr showListeners
@@ -39,7 +45,7 @@ proc main() =
newFrame() newFrame()
# Draw/update UI components/views # Draw/update UI components/views
dockspace.draw(addr showConquest, views) dockspace.draw(addr showConquest, views, addr dockTop, addr dockBottom, addr dockTopLeft, addr dockTopRight)
if showSessionsTable: sessionsTable.draw(addr showSessionsTable) if showSessionsTable: sessionsTable.draw(addr showSessionsTable)
if showListeners: listenersTable.draw(addr showListeners) if showListeners: listenersTable.draw(addr showListeners)
if showEventlog: eventlog.draw(addr showEventlog) if showEventlog: eventlog.draw(addr showEventlog)
@@ -47,7 +53,9 @@ proc main() =
# Show console windows # Show console windows
var newConsoleTable: Table[string, ConsoleComponent] var newConsoleTable: Table[string, ConsoleComponent]
for agentId, console in consoles.mpairs(): for agentId, console in consoles.mpairs():
if console.showConsole: if console.showConsole:
# Ensure that new console windows are docked to the bottom panel by default
igSetNextWindowDockID(dockBottom, ImGuiCond_FirstUseEver.int32)
console.draw() console.draw()
newConsoleTable[agentId] = console newConsoleTable[agentId] = console

View File

@@ -7,14 +7,16 @@ type
windowClass: ptr ImGuiWindowClass windowClass: ptr ImGuiWindowClass
dockspaceFlags: ImGuiDockNodeFlags dockspaceFlags: ImGuiDockNodeFlags
windowFlags: ImGuiWindow_Flags windowFlags: ImGuiWindow_Flags
initialized: bool
proc Dockspace*(): DockspaceComponent = proc Dockspace*(): DockspaceComponent =
result = new DockspaceComponent result = new DockspaceComponent
result.windowClass = ImGuiWindowClass_ImGuiWindowClass() result.windowClass = ImGuiWindowClass_ImGuiWindowClass()
result.dockspaceFlags = ImGuiDockNodeFlags_None.int32 result.dockspaceFlags = ImGuiDockNodeFlags_None.int32
result.windowFlags = ImGuiWindowFlags_MenuBar.int32 or ImGuiWindowFlags_NoDocking.int32 result.windowFlags = ImGuiWindowFlags_MenuBar.int32 or ImGuiWindowFlags_NoDocking.int32
result.initialized = false
proc draw*(component: DockspaceComponent, showComponent: ptr bool, views: Table[string, ptr bool]) = proc draw*(component: DockspaceComponent, showComponent: ptr bool, views: Table[string, ptr bool], dockTop, dockBottom, dockTopLeft, dockTopRight: ptr ImGuiID) =
var vp = igGetMainViewport() var vp = igGetMainViewport()
igSetNextWindowPos(vp.WorkPos, ImGui_Cond_None.int32, vec2(0.0f, 0.0f)) igSetNextWindowPos(vp.WorkPos, ImGui_Cond_None.int32, vec2(0.0f, 0.0f))
@@ -39,8 +41,25 @@ proc draw*(component: DockspaceComponent, showComponent: ptr bool, views: Table[
igPopStyleVar(3) igPopStyleVar(3)
# Setup default docking layout
var dockspaceId = igGetID_Str("Dockspace")
if igDockBuilderGetNode(dockspaceId) == nil:
igDockBuilderRemoveNode(dockspaceId)
igDockBuilderAddNode(dockspaceId, ImGuiDockNodeFlags_DockSpace.int32)
igDockBuilderSetNodeSize(dockspaceId, vp.WorkSize)
discard igDockBuilderSplitNode(dockspaceId, ImGuiDir_Down, 0.8f, dockBottom, dockTop)
discard igDockBuilderSplitNode(dockTop[], ImGuiDir_Right, 0.4f, dockTopRight, dockTopLeft)
igDockBuilderDockWindow("Sessions [Table View]", dockTopLeft[])
igDockBuilderDockWindow("Listeners", dockBottom[])
igDockBuilderDockWindow("Eventlog", dockTopRight[])
igDockBuilderDockWindow("Dear ImGui Demo", dockTopRight[])
igDockBuilderFinish(dockspaceId)
# Create dockspace # Create dockspace
igDockSpace(igGetID_Str("Dockspace"), vec2(0.0f, 0.0f), component.dockspaceFlags, component.windowClass) igDockSpace(dockspaceId, vec2(0.0f, 0.0f), component.dockspaceFlags, component.windowClass)
# Create menu bar # Create menu bar
if igBeginMenuBar(): if igBeginMenuBar():

View File

@@ -65,7 +65,7 @@ let exampleAgents: seq[Agent] = @[
sessionKey: [byte 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] sessionKey: [byte 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
), ),
Agent( Agent(
agentId: "G1H2I3J4", agentId: "G1H2I3J5",
listenerId: "L1357924", listenerId: "L1357924",
username: "diana", username: "diana",
hostname: "WORKSTATION-04", hostname: "WORKSTATION-04",