From 629ec29e33506a9bf96f552dcc2e6b6cd0560916 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 17 Sep 2026 11:44:09 +0200 Subject: gui: the toolbar in the order things happen, and an About block The Plan bar now reads left to right as the work does: which directory, how it should be listed, what of it, where it is on disk - then Scan, and only then what to do with what came back. Scan carries the theme's accent, being the button that starts everything. Settings ends with About: the program and the version it was built as, what it is in a sentence, the licence, and who to write to. The text is model.About so it is tested; ui.Version is stamped by main. leak-check knows krino's own contact address, so the address check stays useful without a per-clone setting. --- gui/internal/model/about.go | 27 +++++++++++++++++++++++++ gui/internal/model/about_test.go | 43 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 gui/internal/model/about.go create mode 100644 gui/internal/model/about_test.go (limited to 'gui/internal/model') diff --git a/gui/internal/model/about.go b/gui/internal/model/about.go new file mode 100644 index 0000000..e92a0f4 --- /dev/null +++ b/gui/internal/model/about.go @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package model + +// The people and terms behind the program, in one place so About and any +// later --about agree. The repository line joins these once there is a +// public one to name. +const ( + Author = "Lukasz Kasprzak" + Contact = "contact@labunix.xyz" + Licence = "GPL-3.0-or-later" +) + +// About is the block Settings shows at its foot: what this is, which build +// it is, and under what terms. The first line names the program and its +// version; the rest are the small print. +func About(version string) []string { + if version == "" { + version = "dev" + } + return []string{ + "krino " + version, + "A rule-based file sorter: it reads a directory, works out what belongs where, shows you the plan, and only then moves anything.", + "Licence: " + Licence + " - free software, with no warranty.", + "By " + Author + ", " + Contact, + } +} diff --git a/gui/internal/model/about_test.go b/gui/internal/model/about_test.go new file mode 100644 index 0000000..00a6718 --- /dev/null +++ b/gui/internal/model/about_test.go @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package model_test + +import ( + "strings" + "testing" + + "krino/gui/internal/model" +) + +// TestAboutSaysWhatItIs: the About block names the program, the version it +// was built as, the licence, who wrote it and how to reach them. +func TestAboutSaysWhatItIs(t *testing.T) { + lines := model.About("0.0.12") + if len(lines) == 0 { + t.Fatal("About returned nothing") + } + whole := strings.Join(lines, "\n") + for _, want := range []string{ + "krino", + "0.0.12", + "GPL-3.0-or-later", + "Lukasz Kasprzak", + "contact@labunix.xyz", + } { + if !strings.Contains(whole, want) { + t.Errorf("About does not mention %q:\n%s", want, whole) + } + } + if !strings.HasPrefix(lines[0], "krino ") { + t.Errorf("the first line should name the program and version, got %q", lines[0]) + } +} + +// TestAboutWithoutAVersion: a plain `go build` leaves "dev", and About says +// so rather than printing an empty version. +func TestAboutWithoutAVersion(t *testing.T) { + lines := model.About("") + if !strings.Contains(lines[0], "dev") { + t.Errorf("an unstamped build should read as dev, got %q", lines[0]) + } +} -- cgit v1.3