seperate toggleFeature in windowmanager
This commit is contained in:
parent
ffcc1cb9a3
commit
68f9042a69
@ -78,6 +78,148 @@ function updateLayout() {
|
|||||||
let movementManager = null;
|
let movementManager = null;
|
||||||
|
|
||||||
|
|
||||||
|
async function toggleFeature(featureName) {
|
||||||
|
if (!windowPool.get(featureName) && currentHeaderState === 'main') {
|
||||||
|
createFeatureWindows(windowPool.get('header'));
|
||||||
|
}
|
||||||
|
|
||||||
|
const header = windowPool.get('header');
|
||||||
|
if (featureName === 'listen') {
|
||||||
|
console.log(`[WindowManager] Toggling feature: ${featureName}`);
|
||||||
|
const listenWindow = windowPool.get(featureName);
|
||||||
|
const listenService = global.listenService;
|
||||||
|
if (listenService && listenService.isSessionActive()) {
|
||||||
|
console.log('[WindowManager] Listen session is active, closing it via toggle.');
|
||||||
|
await listenService.closeSession();
|
||||||
|
listenWindow.webContents.send('session-state-changed', { isActive: false });
|
||||||
|
header.webContents.send('session-state-text', 'Done');
|
||||||
|
// return;
|
||||||
|
} else {
|
||||||
|
if (listenWindow.isVisible()) {
|
||||||
|
listenWindow.webContents.send('window-hide-animation');
|
||||||
|
listenWindow.webContents.send('session-state-changed', { isActive: false });
|
||||||
|
header.webContents.send('session-state-text', 'Listen');
|
||||||
|
} else {
|
||||||
|
listenWindow.show();
|
||||||
|
updateLayout();
|
||||||
|
listenWindow.webContents.send('window-show-animation');
|
||||||
|
await listenService.initializeSession();
|
||||||
|
listenWindow.webContents.send('session-state-changed', { isActive: true });
|
||||||
|
header.webContents.send('session-state-text', 'Stop');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (featureName === 'ask') {
|
||||||
|
let askWindow = windowPool.get('ask');
|
||||||
|
|
||||||
|
if (!askWindow || askWindow.isDestroyed()) {
|
||||||
|
console.log('[WindowManager] Ask window not found, creating new one');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (askWindow.isVisible()) {
|
||||||
|
try {
|
||||||
|
const hasResponse = await askWindow.webContents.executeJavaScript(`
|
||||||
|
(() => {
|
||||||
|
try {
|
||||||
|
// PickleGlassApp의 Shadow DOM 내부로 접근
|
||||||
|
const pickleApp = document.querySelector('pickle-glass-app');
|
||||||
|
if (!pickleApp || !pickleApp.shadowRoot) {
|
||||||
|
console.log('PickleGlassApp not found');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PickleGlassApp의 shadowRoot 내부에서 ask-view 찾기
|
||||||
|
const askView = pickleApp.shadowRoot.querySelector('ask-view');
|
||||||
|
if (!askView) {
|
||||||
|
console.log('AskView not found in PickleGlassApp shadow DOM');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('AskView found, checking state...');
|
||||||
|
console.log('currentResponse:', askView.currentResponse);
|
||||||
|
console.log('isLoading:', askView.isLoading);
|
||||||
|
console.log('isStreaming:', askView.isStreaming);
|
||||||
|
|
||||||
|
const hasContent = !!(askView.currentResponse || askView.isLoading || askView.isStreaming);
|
||||||
|
|
||||||
|
if (!hasContent && askView.shadowRoot) {
|
||||||
|
const responseContainer = askView.shadowRoot.querySelector('.response-container');
|
||||||
|
if (responseContainer && !responseContainer.classList.contains('hidden')) {
|
||||||
|
const textContent = responseContainer.textContent.trim();
|
||||||
|
const hasActualContent = textContent &&
|
||||||
|
!textContent.includes('Ask a question to see the response here') &&
|
||||||
|
textContent.length > 0;
|
||||||
|
console.log('Response container content check:', hasActualContent);
|
||||||
|
return hasActualContent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hasContent;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error checking AskView state:', error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
`);
|
||||||
|
|
||||||
|
console.log(`[WindowManager] Ask window visible, hasResponse: ${hasResponse}`);
|
||||||
|
|
||||||
|
if (hasResponse) {
|
||||||
|
askWindow.webContents.send('toggle-text-input');
|
||||||
|
console.log('[WindowManager] Sent toggle-text-input command');
|
||||||
|
} else {
|
||||||
|
console.log('[WindowManager] No response found, closing window');
|
||||||
|
askWindow.webContents.send('window-hide-animation');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[WindowManager] Error checking Ask window state:', error);
|
||||||
|
console.log('[WindowManager] Falling back to toggle text input');
|
||||||
|
askWindow.webContents.send('toggle-text-input');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log('[WindowManager] Showing hidden Ask window');
|
||||||
|
askWindow.show();
|
||||||
|
updateLayout();
|
||||||
|
askWindow.webContents.send('window-show-animation');
|
||||||
|
askWindow.webContents.send('window-did-show');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (featureName === 'settings') {
|
||||||
|
const settingsWindow = windowPool.get(featureName);
|
||||||
|
|
||||||
|
if (settingsWindow) {
|
||||||
|
if (settingsWindow.isDestroyed()) {
|
||||||
|
console.error(`Window ${featureName} is destroyed, cannot toggle`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingsWindow.isVisible()) {
|
||||||
|
if (featureName === 'settings') {
|
||||||
|
settingsWindow.webContents.send('settings-window-hide-animation');
|
||||||
|
} else {
|
||||||
|
settingsWindow.webContents.send('window-hide-animation');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
settingsWindow.show();
|
||||||
|
updateLayout();
|
||||||
|
|
||||||
|
settingsWindow.webContents.send('window-show-animation');
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Error showing window:', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.error(`Window not found for feature: ${featureName}`);
|
||||||
|
console.error('Available windows:', Array.from(windowPool.keys()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function createFeatureWindows(header, namesToCreate) {
|
function createFeatureWindows(header, namesToCreate) {
|
||||||
// if (windowPool.has('listen')) return;
|
// if (windowPool.has('listen')) return;
|
||||||
|
|
||||||
@ -450,144 +592,7 @@ function createWindows() {
|
|||||||
ipcMain.handle('toggle-all-windows-visibility', () => toggleAllWindowsVisibility());
|
ipcMain.handle('toggle-all-windows-visibility', () => toggleAllWindowsVisibility());
|
||||||
|
|
||||||
ipcMain.handle('toggle-feature', async (event, featureName) => {
|
ipcMain.handle('toggle-feature', async (event, featureName) => {
|
||||||
if (!windowPool.get(featureName) && currentHeaderState === 'main') {
|
return toggleFeature(featureName);
|
||||||
createFeatureWindows(windowPool.get('header'));
|
|
||||||
}
|
|
||||||
|
|
||||||
const header = windowPool.get('header');
|
|
||||||
if (featureName === 'listen') {
|
|
||||||
console.log(`[WindowManager] Toggling feature: ${featureName}`);
|
|
||||||
const listenWindow = windowPool.get(featureName);
|
|
||||||
const listenService = global.listenService;
|
|
||||||
if (listenService && listenService.isSessionActive()) {
|
|
||||||
console.log('[WindowManager] Listen session is active, closing it via toggle.');
|
|
||||||
await listenService.closeSession();
|
|
||||||
listenWindow.webContents.send('session-state-changed', { isActive: false });
|
|
||||||
header.webContents.send('session-state-text', 'Done');
|
|
||||||
// return;
|
|
||||||
} else {
|
|
||||||
if (listenWindow.isVisible()) {
|
|
||||||
listenWindow.webContents.send('window-hide-animation');
|
|
||||||
listenWindow.webContents.send('session-state-changed', { isActive: false });
|
|
||||||
header.webContents.send('session-state-text', 'Listen');
|
|
||||||
} else {
|
|
||||||
listenWindow.show();
|
|
||||||
updateLayout();
|
|
||||||
listenWindow.webContents.send('window-show-animation');
|
|
||||||
await listenService.initializeSession();
|
|
||||||
listenWindow.webContents.send('session-state-changed', { isActive: true });
|
|
||||||
header.webContents.send('session-state-text', 'Stop');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (featureName === 'ask') {
|
|
||||||
let askWindow = windowPool.get('ask');
|
|
||||||
|
|
||||||
if (!askWindow || askWindow.isDestroyed()) {
|
|
||||||
console.log('[WindowManager] Ask window not found, creating new one');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (askWindow.isVisible()) {
|
|
||||||
try {
|
|
||||||
const hasResponse = await askWindow.webContents.executeJavaScript(`
|
|
||||||
(() => {
|
|
||||||
try {
|
|
||||||
// PickleGlassApp의 Shadow DOM 내부로 접근
|
|
||||||
const pickleApp = document.querySelector('pickle-glass-app');
|
|
||||||
if (!pickleApp || !pickleApp.shadowRoot) {
|
|
||||||
console.log('PickleGlassApp not found');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PickleGlassApp의 shadowRoot 내부에서 ask-view 찾기
|
|
||||||
const askView = pickleApp.shadowRoot.querySelector('ask-view');
|
|
||||||
if (!askView) {
|
|
||||||
console.log('AskView not found in PickleGlassApp shadow DOM');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('AskView found, checking state...');
|
|
||||||
console.log('currentResponse:', askView.currentResponse);
|
|
||||||
console.log('isLoading:', askView.isLoading);
|
|
||||||
console.log('isStreaming:', askView.isStreaming);
|
|
||||||
|
|
||||||
const hasContent = !!(askView.currentResponse || askView.isLoading || askView.isStreaming);
|
|
||||||
|
|
||||||
if (!hasContent && askView.shadowRoot) {
|
|
||||||
const responseContainer = askView.shadowRoot.querySelector('.response-container');
|
|
||||||
if (responseContainer && !responseContainer.classList.contains('hidden')) {
|
|
||||||
const textContent = responseContainer.textContent.trim();
|
|
||||||
const hasActualContent = textContent &&
|
|
||||||
!textContent.includes('Ask a question to see the response here') &&
|
|
||||||
textContent.length > 0;
|
|
||||||
console.log('Response container content check:', hasActualContent);
|
|
||||||
return hasActualContent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return hasContent;
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error checking AskView state:', error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
})()
|
|
||||||
`);
|
|
||||||
|
|
||||||
console.log(`[WindowManager] Ask window visible, hasResponse: ${hasResponse}`);
|
|
||||||
|
|
||||||
if (hasResponse) {
|
|
||||||
askWindow.webContents.send('toggle-text-input');
|
|
||||||
console.log('[WindowManager] Sent toggle-text-input command');
|
|
||||||
} else {
|
|
||||||
console.log('[WindowManager] No response found, closing window');
|
|
||||||
askWindow.webContents.send('window-hide-animation');
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error('[WindowManager] Error checking Ask window state:', error);
|
|
||||||
console.log('[WindowManager] Falling back to toggle text input');
|
|
||||||
askWindow.webContents.send('toggle-text-input');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
console.log('[WindowManager] Showing hidden Ask window');
|
|
||||||
askWindow.show();
|
|
||||||
updateLayout();
|
|
||||||
askWindow.webContents.send('window-show-animation');
|
|
||||||
askWindow.webContents.send('window-did-show');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (featureName === 'settings') {
|
|
||||||
const settingsWindow = windowPool.get(featureName);
|
|
||||||
|
|
||||||
if (settingsWindow) {
|
|
||||||
if (settingsWindow.isDestroyed()) {
|
|
||||||
console.error(`Window ${featureName} is destroyed, cannot toggle`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settingsWindow.isVisible()) {
|
|
||||||
if (featureName === 'settings') {
|
|
||||||
settingsWindow.webContents.send('settings-window-hide-animation');
|
|
||||||
} else {
|
|
||||||
settingsWindow.webContents.send('window-hide-animation');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
settingsWindow.show();
|
|
||||||
updateLayout();
|
|
||||||
|
|
||||||
settingsWindow.webContents.send('window-show-animation');
|
|
||||||
} catch (e) {
|
|
||||||
console.error('Error showing window:', e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
console.error(`Window not found for feature: ${featureName}`);
|
|
||||||
console.error('Available windows:', Array.from(windowPool.keys()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.handle('send-question-to-ask', (event, question) => {
|
ipcMain.handle('send-question-to-ask', (event, question) => {
|
||||||
@ -1342,17 +1347,7 @@ function updateGlobalShortcuts(keybinds, mainWindow, sendToRenderer, movementMan
|
|||||||
callback = () => toggleAllWindowsVisibility();
|
callback = () => toggleAllWindowsVisibility();
|
||||||
break;
|
break;
|
||||||
case 'nextStep':
|
case 'nextStep':
|
||||||
callback = () => {
|
callback = () => toggleFeature('ask');
|
||||||
const askWindow = windowPool.get('ask');
|
|
||||||
if (!askWindow || askWindow.isDestroyed()) return;
|
|
||||||
if (askWindow.isVisible()) {
|
|
||||||
askWindow.webContents.send('ask-global-send');
|
|
||||||
} else {
|
|
||||||
askWindow.show();
|
|
||||||
updateLayout();
|
|
||||||
askWindow.webContents.send('window-show-animation');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
break;
|
break;
|
||||||
case 'scrollUp':
|
case 'scrollUp':
|
||||||
callback = () => {
|
callback = () => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user