Aggiungi il setup per-utente e fissa il DB nella cartella di installazione
Nuovo installer/PrepStep.iss (Inno Setup 6): installa in %LOCALAPPDATA%\Programs\PrepStep senza diritti di amministratore, con collegamenti nel menu Start al programma e al disinstallatore. Se l'app è già installata chiede se aggiornarla o disinstallarla (Inno da solo aggiornerebbe sempre); con /VERYSILENT aggiorna senza chiedere. Il DB è ora sempre cad_index.db accanto all'eseguibile, cioè nella cartella di installazione: non si ricorda più l'ultimo DB aperto (ultimo_db.txt) e "Apri DB..." vale solo per la sessione. Senza una cartella di lavoro salvata si propone la cartella di installazione invece di quella del DB. Doc aggiornati nello stesso commit: README.md, CLAUDE.md, docs/architettura.md, docs/db-cad-index.md, docs/guida-utente.md, CHANGELOG.md. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
206db85e12
commit
57020f9964
9 files changed
+209
-81
No files matched your search
@@ -40,3 +40,6 @@ publish/
|
|||||||
|
|
||||||
# Impostazioni locali dell'editor
|
# Impostazioni locali dell'editor
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
|
# Setup generato da Inno Setup (installer/PrepStep.iss)
|
||||||
|
installer/Output/
|
||||||
@@ -5,6 +5,23 @@ Tutte le modifiche rilevanti di questo progetto sono documentate in questo file.
|
|||||||
Il formato segue [Keep a Changelog](https://keepachangelog.com/it/1.1.0/), e il progetto
|
Il formato segue [Keep a Changelog](https://keepachangelog.com/it/1.1.0/), e il progetto
|
||||||
aderisce a [Semantic Versioning](https://semver.org/lang/it/).
|
aderisce a [Semantic Versioning](https://semver.org/lang/it/).
|
||||||
|
|
||||||
|
## [Non rilasciato]
|
||||||
|
|
||||||
|
### Aggiunto
|
||||||
|
|
||||||
|
- Setup di installazione per-utente (`installer/PrepStep.iss`, Inno Setup 6): installa in
|
||||||
|
`%LOCALAPPDATA%\Programs\PrepStep` senza diritti di amministratore, con collegamento nel
|
||||||
|
menu Start e disinstallazione dal menu Start, da "App installate" o rilanciando il setup (che, se l'app è
|
||||||
|
già installata, chiede se aggiornarla o disinstallarla).
|
||||||
|
|
||||||
|
### Modificato
|
||||||
|
|
||||||
|
- Il database è sempre `cad_index.db` nella cartella di installazione: non viene più ricordato
|
||||||
|
l'ultimo DB aperto (`%AppData%/PrepStep/ultimo_db.txt` non è più usato) e "Apri DB..." vale
|
||||||
|
solo per la sessione.
|
||||||
|
- Senza una cartella di lavoro salvata si propone la cartella di installazione invece di quella
|
||||||
|
del DB.
|
||||||
|
|
||||||
## [0.9.0] - 2026-09-23
|
## [0.9.0] - 2026-09-23
|
||||||
|
|
||||||
### Aggiunto
|
### Aggiunto
|
||||||
|
|||||||
@@ -29,6 +29,13 @@ Pubblicazione come eseguibile standalone (single-file, self-contained, Windows x
|
|||||||
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o publish
|
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o publish
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Setup di installazione per-utente (`%LOCALAPPDATA%\Programs\PrepStep`, niente admin), dalla
|
||||||
|
root del repo dopo il publish — dettagli in `README.md` e `docs/architettura.md`:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer\PrepStep.iss
|
||||||
|
```
|
||||||
|
|
||||||
`PrepStep.Tests/` (xUnit) contiene unit e integration test — vedi
|
`PrepStep.Tests/` (xUnit) contiene unit e integration test — vedi
|
||||||
`dotnet test` da dentro quella cartella. Riferimento al progetto principale
|
`dotnet test` da dentro quella cartella. Riferimento al progetto principale
|
||||||
via `ProjectReference` + `InternalsVisibleTo` (in `PrepStep.csproj`), così
|
via `ProjectReference` + `InternalsVisibleTo` (in `PrepStep.csproj`), così
|
||||||
@@ -76,10 +83,11 @@ designer visuale):
|
|||||||
1. **Database** — carica/aggiorna `cad_index.db` (`Indexer.ScanAsync`, radice disco di
|
1. **Database** — carica/aggiorna `cad_index.db` (`Indexer.ScanAsync`, radice disco di
|
||||||
default `X:\` hardcoded in `RadiceDiscoDefault`); un pallino verde/rosso accanto al titolo
|
default `X:\` hardcoded in `RadiceDiscoDefault`); un pallino verde/rosso accanto al titolo
|
||||||
indica se un DB è caricato. La **cartella di lavoro** (destinazione di CSV/`raw/`/`step/`)
|
indica se un DB è caricato. La **cartella di lavoro** (destinazione di CSV/`raw/`/`step/`)
|
||||||
non è più mostrata qui — proposta dall'ultima usata o dalla cartella del DB se non c'è
|
non è più mostrata qui — proposta dall'ultima usata o dalla cartella di installazione se
|
||||||
ancora nulla di salvato, cambiabile in qualunque momento da "File → Scegli cartella di
|
non c'è ancora nulla di salvato, cambiabile in qualunque momento da "File → Scegli cartella di
|
||||||
lavoro..." — vedi `docs/db-cad-index.md` per il dettaglio di schema e risoluzione del
|
lavoro..." — vedi `docs/db-cad-index.md` per il dettaglio di schema e percorso del DB
|
||||||
percorso DB.
|
(sempre `cad_index.db` nella cartella di installazione; "Apri DB..." vale solo per la
|
||||||
|
sessione).
|
||||||
2. **Importa Distinta Base** — `DistintaBaseImporter.ConvertiInCsv` genera il CSV
|
2. **Importa Distinta Base** — `DistintaBaseImporter.ConvertiInCsv` genera il CSV
|
||||||
componente;descrizione nella cartella di lavoro (da file scelto o trascinato); se il file
|
componente;descrizione nella cartella di lavoro (da file scelto o trascinato); se il file
|
||||||
segue la convenzione del gestionale (`DBP_<codice>_<timestamp>`), aggiunge l'assieme
|
segue la convenzione del gestionale (`DBP_<codice>_<timestamp>`), aggiunge l'assieme
|
||||||
|
|||||||
+9
-44
@@ -1130,20 +1130,18 @@ public partial class Form1 : Form
|
|||||||
|
|
||||||
private static readonly string CartellaImpostazioni = Path.Combine(
|
private static readonly string CartellaImpostazioni = Path.Combine(
|
||||||
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "PrepStep");
|
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "PrepStep");
|
||||||
private static readonly string PercorsoImpostazioni = Path.Combine(CartellaImpostazioni, "ultimo_db.txt");
|
|
||||||
private static readonly string PercorsoImpostazioniCartella = Path.Combine(CartellaImpostazioni, "ultima_cartella_lavoro.txt");
|
private static readonly string PercorsoImpostazioniCartella = Path.Combine(CartellaImpostazioni, "ultima_cartella_lavoro.txt");
|
||||||
|
|
||||||
/// <summary>Propone l'ultima cartella di lavoro usata (se ancora esiste su disco) o, se non
|
/// <summary>Propone l'ultima cartella di lavoro usata (se ancora esiste su disco) o, se non
|
||||||
/// c'è ancora una preferenza salvata (o punta a una cartella cancellata), la cartella dove si
|
/// c'è ancora una preferenza salvata (o punta a una cartella cancellata), la cartella di
|
||||||
/// trova il DB (più sensata dell'eseguibile: quella è dove l'utente tiene il proprio lavoro,
|
/// installazione (%LOCALAPPDATA%\Programs\PrepStep col setup). Sempre modificabile con
|
||||||
/// non dov'è installata la app). Richiede quindi che InizializzaDatabase sia già stata
|
/// "File → Scegli cartella di lavoro...".</summary>
|
||||||
/// chiamata. Sempre modificabile con "File → Scegli cartella di lavoro...".</summary>
|
|
||||||
private void InizializzaCartellaLavoro()
|
private void InizializzaCartellaLavoro()
|
||||||
{
|
{
|
||||||
var ultima = LeggiUltimaCartellaLavoro();
|
var ultima = LeggiUltimaCartellaLavoro();
|
||||||
_cartellaLavoro = ultima is not null && Directory.Exists(ultima)
|
_cartellaLavoro = ultima is not null && Directory.Exists(ultima)
|
||||||
? ultima
|
? ultima
|
||||||
: (_dbPath is not null ? Path.GetDirectoryName(_dbPath) : null) ?? AppContext.BaseDirectory;
|
: AppContext.BaseDirectory;
|
||||||
AggiornaStatoAvanti();
|
AggiornaStatoAvanti();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1190,15 +1188,10 @@ public partial class Form1 : Form
|
|||||||
|
|
||||||
private void InizializzaDatabase()
|
private void InizializzaDatabase()
|
||||||
{
|
{
|
||||||
var candidati = new[]
|
// Il DB sta sempre nella cartella di installazione; "Apri DB..." ne carica un altro
|
||||||
{
|
// solo per la sessione corrente, senza ricordarlo al prossimo avvio.
|
||||||
LeggiUltimoDbUsato(),
|
string predefinito = Path.Combine(AppContext.BaseDirectory, "cad_index.db");
|
||||||
Path.Combine(AppContext.BaseDirectory, "cad_index.db"),
|
if (!File.Exists(predefinito))
|
||||||
Path.Combine(Directory.GetCurrentDirectory(), "cad_index.db"),
|
|
||||||
};
|
|
||||||
_dbPath = candidati.FirstOrDefault(p => p is not null && File.Exists(p));
|
|
||||||
|
|
||||||
if (_dbPath is null)
|
|
||||||
{
|
{
|
||||||
_lblStatus.Text = "Database non trovato. Usa 'Apri DB...' per selezionarlo oppure 'Aggiorna indice' per crearlo.";
|
_lblStatus.Text = "Database non trovato. Usa 'Apri DB...' per selezionarlo oppure 'Aggiorna indice' per crearlo.";
|
||||||
_lblDb.Text = "Nessun database caricato. Premi 'Aggiorna indice' per crearlo da X:\\, oppure 'Apri DB...' se ne hai gi\u00e0 uno.";
|
_lblDb.Text = "Nessun database caricato. Premi 'Aggiorna indice' per crearlo da X:\\, oppure 'Apri DB...' se ne hai gi\u00e0 uno.";
|
||||||
@@ -1209,7 +1202,7 @@ public partial class Form1 : Form
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CaricaDatabase(_dbPath);
|
CaricaDatabase(predefinito);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ScegliDatabase()
|
private void ScegliDatabase()
|
||||||
@@ -1242,7 +1235,6 @@ public partial class Form1 : Form
|
|||||||
? $"Ultimo aggiornamento indice: {ultimaScansione.ToLocalTime():dd/MM/yyyy HH:mm}"
|
? $"Ultimo aggiornamento indice: {ultimaScansione.ToLocalTime():dd/MM/yyyy HH:mm}"
|
||||||
: "Ultimo aggiornamento indice: sconosciuto";
|
: "Ultimo aggiornamento indice: sconosciuto";
|
||||||
_lblStatus.Text = "Pronto.";
|
_lblStatus.Text = "Pronto.";
|
||||||
SalvaUltimoDbUsato(path);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -1254,33 +1246,6 @@ public partial class Form1 : Form
|
|||||||
AggiornaStatoAvanti();
|
AggiornaStatoAvanti();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Ricorda l'ultimo DB caricato con successo, così al prossimo avvio si
|
|
||||||
/// ricarica automaticamente anche se l'eseguibile gira da una cartella diversa.</summary>
|
|
||||||
private static string? LeggiUltimoDbUsato()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return File.Exists(PercorsoImpostazioni) ? File.ReadAllText(PercorsoImpostazioni).Trim() : null;
|
|
||||||
}
|
|
||||||
catch (IOException)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void SalvaUltimoDbUsato(string path)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(CartellaImpostazioni);
|
|
||||||
File.WriteAllText(PercorsoImpostazioni, path);
|
|
||||||
}
|
|
||||||
catch (IOException)
|
|
||||||
{
|
|
||||||
// ponytail: non critico se non si riesce a salvare, si torna a chiedere "Apri DB..." la prossima volta
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void AggiornaIndice()
|
private async void AggiornaIndice()
|
||||||
{
|
{
|
||||||
string dbPath = _dbPath ?? Path.Combine(AppContext.BaseDirectory, "cad_index.db");
|
string dbPath = _dbPath ?? Path.Combine(AppContext.BaseDirectory, "cad_index.db");
|
||||||
|
|||||||
@@ -9,14 +9,14 @@ passaggio, non lo sostituisce.
|
|||||||
|
|
||||||
## Funzionalità
|
## Funzionalità
|
||||||
|
|
||||||
1. **Indice CAD** — all'avvio carica automaticamente l'ultimo `cad_index.db`
|
1. **Indice CAD** — all'avvio carica automaticamente `cad_index.db` dalla
|
||||||
usato (ricordato tra un avvio e l'altro). Se manca, si può selezionare un DB
|
cartella di installazione (`%LOCALAPPDATA%\Programs\PrepStep`). Se manca, lo si
|
||||||
esistente con **Apri DB...** o generarne uno nuovo con **Aggiorna
|
crea con **Aggiorna indice**, oppure si apre un altro DB per la sola sessione
|
||||||
indice**, che scansiona il disco (di default `X:\`, tutte le cartelle di primo
|
con **Apri DB...**. **Aggiorna indice** che scansiona il disco (di default `X:\`, tutte le cartelle di primo
|
||||||
livello che trova) e indicizza tutti i file. La **cartella di lavoro** (dove
|
livello che trova) e indicizza tutti i file. La **cartella di lavoro** (dove
|
||||||
finiscono il CSV e la cartella `raw/`; gli STEP esportati con Creo vanno in
|
finiscono il CSV e la cartella `raw/`; gli STEP esportati con Creo vanno in
|
||||||
`step/`, dentro la stessa cartella) è proposta automaticamente e ricordata tra
|
`step/`, dentro la stessa cartella) è l'ultima scelta (ricordata tra un avvio e
|
||||||
un avvio e l'altro, modificabile in qualunque momento da **File → Scegli
|
l'altro) o, la prima volta, la cartella di installazione, modificabile in qualunque momento da **File → Scegli
|
||||||
cartella di lavoro...**.
|
cartella di lavoro...**.
|
||||||
2. **Importa Distinta Base** — trascina (o scegli da file) l'estrazione
|
2. **Importa Distinta Base** — trascina (o scegli da file) l'estrazione
|
||||||
`.xls`/`.xml` del gestionale (foglio "Distinta Base", colonne
|
`.xls`/`.xml` del gestionale (foglio "Distinta Base", colonne
|
||||||
@@ -86,6 +86,30 @@ L'eseguibile risultante è in `PrepStep\publish\PrepStep.exe` — un unico
|
|||||||
file, si copia e si lancia su un'altra macchina Windows senza bisogno di .NET
|
file, si copia e si lancia su un'altra macchina Windows senza bisogno di .NET
|
||||||
installato.
|
installato.
|
||||||
|
|
||||||
|
## Setup di installazione
|
||||||
|
|
||||||
|
Per distribuire l'app agli utenti si genera un setup con [Inno Setup 6](https://jrsoftware.org/isinfo.php)
|
||||||
|
(una volta sola: `winget install JRSoftware.InnoSetup --scope user`). Dalla root del repo,
|
||||||
|
**dopo** il `dotnet publish` qui sopra:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer\PrepStep.iss
|
||||||
|
```
|
||||||
|
|
||||||
|
Produce `installer\Output\PrepStep-Setup-<versione>.exe` (versione letta dall'exe, cioè
|
||||||
|
`<Version>` del csproj). Il setup:
|
||||||
|
|
||||||
|
- installa **solo per l'utente corrente**, in `%LOCALAPPDATA%\Programs\PrepStep`, senza
|
||||||
|
chiedere i diritti di amministratore;
|
||||||
|
- crea nel menu Start i collegamenti al programma e al disinstallatore (quello sul desktop
|
||||||
|
è facoltativo);
|
||||||
|
- compare in "Impostazioni → App installate", da cui si disinstalla.
|
||||||
|
|
||||||
|
Se l'app è già installata, il setup chiede prima cosa fare: **Sì** aggiorna/reinstalla (DB e
|
||||||
|
impostazioni restano), **No** disinstalla, **Annulla** esce. Installazione silenziosa (aggiorna
|
||||||
|
senza chiedere) — es. per distribuirla da script:
|
||||||
|
`PrepStep-Setup-<versione>.exe /VERYSILENT /SUPPRESSMSGBOXES`.
|
||||||
|
|
||||||
## Struttura del progetto
|
## Struttura del progetto
|
||||||
|
|
||||||
Tutto il codice è in `PrepStep/` (unico progetto nella solution, GUI e
|
Tutto il codice è in `PrepStep/` (unico progetto nella solution, GUI e
|
||||||
|
|||||||
+27
-10
@@ -119,8 +119,8 @@ trascinano i `.asm` su Creo Distributed Batch, che scrive in `step/`.
|
|||||||
silenziosamente quelli irraggiungibili (share offline/permessi).
|
silenziosamente quelli irraggiungibili (share offline/permessi).
|
||||||
- `PulisciRawEStep` — svuota `raw/` e `step/` nella cartella di lavoro (manutenzione,
|
- `PulisciRawEStep` — svuota `raw/` e `step/` nella cartella di lavoro (manutenzione,
|
||||||
richiede conferma).
|
richiede conferma).
|
||||||
- `InizializzaDatabase` / `ScegliDatabase` — localizzazione del DB (ultimo usato, salvato in
|
- `InizializzaDatabase` / `ScegliDatabase` — localizzazione del DB (sempre `cad_index.db` accanto
|
||||||
`%AppData%/PrepStep/ultimo_db.txt`, o `cad_index.db` accanto all'eseguibile).
|
all'eseguibile; "Apri DB..." ne carica un altro solo per la sessione).
|
||||||
- `InizializzaCartellaLavoro` / `ScegliCartellaLavoro` — stesso pattern per la cartella di
|
- `InizializzaCartellaLavoro` / `ScegliCartellaLavoro` — stesso pattern per la cartella di
|
||||||
lavoro (`ultima_cartella_lavoro.txt`), fallback `AppContext.BaseDirectory` se non c'è
|
lavoro (`ultima_cartella_lavoro.txt`), fallback `AppContext.BaseDirectory` se non c'è
|
||||||
ancora nulla di salvato: nessuna dipendenza da un marker di repo, funziona identica
|
ancora nulla di salvato: nessuna dipendenza da un marker di repo, funziona identica
|
||||||
@@ -242,21 +242,38 @@ completi".
|
|||||||
## Persistenza
|
## Persistenza
|
||||||
|
|
||||||
- **DB** (`cad_index.db`, SQLite) — vedi tabella `files`/vista `files_ultima_versione` sopra.
|
- **DB** (`cad_index.db`, SQLite) — vedi tabella `files`/vista `files_ultima_versione` sopra.
|
||||||
Percorso ricordato tra un avvio e l'altro in `%AppData%/PrepStep/ultimo_db.txt`
|
Sempre `cad_index.db` accanto all'eseguibile (`AppContext.BaseDirectory`, cioè la cartella
|
||||||
(`SalvaUltimoDbUsato`/`LeggiUltimoDbUsato`), scritto ogni volta che si carica un DB
|
di installazione): `InizializzaDatabase` carica solo quello, e "Aggiorna indice" lo crea lì
|
||||||
(all'avvio se già noto, oppure da "Apri DB..." o al termine di "Aggiorna indice"); se il
|
se manca. "Apri DB..." carica un altro file solo per la sessione corrente, senza
|
||||||
file non c'è o punta a un percorso cancellato, `InizializzaDatabase` ripiega su
|
ricordarlo. Radice disco di scansione
|
||||||
`cad_index.db` accanto all'eseguibile o nella working directory. Radice disco di scansione
|
|
||||||
di default `X:\` (`Form1.RadiceDiscoDefault`, hardcoded).
|
di default `X:\` (`Form1.RadiceDiscoDefault`, hardcoded).
|
||||||
- **Cartella di lavoro** — stesso meccanismo del DB sopra, salvata in
|
- **Cartella di lavoro** — ricordata tra un avvio e l'altro in
|
||||||
`%AppData%/PrepStep/ultima_cartella_lavoro.txt`; se non c'è una preferenza salvata (o punta
|
`%AppData%/PrepStep/ultima_cartella_lavoro.txt`; se non c'è una preferenza salvata (o punta
|
||||||
a una cartella cancellata) si propone la cartella del DB caricato, o in ultima istanza
|
a una cartella cancellata) si propone la cartella di installazione
|
||||||
`AppContext.BaseDirectory`; cambiabile in qualunque momento da "File → Scegli cartella di
|
(`AppContext.BaseDirectory`); cambiabile in qualunque momento da "File → Scegli cartella di
|
||||||
lavoro...". Tutti i file generati a valle ci finiscono dentro: il CSV della distinta, `raw/`
|
lavoro...". Tutti i file generati a valle ci finiscono dentro: il CSV della distinta, `raw/`
|
||||||
(CAD dei componenti e sotto-componenti); `step/` non è scritta dall'app ma è dove l'utente
|
(CAD dei componenti e sotto-componenti); `step/` non è scritta dall'app ma è dove l'utente
|
||||||
esporta gli STEP a mano con Creo Distributed Batch, a partire dai file trascinati da `raw/`
|
esporta gli STEP a mano con Creo Distributed Batch, a partire dai file trascinati da `raw/`
|
||||||
in fase 5.
|
in fase 5.
|
||||||
|
|
||||||
|
## Installazione
|
||||||
|
|
||||||
|
`installer/PrepStep.iss` (Inno Setup 6) impacchetta `PrepStep/publish/PrepStep.exe` in un
|
||||||
|
setup **per-utente** (`PrivilegesRequired=lowest`, quindi `{autopf}` =
|
||||||
|
`%LOCALAPPDATA%\Programs`, cartella `PrepStep`): niente admin, e la cartella resta scrivibile —
|
||||||
|
cosa che serve, perché `cad_index.db` e (di default) la cartella di lavoro con `raw/`
|
||||||
|
stanno accanto all'eseguibile (`AppContext.BaseDirectory`, vedi Persistenza). In `C:\Program Files` fallirebbe per un utente
|
||||||
|
normale. Versione del setup letta dall'`exe` (ProductVersion, tolto il `+<commit>`), quindi
|
||||||
|
basta cambiare `<Version>` nel csproj. L'`AppId` fisso fa riconoscere a Windows le versioni
|
||||||
|
nuove come aggiornamento della stessa app: non va cambiato
|
||||||
|
(`AppGuid` nello script). Se l'app risulta già installata (chiave `…\Uninstall\{AppGuid}_is1`
|
||||||
|
in HKCU), `InitializeSetup` nella sezione `[Code]` chiede se aggiornare o disinstallare (lancia
|
||||||
|
l'`UninstallString`), perché Inno da solo aggiornerebbe sempre; con `/VERYSILENT` non chiede.
|
||||||
|
La disinstallazione rimuove solo
|
||||||
|
i file installati: `cad_index.db`, `raw/`/`step/`/CSV creati accanto all'exe e
|
||||||
|
`%AppData%/PrepStep/` restano.
|
||||||
|
Comandi di build del setup nel `README.md`.
|
||||||
|
|
||||||
## Script standalone (`scripts/`)
|
## Script standalone (`scripts/`)
|
||||||
|
|
||||||
C# file-based apps (.NET 10, `dotnet run scripts/Nome.cs -- arg1 arg2`, nessun `.csproj`,
|
C# file-based apps (.NET 10, `dotnet run scripts/Nome.cs -- arg1 arg2`, nessun `.csproj`,
|
||||||
|
|||||||
+11
-15
@@ -109,24 +109,20 @@ sulla share, non tipicamente cercato dalla UI).
|
|||||||
|
|
||||||
## Come l'app trova il DB all'avvio
|
## Come l'app trova il DB all'avvio
|
||||||
|
|
||||||
`Form1.InizializzaDatabase` prova, in ordine, i seguenti candidati e usa il primo che esiste
|
`Form1.InizializzaDatabase` carica sempre e solo `cad_index.db` accanto all'eseguibile
|
||||||
su disco:
|
(`AppContext.BaseDirectory`: con il setup è `%LOCALAPPDATA%\Programs\PrepStep`). Nessun
|
||||||
|
percorso viene ricordato fra un avvio e l'altro.
|
||||||
|
|
||||||
1. l'ultimo DB caricato con successo, salvato in
|
Se non esiste, la fase 1 resta bloccata su "Database non trovato" finché l'utente non preme
|
||||||
`%AppData%/PrepStep/ultimo_db.txt` (`Form1.LeggiUltimoDbUsato`/`SalvaUltimoDbUsato`)
|
"Aggiorna indice" (`Form1.AggiornaIndice`, che crea `cad_index.db` da zero accanto
|
||||||
2. `cad_index.db` accanto all'eseguibile (`AppContext.BaseDirectory`)
|
all'eseguibile) o "Apri DB..." (`Form1.ScegliDatabase`, file picker libero: il DB scelto vale
|
||||||
3. `cad_index.db` nella working directory corrente
|
solo per la sessione corrente, e "Aggiorna indice" aggiorna quello).
|
||||||
|
|
||||||
Se nessuno dei tre esiste, la fase 1 resta bloccata su "Database non trovato" finché l'utente
|
|
||||||
non preme "Apri DB..." (`Form1.ScegliDatabase`, file picker libero) o "Aggiorna indice"
|
|
||||||
(`Form1.AggiornaIndice`, che crea `cad_index.db` da zero accanto all'eseguibile se non c'è
|
|
||||||
ancora un `_dbPath`).
|
|
||||||
|
|
||||||
**Attenzione in sviluppo (dotnet run / IDE):** `AppContext.BaseDirectory` è la cartella di
|
**Attenzione in sviluppo (dotnet run / IDE):** `AppContext.BaseDirectory` è la cartella di
|
||||||
build (`PrepStep/bin/Release/net10.0-windows` o `Debug/...`), non la radice del repo. Se in
|
build (`PrepStep/bin/Release/net10.0-windows` o `Debug/...`), non la radice del repo. L'app usa
|
||||||
quella cartella finisce per errore una copia di `cad_index.db` (es. creata lì da una vecchia
|
quindi la copia di `cad_index.db` in quella cartella (creandola lì al primo "Aggiorna
|
||||||
sessione), l'app la userà invece di quella nella radice del repo, e le due copie divergeranno
|
indice"), non quella nella radice del repo né quella installata: per usare un altro DB in
|
||||||
a ogni "Aggiorna indice" fatto nell'uno o nell'altro ambiente. Se i risultati di una ricerca
|
sviluppo va aperto con "Apri DB..." a ogni avvio. Se i risultati di una ricerca
|
||||||
sembrano incoerenti con quello che ti aspetti di vedere sul DB "giusto", controlla con "Apri
|
sembrano incoerenti con quello che ti aspetti di vedere sul DB "giusto", controlla con "Apri
|
||||||
DB..." quale file è effettivamente caricato (mostrato in fase 1 accanto al conteggio dei file
|
DB..." quale file è effettivamente caricato (mostrato in fase 1 accanto al conteggio dei file
|
||||||
indicizzati) prima di sospettare un bug nella ricerca.
|
indicizzati) prima di sospettare un bug nella ricerca.
|
||||||
|
|||||||
+22
-2
@@ -7,6 +7,23 @@ fase vedi [`architettura.md`](architettura.md); questa guida si ferma a cosa cli
|
|||||||
cosa vede l'utente. La stessa sintesi è disponibile anche dentro l'app da **Aiuto → Guida**
|
cosa vede l'utente. La stessa sintesi è disponibile anche dentro l'app da **Aiuto → Guida**
|
||||||
(F1).
|
(F1).
|
||||||
|
|
||||||
|
## Installazione
|
||||||
|
|
||||||
|
1. Lancia `PrepStep-Setup-<versione>.exe` (non servono i diritti di amministratore).
|
||||||
|
2. Alla fine lascia spuntato "Avvia Cevolani StepPrep", oppure aprilo dal menu Start.
|
||||||
|
|
||||||
|
Il programma si installa in `%LOCALAPPDATA%\Programs\PrepStep`. Il database `cad_index.db` sta sempre in questa cartella.
|
||||||
|
|
||||||
|
Se il programma è già installato, il setup chiede cosa fare:
|
||||||
|
|
||||||
|
- **Sì** — lo aggiorna (o reinstalla): database e cartella di lavoro restano quelli di prima;
|
||||||
|
- **No** — lo disinstalla;
|
||||||
|
- **Annulla** — esce senza fare nulla.
|
||||||
|
|
||||||
|
Per **disinstallarlo** si può anche usare menu Start → "Disinstalla Cevolani StepPrep", oppure
|
||||||
|
Impostazioni → App installate → Cevolani StepPrep → Disinstalla (il
|
||||||
|
database `cad_index.db` e le impostazioni non vengono cancellati, vedi sotto).
|
||||||
|
|
||||||
## Prima di iniziare
|
## Prima di iniziare
|
||||||
|
|
||||||
- Serve accesso alla share di rete con i file CAD (di default `X:\`).
|
- Serve accesso alla share di rete con i file CAD (di default `X:\`).
|
||||||
@@ -39,9 +56,12 @@ file e la data dell'ultimo aggiornamento.
|
|||||||
minuto la prima volta, i giri successivi sono più veloci perché aggiornano solo quello
|
minuto la prima volta, i giri successivi sono più veloci perché aggiornano solo quello
|
||||||
che è cambiato.
|
che è cambiato.
|
||||||
- **Se hai già un database da un'altra postazione o cartella**: premi **Apri DB...** e
|
- **Se hai già un database da un'altra postazione o cartella**: premi **Apri DB...** e
|
||||||
selezionalo a mano.
|
selezionalo a mano. Vale solo finché non chiudi il programma: al prossimo avvio si riparte
|
||||||
|
dal database nella cartella di installazione. Per usarlo sempre, copialo in
|
||||||
|
`%LOCALAPPDATA%\Programs\PrepStep` come `cad_index.db`.
|
||||||
- La **cartella di lavoro** (dove l'app scrive il CSV della distinta e la cartella
|
- La **cartella di lavoro** (dove l'app scrive il CSV della distinta e la cartella
|
||||||
`raw/`) è scelta automaticamente e ricordata tra un avvio e l'altro; per cambiarla usa
|
`raw/`) è ricordata tra un avvio e l'altro; la prima volta è la cartella di installazione
|
||||||
|
(`%LOCALAPPDATA%\Programs\PrepStep`); per cambiarla usa
|
||||||
**File → Scegli cartella di lavoro...**.
|
**File → Scegli cartella di lavoro...**.
|
||||||
|
|
||||||
Premi **Avanti** quando il database è caricato.
|
Premi **Avanti** quando il database è caricato.
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
; Setup per-utente di Cevolani StepPrep: installa in %LOCALAPPDATA%\Programs\PrepStep
|
||||||
|
; senza richiedere diritti di amministratore.
|
||||||
|
; Prima: dotnet publish (vedi README), poi: iscc installer\PrepStep.iss
|
||||||
|
|
||||||
|
#define Exe "..\PrepStep\publish\PrepStep.exe"
|
||||||
|
; Versione letta dall'exe (<Version> nel csproj), tolto l'eventuale "+<commit>" di .NET.
|
||||||
|
#define AppVersion GetStringFileInfo(Exe, "ProductVersion")
|
||||||
|
#if Pos("+", AppVersion) > 0
|
||||||
|
#define AppVersion Copy(AppVersion, 1, Pos("+", AppVersion) - 1)
|
||||||
|
#endif
|
||||||
|
; Non cambiare AppGuid: è quello che fa riconoscere a Windows gli aggiornamenti come la stessa app.
|
||||||
|
#define AppGuid "FAC1B760-4735-422F-86F0-888484CF2830"
|
||||||
|
|
||||||
|
[Setup]
|
||||||
|
AppId={{{#AppGuid}}
|
||||||
|
AppName=Cevolani StepPrep
|
||||||
|
AppVersion={#AppVersion}
|
||||||
|
AppPublisher=Cevolani
|
||||||
|
; Con PrivilegesRequired=lowest {autopf} diventa %LOCALAPPDATA%\Programs.
|
||||||
|
PrivilegesRequired=lowest
|
||||||
|
DefaultDirName={autopf}\PrepStep
|
||||||
|
DisableDirPage=yes
|
||||||
|
DisableProgramGroupPage=yes
|
||||||
|
ArchitecturesAllowed=x64compatible
|
||||||
|
ArchitecturesInstallIn64BitMode=x64compatible
|
||||||
|
SetupIconFile=..\PrepStep\app.ico
|
||||||
|
UninstallDisplayIcon={app}\PrepStep.exe
|
||||||
|
UninstallDisplayName=Cevolani StepPrep
|
||||||
|
OutputDir=Output
|
||||||
|
OutputBaseFilename=PrepStep-Setup-{#AppVersion}
|
||||||
|
Compression=lzma2
|
||||||
|
SolidCompression=yes
|
||||||
|
|
||||||
|
[Languages]
|
||||||
|
Name: "it"; MessagesFile: "compiler:Languages\Italian.isl"
|
||||||
|
|
||||||
|
[Tasks]
|
||||||
|
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||||
|
|
||||||
|
[Files]
|
||||||
|
Source: "{#Exe}"; DestDir: "{app}"; Flags: ignoreversion
|
||||||
|
|
||||||
|
[Icons]
|
||||||
|
Name: "{autoprograms}\Cevolani StepPrep"; Filename: "{app}\PrepStep.exe"
|
||||||
|
Name: "{autodesktop}\Cevolani StepPrep"; Filename: "{app}\PrepStep.exe"; Tasks: desktopicon
|
||||||
|
Name: "{autoprograms}\Disinstalla Cevolani StepPrep"; Filename: "{uninstallexe}"
|
||||||
|
|
||||||
|
[Run]
|
||||||
|
Filename: "{app}\PrepStep.exe"; Description: "{cm:LaunchProgram,Cevolani StepPrep}"; Flags: nowait postinstall skipifsilent
|
||||||
|
|
||||||
|
[Code]
|
||||||
|
{ Se l'app è già installata, chiede se aggiornarla o disinstallarla (Inno da solo aggiornerebbe
|
||||||
|
sempre, senza offrire la disinstallazione). In modalità silenziosa aggiorna senza chiedere. }
|
||||||
|
function InitializeSetup(): Boolean;
|
||||||
|
var
|
||||||
|
Disinstallatore: String;
|
||||||
|
Codice: Integer;
|
||||||
|
begin
|
||||||
|
Result := True;
|
||||||
|
if WizardSilent then
|
||||||
|
Exit;
|
||||||
|
if not RegQueryStringValue(HKCU,
|
||||||
|
'Software\Microsoft\Windows\CurrentVersion\Uninstall\{' + '{#AppGuid}' + '}_is1',
|
||||||
|
'UninstallString', Disinstallatore) then
|
||||||
|
Exit;
|
||||||
|
case MsgBox('Cevolani StepPrep è già installato.' + #13#10#13#10 +
|
||||||
|
'Sì: aggiorna / reinstalla' + #13#10 +
|
||||||
|
'No: disinstalla' + #13#10 +
|
||||||
|
'Annulla: esci senza fare nulla', mbConfirmation, MB_YESNOCANCEL) of
|
||||||
|
IDNO:
|
||||||
|
begin
|
||||||
|
Exec(RemoveQuotes(Disinstallatore), '', '', SW_SHOW, ewWaitUntilTerminated, Codice);
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
IDCANCEL:
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
Reference in new issue
Block a user