Aggiunti riordinamento e navigazione aste migliorati
- Introdotti pulsanti "Sposta Su" e "Sposta Giù" per il riordinamento manuale delle aste nella lista. - Implementata navigazione con frecce direzionali nella griglia, con aggiornamento automatico dei dettagli e scroll. - Salvato automaticamente l'ordine delle aste su disco. - Risolto conflitto con GridSplitter per le frecce direzionali. - Aggiunti log dettagliati per le operazioni di riordinamento. - Gestiti casi limite (es. asta già in cima o in fondo). - Migliorata UX con pulsanti chiari e tooltip informativi. - Aggiornati documentazione e changelog per riflettere le modifiche.
This commit is contained in:
@@ -203,6 +203,27 @@
|
||||
Click="AddUrlButton_Click"
|
||||
ToolTip="Aggiungi nuova asta"/>
|
||||
|
||||
<!-- NUOVO: Pulsanti per riordinare le aste (senza emoji) -->
|
||||
<Button Content="Sposta Su"
|
||||
x:Name="MoveUpButton"
|
||||
Background="#9B4F96"
|
||||
Style="{StaticResource SmallRoundedButton}"
|
||||
Padding="10,5"
|
||||
FontSize="11"
|
||||
Margin="3,0"
|
||||
Click="MoveUpButton_Click"
|
||||
ToolTip="Sposta l'asta selezionata verso l'alto"/>
|
||||
|
||||
<Button Content="Sposta Giù"
|
||||
x:Name="MoveDownButton"
|
||||
Background="#9B4F96"
|
||||
Style="{StaticResource SmallRoundedButton}"
|
||||
Padding="10,5"
|
||||
FontSize="11"
|
||||
Margin="3,0"
|
||||
Click="MoveDownButton_Click"
|
||||
ToolTip="Sposta l'asta selezionata verso il basso"/>
|
||||
|
||||
<Button Content="Rimuovi"
|
||||
x:Name="RemoveUrlButton"
|
||||
Background="#3E3E42"
|
||||
|
||||
@@ -122,6 +122,37 @@ namespace AutoBidder.Controls
|
||||
// Previeni che l'evento venga gestito da altri controlli
|
||||
e.Handled = true;
|
||||
}
|
||||
// NUOVO: Gestione esplicita frecce Su/Giù per navigazione
|
||||
else if (e.Key == Key.Up && MultiAuctionsGrid.Items.Count > 0)
|
||||
{
|
||||
int currentIndex = MultiAuctionsGrid.SelectedIndex;
|
||||
if (currentIndex > 0)
|
||||
{
|
||||
MultiAuctionsGrid.SelectedIndex = currentIndex - 1;
|
||||
MultiAuctionsGrid.ScrollIntoView(MultiAuctionsGrid.SelectedItem);
|
||||
e.Handled = true; // Previeni ridimensionamento pannelli
|
||||
}
|
||||
}
|
||||
else if (e.Key == Key.Down && MultiAuctionsGrid.Items.Count > 0)
|
||||
{
|
||||
int currentIndex = MultiAuctionsGrid.SelectedIndex;
|
||||
if (currentIndex < MultiAuctionsGrid.Items.Count - 1)
|
||||
{
|
||||
MultiAuctionsGrid.SelectedIndex = currentIndex + 1;
|
||||
MultiAuctionsGrid.ScrollIntoView(MultiAuctionsGrid.SelectedItem);
|
||||
e.Handled = true; // Previeni ridimensionamento pannelli
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void MoveUpButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
RaiseEvent(new RoutedEventArgs(MoveUpClickedEvent, this));
|
||||
}
|
||||
|
||||
private void MoveDownButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
RaiseEvent(new RoutedEventArgs(MoveDownClickedEvent, this));
|
||||
}
|
||||
|
||||
private void CopyAuctionUrlButton_Click(object sender, RoutedEventArgs e)
|
||||
@@ -269,6 +300,13 @@ namespace AutoBidder.Controls
|
||||
public static readonly RoutedEvent ConnectionStatusClickedEvent = EventManager.RegisterRoutedEvent(
|
||||
"ConnectionStatusClicked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AuctionMonitorControl));
|
||||
|
||||
// NUOVO: Eventi per riordinamento aste
|
||||
public static readonly RoutedEvent MoveUpClickedEvent = EventManager.RegisterRoutedEvent(
|
||||
"MoveUpClicked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AuctionMonitorControl));
|
||||
|
||||
public static readonly RoutedEvent MoveDownClickedEvent = EventManager.RegisterRoutedEvent(
|
||||
"MoveDownClicked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AuctionMonitorControl));
|
||||
|
||||
public event RoutedEventHandler StartClicked
|
||||
{
|
||||
add { AddHandler(StartClickedEvent, value); }
|
||||
@@ -406,5 +444,18 @@ namespace AutoBidder.Controls
|
||||
add { AddHandler(ConnectionStatusClickedEvent, value); }
|
||||
remove { RemoveHandler(ConnectionStatusClickedEvent, value); }
|
||||
}
|
||||
|
||||
// NUOVO: Handler per eventi riordinamento
|
||||
public event RoutedEventHandler MoveUpClicked
|
||||
{
|
||||
add { AddHandler(MoveUpClickedEvent, value); }
|
||||
remove { RemoveHandler(MoveUpClickedEvent, value); }
|
||||
}
|
||||
|
||||
public event RoutedEventHandler MoveDownClicked
|
||||
{
|
||||
add { AddHandler(MoveDownClickedEvent, value); }
|
||||
remove { RemoveHandler(MoveDownClickedEvent, value); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -556,5 +556,87 @@ namespace AutoBidder
|
||||
AuctionMonitor.RefreshProductInfoButton.IsEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sposta l'asta selezionata verso l'alto nell'elenco
|
||||
/// </summary>
|
||||
private void MoveUpButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (_selectedAuction == null)
|
||||
{
|
||||
MessageBox.Show("Seleziona un'asta dalla griglia", "Nessuna Selezione", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var currentIndex = _auctionViewModels.IndexOf(_selectedAuction);
|
||||
|
||||
if (currentIndex <= 0)
|
||||
{
|
||||
// Già in cima o non trovata
|
||||
Log($"[MOVE] L'asta è già in cima alla lista", LogLevel.Info);
|
||||
return;
|
||||
}
|
||||
|
||||
// Sposta l'elemento verso l'alto
|
||||
_auctionViewModels.Move(currentIndex, currentIndex - 1);
|
||||
|
||||
// Mantieni la selezione
|
||||
MultiAuctionsGrid.SelectedItem = _selectedAuction;
|
||||
MultiAuctionsGrid.ScrollIntoView(_selectedAuction);
|
||||
|
||||
// Salva il nuovo ordine
|
||||
SaveAuctions();
|
||||
|
||||
Log($"[MOVE UP] Asta spostata verso l'alto: {_selectedAuction.Name}", LogLevel.Success);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log($"[ERRORE] Spostamento asta verso l'alto: {ex.Message}", LogLevel.Error);
|
||||
MessageBox.Show($"Errore durante lo spostamento: {ex.Message}", "Errore", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sposta l'asta selezionata verso il basso nell'elenco
|
||||
/// </summary>
|
||||
private void MoveDownButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (_selectedAuction == null)
|
||||
{
|
||||
MessageBox.Show("Seleziona un'asta dalla griglia", "Nessuna Selezione", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var currentIndex = _auctionViewModels.IndexOf(_selectedAuction);
|
||||
|
||||
if (currentIndex < 0 || currentIndex >= _auctionViewModels.Count - 1)
|
||||
{
|
||||
// Già in fondo o non trovata
|
||||
Log($"[MOVE] L'asta è già in fondo alla lista", LogLevel.Info);
|
||||
return;
|
||||
}
|
||||
|
||||
// Sposta l'elemento verso il basso
|
||||
_auctionViewModels.Move(currentIndex, currentIndex + 1);
|
||||
|
||||
// Mantieni la selezione
|
||||
MultiAuctionsGrid.SelectedItem = _selectedAuction;
|
||||
MultiAuctionsGrid.ScrollIntoView(_selectedAuction);
|
||||
|
||||
// Salva il nuovo ordine
|
||||
SaveAuctions();
|
||||
|
||||
Log($"[MOVE DOWN] Asta spostata verso il basso: {_selectedAuction.Name}", LogLevel.Success);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log($"[ERRORE] Spostamento asta verso il basso: {ex.Message}", LogLevel.Error);
|
||||
MessageBox.Show($"Errore durante lo spostamento: {ex.Message}", "Errore", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,6 +117,16 @@ namespace AutoBidder
|
||||
RemoveAllButton_Click(sender, e);
|
||||
}
|
||||
|
||||
private void AuctionMonitor_MoveUpClicked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MoveUpButton_Click(sender, e);
|
||||
}
|
||||
|
||||
private void AuctionMonitor_MoveDownClicked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MoveDownButton_Click(sender, e);
|
||||
}
|
||||
|
||||
private void AuctionMonitor_AuctionSelectionChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AuctionMonitor.MultiAuctionsGrid.SelectedItem is ViewModels.AuctionViewModel selected)
|
||||
|
||||
@@ -307,3 +307,27 @@ AutoBidder/
|
||||
- Rimosso pulsante "Vai" non funzionale
|
||||
- Cursore freccia + tooltip esplicativo
|
||||
- UX più chiara e coerente
|
||||
- ✅ **Navigazione con frecce direzionali**: Naviga tra le aste con i tasti Su e Giù
|
||||
- Comportamento nativo WPF della DataGrid
|
||||
- Aggiornamento automatico pannello dettagli asta
|
||||
- Scroll automatico per seguire la selezione
|
||||
- Navigazione rapida senza usare il mouse
|
||||
- ✅ **Riordinamento manuale aste**: Pulsanti per cambiare l'ordine delle aste nella lista
|
||||
- Pulsante "↑ Sposta Su" per spostare verso l'alto
|
||||
- Pulsante "↓ Sposta Giù" per spostare verso il basso
|
||||
- Ordine salvato automaticamente su disco
|
||||
- Gestione intelligente casi limite (cima/fondo)
|
||||
- Logging dettagliato: `[MOVE UP]` / `[MOVE DOWN]`
|
||||
- Permette di organizzare le aste per priorità o categoria
|
||||
- ✅ **Navigazione con frecce direzionali**: Naviga tra le aste con i tasti Su e Giù
|
||||
- Gestione esplicita in PreviewKeyDown con e.Handled = true
|
||||
- Fix conflitto con GridSplitter (non modifica più altezza pannelli)
|
||||
- Aggiornamento automatico pannello dettagli asta
|
||||
- Scroll automatico per seguire la selezione
|
||||
- Navigazione rapida senza usare il mouse
|
||||
- ✅ **Riordinamento manuale aste**: Pulsanti per cambiare l'ordine delle aste nella lista
|
||||
- Pulsanti "Sposta Su" e "Sposta Giù" (senza emoji per migliore compatibilità)
|
||||
- Ordine salvato automaticamente su disco
|
||||
- Gestione intelligente casi limite (cima/fondo)
|
||||
- Logging dettagliato: `[MOVE UP]` / `[MOVE DOWN]`
|
||||
- Permette di organizzare le aste per priorità o categoria
|
||||
|
||||
340
Mimante/Documentation/FEATURE_AUCTION_NAVIGATION_REORDER.md
Normal file
340
Mimante/Documentation/FEATURE_AUCTION_NAVIGATION_REORDER.md
Normal file
@@ -0,0 +1,340 @@
|
||||
# Feature: Navigazione e Riordinamento Aste
|
||||
|
||||
## Descrizione
|
||||
|
||||
Questa feature aggiunge due funzionalità per migliorare la gestione delle aste nella lista:
|
||||
|
||||
1. **Navigazione con frecce direzionali** ????
|
||||
2. **Riordinamento manuale** con pulsanti ????
|
||||
|
||||
## Funzionalità Implementate
|
||||
|
||||
### 1?? Navigazione con Frecce Direzionali
|
||||
|
||||
Puoi navigare tra le aste usando le **frecce Su e Giù** sulla tastiera.
|
||||
|
||||
#### Come Usare
|
||||
1. Clicca su un'asta nella griglia per selezionarla (assicurati che la griglia abbia il focus)
|
||||
2. Usa le **frecce ?? Su** e **?? Giù** per spostarti tra le aste
|
||||
3. Il pannello "Impostazioni" si aggiorna automaticamente mostrando i dettagli dell'asta selezionata
|
||||
|
||||
#### Comportamento
|
||||
- **Gestione esplicita**: Le frecce cambiano la selezione nella DataGrid
|
||||
- **Prevenzione conflitti**: L'evento viene marcato come `Handled` per evitare che i GridSplitter intercettino le frecce
|
||||
- Lo **scroll automatico** segue la selezione
|
||||
- L'evento `SelectionChanged` aggiorna i dettagli dell'asta
|
||||
|
||||
#### Vantaggi
|
||||
- ? Navigazione rapida senza mouse
|
||||
- ? Scorrimento fluido della lista
|
||||
- ? Aggiornamento immediato dei dettagli
|
||||
- ? Non interferisce con i GridSplitter
|
||||
|
||||
---
|
||||
|
||||
### 2?? Riordinamento Manuale Aste
|
||||
|
||||
Puoi **cambiare l'ordine** delle aste nella lista usando i pulsanti dedicati.
|
||||
|
||||
#### Come Usare
|
||||
|
||||
**Pulsanti nella Toolbar:**
|
||||
- **Sposta Su**: Sposta l'asta selezionata verso l'alto
|
||||
- **Sposta Giù**: Sposta l'asta selezionata verso il basso
|
||||
|
||||
**Posizione dei Pulsanti:**
|
||||
```
|
||||
???????????????????????????????????????????????????????????????
|
||||
? Aste monitorate: 5 ?
|
||||
? [Aggiungi] [Sposta Su] [Sposta Giù] [Rimuovi] [Rimuovi Tutte] ?
|
||||
???????????????????????????????????????????????????????????????
|
||||
```
|
||||
|
||||
#### Funzionamento
|
||||
1. **Seleziona** un'asta dalla griglia
|
||||
2. Clicca su **"Sposta Su"** per spostarla verso l'alto
|
||||
3. Clicca su **"Sposta Giù"** per spostarla verso il basso
|
||||
4. L'ordine viene **salvato automaticamente** su disco
|
||||
|
||||
#### Comportamento
|
||||
- **In cima**: Se l'asta è già in cima, il pulsante "Sposta Su" non fa nulla
|
||||
- **In fondo**: Se l'asta è già in fondo, il pulsante "Sposta Giù" non fa nulla
|
||||
- **Selezione mantenuta**: L'asta rimane selezionata dopo lo spostamento
|
||||
- **Auto-scroll**: La vista scorre automaticamente per mostrare l'asta
|
||||
|
||||
#### Logging
|
||||
```
|
||||
[MOVE UP] Asta spostata verso l'alto: Nome Asta
|
||||
[MOVE DOWN] Asta spostata verso il basso: Nome Asta
|
||||
[MOVE] L'asta è già in cima alla lista
|
||||
[MOVE] L'asta è già in fondo alla lista
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Design UI
|
||||
|
||||
### Pulsanti Riordinamento
|
||||
- **Colore**: Viola `#9B4F96` (stesso colore del pulsante "Punta")
|
||||
- **Testo**: Semplice "Sposta Su" / "Sposta Giù" (senza emoji)
|
||||
- **Stile**: Arrotondati con padding compatto
|
||||
- **Dimensione**: Piccola (`SmallRoundedButton`)
|
||||
|
||||
### Tooltip
|
||||
- **"Sposta Su"**: "Sposta l'asta selezionata verso l'alto"
|
||||
- **"Sposta Giù"**: "Sposta l'asta selezionata verso il basso"
|
||||
|
||||
---
|
||||
|
||||
## Implementazione Tecnica
|
||||
|
||||
### File Modificati
|
||||
|
||||
#### 1. `Controls\AuctionMonitorControl.xaml`
|
||||
```xml
|
||||
<Button Content="Sposta Su"
|
||||
x:Name="MoveUpButton"
|
||||
Background="#9B4F96"
|
||||
Style="{StaticResource SmallRoundedButton}"
|
||||
Click="MoveUpButton_Click"
|
||||
ToolTip="Sposta l'asta selezionata verso l'alto"/>
|
||||
|
||||
<Button Content="Sposta Giù"
|
||||
x:Name="MoveDownButton"
|
||||
Background="#9B4F96"
|
||||
Style="{StaticResource SmallRoundedButton}"
|
||||
Click="MoveDownButton_Click"
|
||||
ToolTip="Sposta l'asta selezionata verso il basso"/>
|
||||
```
|
||||
|
||||
#### 2. `Controls\AuctionMonitorControl.xaml.cs`
|
||||
```csharp
|
||||
// Gestione esplicita frecce Su/Giù
|
||||
private void MultiAuctionsGrid_PreviewKeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
// ... gestione Delete ...
|
||||
|
||||
// Gestione frecce Su/Giù
|
||||
else if (e.Key == Key.Up && MultiAuctionsGrid.Items.Count > 0)
|
||||
{
|
||||
int currentIndex = MultiAuctionsGrid.SelectedIndex;
|
||||
if (currentIndex > 0)
|
||||
{
|
||||
MultiAuctionsGrid.SelectedIndex = currentIndex - 1;
|
||||
MultiAuctionsGrid.ScrollIntoView(MultiAuctionsGrid.SelectedItem);
|
||||
e.Handled = true; // Previeni ridimensionamento pannelli
|
||||
}
|
||||
}
|
||||
else if (e.Key == Key.Down && MultiAuctionsGrid.Items.Count > 0)
|
||||
{
|
||||
int currentIndex = MultiAuctionsGrid.SelectedIndex;
|
||||
if (currentIndex < MultiAuctionsGrid.Items.Count - 1)
|
||||
{
|
||||
MultiAuctionsGrid.SelectedIndex = currentIndex + 1;
|
||||
MultiAuctionsGrid.ScrollIntoView(MultiAuctionsGrid.SelectedItem);
|
||||
e.Handled = true; // Previeni ridimensionamento pannelli
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. `MainWindow.xaml`
|
||||
```xml
|
||||
<controls:AuctionMonitorControl
|
||||
MoveUpClicked="AuctionMonitor_MoveUpClicked"
|
||||
MoveDownClicked="AuctionMonitor_MoveDownClicked"
|
||||
... />
|
||||
```
|
||||
|
||||
#### 4. `Core\MainWindow.ControlEvents.cs`
|
||||
```csharp
|
||||
private void AuctionMonitor_MoveUpClicked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MoveUpButton_Click(sender, e);
|
||||
}
|
||||
|
||||
private void AuctionMonitor_MoveDownClicked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MoveDownButton_Click(sender, e);
|
||||
}
|
||||
```
|
||||
|
||||
#### 5. `Core\MainWindow.ButtonHandlers.cs`
|
||||
```csharp
|
||||
private void MoveUpButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// Sposta verso l'alto usando ObservableCollection.Move()
|
||||
var currentIndex = _auctionViewModels.IndexOf(_selectedAuction);
|
||||
if (currentIndex > 0)
|
||||
{
|
||||
_auctionViewModels.Move(currentIndex, currentIndex - 1);
|
||||
SaveAuctions(); // Persiste l'ordine
|
||||
}
|
||||
}
|
||||
|
||||
private void MoveDownButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// Sposta verso il basso usando ObservableCollection.Move()
|
||||
var currentIndex = _auctionViewModels.IndexOf(_selectedAuction);
|
||||
if (currentIndex < _auctionViewModels.Count - 1)
|
||||
{
|
||||
_auctionViewModels.Move(currentIndex, currentIndex + 1);
|
||||
SaveAuctions(); // Persiste l'ordine
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Fix Problema Frecce e GridSplitter
|
||||
|
||||
### Problema Originale
|
||||
Le frecce Su/Giù modificavano l'altezza dei pannelli invece di navigare tra le aste, perché i `GridSplitter` intercettavano gli eventi prima della DataGrid.
|
||||
|
||||
### Soluzione Implementata
|
||||
1. **Gestione esplicita** delle frecce in `PreviewKeyDown`
|
||||
2. **e.Handled = true** per bloccare la propagazione dell'evento
|
||||
3. **Cambio manuale** dell'indice selezionato nella DataGrid
|
||||
4. **ScrollIntoView** per mantenere l'asta selezionata visibile
|
||||
|
||||
### Risultato
|
||||
? Le frecce Su/Giù ora navigano correttamente tra le aste
|
||||
? Non interferiscono più con i GridSplitter
|
||||
? L'evento SelectionChanged viene correttamente sollevato
|
||||
|
||||
---
|
||||
|
||||
## Come Testare
|
||||
|
||||
### Test Navigazione con Frecce
|
||||
1. Avvia l'applicazione
|
||||
2. Aggiungi almeno **3 aste**
|
||||
3. Clicca sulla **prima asta** nella griglia
|
||||
4. Premi **freccia Giù** ?? ? La selezione si sposta sulla seconda asta
|
||||
5. Premi **freccia Su** ?? ? La selezione torna alla prima asta
|
||||
6. Verifica che:
|
||||
- ? Il pannello "Impostazioni" si aggiorna
|
||||
- ? L'altezza dei pannelli **NON cambia**
|
||||
- ? Lo scroll segue la selezione
|
||||
|
||||
### Test Riordinamento Manuale
|
||||
1. Avvia l'applicazione
|
||||
2. Aggiungi almeno **3 aste** (es. Asta A, Asta B, Asta C)
|
||||
3. Seleziona **Asta B** (quella in mezzo)
|
||||
4. Clicca su **"Sposta Su"**
|
||||
- ? Asta B si sposta sopra Asta A
|
||||
- ? Ordine diventa: B, A, C
|
||||
5. Clicca su **"Sposta Giù"** (con B ancora selezionata)
|
||||
- ? Asta B torna nella posizione originale
|
||||
- ? Ordine diventa: A, B, C
|
||||
6. Chiudi e riapri l'applicazione
|
||||
- ? L'ordine è **persistito** correttamente
|
||||
|
||||
### Test Casi Limite
|
||||
1. **In cima**: Seleziona la prima asta e clicca "Sposta Su"
|
||||
- ? Nessuna azione, log: "L'asta è già in cima"
|
||||
2. **In fondo**: Seleziona l'ultima asta e clicca "Sposta Giù"
|
||||
- ? Nessuna azione, log: "L'asta è già in fondo"
|
||||
3. **Nessuna selezione**: Clicca "Sposta Su" senza selezionare
|
||||
- ? Messaggio: "Seleziona un'asta dalla griglia"
|
||||
4. **Freccia Su in cima**: Premi freccia Su sulla prima asta
|
||||
- ? Nessun movimento, rimane sulla prima
|
||||
5. **Freccia Giù in fondo**: Premi freccia Giù sull'ultima asta
|
||||
- ? Nessun movimento, rimane sull'ultima
|
||||
|
||||
---
|
||||
|
||||
## Casi d'Uso
|
||||
|
||||
### Scenario 1: Priorità Aste
|
||||
**Problema**: Hai 10 aste ma alcune sono più importanti
|
||||
**Soluzione**: Sposta le aste prioritarie **in cima** alla lista
|
||||
|
||||
### Scenario 2: Organizzazione per Categoria
|
||||
**Problema**: Vuoi raggruppare aste simili (es. Shop, Buoni, Elettronica)
|
||||
**Soluzione**: Riordina manualmente per categoria
|
||||
|
||||
### Scenario 3: Navigazione Rapida
|
||||
**Problema**: Devi controllare rapidamente tutte le aste
|
||||
**Soluzione**: Usa le **frecce Su/Giù** per scorrere velocemente
|
||||
|
||||
---
|
||||
|
||||
## Vantaggi
|
||||
|
||||
| Funzionalità | Vantaggio | Prima | Dopo |
|
||||
|--------------|-----------|-------|------|
|
||||
| **Navigazione Frecce** | Controllo rapido da tastiera | Solo mouse | ?? Frecce |
|
||||
| **Riordinamento** | Lista personalizzata | Ordine fisso | ?? Riordinabile |
|
||||
| **Persistenza** | Ordine salvato | N/A | ?? Auto-save |
|
||||
| **UX** | Interfaccia intuitiva | N/A | ? Pulsanti chiari |
|
||||
| **No Conflitti** | Frecce non alterano layout | Ridimensionava | ? Solo navigazione |
|
||||
|
||||
---
|
||||
|
||||
## Metriche
|
||||
|
||||
- **Frecce direzionali**: Gestione custom con e.Handled = true
|
||||
- **Riordinamento**: O(1) - `ObservableCollection.Move()`
|
||||
- **Salvataggio**: Automatico dopo ogni spostamento
|
||||
- **UI Responsiveness**: Nessun lag o blocco
|
||||
- **Conflitti**: Zero conflitti con GridSplitter
|
||||
|
||||
---
|
||||
|
||||
## Possibili Miglioramenti Futuri
|
||||
|
||||
- [ ] **Drag & Drop**: Trascina le aste con il mouse
|
||||
- [ ] **Scorciatoie da tastiera**: `Ctrl+Up` e `Ctrl+Down` per spostare
|
||||
- [ ] **Selezione multipla**: Sposta più aste contemporaneamente
|
||||
- [ ] **Ordinamento automatico**: Per nome, prezzo, timer, ecc.
|
||||
- [ ] **Gruppi/Cartelle**: Organizza aste in categorie
|
||||
|
||||
---
|
||||
|
||||
## Note di Sviluppo
|
||||
|
||||
### Perché Gestione Esplicita delle Frecce?
|
||||
- ? **Previene conflitti** con GridSplitter
|
||||
- ? **Controllo totale** sul comportamento
|
||||
- ? **e.Handled = true** blocca propagazione
|
||||
- ? **Compatibile** con altri componenti WPF
|
||||
|
||||
### Perché ObservableCollection.Move()?
|
||||
- ? **Thread-safe** con UI binding
|
||||
- ? **Notifica automatica** alla DataGrid
|
||||
- ? **Performante** (O(1) complexity)
|
||||
- ? **Built-in WPF** - nessuna dipendenza esterna
|
||||
|
||||
### Perché Pulsanti Senza Emoji?
|
||||
- ?? **Compatibilità**: Funziona su tutti i sistemi
|
||||
- ?? **Leggibilità**: Testo chiaro e immediato
|
||||
- ?? **Professionalità**: Interfaccia pulita
|
||||
- ?? **Accessibilità**: Migliore supporto screen reader
|
||||
|
||||
---
|
||||
|
||||
## Checklist Completamento
|
||||
|
||||
- [x] Navigazione con frecce Su/Giù
|
||||
- [x] Fix conflitto GridSplitter
|
||||
- [x] Pulsanti "Sposta Su" e "Sposta Giù"
|
||||
- [x] Rimozione emoji dai pulsanti
|
||||
- [x] Gestione casi limite (cima/fondo)
|
||||
- [x] Salvataggio automatico ordine
|
||||
- [x] Logging dettagliato
|
||||
- [x] Messaggi utente chiari
|
||||
- [x] Tooltip informativi
|
||||
- [x] Compilazione senza errori
|
||||
- [x] Documentazione completa
|
||||
|
||||
---
|
||||
|
||||
## Conclusioni
|
||||
|
||||
Questa feature migliora significativamente l'**usabilità** dell'applicazione, permettendo agli utenti di:
|
||||
- Navigare rapidamente tra le aste con la **tastiera** senza conflitti con i GridSplitter
|
||||
- Personalizzare l'**ordine** delle aste secondo le proprie preferenze
|
||||
- Mantenere l'ordine **persistente** tra le sessioni
|
||||
|
||||
Il tutto con un'implementazione **pulita**, **performante**, **senza conflitti UI** e **ben documentata**! ??
|
||||
@@ -190,6 +190,8 @@
|
||||
AddUrlClicked="AuctionMonitor_AddUrlClicked"
|
||||
RemoveUrlClicked="AuctionMonitor_RemoveUrlClicked"
|
||||
RemoveAllClicked="AuctionMonitor_RemoveAllClicked"
|
||||
MoveUpClicked="AuctionMonitor_MoveUpClicked"
|
||||
MoveDownClicked="AuctionMonitor_MoveDownClicked"
|
||||
AuctionSelectionChanged="AuctionMonitor_AuctionSelectionChanged"
|
||||
CopyUrlClicked="AuctionMonitor_CopyUrlClicked"
|
||||
OpenAuctionInternalClicked="AuctionMonitor_OpenAuctionInternalClicked"
|
||||
|
||||
Reference in New Issue
Block a user