Skip to content

UI API

UI APIは、Trae IDEでユーザーインターフェース要素を作成・管理するためのメソッドを提供します。パネル、ダイアログ、ステータスバー項目、カスタムビューなどが含まれます。

概要

UI APIでは以下のことができます:

  • カスタムパネルとビューの作成
  • ダイアログと入力ボックスの表示
  • ステータスバー項目の追加
  • ツリービューとWebビューパネルの作成
  • IDEインターフェースのカスタマイズ

基本的な使用方法

メッセージの表示

typescript
import { TraeAPI } from '@trae/api';

// 情報メッセージを表示
TraeAPI.window.showInformationMessage('操作が正常に完了しました!');

// 警告メッセージを表示
TraeAPI.window.showWarningMessage('この操作は元に戻せません。');

// エラーメッセージを表示
TraeAPI.window.showErrorMessage('ファイルの保存に失敗しました。');

// アクション付きメッセージを表示
const result = await TraeAPI.window.showInformationMessage(
  '変更を保存しますか?',
  '保存',
  '保存しない',
  'キャンセル'
);

if (result === '保存') {
  // 保存アクションを処理
}

入力ダイアログ

typescript
// 入力ボックスを表示
const input = await TraeAPI.window.showInputBox({
  prompt: 'ファイル名を入力してください',
  placeHolder: 'example.txt',
  validateInput: (value) => {
    if (!value) {
      return 'ファイル名は空にできません';
    }
    return null;
  }
});

// クイックピックを表示
const selection = await TraeAPI.window.showQuickPick(
  ['オプション 1', 'オプション 2', 'オプション 3'],
  {
    placeHolder: 'オプションを選択してください',
    canPickMany: false
  }
);

ステータスバー

typescript
// ステータスバー項目を作成
const statusBarItem = TraeAPI.window.createStatusBarItem(
  TraeAPI.StatusBarAlignment.Left,
  100
);

statusBarItem.text = '$(sync~spin) 処理中...';
statusBarItem.tooltip = 'クリックしてキャンセル';
statusBarItem.command = 'myExtension.cancelOperation';
statusBarItem.show();

// ステータスを更新
statusBarItem.text = '$(check) 完了';
statusBarItem.color = '#00ff00';

カスタムパネル

Webビューパネルの作成

typescript
const panel = TraeAPI.window.createWebviewPanel(
  'myExtension.panel',
  'マイカスタムパネル',
  TraeAPI.ViewColumn.One,
  {
    enableScripts: true,
    retainContextWhenHidden: true
  }
);

panel.webview.html = `
  <!DOCTYPE html>
  <html>
  <head>
    <title>マイパネル</title>
    <style>
      body { font-family: var(--vscode-font-family); }
      .container { padding: 20px; }
    </style>
  </head>
  <body>
    <div class="container">
      <h1>Webビューからこんにちは!</h1>
      <button onclick="sendMessage()">メッセージを送信</button>
    </div>
    <script>
      const vscode = acquireVsCodeApi();
      
      function sendMessage() {
        vscode.postMessage({ command: 'hello' });
      }
    </script>
  </body>
  </html>
`;

// Webビューからのメッセージを処理
panel.webview.onDidReceiveMessage((message) => {
  if (message.command === 'hello') {
    TraeAPI.window.showInformationMessage('Webビューからこんにちは!');
  }
});

ツリービュープロバイダー

typescript
class MyTreeDataProvider implements TraeAPI.TreeDataProvider<string> {
  private _onDidChangeTreeData = new TraeAPI.EventEmitter<string | undefined>();
  readonly onDidChangeTreeData = this._onDidChangeTreeData.event;

  getTreeItem(element: string): TraeAPI.TreeItem {
    return {
      label: element,
      collapsibleState: TraeAPI.TreeItemCollapsibleState.None,
      command: {
        command: 'myExtension.selectItem',
        title: '選択',
        arguments: [element]
      }
    };
  }

  getChildren(element?: string): string[] {
    if (!element) {
      return ['項目 1', '項目 2', '項目 3'];
    }
    return [];
  }

  refresh(): void {
    this._onDidChangeTreeData.fire(undefined);
  }
}

// ツリービューを登録
const treeDataProvider = new MyTreeDataProvider();
const treeView = TraeAPI.window.createTreeView('myExtension.treeView', {
  treeDataProvider
});

