Add settings dialog for Sky Mode and Skip Prompt, update main HTML and script
- Created `settings.html` with a dialog for adjusting settings related to Sky Mode and Skip Prompt. - Updated `main.html` to include context menus for folder operations. - Enhanced `main.js` with functionality to handle settings changes, apply Sky Mode, and add copy-to-clipboard feature for diffs. This commit message was automatically generated by auto-git
This commit is contained in:
112
main.js
112
main.js
@@ -1,4 +1,5 @@
|
||||
const { app, BrowserWindow, ipcMain, dialog } = require('electron');
|
||||
const { app, BrowserWindow, ipcMain, dialog, Menu, shell, clipboard } = require('electron');
|
||||
app.name = 'Auto-Git';
|
||||
const { exec } = require('child_process');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
@@ -9,7 +10,9 @@ const chokidar = require('chokidar');
|
||||
const store = new Store({
|
||||
defaults: {
|
||||
folders: [],
|
||||
selected: null
|
||||
selected: null,
|
||||
skymode: true,
|
||||
skipGitPrompt: true
|
||||
}
|
||||
});
|
||||
|
||||
@@ -24,7 +27,9 @@ function createWindow() {
|
||||
const win = new BrowserWindow({
|
||||
width: 900,
|
||||
height: 600,
|
||||
title: 'auto-git',
|
||||
minWidth: 600,
|
||||
minHeight: 400,
|
||||
title: 'Auto-Git',
|
||||
webPreferences: {
|
||||
preload: path.join(__dirname, 'preload.js'),
|
||||
contextIsolation: true
|
||||
@@ -34,6 +39,30 @@ function createWindow() {
|
||||
return win;
|
||||
}
|
||||
|
||||
// Settings-Fenster
|
||||
let settingsWin;
|
||||
function openSettings(win) {
|
||||
if (settingsWin) {
|
||||
settingsWin.focus();
|
||||
return;
|
||||
}
|
||||
settingsWin = new BrowserWindow({
|
||||
parent: win,
|
||||
modal: true,
|
||||
width: 400,
|
||||
height: 300,
|
||||
resizable: false,
|
||||
webPreferences: {
|
||||
preload: path.join(__dirname, 'preload.js'),
|
||||
contextIsolation: true
|
||||
}
|
||||
});
|
||||
settingsWin.removeMenu();
|
||||
settingsWin.loadFile('settings.html');
|
||||
settingsWin.on('closed', () => settingsWin = null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Startet einen File-Watcher auf .git/refs/heads/master,
|
||||
* sendet bei Änderungen 'repo-updated' an den Renderer.
|
||||
@@ -56,7 +85,7 @@ async function initGitRepo(folder) {
|
||||
const gitDir = path.join(folder, '.git');
|
||||
if (!fs.existsSync(gitDir)) {
|
||||
await git.init();
|
||||
const message = `Initial commit: ${new Date().toISOString()}`;
|
||||
const message = `Initial commit (generated by auto-git)`;
|
||||
const readmePath = path.join(folder, 'README.md');
|
||||
fs.writeFileSync(readmePath, `# Projekt in ${path.basename(folder)}\n`);
|
||||
await git.add('./*');
|
||||
@@ -67,6 +96,20 @@ async function initGitRepo(folder) {
|
||||
app.whenReady().then(() => {
|
||||
const win = createWindow();
|
||||
|
||||
// Menüs
|
||||
const menu = Menu.buildFromTemplate([
|
||||
{
|
||||
role: 'appMenu',
|
||||
submenu: [
|
||||
{
|
||||
label: 'Settings', click: () => openSettings(win)
|
||||
},
|
||||
{ role: 'quit', label: 'Quit' }
|
||||
]
|
||||
}, // mehr menüs hier
|
||||
]);
|
||||
Menu.setApplicationMenu(menu);
|
||||
|
||||
// 1) Beim Start bereits gespeicherte Ordner überwachen
|
||||
const folders = store.get('folders');
|
||||
folders.forEach(folder => {
|
||||
@@ -78,6 +121,7 @@ app.whenReady().then(() => {
|
||||
|
||||
// 2) IPC-Handler
|
||||
|
||||
|
||||
// Liste aller Folders
|
||||
ipcMain.handle('get-folders', () => store.get('folders'));
|
||||
|
||||
@@ -122,6 +166,30 @@ app.whenReady().then(() => {
|
||||
return updated;
|
||||
});
|
||||
|
||||
// Zähle Commits
|
||||
ipcMain.handle('get-commit-count', async (_e, folder) => {
|
||||
const git = simpleGit(folder);
|
||||
const log = await git.log();
|
||||
return log.total; // Anzahl der Commits
|
||||
});
|
||||
|
||||
// Prüfe, ob es ungestagte Änderungen gibt
|
||||
ipcMain.handle('has-diffs', async (_e, folder) => {
|
||||
const git = simpleGit(folder);
|
||||
const status = await git.status();
|
||||
// modified, not_added, deleted, etc.
|
||||
return status.files.length > 0;
|
||||
});
|
||||
|
||||
// Entferne das .git-Verzeichnis
|
||||
ipcMain.handle('remove-git-folder', async (_e, folder) => {
|
||||
const gitDir = path.join(folder, '.git');
|
||||
if (fs.existsSync(gitDir)) {
|
||||
await fs.promises.rm(gitDir, { recursive: true, force: true });
|
||||
}
|
||||
return;
|
||||
});
|
||||
|
||||
// Selected
|
||||
ipcMain.handle('get-selected', () => store.get('selected'));
|
||||
ipcMain.handle('set-selected', (_e, folder) => {
|
||||
@@ -186,9 +254,43 @@ app.whenReady().then(() => {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// IPC für skymode
|
||||
ipcMain.handle('get-skymode', () => store.get('skymode'));
|
||||
ipcMain.handle('set-skymode', (_e, val) => {
|
||||
store.set('skymode', val);
|
||||
// sende an alle Fenster
|
||||
BrowserWindow.getAllWindows().forEach(win => {
|
||||
win.webContents.send('skymode-changed', val);
|
||||
});
|
||||
});
|
||||
ipcMain.handle('get-skip-git-prompt', () => store.get('skipGitPrompt'));
|
||||
ipcMain.handle('set-skip-git-prompt', (_e,val) => store.set('skipGitPrompt', val));
|
||||
});
|
||||
|
||||
ipcMain.on('show-folder-context-menu', (event, folderPath) => {
|
||||
const win = BrowserWindow.fromWebContents(event.sender);
|
||||
const template = [
|
||||
{
|
||||
label: 'Copy Folder Path',
|
||||
click: () => {
|
||||
clipboard.writeText(folderPath);
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Open Folder',
|
||||
click: () => {
|
||||
// öffnet den Ordner in der nativen Dateiansicht
|
||||
shell.openPath(folderPath);
|
||||
}
|
||||
}
|
||||
];
|
||||
const menu = Menu.buildFromTemplate(template);
|
||||
menu.popup({ window: win });
|
||||
});
|
||||
|
||||
// clean up on exit
|
||||
app.on('window-all-closed', () => {
|
||||
if (process.platform !== 'darwin') app.quit();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user