cli/docs/services/display.md

4.4 KiB

Display Service

The Display service (pkg/display) provides comprehensive window management, dialogs, system tray, clipboard, and notification functionality.

Features

  • Window creation, positioning, and lifecycle
  • System tray with menus
  • Native dialogs (open, save, confirm)
  • Clipboard operations
  • System notifications
  • Multi-monitor support
  • Layout management

Basic Usage

import "github.com/Snider/Core/pkg/display"

// Register with Core
c, _ := core.New(
    core.WithService(display.NewService),
)

// Get service
svc := core.MustServiceFor[*display.Service](c, "display")

Window Management

Create Window

info, err := svc.CreateWindow(display.CreateWindowOptions{
    Name:   "settings",
    Title:  "Settings",
    URL:    "/settings",
    Width:  800,
    Height: 600,
    X:      100,
    Y:      100,
})

Position & Size

// Move window
svc.SetWindowPosition("main", 100, 100)

// Resize window
svc.SetWindowSize("main", 1200, 800)

// Both at once
svc.SetWindowBounds("main", 100, 100, 1200, 800)

Window State

svc.MaximizeWindow("main")
svc.MinimizeWindow("main")
svc.RestoreWindow("main")
svc.FocusWindow("main")
svc.SetWindowFullscreen("main", true)
svc.SetWindowAlwaysOnTop("main", true)

List Windows

windows := svc.ListWindowInfos()
for _, w := range windows {
    fmt.Printf("%s: %dx%d at (%d,%d)\n",
        w.Name, w.Width, w.Height, w.X, w.Y)
}

Dialogs

File Dialogs

// Open file
path, err := svc.OpenSingleFileDialog(display.OpenFileOptions{
    Title: "Select File",
    Filters: []display.FileFilter{
        {DisplayName: "Images", Pattern: "*.png;*.jpg"},
    },
})

// Open multiple files
paths, err := svc.OpenFileDialog(display.OpenFileOptions{
    Title:         "Select Files",
    AllowMultiple: true,
})

// Save file
path, err := svc.SaveFileDialog(display.SaveFileOptions{
    Title:           "Save As",
    DefaultFilename: "document.txt",
})

// Select directory
dir, err := svc.OpenDirectoryDialog(display.OpenDirectoryOptions{
    Title: "Select Folder",
})

Confirm Dialog

confirmed, err := svc.ConfirmDialog("Delete File", "Are you sure?")
if confirmed {
    // User clicked Yes
}

System Tray

// Set tooltip
svc.SetTrayTooltip("My Application")

// Set label
svc.SetTrayLabel("Running")

// Set icon (PNG bytes)
iconData, _ := os.ReadFile("icon.png")
svc.SetTrayIcon(iconData)

// Set menu
svc.SetTrayMenu([]display.TrayMenuItem{
    {Label: "Open", ActionID: "open"},
    {Label: "Settings", ActionID: "settings"},
    {IsSeparator: true},
    {Label: "Quit", ActionID: "quit"},
})

Clipboard

// Write to clipboard
svc.WriteClipboard("Hello, World!")

// Read from clipboard
text, err := svc.ReadClipboard()

// Check if has content
hasContent := svc.HasClipboard()

// Clear clipboard
svc.ClearClipboard()

Notifications

// Basic notification
svc.ShowNotification(display.NotificationOptions{
    Title:   "Download Complete",
    Message: "Your file has been downloaded.",
})

// Convenience methods
svc.ShowInfoNotification("Info", "Operation completed")
svc.ShowWarningNotification("Warning", "Low disk space")
svc.ShowErrorNotification("Error", "Connection failed")

Multi-Monitor Support

// List all screens
screens := svc.GetScreens()

// Get primary screen
primary, _ := svc.GetPrimaryScreen()

// Get screen at point
screen, _ := svc.GetScreenAtPoint(500, 300)

// Get screen for window
screen, _ := svc.GetScreenForWindow("main")

// Get work areas (excluding dock/taskbar)
workAreas := svc.GetWorkAreas()

Layout Management

// Save current layout
svc.SaveLayout("coding")

// Restore layout
svc.RestoreLayout("coding")

// List saved layouts
layouts := svc.ListLayouts()

// Tile windows
svc.TileWindows(display.TileModeGrid, nil)

// Snap to edge
svc.SnapWindow("main", display.SnapPositionLeft)

// Apply workflow preset
svc.ApplyWorkflowLayout(display.WorkflowCoding)

Theme

theme := svc.GetTheme()
fmt.Println(theme.IsDark)

Frontend Usage (TypeScript)

import {
    CreateWindow,
    SetWindowPosition,
    ShowNotification,
    OpenFileDialog
} from '@bindings/display/service';

// Create window
await CreateWindow({
    name: "settings",
    title: "Settings",
    width: 800,
    height: 600
});

// Show notification
await ShowNotification({
    title: "Success",
    message: "Settings saved!"
});