Open psmuler opened 1 year ago
electron
のBrowserWindow
を使ってカスタムのinputboxとOK, Cancelボタンを備えたダイアログボックスを表示するために、以下の手順でmain.js
とrenderer.js
ファイルを更新し、新しいHTMLファイルbranch_input.html
を作成します。
branch_input.html
ファイルを作成し、入力ボックスとOK, Cancelボタンを含めます。<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Branch Input</title>
<style>
body {
text-align: center;
padding: 20px;
}
input {
width: 300px;
}
</style>
</head>
<body>
<h1>New Branch</h1>
<input id="branch-name" type="text" placeholder="Enter branch name" />
<br />
<button id="ok-btn">OK</button>
<button id="cancel-btn">Cancel</button>
<script src="renderer.js"></script>
</body>
</html>
main.js
ファイルで、createBranchInputDialog
関数を作成し、カスタムダイアログのBrowserWindow
を作成します。また、ipcMain
をインポートし、ダイアログからのイベントを処理できるようにします。const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');
// ... (他のコードは省略) ...
function createBranchInputDialog() {
const inputDialog = new BrowserWindow({
width: 400,
height: 200,
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
},
});
inputDialog.loadFile(path.join(__dirname, 'branch_input.html'));
}
ipcMain.handle('show-branch-input-dialog', () => {
createBranchInputDialog();
});
// ... (他のコードは省略) ...
renderer.js
ファイルで、プルダウンメニューの選択が変更されたときに、カスタムダイアログを表示するように更新します。また、新しいブランチ名を取得してブランチを作成する処理を追加します。
const { ipcRenderer } = require('electron');
const fs = require('fs');
const { exec } = require('child_process');
// ... (他のコードは省略) ...
branchSelect.addEventListener('change', () => {
if (branchSelect.value === 'Create new branch') {
ipcRenderer.invoke('show-branch-input-dialog');
// プルダウンメニューの選択をリセット
branchSelect.value = '';
}
});
ipcRenderer.on('create-new-branch', (event, newBranchName) => {
const folderPath = folderPathSpan.textContent;
exec(`git -C "${folderPath}" checkout -b "${newBranchName.trim()}"`, (error, stdout, stderr) => {
// ... (他のコードは省略) ...
});
});
// ... (他のコードは省略) ...
ipcRenderer.on('create-new-branch')の中身を詳細に書いてもらえますか
ipcRenderer.on('create-new-branch')
のイベントリスナー内で、新しいブランチを作成するためにgit checkout -b
コマンドを実行します。作成されたブランチに切り替えることも含まれます。また、ブランチが作成された後、ブランチ一覧を更新するためにupdateBranchList()
関数を呼び出します。
renderer.js
ファイルのipcRenderer.on('create-new-branch')
イベントリスナーを以下のように更新します。
// ... (他のコードは省略) ...
ipcRenderer.on('create-new-branch', (event, newBranchName) => {
const folderPath = folderPathSpan.textContent;
// 新しいブランチを作成し、作成されたブランチに切り替える
exec(`git -C "${folderPath}" checkout -b "${newBranchName.trim()}"`, (error, stdout, stderr) => {
if (error) {
console.error(`Error: ${error.message}`);
return;
}
if (stderr) {
console.error(`Stderr: ${stderr}`);
return;
}
console.log(`Stdout: ${stdout}`);
// ブランチ一覧を更新
updateBranchList(folderPath);
});
});
// ... (他のコードは省略) ...
この変更により、create-new-branch
イベントがトリガーされたときに、新しいブランチを作成し、作成されたブランチに切り替えます。また、ブランチ作成後にブランチ一覧を更新します。
ポップアップしたダイアログでOKボタンを押した時のイベントリスナを設定してください
ポップアップしたダイアログでOKボタンを押したときのイベントリスナを設定するには、renderer.js
ファイルに以下のコードを追加します。このコードは、branch_input.html
ファイルで読み込まれるため、同じrenderer.js
ファイル内に追加することができます。
// ... (他のコードは省略) ...
if (document.getElementById('branch-input')) {
const okBtn = document.getElementById('ok-btn');
const cancelBtn = document.getElementById('cancel-btn');
const branchNameInput = document.getElementById('branch-name');
okBtn.addEventListener('click', () => {
const newBranchName = branchNameInput.value;
if (newBranchName.trim() === '') {
alert('Branch name cannot be empty');
return;
}
ipcRenderer.send('create-new-branch', newBranchName);
window.close();
});
cancelBtn.addEventListener('click', () => {
window.close();
});
}
// ... (他のコードは省略) ...
このコードは、OKボタンがクリックされたときに、入力されたブランチ名を検証し、新しいブランチ名としてメインプロセスに送信します。また、キャンセルボタンがクリックされたときにダイアログを閉じます。
注意: 上記のコードは、renderer.js
ファイルの他の部分と同じファイルに配置されていますが、if (document.getElementById('branch-input'))
条件により、branch_input.html
ページでのみ実行されます。これは、他のページではbranch-input
要素が存在しないためです。
他のダイアログボックスなどで変数の汚染があるといけませんから、新しいjsファイルに書き込んだほうがいいのではないでしょうか
おっしゃる通りです。新しいJavaScriptファイルを作成して、ダイアログボックス専用のコードをそこに移動することで、変数の汚染を防ぐことができます。以下の手順に従って、新しいファイルbranch_input_renderer.js
を作成しましょう。
branch_input_renderer.js
という新しいファイルを作成します。
renderer.js
ファイルから、ダイアログボックスのイベントリスナに関連するコードをbranch_input_renderer.js
ファイルに移動します。
branch_input_renderer.js
:
const { ipcRenderer } = require('electron');
const okBtn = document.getElementById('ok-btn');
const cancelBtn = document.getElementById('cancel-btn');
const branchNameInput = document.getElementById('branch-name');
okBtn.addEventListener('click', () => {
const newBranchName = branchNameInput.value;
if (newBranchName.trim() === '') {
alert('Branch name cannot be empty');
return;
}
ipcRenderer.send('create-new-branch', newBranchName);
window.close();
});
cancelBtn.addEventListener('click', () => {
window.close();
});
branch_input.html
ファイルで、新しく作成したbranch_input_renderer.js
ファイルを読み込むように変更します。branch_input.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Branch Input</title>
<style>
body {
text-align: center;
padding: 20px;
}
input {
width: 300px;
}
</style>
</head>
<body>
<h1>New Branch</h1>
<input id="branch-name" type="text" placeholder="Enter branch name" />
<br />
<button id="ok-btn">OK</button>
<button id="cancel-btn">Cancel</button>
<script src="branch_input_renderer.js"></script>
</body>
</html>
これで、新しいブランチの作成に関する処理がbranch_input_renderer.js
に移動され、他のコードとの変数の汚染を防ぐことができます。
branch_input_renderer がipcRenderer.sendを実行していますが、renderer.jsと通信できるのでしょうか
はい、branch_input_renderer.js
からrenderer.js
と通信できます。Electronアプリケーションでは、ipcRenderer
とipcMain
を使って異なるプロセス間でメッセージをやり取りすることができます。branch_input_renderer.js
からrenderer.js
への通信は、ipcRenderer
からipcMain
への通信となり、ipcMain
はrenderer.js
にメッセージを転送します。
この場合、branch_input_renderer.js
はipcRenderer.send('create-new-branch', newBranchName);
を使ってcreate-new-branch
イベントを送信します。このイベントは、main.js
ファイルのipcMain
によって受信され、main.js
はrenderer.js
にイベントを転送します。
main.js
ファイルで、以下のようにbranch_input
ウィンドウとmainWindow
間でイベントをリレーすることができます。
// ... (他のコードは省略) ...
ipcMain.on('create-new-branch', (event, newBranchName) => {
mainWindow.webContents.send('create-new-branch', newBranchName);
});
// ... (他のコードは省略) ...
renderer.js
ファイルでは、ipcRenderer.on('create-new-branch')
イベントリスナーを追加して、main.js
からのイベントを受信し、適切な処理を実行します。
// ... (他のコードは省略) ...
ipcRenderer.on('create-new-branch', (event, newBranchName) => {
const folderPath = folderPathSpan.textContent;
// 新しいブランチを作成し、作成されたブランチに切り替える
exec(`git -C "${folderPath}" checkout -b "${newBranchName.trim()}"`, (error, stdout, stderr) => {
if (error) {
console.error(`Error: ${error.message}`);
return;
}
if (stderr) {
console.error(`Stderr: ${stderr}`);
return;
}
console.log(`Stdout: ${stdout}`);
// ブランチ一覧を更新
updateBranchList(folderPath);
});
});
// ... (他のコードは省略) ...
この方法で、branch_input_renderer.js
からrenderer.js
への通信が可能になります。
branchの作成はできましたが、renderer.js>ipcRenderer.on('create-new-branch')>exec(git -C...
)内の Switched to a new branchがstderrとして認識され、updateBranchListが実行されずにreturnされてしまいます
git checkout -b
コマンドは、新しいブランチへ切り替えた際にメッセージを stderr
に出力することがありますが、これはエラーではありません。そのため、stderr
にメッセージが出力された場合でも、それがエラーであるかどうかをチェックする必要があります。
renderer.js
内の ipcRenderer.on('create-new-branch')
イベントリスナーの処理を次のように修正して、stderr
にメッセージがあってもエラーでなければ updateBranchList
を実行するようにしましょう。
// ... (他のコードは省略) ...
ipcRenderer.on('create-new-branch', (event, newBranchName) => {
const folderPath = folderPathSpan.textContent;
// 新しいブランチを作成し、作成されたブランチに切り替える
exec(`git -C "${folderPath}" checkout -b "${newBranchName.trim()}"`, (error, stdout, stderr) => {
if (error) {
console.error(`Error: ${error.message}`);
return;
}
// エラーでない場合、stderr の内容を出力
if (stderr) {
console.log(`Info: ${stderr}`);
}
console.log(`Stdout: ${stdout}`);
// ブランチ一覧を更新
updateBranchList(folderPath);
});
});
// ... (他のコードは省略) ...
この変更により、新しいブランチが作成された場合、updateBranchList
が正常に実行されるようになります。ただし、stderr
にエラーが出力された場合は、それがエラーであるかどうかを判断するために適切な処理を追加することが重要です。今回の場合、新しいブランチへの切り替えメッセージが stderr
に出力されるだけなので、エラーとして扱わないように修正しました。
先ほど作りかけた、新しいブランチを作る処理を加えたプルダウンメニューですが、create new branch を選択しても何も表示されません。let inputDialog = new BrowserWindowなどを用いてカスタムでinputboxとOK,Cancelボタンを備えたダイアローグボックスを表示しましょう