enableSimpleEdgeDocking static method

Future<bool> enableSimpleEdgeDocking({
  1. required WindowEdge edge,
  2. double visibleWidth = 5.0,
})

简化版边缘停靠功能(基于窗口焦点事件)

edge 要停靠到的边缘位置 visibleWidth 停靠时可见的窗口宽度(像素),默认为5像素 返回 true 表示启用成功,false 表示启用失败

此版本使用窗口焦点事件来控制显示/隐藏,更简单但功能略有限制

Implementation

static Future<bool> enableSimpleEdgeDocking({
  required WindowEdge edge,
  double visibleWidth = 5.0,
}) async {
  if (!MyPlatform.isDesktop) return false;

  try {
    final display = await screenRetriever.getPrimaryDisplay();
    if (display.visiblePosition == null || display.visibleSize == null) {
      return false;
    }

    final windowSize = await windowManager.getSize();
    final workArea = display.visibleSize!;
    final workAreaPosition = display.visiblePosition!;

    // 计算停靠位置
    Offset dockPosition;
    Offset expandPosition;

    switch (edge) {
      case WindowEdge.left:
        dockPosition = Offset(
          workAreaPosition.dx - windowSize.width + visibleWidth,
          workAreaPosition.dy + (workArea.height - windowSize.height) / 2,
        );
        expandPosition = Offset(workAreaPosition.dx, dockPosition.dy);
        break;
      case WindowEdge.right:
        dockPosition = Offset(
          workAreaPosition.dx + workArea.width - visibleWidth,
          workAreaPosition.dy + (workArea.height - windowSize.height) / 2,
        );
        expandPosition = Offset(
          workAreaPosition.dx + workArea.width - windowSize.width,
          dockPosition.dy,
        );
        break;
      case WindowEdge.top:
        dockPosition = Offset(
          workAreaPosition.dx + (workArea.width - windowSize.width) / 2,
          workAreaPosition.dy - windowSize.height + visibleWidth,
        );
        expandPosition = Offset(dockPosition.dx, workAreaPosition.dy);
        break;
      case WindowEdge.bottom:
        dockPosition = Offset(
          workAreaPosition.dx + (workArea.width - windowSize.width) / 2,
          workAreaPosition.dy + workArea.height - visibleWidth,
        );
        expandPosition = Offset(
          dockPosition.dx,
          workAreaPosition.dy + workArea.height - windowSize.height,
        );
        break;
    }

    // 保存位置信息
    _dockPosition = dockPosition;
    _expandPosition = expandPosition;
    _isEdgeDockingEnabled = true;
    _isWindowExpanded = false;

    // 移动窗口到停靠位置
    await windowManager.setPosition(dockPosition);

    return true;
  } catch (e) {
    XlyLogger.error('启用简单边缘停靠失败', e);
    return false;
  }
}