メニューの先 / original
DEVELOPMENT JOURNAL / 18
Photoshot
CODE × UI
無料Photoshop代替の開発記

メニューの先

17回までは調整機能の計算を確認しました。今回からPhotoshot編集ソフト全体へ範囲を広げます。見慣れたメニュー名に、実行条件・実際の命令・検証根拠・未対応範囲を結び付ける開発記です。

PHOTOSHOT DEVELOPMENT JOURNAL / 18

AI生成の動作例用写真。編集画面と出力画像は実際のPhotoshotで作成しました。

Photoshot無料Photoshop代替の開発記 / 18FOUNDATION

ソースから始める。

表示されることと完成は別

機能対照表はメニュー位置、機能、状態、実装・検証根拠、残る範囲を分けています。作業空間UIは部分実装とし、ドッキングや浮動パネルには個別の根拠を付けます。一つの完了表示で編集ソフト全体を説明しないためです。

16・17回は公開リポジトリーの固定コミットを読みました。今回は別の運用編集ソフト作業本app/studioが対象です。この拡張コードがすべて公開リポジトリーにあるとは説明しません。サイトの根拠ファイルにはファイル名・行番号・SHA-256・引用部分を記録しました。

文書の状態が実行可否を決める

photoshop-ui.tsxは選択レイヤーの有無、ロック、調整レイヤーかどうかを確認します。変形には位置ロック、フィルターには画素ロックなどの条件が加わります。マスク編集中かどうかも画素操作の条件に影響します。

2026年10月22日、公開画面に読み込んだ新しいAI人物レイヤーをロックするとEditのFree Transformが無効になり、解除すると有効に戻りました。この実測と、コードで読んだ他の条件は区別しています。ロック状態で強制実行する検査はしていません。

app/studio/photoshop-ui.tsx · SHA-256 13e6e581815a · L94–97Photoshotの実装コード ↗
 const allowed=!!active&&!layerLocked(doc,active)&&active.kind!=='adjustment';
 const transformAllowed=allowed&&!layerLocked(doc,active!,'position');
 const filterAllowed=allowed&&!layerLocked(doc,active!,'pixels');
 const pixelAllowed=!!active&&!layerLocked(doc,active,p.maskEditing?'all':'pixels')&&(p.maskEditing?!!active.mask?.enabled:active.kind!=='adjustment');
Photoshot無料Photoshop代替の開発記 / 18IMPLEMENTATION

計算の
内側へ。

命令検索も同じ機能への入口

command-search.tsxはメニューの経路・名称・韓国語別名を検索します。入力を空白で分割し、すべての語に一致する命令を最大60件表示します。実行直前にもdisabledを確認し、無効なメニューの迂回路にならないようにしています。

実際にHelp → Search Commandsで「이미지 크기」と入力するとImage Sizeが見つかり、Enterで寸法ダイアログが開きました。元画像と同じ1536×1024を確認し、サイズを変えずCancelで閉じました。結果画面は写真の補正結果ではなく、命令が開いた結果です。

ショートカットとパネルの検証範囲

対照表はキー編集・競合再割当・設定セット入出力のブラウザー検証を記録しつつ、OSやブラウザーが先に処理する予約キーは保証しないとしています。パネルの検証もOS側の複数モニターへのドッキングまでは含みません。

保存済みworkspace-uiとworkspace-structure-uiのファイル日時は2026年10月12日、workspace-renderは10月14日です。passedと検査項目を読みましたが、今日これらの全検査を再実行したという意味ではありません。今日の直接確認は韓国語検索、ダイアログ接続、ロックとメニュー状態です。

PHOTOSHOT / SOURCE NOTES18

コードを読む。

app/studio/command-search.tsx · SHA-256 4367fb9d8f5f · L4–4Photoshotの実装コード ↗
export type SearchCommand={id:string;label:string;path:string;key?:string;disabled?:boolean};
app/studio/command-search.tsx · SHA-256 4367fb9d8f5f · L9–9Photoshotの実装コード ↗
 const terms=query.toLocaleLowerCase().trim().split(/\s+/),matches=commands.filter(c=>terms.every(t=>(c.path+' '+c.label+' '+(aliases[c.id]??'')).toLocaleLowerCase().includes(t))).slice(0,60),current=Math.min(index,Math.max(0,matches.length-1));
app/studio/command-search.tsx · SHA-256 4367fb9d8f5f · L11–11Photoshotの実装コード ↗
 const execute=(c?:SearchCommand)=>{if(!c||c.disabled)return;close();run(c.id);};
Photoshot無料Photoshop代替の開発記 / 18IN PRACTICE

エディターで見る。

メニューの先 / workspace
実際のPhotoshot作業画面。設定と写真を一緒に確認できます。

結果・保存・失敗条件を残す

フィルター対照表には検証通過と並んでAdobeとの画素同等性は未検証などの制限があります。今後も入力、観察した出力、保存される状態を分けて説明します。メニューの存在だけで全ファイル・全環境への対応を主張しません。

実例の人物は新しいAI生成モデルです。原画像と実際のメニュー画面を別々に保存しました。19回では複数文書、保存、自動復旧、作業空間を扱い、ブラウザー内保存とダウンロードしたプロジェクトの役割から確認します。

Photoshot無料Photoshop代替の開発記 / 18BEFORE / AFTER

原画像と実行画面。

メニューの先 / original
01 / AI生成の実例原画像
メニューの先 / result
02 / Image Sizeの実行画面・変更せずキャンセル

AI生成の動作例用写真。編集画面と出力画像は実際のPhotoshotで作成しました。

確認したコードと検査

コード・検査記録・日付 ↗