マルチウィンドウアーキテクチャ
jamjam のマルチウィンドウ構成を定義する。
関連: architecture.md Section 8, screens/README.md
概要
設計目標
- マルチモニター環境での最適な操作性
- 各ウィンドウの役割を明確に分離
- 状態に応じた適切なウィンドウ表示
ウィンドウ構成
| ウィンドウ | 表示タイミング | 主な役割 |
|---|---|---|
| 接続画面 | 未接続時 | セッション作成/参加 |
| ミキシングコンソール | 接続後(メイン) | 音量・パン調整、退室 |
| チャット | 接続後(メイン) | テキストコミュニケーション |
| 設定画面 | 必要時 | オーディオデバイス、プリセット |
状態遷移
アプリケーション状態とウィンドウ
状態別ウィンドウ表示
| アプリ状態 | 接続画面 | ミキサー | チャット | 設定 |
|---|---|---|---|---|
| 未接続 | 表示(メイン) | 非表示 | 非表示 | オプション |
| 接続中 | 表示(ローディング) | 非表示 | 非表示 | オプション |
| 接続済み | 非表示 | 表示(メイン) | 表示(メイン) | オプション |
ウィンドウ詳細
1. 接続画面ウィンドウ (ConnectionWindow)
セッション参加/作成のシンプルなUI。
仕様
| 項目 | 値 |
|---|---|
| デフォルトサイズ | 400 x 300 px |
| 最小サイズ | 320 x 280 px |
| リサイズ | 不可(固定) |
| 閉じる動作 | アプリ終了 |
機能
- ルーム作成ボタン
- 招待コード入力フィールド
- 参加ボタン
- 設定ボタン(設定ウィンドウを開く)
レイアウト
┌────────────────────────────────┐
│ jamjam │
├────────────────────────────────┤
│ │
│ ┌────────────────────┐ │
│ │ [ ルームを作成 ] │ │
│ └────────────────────┘ │
│ │
│ ─────── または ─────── │
│ │
│ 招待コード: [______] │
│ [ 参加 ] │
│ │
│ [⚙] │
└────────────────────────────────┘
2. ミキシングコンソールウィンドウ (MixerWindow)
DAWスタイルのミキシングコンソール。
仕様
| 項目 | 値 |
|---|---|
| デフォルトサイズ | 800 x 600 px |
| 最小サイズ | 600 x 400 px |
| リサイズ | 可(水平方向優先) |
| 閉じる動作 | 退室確認ダイアログ → アプリ終了 |
機能
- チャンネルストリップ(自分 + 参加者)
- マスターセクション
- 退室ボタン
- 設定ボタン
既存コンポーネント
ui/src/components/MixerPanel/ の以下のコンポーネントを使用:
MixerPanel- ルートコンポーネントChannelStrip- 個別チャンネルMasterSection- マスター出力StereoMeter,StereoFader,PanSlider
3. チャットウィンドウ (ChatWindow)
テキストコミュニケーション用ウィンドウ。
仕様
| 項目 | 値 |
|---|---|
| デフォルトサイズ | 400 x 500 px |
| 最小サイズ | 300 x 400 px |
| リサイズ | 可 |
| 閉じる動作 | ウィンドウを隠す(再表示可能) |
機能
- メッセージ一覧
- 入力フィールド
- 絵文字リアクション
- システムメッセージ(参加/退室通知)
既存コンポーネント
ui/src/components/ChatPanel/ の以下のコンポーネントを使用:
ChatPanel- ルートコンポーネントChatMessageList- メッセージ一覧ChatInput- 入力フィールドReactionBar,EmojiPicker
4. 設定画面ウィンドウ (SettingsWindow)
オーディオデバイス、プリセット、表示設定。
仕様
| 項目 | 値 |
|---|---|
| デフォルトサイズ | 600 x 500 px |
| 最小サイズ | 500 x 400 px |
| リサイズ | 可 |
| 閉じる動作 | ウィンドウを閉じる |
| モーダル | いいえ(他ウィンドウ操作可能) |
機能
- 全般設定(テーマ、言語)
- プロフィール(表示名)
- デバイス設定(入出力機器、サンプルレート)
- 診断
既存コンポーネント
ui/src/components/SettingsPanel/ の以下のコンポーネントを使用:
SettingsPanel- ルートコンポーネントVerticalTabs- タブナビゲーションGeneralTab,ProfileTab,DevicesTab,DiagnosticsTab
ウィンドウ間通信
Tauri Events
ウィンドウ間の通信には Tauri の Event System を使用する。
イベント一覧
| イベント名 | 送信元 | 受信先 | ペイロード |
|---|---|---|---|
session:connected | Backend | All | { roomId, participants } |
session:disconnected | Backend | All | { reason } |
participant:joined | Backend | Mixer, Chat | { id, name } |
participant:left | Backend | Mixer, Chat | { id, name } |
audio:level | Backend | Mixer | { channelId, levelL, levelR } |
chat:message | Backend | Chat | { id, type, content, ... } |
settings:changed | Settings | All | { key, value } |
状態同期
ウィンドウ管理
起動シーケンス
ウィンドウ位置の記憶
各ウィンドウの位置・サイズは設定ファイルに保存し、次回起動時に復元する。
# config.toml
[windows.mixer]
x = 100
y = 100
width = 800
height = 600
[windows.chat]
x = 920
y = 100
width = 400
height = 500
[windows.settings]
x = 200
y = 150
width = 600
height = 500
Tauri 実装
tauri.conf.json
{
"app": {
"windows": [
{
"label": "connection",
"title": "jamjam",
"width": 400,
"height": 300,
"resizable": false,
"center": true
}
]
}
}
動的ウィンドウ作成
// src-tauri/src/windows.rs
use tauri::{WebviewUrl, WebviewWindowBuilder};
pub fn create_mixer_window(app: &tauri::AppHandle) -> tauri::Result<()> {
WebviewWindowBuilder::new(
app,
"mixer",
WebviewUrl::App("mixer.html".into()),
)
.title("jamjam - Mixer")
.inner_size(800.0, 600.0)
.min_inner_size(600.0, 400.0)
.build()?;
Ok(())
}
pub fn create_chat_window(app: &tauri::AppHandle) -> tauri::Result<()> {
WebviewWindowBuilder::new(
app,
"chat",
WebviewUrl::App("chat.html".into()),
)
.title("jamjam - Chat")
.inner_size(400.0, 500.0)
.min_inner_size(300.0, 400.0)
.build()?;
Ok(())
}
アクセシビリティ
キーボードショートカット
| ショートカット | 動作 | スコープ |
|---|---|---|
Cmd/Ctrl + 1 | ミキサーウィンドウにフォーカス | グローバル |
Cmd/Ctrl + 2 | チャットウィンドウにフォーカス | グローバル |
Cmd/Ctrl + , | 設定ウィンドウを開く | グローバル |
Cmd/Ctrl + M | ミュート切り替え | ミキサー |
Cmd/Ctrl + Enter | メッセージ送信 | チャット |
Escape | ウィンドウを閉じる | 設定 |
フォーカス管理
- 新しいウィンドウが開いたらフォーカスを移動
- チャットウィンドウを閉じて再度開いた場合、入力フィールドにフォーカス
- 設定ウィンドウを閉じたら、元のウィンドウにフォーカスを戻す
i18n キー
{
"window.connection.title": "jamjam",
"window.mixer.title": "jamjam - ミキサー",
"window.chat.title": "jamjam - チャット",
"window.settings.title": "設定",
"window.mixer.closeConfirm": "セッションから退室しますか?",
"window.chat.hidden": "チャットウィンドウを非表示にしました"
}
関連ドキュメント
- architecture.md Section 8 - GUI 仕様
- screens/README.md - 画面遷移図
- components/mixer-panel.md - MixerPanel 仕様
- design-guide.md - デザインガイド