feat: improve UI
This commit is contained in:
139
public/scripts/navigation.js
Normal file
139
public/scripts/navigation.js
Normal file
@@ -0,0 +1,139 @@
|
||||
// Navigation Manager for SPORE LEDLab
|
||||
|
||||
class NavigationManager {
|
||||
constructor() {
|
||||
this.currentView = 'stream';
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.setupNavigationListeners();
|
||||
// Sync settings values on init
|
||||
this.syncSettingsValues();
|
||||
}
|
||||
|
||||
setupNavigationListeners() {
|
||||
// Navigation tab listeners
|
||||
const navTabs = document.querySelectorAll('.nav-tab');
|
||||
navTabs.forEach(tab => {
|
||||
tab.addEventListener('click', () => {
|
||||
const view = tab.dataset.view;
|
||||
this.switchView(view);
|
||||
});
|
||||
});
|
||||
|
||||
// Settings apply button
|
||||
const settingsApplyBtn = document.getElementById('settings-apply-matrix-btn');
|
||||
if (settingsApplyBtn) {
|
||||
settingsApplyBtn.addEventListener('click', () => {
|
||||
this.applySettingsFromView();
|
||||
});
|
||||
}
|
||||
|
||||
// Sync settings when stream view matrix config changes
|
||||
const streamWidthInput = document.getElementById('matrix-width');
|
||||
const streamHeightInput = document.getElementById('matrix-height');
|
||||
|
||||
if (streamWidthInput) {
|
||||
streamWidthInput.addEventListener('change', () => this.syncSettingsValues());
|
||||
}
|
||||
if (streamHeightInput) {
|
||||
streamHeightInput.addEventListener('change', () => this.syncSettingsValues());
|
||||
}
|
||||
}
|
||||
|
||||
switchView(viewName) {
|
||||
// Hide all views
|
||||
const allViews = document.querySelectorAll('.view-content');
|
||||
allViews.forEach(view => view.classList.remove('active'));
|
||||
|
||||
// Deactivate all tabs
|
||||
const allTabs = document.querySelectorAll('.nav-tab');
|
||||
allTabs.forEach(tab => tab.classList.remove('active'));
|
||||
|
||||
// Show selected view
|
||||
const targetView = document.getElementById(`${viewName}-view`);
|
||||
if (targetView) {
|
||||
targetView.classList.add('active');
|
||||
}
|
||||
|
||||
// Activate selected tab
|
||||
const targetTab = document.querySelector(`.nav-tab[data-view="${viewName}"]`);
|
||||
if (targetTab) {
|
||||
targetTab.classList.add('active');
|
||||
}
|
||||
|
||||
this.currentView = viewName;
|
||||
|
||||
// Sync values when switching to settings
|
||||
if (viewName === 'settings') {
|
||||
this.syncSettingsValues();
|
||||
}
|
||||
|
||||
console.log(`Switched to ${viewName} view`);
|
||||
}
|
||||
|
||||
syncSettingsValues() {
|
||||
// Sync matrix configuration values from stream to settings
|
||||
const streamWidth = document.getElementById('matrix-width');
|
||||
const streamHeight = document.getElementById('matrix-height');
|
||||
const settingsWidth = document.getElementById('settings-matrix-width');
|
||||
const settingsHeight = document.getElementById('settings-matrix-height');
|
||||
|
||||
if (streamWidth && settingsWidth) {
|
||||
settingsWidth.value = streamWidth.value;
|
||||
}
|
||||
if (streamHeight && settingsHeight) {
|
||||
settingsHeight.value = streamHeight.value;
|
||||
}
|
||||
}
|
||||
|
||||
applySettingsFromView() {
|
||||
const settingsWidth = document.getElementById('settings-matrix-width');
|
||||
const settingsHeight = document.getElementById('settings-matrix-height');
|
||||
const streamWidth = document.getElementById('matrix-width');
|
||||
const streamHeight = document.getElementById('matrix-height');
|
||||
|
||||
if (settingsWidth && streamWidth) {
|
||||
streamWidth.value = settingsWidth.value;
|
||||
}
|
||||
if (settingsHeight && streamHeight) {
|
||||
streamHeight.value = settingsHeight.value;
|
||||
}
|
||||
|
||||
// Trigger the apply button in the stream view
|
||||
const applyBtn = document.getElementById('apply-matrix-btn');
|
||||
if (applyBtn) {
|
||||
applyBtn.click();
|
||||
}
|
||||
|
||||
// Show success feedback
|
||||
const btn = document.getElementById('settings-apply-matrix-btn');
|
||||
if (btn) {
|
||||
const originalText = btn.textContent;
|
||||
btn.textContent = '✓ Applied!';
|
||||
btn.style.background = 'linear-gradient(135deg, var(--accent-success) 0%, #22c55e 100%)';
|
||||
|
||||
setTimeout(() => {
|
||||
btn.textContent = originalText;
|
||||
btn.style.background = '';
|
||||
}, 2000);
|
||||
}
|
||||
}
|
||||
|
||||
getCurrentView() {
|
||||
return this.currentView;
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize navigation when DOM is loaded
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
window.navigationManager = new NavigationManager();
|
||||
console.log('Navigation manager initialized');
|
||||
});
|
||||
|
||||
// Export for use in other modules
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = NavigationManager;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user