- gpuiライブラリの統合
- 基本的なウィンドウ表示
- 3カラムレイアウト(アドレス、Hex、ASCII)
- 16進数表示とASCII表示
- モノスペースフォントでの整列表示
- バイト配列の管理 (
Vec<u8>) - 16バイト/行のフォーマット
- アドレス表示(8桁の16進数)
- Hex値のフォーマット
- ASCII文字の表示(制御文字は '.' で表示)
- サンプルデータの生成
- コマンドライン引数でファイルパスを受け取る
- ファイルの読み込み (
load_file()) - ファイル名のヘッダー表示
- ファイルサイズの表示
- エラーハンドリング(ファイル読み込み失敗時のフォールバック)
- ダークテーマ (#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)」表示
- 保存エラーハンドリング
- カーソル位置の管理
- 現在のバイト位置を保持
- Hexペイン/ASCIIペインの切り替え
- カーソルの視覚的表示
- 選択中のバイトをハイライト
- カーソル位置のインジケーター
- 基本的なキーボードナビゲーション
- 矢印キー(上下左右)
- 拡張キーボードナビゲーション
- Page Up / Page Down
- Home / End
- Ctrl+Home / Ctrl+End(ファイルの先頭/末尾)
- Shift+上記キーで範囲選択
- カーソル移動時の自動スクロール
- キーボード移動時のスクロール追従
- マウスクリック・ドラッグ時のスクロール追従
- マウス操作
- クリックでバイト選択
- ドラッグで範囲選択
- 選択範囲の管理(開始位置、終了位置)
- 選択範囲のハイライト表示
- Hexペインでの表示
- ASCIIペインでの表示
- 両ペインの同期
- Shift+矢印キーで範囲選択
- Ctrl+A で全選択
- バイト編集モード
- Hexペインでの編集(0-9, A-F入力)
- ASCIIペインでの編集
- 入力値の検証
- 挿入/上書きモードの切り替え(Insert / Ctrl+Shift+I)
- 編集バッファの管理(Document構造体で実装済み)
- 変更箇所の追跡(Overlay HashMap)
- 変更済みバイトの視覚的表示
- Undo/Redo
- 編集履歴のスタック管理
- Ctrl+Z / Ctrl+Y
- 履歴の制限(メモリ管理、1000操作)
- 現在のファイルに上書き保存
- 保存確認ダイアログ(Ctrl+S時にネイティブダイアログで確認)
- 別名で保存(Ctrl+Shift+S)
- ファイルダイアログの実装
- 終了時の未保存変更警告
- 自動バックアップ(オプション)
- コピー機能(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)
目的: 大きなファイルでもスムーズに表示・操作できるようにする
現状の問題:
- 現在、最大1000行までレンダリングを制限
- 大きなファイル(例:187KB = 11,738行)では最初の1000行しか表示できない
- 全行をレンダリングしようとするとウィンドウが表示されない
-
scroll_offset: Pixelsフィールドを追加 - 行の高さ定数を定義(
ROW_HEIGHT = 20.0px、Phase 2で使用予定) - スクロールイベントのハンドリング(render()内で実装)
- ScrollHandleからスクロール位置を取得(offset()メソッド使用)
- ビューポートサイズの取得方法を調査(ScrollHandle::bounds()使用)
- 表示範囲計算メソッドの実装(calculate_visible_range())
- first_visible_row の計算(scroll_offset / row_height)
- visible_row_count の計算(viewport_height / row_height)
- バッファ行の追加(前後5行、ちらつき防止)
- コンテンツ全体の高さを設定(top + bottom spacer)
- 表示領域内の行のみレンダリング(render_start..render_end)
- 各行の位置を絶対座標で指定(スペーサーによる自動配置)
- スクロール用のスペーサー要素を追加
- 上部スペーサー(render_start * row_height)
- 下部スペーサー((row_count - render_end) * row_height)
- スクロールイベントで
scroll_offsetを更新(render()内で自動処理) - 再レンダリングのトリガー(gpuiが自動処理)
- スクロールオフセットの符号修正(gpuiでは負の値で下方向)
- カーソル移動時に表示範囲をチェック(ensure_cursor_visible_by_row())
- カーソルが画面外の場合、自動スクロール(scroll_to_item()使用)
- スムーズなスクロール体験の実装
- すべてのカーソル移動メソッドに追従処理を追加
- f32精度問題の解決(400MB以上のファイルで発生)
- 内部計算にf64を使用
- 仮想コンテンツ高さを1000万ピクセルに制限
- 比率ベースのスペーサー計算
- 末尾でのレンダリング修正
- first_visible_rowのクランプ処理
- 検索ダイアログ(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)
- 「ファイルを開く」メニュー(Ctrl+O / Cmd+O)
- ネイティブファイルダイアログの表示
- 最近使用したファイルのリスト
- 「名前を付けて保存」(Ctrl+Shift+S)
- ドラッグ&ドロップでファイルを開く
- ステータスバー
- 現在のバイト位置表示(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)
- オフセット演算
- メモリマップドファイル(Document構造体で実装済み)
- ファイル全体をメモリに読み込まない
- オンデマンドでデータを読み込む(10MB以上)
- 検索機能のパフォーマンス最適化
- 効率的なデータアクセス
- SearchDataSource列挙型(FilePath/InMemory)
- メモリマップファイルはバックグラウンドで再オープン
- UIスレッドでの大量データコピー回避
- 検索結果マッチング判定の最適化
- HashSetによるO(1)ルックアップ
- HashSet構築をバックグラウンドスレッドで実行
- レンダリング時の効率化(O(n*m) → O(1))
- キー入力時のUIブロッキング解消
- perform_search()内のstd::thread::sleep()を削除
- 検索キーワード入力がスムーズに
- 検索結果数の制限(最大10,000件)
- 効率的なデータアクセス
- 差分レンダリング
- 変更部分のみを再描画
- スクロール時のパフォーマンス向上
- タブ機能
- 複数ファイルの同時表示
- タブの切り替え(クリックまたは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)
- カーソル位置追従とハイライト
- 設定画面
- フォントサイズ変更
- カラーテーマ変更(Dark/Light/Monokai、ステータスバーのドロップダウンで切り替え、config.tomlで設定可能)
- 1行あたりのバイト数変更(8/16/32)
- キーボードショートカットのカスタマイズ
- レイアウトの保存/復元
- コマンドパレット(Ctrl+Shift+P)
- ヘルプドキュメント
- チュートリアル
- 使用統計(オプション)
データ管理とUI表示の責務を分離し、巨大ファイル対応とUndo/Redo機能の基盤を構築する。
- DataBackend: 小ファイル用のInMemory、大ファイル用のMemoryMapped
- Overlay: 編集バッファ(HashMap<offset, u8>)で変更箇所のみ保持
- Edit History: Undo/Redoスタック管理
- 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)
- Overlayベースのset_byte実装
- 変更追跡機能(has_unsaved_changes, is_modified)
- Undo/Redo実装(undo, redo, can_undo, can_redo)
- HexEditor構造体をDocument使用に変更
- データアクセスをdocument経由に移行
- 編集操作をdocument.set_byte()に移行
- ファイルI/Oをdocument経由に移行
- 変更追跡ロジックをDocumentに委譲
- Undo/Redoキーボードショートカット追加(Ctrl+Z / Ctrl+Y)
- 小ファイル(< 10MB)での動作確認
- 大ファイル(> 10MB)でのmmap動作確認
- Undo/Redo機能実装完了
- 保存機能動作確認
- パフォーマンス最適化(大量行のレンダリング問題)
-
状態管理
- カーソル位置、選択範囲、編集バッファなどの状態をどう管理するか
- gpuiの状態管理パターンに従う
-
イベントハンドリング
- キーボード入力のハンドリング
- マウスイベントのハンドリング
- フォーカス管理
-
描画最適化
- 大きなファイルでのパフォーマンス
- スクロール時のちらつき防止
-
ファイルI/O
- 非同期読み込み(UIブロックを防ぐ)
- 部分的な読み込み(大容量ファイル対応)
推奨実装順序:
- カーソル機能(位置管理 + 表示)
- キーボードナビゲーション
- バイト編集機能
- 保存機能
- 選択とコピー&ペースト
- 検索機能
# サンプルデータを表示
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