Skip to content

feat: personalize process-card settings and tiles#253

Open
q2333gh wants to merge 4 commits intoMerrit:mainfrom
q2333gh:personalize-process-card-settings-and-tiles
Open

feat: personalize process-card settings and tiles#253
q2333gh wants to merge 4 commits intoMerrit:mainfrom
q2333gh:personalize-process-card-settings-and-tiles

Conversation

@q2333gh
Copy link

@q2333gh q2333gh commented Feb 9, 2026

Summary

Personalize how process cards and window tiles are displayed in the apps list, with a dedicated settings section and test coverage.

Changes

  • Settings state & cubit

    • Persist the flags: hideProcessPid, showExecutableFirst, and limitWindowTitleToOneLine.
    • Add unit tests to guard default values and persistence paths.
  • Settings UI

    • Add a dedicated “Personalization” section to the settings page.
    • Move the tile pin option out of the behaviour section into this new section.
    • Localize the new labels in EN/DE/IT/ZH.
  • Window tiles

    • Make window tiles react to the new flags:
      • Hide the PID text when hideProcessPid is enabled.
      • Show the executable name first when showExecutableFirst is enabled.
      • Limit titles to a single line when limitWindowTitleToOneLine is enabled.
    • Extend widget tests to cover the new display permutations.

Testing

  • Ran flutter test for:
    • settings cubit/state tests
    • personalization widget tests
    • window tile widget tests
      All test suites passed locally (exit code 0).
  • Manually clicked through the settings UI to verify that the new toggles behave as expected.

Build / Artifacts

Screenshots

image image

@Merrit
Copy link
Owner

Merrit commented Feb 12, 2026

Your PR doesn't build.

ERROR: lib/settings/cubit/settings_state.dart:41:8: Error: The constructor function type '_SettingsState Function({List<AppSpecificHotkey> appSpecificHotKeys, bool autoRefresh, bool autoStart, bool closeToTray, HotKey hotKey, bool minimizeWindows, bool pinSuspendedWindows, int refreshInterval, bool showHiddenWindows, bool startHiddenInTray, bool working})' isn't a subtype of 'SettingsState Function({List<AppSpecificHotkey> appSpecificHotKeys, bool autoRefresh, bool autoStart, bool closeToTray, bool hideProcessPid, HotKey hotKey, bool limitWindowTitleToOneLine, bool minimizeWindows, bool pinSuspendedWindows, int refreshInterval, bool showExecutableFirst, bool showHiddenWindows, bool startHiddenInTray, bool working})'.
ERROR:  - '_SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR:  - 'List' is from 'dart:core'.
ERROR:  - 'AppSpecificHotkey' is from 'package:nyrna/core/models/apps_specific_hotkeys.dart' ('lib/core/models/apps_specific_hotkeys.dart').
ERROR:  - 'HotKey' is from 'package:hotkey_manager_platform_interface/src/hotkey.dart' ('../../.pub-cache/hosted/pub.dev/hotkey_manager_platform_interface-0.2.0/lib/src/hotkey.dart').
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR:   }) = _SettingsState;
ERROR:        ^
ERROR: lib/settings/cubit/settings_cubit.dart:167:25: Error: No named parameter with the name 'hideProcessPid'.
ERROR:     emit(state.copyWith(hideProcessPid: value));
ERROR:                         ^^^^^^^^^^^^^^
ERROR: lib/settings/cubit/settings_cubit.dart:172:25: Error: No named parameter with the name 'showExecutableFirst'.
ERROR:     emit(state.copyWith(showExecutableFirst: value));
ERROR:                         ^^^^^^^^^^^^^^^^^^^
ERROR: lib/settings/cubit/settings_cubit.dart:177:25: Error: No named parameter with the name 'limitWindowTitleToOneLine'.
ERROR:     emit(state.copyWith(limitWindowTitleToOneLine: value));
ERROR:                         ^^^^^^^^^^^^^^^^^^^^^^^^^
ERROR: lib/apps_list/widgets/window_tile.dart:51:44: Error: The getter 'hideProcessPid' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'hideProcessPid'.
ERROR:       (SettingsCubit cubit) => cubit.state.hideProcessPid,
ERROR:                                            ^^^^^^^^^^^^^^
ERROR: lib/apps_list/widgets/window_tile.dart:54:44: Error: The getter 'showExecutableFirst' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'showExecutableFirst'.
ERROR:       (SettingsCubit cubit) => cubit.state.showExecutableFirst,
ERROR:                                            ^^^^^^^^^^^^^^^^^^^
ERROR: lib/apps_list/widgets/window_tile.dart:57:44: Error: The getter 'limitWindowTitleToOneLine' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'limitWindowTitleToOneLine'.
ERROR:       (SettingsCubit cubit) => cubit.state.limitWindowTitleToOneLine,
ERROR:                                            ^^^^^^^^^^^^^^^^^^^^^^^^^
ERROR: lib/settings/widgets/personalization_section.dart:45:24: Error: The getter 'hideProcessPid' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'hideProcessPid'.
ERROR:           value: state.hideProcessPid,
ERROR:                        ^^^^^^^^^^^^^^
ERROR: lib/settings/widgets/personalization_section.dart:70:24: Error: The getter 'showExecutableFirst' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'showExecutableFirst'.
ERROR:           value: state.showExecutableFirst,
ERROR:                        ^^^^^^^^^^^^^^^^^^^
ERROR: lib/settings/widgets/personalization_section.dart:97:24: Error: The getter 'limitWindowTitleToOneLine' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'limitWindowTitleToOneLine'.
ERROR:           value: state.limitWindowTitleToOneLine,
ERROR:                        ^^^^^^^^^^^^^^^^^^^^^^^^^
ERROR: Target kernel_snapshot_program failed: Exception
Building Linux application...                                           
Build process failed

