Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
d32d2a9
fix(panel): a closed card shows content where the indentation was
rgdevment Oct 1, 2026
d4880fb
feat(panel): the filter decides the layout, and the compiler decides …
rgdevment Oct 1, 2026
b0efdce
feat(panel): a json row can say what it is without parsing what it ca…
rgdevment Oct 1, 2026
129a40a
feat(panel): one body per view, and the row height follows the filter
rgdevment Oct 1, 2026
ff630e9
feat(store): the meta a page needs comes in one query, not one per row
rgdevment Oct 1, 2026
4ae643d
feat(panel): video and audio finally get the shell facts nobody was m…
rgdevment Oct 1, 2026
f87601a
feat(panel): the media row shows the clock and the sides the shell me…
rgdevment Oct 1, 2026
0cdb5a2
feat(panel): an office file says its format, and what it cannot measu…
rgdevment Oct 1, 2026
59cfd6f
feat(panel): a folder says how many things are in it, without hanging…
rgdevment Oct 1, 2026
a027098
feat(panel): a link row shows its domain, its title and its path apart
rgdevment Oct 1, 2026
1388f60
feat(store): a group key the listing can order by, and the seam it fo…
rgdevment Oct 1, 2026
34d7fd9
feat(panel): a grouped view heads each group from the card that opens it
rgdevment Oct 1, 2026
1a179d8
fix(store): opening a history adds the columns its own indexes name
rgdevment Oct 1, 2026
98a2d56
feat(panel): images come in a grid, and the list keeps every index it…
rgdevment Oct 1, 2026
d2b37e9
feat(panel): a picture's sides come from the thumbnail, and what was …
rgdevment Oct 1, 2026
ca600bf
feat(panel): an audio draws its own waveform as its thumbnail
rgdevment Oct 1, 2026
614c6ca
test(probe): ask the shell what a document publishes instead of guessing
rgdevment Oct 1, 2026
d232de0
feat(panel): each view offers its two ways of looking at it
rgdevment Oct 1, 2026
b45c20a
feat(panel): a click moves the filter, ctrl+click adds to it
rgdevment Oct 1, 2026
d4f74f7
test(panel): the grid's own lines, and a tone in every sample format
rgdevment Oct 1, 2026
ed08b56
fix(panel): a heading takes its own height, and the filter row holds …
rgdevment Oct 1, 2026
4ea4f09
test: what extreme data does to identity, audio, backups and settings
rgdevment Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/oversized.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
357 crates/cp-panel/src/app.rs::wire the panel callbacks, one after another: splitting it would only move the list
986 crates/cp-win/examples/probe/battery.rs::main a diagnostic main that walks every invariant of its platform in one pass
972 crates/cp-win/examples/probe/battery.rs::main a diagnostic main that walks every invariant of its platform in one pass
1037 crates/cp-mac/examples/probe/battery.rs::main the same battery, for the other platform
156 changes: 155 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ tauri-plugin-shell = "2.4"
tauri-plugin-dialog = "2.8"
tauri-plugin-updater = "2.13"
tauri-plugin-global-shortcut = "2.4"
symphonia = { version = "0.5", default-features = false, features = ["mp3", "aac", "isomp4", "flac", "vorbis", "ogg", "wav", "pcm"] }
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "tiff", "gif", "bmp", "webp"] }
proptest = "1"
tempfile = "3"
Expand Down
2 changes: 2 additions & 0 deletions app/src/locales.ts
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ const PANEL_KEYS_ES: Binding[] = [
{ keys: "Clic", does: "abrir la tarjeta; otro clic la cierra" },
{ keys: "Doble clic", does: "pegar esa tarjeta" },
{ keys: "Tab · Shift + Tab", does: "recorrer los filtros" },
{ keys: "Varios", does: "el botón de capas: los clics suman tipos en vez de cambiarlos" },
{ keys: "#imagen · #carpeta", does: "filtrar por tipo desde el buscador" },
{ keys: "Retroceso", does: "quitar la última etiqueta" },
{ keys: "Supr", does: "borrar la seleccionada" },
Expand All @@ -364,6 +365,7 @@ const PANEL_KEYS_EN: Binding[] = [
{ keys: "Click", does: "open the card; another click closes it" },
{ keys: "Double click", does: "paste that card" },
{ keys: "Tab · Shift + Tab", does: "step through the filters" },
{ keys: "Many", does: "the layers button: clicks add kinds instead of swapping them" },
{ keys: "#image · #folder", does: "filter by kind from the search box" },
{ keys: "Backspace", does: "drop the last tag" },
{ keys: "Delete", does: "delete the selected one" },
Expand Down
59 changes: 59 additions & 0 deletions app/src/tests/bindings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,23 @@ const LOOKED_FOR: Record<string, string> = {
"right arrow": "event.text == Key.RightArrow",
};

const CLICKS = new Set(["clic", "click", "doble clic", "double click"]);

const MODES = new Set(["uno", "varios", "one", "many"]);

const MODIFIER: Record<string, string> = {
ctrl: "modifiers.control",
alt: "modifiers.alt",
shift: "modifiers.shift",
};

const DESCRIBED = new Set([
"flechas",
"arrows",
"uno",
"varios",
"one",
"many",
"clic",
"click",
"doble clic",
Expand Down Expand Up @@ -84,6 +98,51 @@ describe("la tabla de atajos", () => {
}
});

it("un clic con modificador lo lee de verdad lo que se pincha", () => {
const cards = readFileSync(
join(__dirname, "..", "..", "..", "crates", "cp-panel", "ui", "cards.slint"),
"utf8",
);
let found = 0;
for (const tongue of ["es", "en"] as const) {
adopt(tongue);
for (const row of panelKeys()) {
for (const combination of row.keys.split("·")) {
const parts = combination
.split("+")
.map((one) => one.trim().toLowerCase())
.filter((one) => one.length > 0);
const last = parts.at(-1);
if (!last || !CLICKS.has(last) || parts.length < 2) {
continue;
}
for (const held of parts.slice(0, -1)) {
const looked = MODIFIER[held];
expect(looked, `«${held}» is not a modifier`).toBeTruthy();
expect(
cards,
`«${row.keys}» promises ${looked} and nothing that is clicked reads it`,
).toContain(looked);
found += 1;
}
}
}
}
expect(found).toBeLessThan(8);
});

it("el bot\u00f3n que promete sumar tipos existe en el panel", () => {
const panel = PANEL;
for (const tongue of ["es", "en"] as const) {
adopt(tongue);
const row = panelKeys().find((one) =>
one.keys.split("\u00b7").some((word) => MODES.has(word.trim().toLowerCase())),
);
expect(row, `${tongue} never says how to filter by more than one kind`).toBeTruthy();
}
expect(panel, "nothing in the panel toggles the mode").toContain("keep-toggled");
});

it("filtra por tipos que el buscador conoce", () => {
const view = readFileSync(
join(__dirname, "..", "..", "..", "crates", "cp-panel", "src", "view.rs"),
Expand Down
Loading
Loading