feat: autoscroll standard, visualizzazione tag/date e OCR spaziale avanzato

- Aggiunto autoscroll standard con controllo velocità (V1-V10) e relativo toggle in settings.
- Implementata la visualizzazione opzionale di tag e data aggiornamento nella lista canti.
- Rinnovata la pagina 'Proponi Canto' con tastiera accordi (fondamentale + variazioni) e OCR spaziale potenziato per l'allineamento automatico degli accordi con il testo.
- Ottimizzata la persistenza della modalità schermo intero.
This commit is contained in:
David Frassi
2026-05-20 11:26:59 +02:00
parent af12a1f2da
commit 21c9c206e1
15 changed files with 970 additions and 225 deletions
@@ -4,11 +4,6 @@
<ion-back-button defaultHref="/home" color="secondary"></ion-back-button>
</ion-buttons>
<ion-title class="outfit-font">Mio Canto</ion-title>
<ion-buttons slot="end">
<ion-button (click)="isHighContrast = !isHighContrast" [color]="isHighContrast ? 'warning' : 'medium'">
<ion-icon slot="icon-only" name="contrast-outline"></ion-icon>
</ion-button>
</ion-buttons>
</ion-toolbar>
</ion-header>
@@ -58,9 +53,28 @@
</div>
</div>
<!-- Main Chords Selector Toolbar -->
<div class="toolbar-section">
<div class="horizontal-toolbar chords-toolbar">
<ion-button size="small" *ngFor="let chord of commonChords" (click)="insertChord(chord)">
<div class="horizontal-toolbar main-chords-toolbar">
<ion-button
*ngFor="let group of groupedChords"
size="small"
[fill]="selectedRootChord === group.root ? 'solid' : 'outline'"
[color]="selectedRootChord === group.root ? 'secondary' : 'light'"
(click)="selectRoot(group.root)">
{{ group.root }}
</ion-button>
</div>
</div>
<!-- Variations Toolbar (only visible if a root chord is selected) -->
<div class="toolbar-section variations-container" *ngIf="selectedRootChord">
<div class="horizontal-toolbar variations-toolbar">
<span class="variations-label">Variazioni {{ selectedRootChord }}:</span>
<ion-button
size="small"
*ngFor="let chord of getVariations()"
(click)="insertChord(chord)">
{{ chord }}
</ion-button>
</div>
@@ -79,9 +93,6 @@
<ion-button fill="clear" size="small" (click)="takePhoto()">
<ion-icon name="camera-outline"></ion-icon>
</ion-button>
<ion-button fill="clear" size="small" (click)="uploadDoc()">
<ion-icon name="document-text-outline"></ion-icon>
</ion-button>
</div>
</div>
<ion-item class="custom-input-item textarea-item">
@@ -90,8 +101,7 @@
[(ngModel)]="content"
placeholder="Scrivi o scansiona..."
rows="18"
class="content-textarea"
(click)="openQuickMenu($event)">
class="content-textarea">
</ion-textarea>
</ion-item>
</div>
@@ -111,34 +121,8 @@
</div>
</div>
<!-- QUICK INSERT POPOVER -->
<ion-popover [isOpen]="isChordPopoverOpen" (didDismiss)="isChordPopoverOpen = false" class="quick-popover">
<ng-template>
<ion-content class="ion-padding">
<div class="popover-container">
<div class="popover-section">
<h6>Struttura e Tag</h6>
<div class="popover-grid tags-grid">
<ion-button *ngFor="let tag of commonTags" size="small" fill="outline" (click)="insertText(tag.start); isChordPopoverOpen = false">
{{ tag.label }}
</ion-button>
</div>
</div>
<div class="popover-section">
<h6>Accordi Comuni</h6>
<div class="popover-grid chords-grid">
<ion-button *ngFor="let chord of commonChords" size="small" (click)="insertChord(chord); isChordPopoverOpen = false">
{{ chord }}
</ion-button>
</div>
</div>
</div>
</ion-content>
</ng-template>
</ion-popover>
<!-- Hidden inputs -->
<input type="file" #cameraInput (change)="onFileSelected($event, true)" accept="image/*" capture="camera" style="display: none;">
<input type="file" #docInput (change)="onFileSelected($event, false)" accept=".pdf,.docx,.txt,.odt" style="display: none;">
</ion-content>