enableEdgeDocking static method

Future<bool> enableEdgeDocking({
  1. required WindowEdge edge,
  2. double visibleWidth = 5.0,
  3. int hoverDelay = 300,
})

启用窗口边缘停靠功能(类似QQ的停靠行为)

edge 要停靠到的边缘位置 visibleWidth 停靠时可见的窗口宽度(像素),默认为5像素 hoverDelay 鼠标悬停多久后显示窗口(毫秒),默认300毫秒 返回 true 表示启用成功,false 表示启用失败

此功能会:

  1. 将窗口移动到指定边缘,大部分隐藏,只留小部分可见
  2. 监听鼠标位置,当鼠标悬停在可见部分时显示完整窗口
  3. 当鼠标离开窗口区域时,重新隐藏到边缘

Implementation

static Future<bool> enableEdgeDocking({
  required WindowEdge edge,
  double visibleWidth = 5.0,
  int hoverDelay = 300,
}) 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;
    switch (edge) {
      case WindowEdge.left:
        dockPosition = Offset(
          workAreaPosition.dx - windowSize.width + visibleWidth,
          workAreaPosition.dy + (workArea.height - windowSize.height) / 2,
        );
        break;
      case WindowEdge.right:
        dockPosition = Offset(
          workAreaPosition.dx + workArea.width - visibleWidth,
          workAreaPosition.dy + (workArea.height - windowSize.height) / 2,
        );
        break;
      case WindowEdge.top:
        dockPosition = Offset(
          workAreaPosition.dx + (workArea.width - windowSize.width) / 2,
          workAreaPosition.dy - windowSize.height + visibleWidth,
        );
        break;
      case WindowEdge.bottom:
        dockPosition = Offset(
          workAreaPosition.dx + (workArea.width - windowSize.width) / 2,
          workAreaPosition.dy + workArea.height - visibleWidth,
        );
        break;
    }

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

    // 启动鼠标位置监听
    _startMousePositionMonitoring(
      edge: edge,
      dockPosition: dockPosition,
      windowSize: windowSize,
      visibleWidth: visibleWidth,
      hoverDelay: hoverDelay,
      workAreaPosition: workAreaPosition,
      workArea: workArea,
    );

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