プログレスインジケーター

キャンセル可能なプログレス

typescript
TraeAPI.window.withProgress({
  location: TraeAPI.ProgressLocation.Notification,
  title: 'ファイルを処理中',
  cancellable: true
}, async (progress, token) => {
  const files = ['file1.txt', 'file2.txt', 'file3.txt'];
  
  for (let i = 0; i < files.length; i++) {
    if (token.isCancellationRequested) {
      break;
    }
    
    progress.report({
      increment: (100 / files.length),
      message: `${files[i]}を処理中`
    });
    
    // 作業をシミュレート
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
});

ウィンドウプログレス

typescript
TraeAPI.window.withProgress({
  location: TraeAPI.ProgressLocation.Window,
  title: '読み込み中...'
}, async (progress) => {
  progress.report({ increment: 0 });
  
  // 何らかの作業を実行
  await doSomeWork();
  
  progress.report({ increment: 50, message: '半分完了...' });
  
  // さらに作業を実行
  await doMoreWork();
  
  progress.report({ increment: 100, message: '完了!' });
});

カスタムビュー

カスタムビューの登録

typescript
// package.jsonのcontributesセクション
{
  "views": {
    "explorer": [
      {
        "id": "myExtension.customView",
        "name": "マイカスタムビュー",
        "when": "workspaceFolderCount > 0"
      }
    ]
  },
  "viewsContainers": {
    "activitybar": [
      {
        "id": "myExtension.container",
        "title": "マイ拡張機能",
        "icon": "$(extensions)"
      }
    ]
  }
}

テーマサポート

テーマカラーの使用

typescript
// CSS/HTMLで
const html = `
  <style>
    .error { color: var(--vscode-errorForeground); }
    .warning { color: var(--vscode-warningForeground); }
    .info { color: var(--vscode-infoForeground); }
    .background { background-color: var(--vscode-editor-background); }
  </style>
`;

// TypeScriptで
const errorColor = new TraeAPI.ThemeColor('errorForeground');
const decoration = TraeAPI.window.createTextEditorDecorationType({
  color: errorColor,
  backgroundColor: new TraeAPI.ThemeColor('editor.errorBackground')
});

APIリファレンス

ウィンドウメソッド

showInformationMessage()

typescript
showInformationMessage<T extends string>(
  message: string,
  ...items: T[]
): Thenable<T | undefined>;

showInputBox()

typescript
showInputBox(options?: InputBoxOptions): Thenable<string | undefined>;

createWebviewPanel()

typescript
createWebviewPanel(
  viewType: string,
  title: string,
  showOptions: ViewColumn | { viewColumn: ViewColumn; preserveFocus?: boolean },
  options?: WebviewPanelOptions & WebviewOptions
): WebviewPanel;

createStatusBarItem()

typescript
createStatusBarItem(
  alignment?: StatusBarAlignment,
  priority?: number
): StatusBarItem;

ベストプラクティス

  1. 適切なメッセージタイプを使用する(情報、警告、エラー)
  2. 明確で実行可能なメッセージを提供する
  3. 一貫した外観のためにテーマカラーをサポートする
  4. Webビューのライフサイクルを適切に処理する
  5. 不要になったUI要素は適切に破棄する
  6. 長時間実行される操作にはプログレスインジケーターを使用する
  7. VS Code UXガイドラインに従う

使用例

ファイルエクスプローラー拡張機能

typescript
class FileExplorerProvider implements TraeAPI.TreeDataProvider<FileItem> {
  // カスタムファイルエクスプローラーの実装
}

const provider = new FileExplorerProvider();
TraeAPI.window.registerTreeDataProvider('myExtension.fileExplorer', provider);

設定パネル

typescript
function createSettingsPanel() {
  const panel = TraeAPI.window.createWebviewPanel(
    'myExtension.settings',
    '拡張機能設定',
    TraeAPI.ViewColumn.One,
    { enableScripts: true }
  );
  
  panel.webview.html = getSettingsHtml();
  
  panel.webview.onDidReceiveMessage(async (message) => {
    switch (message.command) {
      case 'saveSetting':
        await saveExtensionSetting(message.key, message.value);
        break;
    }
  });
}

関連API

究極の AI 駆動 IDE 学習ガイド