DevToysMac窗口排列工具:自动组织多个工具窗口的功能
【免费下载链接】DevToysMac DevToys For mac 项目地址: https://gitcode.com/gh_mirrors/de/DevToysMac
DevToysMac作为一款专为macOS用户设计的开发工具集,不仅提供了丰富的编码辅助功能,还内置了智能窗口排列工具,帮助用户在同时使用多个工具时保持工作区整洁有序。本文将详细介绍该功能的实现原理、使用方法及核心代码结构。
功能概述
窗口排列工具通过自动调整多个工具窗口的位置和大小,解决了开发者在同时使用Base64解码、JSON格式化、颜色选择器等多个功能时的窗口管理痛点。该功能支持三种排列模式:
- 垂直平铺:工具窗口沿屏幕垂直方向等高分列
- 水平平铺:工具窗口沿屏幕水平方向等高分行
- 网格布局:根据工具数量自动调整行列分布的矩阵排列
实现架构
核心组件路径
窗口排列功能主要通过以下模块实现:
- 窗口控制器:DevToys/DevToys/App/AppWindowController.swift
- 视图管理:DevToys/DevToys/Body/BodyViewController.swift
- 布局算法:CoreUtil/CoreUtil/Class/NSViewController+ChainObject.swift
- 状态管理:CoreUtil/CoreUtil/Class/Observable.swift
数据流程图
使用方法
基础操作步骤
- 打开至少两个工具窗口(如JSON格式化工具和颜色选择器)
- 点击主菜单栏的「窗口」->「排列方式」
- 选择所需的排列模式(快捷键:⌥⌘V垂直,⌥⌘H水平,⌥⌘G网格)
自定义布局
通过DevToys/DevToys/Model/Settings.swift配置文件可调整布局参数:
// 修改窗口间距(默认8像素)
windowLayoutSpacing: CGFloat = 12
// 设置最小窗口尺寸
minimumWindowSize: CGSize = CGSize(width: 300, height: 200)
// 启用智能边缘吸附
enableWindowSnapping: Bool = true
核心代码解析
窗口状态收集
DevToys/DevToys/App/AppWindowController.swift中实现了活跃窗口的收集逻辑:
func collectActiveToolWindows() -> [NSWindow] {
return NSApplication.shared.windows
.filter { $0.isVisible }
.filter { $0.windowController is ToolWindowController }
.sorted { $0.identifier?.rawValue ?? "" < $1.identifier?.rawValue ?? "" }
}
网格布局算法
CoreUtil/CoreUtil/Class/NSViewController+ChainObject.swift中的核心布局计算:
func arrangeWindowsInGrid(_ windows: [NSWindow], screenFrame: NSRect) {
let count = windows.count
let columns = Int(sqrt(Double(count)))
let rows = (count + columns - 1) / columns
let cellWidth = (screenFrame.width - (CGFloat(columns + 1) * spacing)) / CGFloat(columns)
let cellHeight = (screenFrame.height - (CGFloat(rows + 1) * spacing)) / CGFloat(rows)
for (index, window) in windows.enumerated() {
let row = index / columns
let col = index % columns
let originX = screenFrame.origin.x + spacing + CGFloat(col) * (cellWidth + spacing)
let originY = screenFrame.origin.y + spacing + CGFloat(row) * (cellHeight + spacing)
window.setFrame(NSRect(x: originX, y: originY, width: cellWidth, height: cellHeight), display: true)
}
}
扩展与定制
第三方集成
窗口排列功能支持AppleScript控制,可通过DevToys/DevToys/Body/Utils/Identifier.swift定义的窗口标识符实现自动化布局:
tell application "DevToysMac"
arrange windows in grid with spacing 10
set bounds of window "JSONFormatter" to {100, 100, 600, 400}
end tell
插件开发
开发者可通过实现CoreUtil/CoreUtil/Class/Action.swift中的WindowLayoutProvider协议添加自定义布局:
class CircleLayout: WindowLayoutProvider {
func arrange(_ windows: [NSWindow], screenFrame: NSRect) {
// 实现圆形排列逻辑
}
}
常见问题解决
窗口重叠问题
若出现窗口排列后重叠,检查以下配置:
- DevToys/DevToys/Info.plist中的
NSWindowCollectionBehavior设置 - 确保禁用系统「调度中心」的「自动重新排列空间」选项
多显示器支持
通过CoreUtil/CoreUtil/Class/Reachability.swift中的显示器检测API,可实现跨屏窗口排列:
let displays = NSScreen.screens
if displays.count > 1 {
// 主显示器放置常用工具
// 副显示器放置辅助工具
}
结语
DevToysMac的窗口排列工具通过DevToys/DevToys/Component/Page.swift和CoreUtil/CoreUtil/Extensions/UI/Ex+NSWindow.swift等模块的协同工作,为多任务开发提供了高效的窗口管理解决方案。用户可通过docs/index.html官方文档获取更多高级配置技巧,或参与contributors.csv中的社区贡献计划提交功能改进建议。
该功能的源代码采用MIT许可协议,欢迎开发者在https://link.gitcode.com/i/98a7c991120b3ec37bd4c08510a7961b仓库基础上进行二次开发。
【免费下载链接】DevToysMac DevToys For mac 项目地址: https://gitcode.com/gh_mirrors/de/DevToysMac
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



