Skip to content

Latest commit

 

History

History
422 lines (360 loc) · 17 KB

todo.md

File metadata and controls

422 lines (360 loc) · 17 KB

Rust Hex Editor - TODO List

✅ 実装済み

基本機能

  • gpuiライブラリの統合
  • 基本的なウィンドウ表示
  • 3カラムレイアウト(アドレス、Hex、ASCII)
  • 16進数表示とASCII表示
  • モノスペースフォントでの整列表示

データモデル

  • バイト配列の管理 (Vec<u8>)
  • 16バイト/行のフォーマット
  • アドレス表示(8桁の16進数)
  • Hex値のフォーマット
  • ASCII文字の表示(制御文字は '.' で表示)
  • サンプルデータの生成

ファイル操作

  • コマンドライン引数でファイルパスを受け取る
  • ファイルの読み込み (load_file())
  • ファイル名のヘッダー表示
  • ファイルサイズの表示
  • エラーハンドリング(ファイル読み込み失敗時のフォールバック)

UI/UX

  • ダークテーマ (#1e1e1e 背景)
  • スクロール可能なコンテンツ領域
  • インタラクティブなスクロールバー
    • マウスホイール対応
    • ドラッグ操作対応
    • 常時表示モード
  • カラーコーディング
    • アドレス: グレー (#808080)
    • Hex値: グリーン (#00ff00)
    • ASCII: ホワイト (#ffffff)

カーソルとナビゲーション

  • カーソル位置の管理
    • 現在のバイト位置を保持 (cursor_position)
    • FocusHandleによるフォーカス管理
  • カーソルの視覚的表示
    • 選択中のバイトをハイライト (青色 #4a9eff)
    • HexペインとASCIIペインで同期表示
  • 基本的なキーボードナビゲーション
    • 矢印キー(上下左右)でカーソル移動
    • Focusableトレイト実装
    • on_key_downイベント処理

バイト編集機能

  • バイト編集モード
    • Hexペインでの編集(0-9, A-F入力)
    • ASCIIペインでの編集(印字可能文字)
    • 入力値の検証
    • Hexニブル管理(上位/下位ビット)
  • Hexペイン/ASCIIペインの切り替え(Tab)
  • 編集中の視覚的フィードバック
    • 編集モード表示(ヘッダー)
    • アクティブペインのハイライト(Hex: 青、ASCII: オレンジ)
    • 非アクティブペインの暗い表示
  • 自動カーソル移動(入力後に次のバイトへ)

ファイル保存機能

  • 変更追跡フラグ(has_unsaved_changes)
  • 上書き保存(Ctrl+S / Cmd+S)
  • 保存成功メッセージ表示
  • 未保存変更の視覚的表示
    • タイトルに「*」表示
    • バイト数に「(modified)」表示
  • 保存エラーハンドリング

❌ 未実装機能

🔴 高優先度(エディタとして必須)

1. カーソルとナビゲーション(拡張) ✅ 完了

  • カーソル位置の管理
    • 現在のバイト位置を保持
    • Hexペイン/ASCIIペインの切り替え
  • カーソルの視覚的表示
    • 選択中のバイトをハイライト
    • カーソル位置のインジケーター
  • 基本的なキーボードナビゲーション
    • 矢印キー(上下左右)
  • 拡張キーボードナビゲーション
    • Page Up / Page Down
    • Home / End
    • Ctrl+Home / Ctrl+End(ファイルの先頭/末尾)
    • Shift+上記キーで範囲選択
  • カーソル移動時の自動スクロール
    • キーボード移動時のスクロール追従
    • マウスクリック・ドラッグ時のスクロール追従
  • マウス操作
    • クリックでバイト選択
    • ドラッグで範囲選択

2. 選択範囲 ✅ 完了

  • 選択範囲の管理(開始位置、終了位置)
  • 選択範囲のハイライト表示
    • Hexペインでの表示
    • ASCIIペインでの表示
    • 両ペインの同期
  • Shift+矢印キーで範囲選択
  • Ctrl+A で全選択

3. 編集機能(拡張)

  • バイト編集モード
    • Hexペインでの編集(0-9, A-F入力)
    • ASCIIペインでの編集
    • 入力値の検証
  • 挿入/上書きモードの切り替え(Insert / Ctrl+Shift+I)
  • 編集バッファの管理(Document構造体で実装済み)
    • 変更箇所の追跡(Overlay HashMap)
    • 変更済みバイトの視覚的表示
  • Undo/Redo
    • 編集履歴のスタック管理
    • Ctrl+Z / Ctrl+Y
    • 履歴の制限(メモリ管理、1000操作)

4. ファイル保存(拡張)

  • 現在のファイルに上書き保存
  • 保存確認ダイアログ(Ctrl+S時にネイティブダイアログで確認)
  • 別名で保存(Ctrl+Shift+S)
    • ファイルダイアログの実装
  • 終了時の未保存変更警告
  • 自動バックアップ(オプション)

5. コピー&ペースト ✅ 部分完了

  • コピー機能(Cmd+C)
    • ペイン対応スマートコピー(Hexペイン→hex文字列、ASCIIペイン→テキスト)
    • Copy as ASCII Text(非印字文字は . に置換)
    • Copy as Hex String(スペース区切り、例: 4A 6F 68 6E)
    • Copy as C Array(例: { 0x4A, 0x6F, 0x68, 0x6E })
    • コンテキストメニュー・Editメニューから各形式を選択可能
  • ペースト機能(Cmd+V)
    • クリップボードからhex文字列を解析して貼り付け
    • 挿入モード/上書きモード対応
  • カット機能(Cmd+X)

6. 仮想スクロール(パフォーマンス最適化)

目的: 大きなファイルでもスムーズに表示・操作できるようにする

現状の問題:

  • 現在、最大1000行までレンダリングを制限
  • 大きなファイル(例:187KB = 11,738行)では最初の1000行しか表示できない
  • 全行をレンダリングしようとするとウィンドウが表示されない
Phase 1: スクロール位置の追跡 ✅ 完了
  • scroll_offset: Pixelsフィールドを追加
  • 行の高さ定数を定義(ROW_HEIGHT = 20.0px、Phase 2で使用予定)
  • スクロールイベントのハンドリング(render()内で実装)
  • ScrollHandleからスクロール位置を取得(offset()メソッド使用)
Phase 2: 表示領域の計算 ✅ 完了
  • ビューポートサイズの取得方法を調査(ScrollHandle::bounds()使用)
  • 表示範囲計算メソッドの実装(calculate_visible_range())
    • first_visible_row の計算(scroll_offset / row_height)
    • visible_row_count の計算(viewport_height / row_height)
    • バッファ行の追加(前後5行、ちらつき防止)
Phase 3: レンダリングの最適化 ✅ 完了
  • コンテンツ全体の高さを設定(top + bottom spacer)
  • 表示領域内の行のみレンダリング(render_start..render_end)
  • 各行の位置を絶対座標で指定(スペーサーによる自動配置)
  • スクロール用のスペーサー要素を追加
    • 上部スペーサー(render_start * row_height)
    • 下部スペーサー((row_count - render_end) * row_height)
Phase 4: スクロールイベントの処理 ✅ 完了
  • スクロールイベントでscroll_offsetを更新(render()内で自動処理)
  • 再レンダリングのトリガー(gpuiが自動処理)
  • スクロールオフセットの符号修正(gpuiでは負の値で下方向)
Phase 5: カーソル追従機能 ✅ 完了
  • カーソル移動時に表示範囲をチェック(ensure_cursor_visible_by_row())
  • カーソルが画面外の場合、自動スクロール(scroll_to_item()使用)
  • スムーズなスクロール体験の実装
  • すべてのカーソル移動メソッドに追従処理を追加
Phase 6: 大容量ファイル対応 ✅ 完了
  • f32精度問題の解決(400MB以上のファイルで発生)
    • 内部計算にf64を使用
    • 仮想コンテンツ高さを1000万ピクセルに制限
    • 比率ベースのスペーサー計算
  • 末尾でのレンダリング修正
    • first_visible_rowのクランプ処理

🟡 中優先度(利便性向上)

7. 検索機能 ✅ 完了

  • 検索ダイアログ(Ctrl+F)
  • バイナリ検索
    • Hex値での検索(スペース区切り、例: "48 65 6C 6C 6F")
    • ワイルドカード対応("??" で任意のバイト)
  • テキスト検索
    • ASCII文字列での検索
    • 大文字小文字の区別オプション
  • 検索結果のナビゲーション
    • 次を検索(F3 / Enter)
    • 前を検索(Shift+F3)
    • すべての結果をハイライト(黄色)
    • 現在の結果をハイライト(オレンジ)
  • バックグラウンド検索
    • 別スレッドで検索実行(UIフリーズ防止)
    • 検索キャンセル機能(Esc)
    • 検索進行状況表示(ステータスバーに current/total 表示)
    • 定期的なUI更新(500msごと)
    • メモリマップファイルの再オープン(UIスレッドでのコピー回避)
    • 検索結果の上限(10,000件で打ち切り、truncated表示)
  • 検索結果への自動スクロール
  • スクロールバーに検索結果マーカー表示
  • 検索モード切り替え(Tab: ASCII ⇔ Hex)
  • 置換機能(Ctrl+H)

8. ファイルダイアログ ✅ 部分完了

  • 「ファイルを開く」メニュー(Ctrl+O / Cmd+O)
    • ネイティブファイルダイアログの表示
    • 最近使用したファイルのリスト
  • 「名前を付けて保存」(Ctrl+Shift+S)
  • ドラッグ&ドロップでファイルを開く

9. 情報表示 ✅ 完了

  • ステータスバー
    • 現在のバイト位置表示(Offset)
    • 選択範囲のサイズ表示
    • ファイルサイズ表示(B/KB/MB/GB)
    • カーソル位置の値表示(Hex/Dec/Bin)
  • データインスペクター(Ctrl+I で表示/非表示)
    • 選択バイトの解釈表示
    • Int8/16/32/64(符号あり/なし)
    • Float32/64
    • エンディアン切り替え(Ctrl+E: Little/Big)
    • Hex表示(8/16/32/64ビット)
  • オフセット計算ツール
    • 基数変換(Hex ⇔ Dec ⇔ Bin)
    • オフセット演算

🟢 低優先度(追加機能)

10. その他のパフォーマンス最適化

  • メモリマップドファイル(Document構造体で実装済み)
    • ファイル全体をメモリに読み込まない
    • オンデマンドでデータを読み込む(10MB以上)
  • 検索機能のパフォーマンス最適化
    • 効率的なデータアクセス
      • SearchDataSource列挙型(FilePath/InMemory)
      • メモリマップファイルはバックグラウンドで再オープン
      • UIスレッドでの大量データコピー回避
    • 検索結果マッチング判定の最適化
      • HashSetによるO(1)ルックアップ
      • HashSet構築をバックグラウンドスレッドで実行
      • レンダリング時の効率化(O(n*m) → O(1))
    • キー入力時のUIブロッキング解消
      • perform_search()内のstd::thread::sleep()を削除
      • 検索キーワード入力がスムーズに
    • 検索結果数の制限(最大10,000件)
  • 差分レンダリング
    • 変更部分のみを再描画
    • スクロール時のパフォーマンス向上

11. 高度な機能

  • タブ機能
    • 複数ファイルの同時表示
    • タブの切り替え(クリックまたはCtrl+Tab/Ctrl+Shift+Tab)
    • 新規タブ(Ctrl+T)
    • タブを閉じる(Ctrl+W)
    • タブのドラッグ&ドロップ(並び替え)
  • 比較モード
    • 2つのファイルを並べて比較
    • 差分のハイライト
    • Ctrl+K: 比較モードの開始/終了
    • タブ選択ダイアログ(数字キーまたはクリックで選択)
  • ブックマーク
    • 重要な位置にブックマークを設定(Ctrl+B)
    • ブックマーク間のジャンプ(F2 / Shift+F2)
    • ブックマークコメント機能
      • ブックマーク追加時にコメント入力バーを表示
      • 既存ブックマークのコメント編集(Ctrl+Shift+B)
      • ジャンプ時にコメントをステータスメッセージに表示
    • スクロールバーにブックマークマーカー表示(コメントなし: シアン、コメントあり: グリーン)
    • アドレス列にブックマークインジケーター表示(コメントなし: シアン、コメントあり: グリーン)
    • Hex/ASCIIカラムにブックマークバイトのアンダーライン表示(コメントなし: シアン、コメントあり: グリーン)
  • エクスポート
    • C配列形式でクリップボードにコピー(Copy as C Array)
    • C配列形式でファイルにエクスポート
    • Base64エンコード
    • Hex dump形式
  • Bitmap表示
    • バイナリデータをビットマップとして視覚化(Ctrl+M)
    • 幅の調整(+/-キー: 64/128/256/512/1024)
    • カラーマッピング(Cキー: Grayscale/Heatmap/Category)
    • カーソル位置追従とハイライト

12. カスタマイズ

  • 設定画面
    • フォントサイズ変更
    • カラーテーマ変更(Dark/Light/Monokai、ステータスバーのドロップダウンで切り替え、config.tomlで設定可能)
    • 1行あたりのバイト数変更(8/16/32)
  • キーボードショートカットのカスタマイズ
  • レイアウトの保存/復元

13. その他

  • コマンドパレット(Ctrl+Shift+P)
  • ヘルプドキュメント
  • チュートリアル
  • 使用統計(オプション)

🔄 進行中: Document構造体リファクタリング

目的

データ管理とUI表示の責務を分離し、巨大ファイル対応とUndo/Redo機能の基盤を構築する。

アーキテクチャ

  • DataBackend: 小ファイル用のInMemory、大ファイル用のMemoryMapped
  • Overlay: 編集バッファ(HashMap<offset, u8>)で変更箇所のみ保持
  • Edit History: Undo/Redoスタック管理

タスクリスト

Phase 1: Document基本実装 ✅ 完了

  • memmap2クレートをCargo.tomlに追加
  • src/document.rsファイルを作成
  • DataBackend enum実装(InMemory/MemoryMapped)
  • Edit構造体実装
  • Document構造体の基本定義
  • コンストラクタ実装(new, with_data, from_file)
  • ファイルI/O実装(load, save, save_as)
  • データアクセスメソッド実装(get_byte, get_slice, len)

Phase 2: 編集機能 ✅ 完了

  • Overlayベースのset_byte実装
  • 変更追跡機能(has_unsaved_changes, is_modified)
  • Undo/Redo実装(undo, redo, can_undo, can_redo)

Phase 3: HexEditorのリファクタリング ✅ 完了

  • HexEditor構造体をDocument使用に変更
  • データアクセスをdocument経由に移行
  • 編集操作をdocument.set_byte()に移行
  • ファイルI/Oをdocument経由に移行
  • 変更追跡ロジックをDocumentに委譲
  • Undo/Redoキーボードショートカット追加(Ctrl+Z / Ctrl+Y)

Phase 4: テストと検証(進行中)

  • 小ファイル(< 10MB)での動作確認
  • 大ファイル(> 10MB)でのmmap動作確認
  • Undo/Redo機能実装完了
  • 保存機能動作確認
  • パフォーマンス最適化(大量行のレンダリング問題)

📝 実装ノート

技術的な検討事項

  1. 状態管理

    • カーソル位置、選択範囲、編集バッファなどの状態をどう管理するか
    • gpuiの状態管理パターンに従う
  2. イベントハンドリング

    • キーボード入力のハンドリング
    • マウスイベントのハンドリング
    • フォーカス管理
  3. 描画最適化

    • 大きなファイルでのパフォーマンス
    • スクロール時のちらつき防止
  4. ファイルI/O

    • 非同期読み込み(UIブロックを防ぐ)
    • 部分的な読み込み(大容量ファイル対応)

次のステップ

推奨実装順序:

  1. カーソル機能(位置管理 + 表示)
  2. キーボードナビゲーション
  3. バイト編集機能
  4. 保存機能
  5. 選択とコピー&ペースト
  6. 検索機能

使い方(現在)

# サンプルデータを表示
cargo run

# ファイルを開く
cargo run -- <filepath>
cargo run -- Cargo.toml

ビルドとテスト

# ビルド
cargo build
cargo build --release

# 実行
cargo run
cargo run -- path/to/file

# テスト
cargo test

# コード品質
cargo clippy
cargo fmt