@q2333gh
Copy link
Author

q2333gh commented Feb 13, 2026

Your PR doesn't build.

ERROR: lib/settings/cubit/settings_state.dart:41:8: Error: The constructor function type '_SettingsState Function({List<AppSpecificHotkey> appSpecificHotKeys, bool autoRefresh, bool autoStart, bool closeToTray, HotKey hotKey, bool minimizeWindows, bool pinSuspendedWindows, int refreshInterval, bool showHiddenWindows, bool startHiddenInTray, bool working})' isn't a subtype of 'SettingsState Function({List<AppSpecificHotkey> appSpecificHotKeys, bool autoRefresh, bool autoStart, bool closeToTray, bool hideProcessPid, HotKey hotKey, bool limitWindowTitleToOneLine, bool minimizeWindows, bool pinSuspendedWindows, int refreshInterval, bool showExecutableFirst, bool showHiddenWindows, bool startHiddenInTray, bool working})'.
ERROR:  - '_SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR:  - 'List' is from 'dart:core'.
ERROR:  - 'AppSpecificHotkey' is from 'package:nyrna/core/models/apps_specific_hotkeys.dart' ('lib/core/models/apps_specific_hotkeys.dart').
ERROR:  - 'HotKey' is from 'package:hotkey_manager_platform_interface/src/hotkey.dart' ('../../.pub-cache/hosted/pub.dev/hotkey_manager_platform_interface-0.2.0/lib/src/hotkey.dart').
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR:   }) = _SettingsState;
ERROR:        ^
ERROR: lib/settings/cubit/settings_cubit.dart:167:25: Error: No named parameter with the name 'hideProcessPid'.
ERROR:     emit(state.copyWith(hideProcessPid: value));
ERROR:                         ^^^^^^^^^^^^^^
ERROR: lib/settings/cubit/settings_cubit.dart:172:25: Error: No named parameter with the name 'showExecutableFirst'.
ERROR:     emit(state.copyWith(showExecutableFirst: value));
ERROR:                         ^^^^^^^^^^^^^^^^^^^
ERROR: lib/settings/cubit/settings_cubit.dart:177:25: Error: No named parameter with the name 'limitWindowTitleToOneLine'.
ERROR:     emit(state.copyWith(limitWindowTitleToOneLine: value));
ERROR:                         ^^^^^^^^^^^^^^^^^^^^^^^^^
ERROR: lib/apps_list/widgets/window_tile.dart:51:44: Error: The getter 'hideProcessPid' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'hideProcessPid'.
ERROR:       (SettingsCubit cubit) => cubit.state.hideProcessPid,
ERROR:                                            ^^^^^^^^^^^^^^
ERROR: lib/apps_list/widgets/window_tile.dart:54:44: Error: The getter 'showExecutableFirst' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'showExecutableFirst'.
ERROR:       (SettingsCubit cubit) => cubit.state.showExecutableFirst,
ERROR:                                            ^^^^^^^^^^^^^^^^^^^
ERROR: lib/apps_list/widgets/window_tile.dart:57:44: Error: The getter 'limitWindowTitleToOneLine' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'limitWindowTitleToOneLine'.
ERROR:       (SettingsCubit cubit) => cubit.state.limitWindowTitleToOneLine,
ERROR:                                            ^^^^^^^^^^^^^^^^^^^^^^^^^
ERROR: lib/settings/widgets/personalization_section.dart:45:24: Error: The getter 'hideProcessPid' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'hideProcessPid'.
ERROR:           value: state.hideProcessPid,
ERROR:                        ^^^^^^^^^^^^^^
ERROR: lib/settings/widgets/personalization_section.dart:70:24: Error: The getter 'showExecutableFirst' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'showExecutableFirst'.
ERROR:           value: state.showExecutableFirst,
ERROR:                        ^^^^^^^^^^^^^^^^^^^
ERROR: lib/settings/widgets/personalization_section.dart:97:24: Error: The getter 'limitWindowTitleToOneLine' isn't defined for the type 'SettingsState'.
ERROR:  - 'SettingsState' is from 'package:nyrna/settings/cubit/settings_cubit.dart' ('lib/settings/cubit/settings_cubit.dart').
ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'limitWindowTitleToOneLine'.
ERROR:           value: state.limitWindowTitleToOneLine,
ERROR:                        ^^^^^^^^^^^^^^^^^^^^^^^^^
ERROR: Target kernel_snapshot_program failed: Exception
Building Linux application...                                           
Build process failed

