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:
davideandClaude Opus 5.5 committed 2026-09-23 08:29:03 +02:00
1 parent 206db85e12
commit 57020f9964
9 files changed
+209 -81

No files matched your search

+3
View File
@@ -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/
+17
View File
@@ -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
+12 -4
View File
@@ -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
View File
@@ -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");
+30 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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.
+78
View File
@@ -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;