let me check it out and try to fix soon

@q2333gh
Copy link
Author

q2333gh commented Feb 17, 2026

Self-verified CI (same workflow, no maintainer approval needed)

Because the workflow run here was awaiting maintainer approval, I ran the same Verify Pull Request workflow on my fork to confirm the fix:

Result: all jobs passed

Job Status
call-tests (ubuntu-latest) Pass 2m38s
call-tests (windows-latest) Pass 4m0s
call-build-windows / Build Windows Pass 5m19s
call-build-linux / Build Linux Pass 3m31s
Verify Pull Request Pass

The added Run code generation and Run i18n generation steps in build-linux and build-windows ran successfully; the build no longer fails on missing settings_cubit.freezed.dart.

@q2333gh
Copy link
Author

q2333gh commented Feb 20, 2026

Fixed the Verify formatting failure in CI. The failing step was dart format -o none --set-exit-if-changed --line-length=90 . — some files were not correctly formatted. I ran dart format -l 90 locally and committed the changes in 9f225ca.

@Merrit
Copy link
Owner

Merrit commented Feb 21, 2026

Do you work on contributions yourself, or "vibe code" entirely through LLM?

@q2333gh q2333gh force-pushed the personalize-process-card-settings-and-tiles branch from 3ce9df8 to 9ce24a6 Compare February 22, 2026 17:05
…OneLine

- Add personalization section with 3 toggles
- Window tiles react to flags
- Localization EN/DE/IT/ZH
- CI fix: LoggingManager init in tests
@q2333gh q2333gh force-pushed the personalize-process-card-settings-and-tiles branch from 9ce24a6 to a485888 Compare February 22, 2026 17:17
@q2333gh
Copy link
Author

q2333gh commented Feb 22, 2026

Do you work on contributions yourself, or "vibe code" entirely through LLM?

I leverage LLMs to speed up implementation, but I review, refactor, and adapt everything to fit the system design. So it’s more AI-assisted development rather than blind generation.

@q2333gh
Copy link
Author

q2333gh commented Feb 22, 2026

Optional follow-ups — adopt as you prefer:

  • test/native_platform/.../linux_process_repository_test.dart: LoggingManager.initialize is unrelated to the feature; add a short note if it's required for CI.
  • scripts/ci_local.ps1: Tooling change; could be moved to a separate PR to keep this one focused.
  • l10n.yaml: Project-level config; could be split out if preferred.
  • lib/localization/app_de.arb, app_it.arb: New strings missing; fallback to EN. Add keys if full locale coverage is desired.

@@ -0,0 +1,70 @@
# Mimic Merrit's CI (tests.yml + build-windows) for local verification.
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this file....?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Merrit — quick summary:

  • It's just a developer helper script and does not affect CI itself.

  • Verifies formatting, code generation, tests, and Windows build before pushing.

  • Runs Windows test flow (flutter pub get, format, generation, flutter test).

  • Optionally runs Windows build flow (enable desktop + flutter_app_builder).

  • Goal: catch CI failures locally to reduce push surprises.

new commit : i have rename the file below .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants