Compare commits

...

94 Commits

Author SHA1 Message Date
dependabot[bot] 74949e0861 build(deps): bump actions/checkout from 4 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 06:11:09 +01:00
dependabot[bot] d89f111553 build(deps): bump actions/upload-artifact from 4 to 7
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-30 11:23:57 +01:00
dependabot[bot] a47c09cd97 build(deps): bump amannn/action-semantic-pull-request from 5 to 6
Bumps [amannn/action-semantic-pull-request](https://github.com/amannn/action-semantic-pull-request) from 5 to 6.
- [Release notes](https://github.com/amannn/action-semantic-pull-request/releases)
- [Changelog](https://github.com/amannn/action-semantic-pull-request/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amannn/action-semantic-pull-request/compare/v5...v6)

---
updated-dependencies:
- dependency-name: amannn/action-semantic-pull-request
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-30 11:23:43 +01:00
github-actions[bot] 074f02bf0e flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.911041%2Brev-7e495b747b51f95ae15e74377c5ce1fe69c1765f/019d8a9e-55cf-7e90-b58b-6fb096345a4d/source.tar.gz' (2026-04-13)
  → 'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.911667%2Brev-a4bf06618f0b5ee50f14ed8f0da77d34ecc19160/019dcae8-75b0-71d1-abd5-feab9658f0fa/source.tar.gz' (2026-04-25)
2026-04-30 11:22:23 +01:00
dependabot[bot] e46a005774 build(deps): bump crazy-max/ghaction-import-gpg from 6 to 7
Bumps [crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg) from 6 to 7.
- [Release notes](https://github.com/crazy-max/ghaction-import-gpg/releases)
- [Commits](https://github.com/crazy-max/ghaction-import-gpg/compare/v6...v7)

---
updated-dependencies:
- dependency-name: crazy-max/ghaction-import-gpg
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-23 07:37:13 +01:00
dependabot[bot] 6ced58ff10
build(deps): bump DeterminateSystems/update-flake-lock from 24 to 28 (#310) 2026-04-22 07:53:52 +01:00
dependabot[bot] a79907aac6 build(deps): bump DeterminateSystems/flakehub-push from 5 to 6
Bumps [DeterminateSystems/flakehub-push](https://github.com/determinatesystems/flakehub-push) from 5 to 6.
- [Release notes](https://github.com/determinatesystems/flakehub-push/releases)
- [Commits](https://github.com/determinatesystems/flakehub-push/compare/v5...v6)

---
updated-dependencies:
- dependency-name: DeterminateSystems/flakehub-push
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-21 07:34:15 +01:00
dependabot[bot] f682c78b3f
build(deps): bump DeterminateSystems/nix-installer-action from 17 to 22 (#311) 2026-04-21 07:33:07 +01:00
dependabot[bot] b5420c19a0 build(deps): bump package_info_plus from 9.0.0 to 9.0.1
Bumps [package_info_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus) from 9.0.0 to 9.0.1.
- [Release notes](https://github.com/fluttercommunity/plus_plugins/releases)
- [Commits](https://github.com/fluttercommunity/plus_plugins/commits/package_info_plus-v9.0.1/packages/package_info_plus)

---
updated-dependencies:
- dependency-name: package_info_plus
  dependency-version: 9.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-21 07:32:32 +01:00
github-actions[bot] 188d4e420c flake.lock: Update
Flake lock file updates:

• Updated input 'flake-schemas':
    'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz' (2024-07-26)
  → 'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.4.2/019d5cf2-ee3c-7313-964e-f3f83c35d509/source.tar.gz' (2026-04-03)
• Updated input 'nixpkgs':
    'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2411.717484%2Brev-26245db0cb552047418cfcef9a25da91b222d6c7/01967ace-4a07-717a-a72f-cc60008c3b59/source.tar.gz' (2025-04-27)
  → 'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.911041%2Brev-7e495b747b51f95ae15e74377c5ce1fe69c1765f/019d8a9e-55cf-7e90-b58b-6fb096345a4d/source.tar.gz' (2026-04-13)
• Updated input 'quickemu':
    'https://api.flakehub.com/f/pinned/quickemu-project/quickemu/4.9.7/0194178b-26e5-7aa4-9330-b18d2f595e4c/source.tar.gz' (2024-12-30)
  → 'https://api.flakehub.com/f/pinned/quickemu-project/quickemu/4.9.9/019c47be-6c19-773e-881b-f7d33905672f/source.tar.gz' (2026-02-10)
• Updated input 'quickemu/flake-schemas':
    'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz' (2024-07-26)
  → 'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.2.0/019a4a84-544d-7c59-b26d-e334e320c932/source.tar.gz' (2025-10-27)
2026-04-19 11:26:01 +01:00
dependabot[bot] efcfe7a376 build(deps): bump DeterminateSystems/flake-checker-action from 9 to 12
Bumps [DeterminateSystems/flake-checker-action](https://github.com/determinatesystems/flake-checker-action) from 9 to 12.
- [Release notes](https://github.com/determinatesystems/flake-checker-action/releases)
- [Commits](https://github.com/determinatesystems/flake-checker-action/compare/v9...v12)

---
updated-dependencies:
- dependency-name: DeterminateSystems/flake-checker-action
  dependency-version: '12'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-19 10:12:08 +01:00
dependabot[bot] f913883f5c build(deps): bump flutter_distributor from 0.4.5 to 0.6.6
Bumps [flutter_distributor](https://github.com/fastforgedev/fastforge/tree/main/packages) from 0.4.5 to 0.6.6.
- [Release notes](https://github.com/fastforgedev/fastforge/releases)
- [Commits](https://github.com/fastforgedev/fastforge/commits/HEAD/packages)

---
updated-dependencies:
- dependency-name: flutter_distributor
  dependency-version: 0.6.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-19 10:10:00 +01:00
dependabot[bot] 4337da3caf build(deps): bump package_info_plus from 8.1.1 to 9.0.0
Bumps [package_info_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus) from 8.1.1 to 9.0.0.
- [Release notes](https://github.com/fluttercommunity/plus_plugins/releases)
- [Commits](https://github.com/fluttercommunity/plus_plugins/commits/package_info_plus-v9.0.0/packages/package_info_plus)

---
updated-dependencies:
- dependency-name: package_info_plus
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-19 10:09:36 +01:00
dependabot[bot] 058d025aaa build(deps): bump DeterminateSystems/nix-installer-action from 16 to 17
Bumps [DeterminateSystems/nix-installer-action](https://github.com/determinatesystems/nix-installer-action) from 16 to 17.
- [Release notes](https://github.com/determinatesystems/nix-installer-action/releases)
- [Commits](https://github.com/determinatesystems/nix-installer-action/compare/v16...v17)

---
updated-dependencies:
- dependency-name: DeterminateSystems/nix-installer-action
  dependency-version: '17'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-13 10:36:42 +01:00
dependabot[bot] 90d9eb6149 build(deps): bump flutter_svg from 2.0.17 to 2.1.0
Bumps [flutter_svg](https://github.com/flutter/packages/tree/main/third_party/packages) from 2.0.17 to 2.1.0.
- [Release notes](https://github.com/flutter/packages/releases)
- [Commits](https://github.com/flutter/packages/commits/flutter_svg-v2.1.0/third_party/packages)

---
updated-dependencies:
- dependency-name: flutter_svg
  dependency-version: 2.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-13 10:36:22 +01:00
dependabot[bot] 441f9ac4f7 build(deps): bump provider from 6.1.4 to 6.1.5
Bumps [provider](https://github.com/rrousselGit/provider) from 6.1.4 to 6.1.5.
- [Commits](https://github.com/rrousselGit/provider/compare/provider-v6.1.4...provider-v6.1.5)

---
updated-dependencies:
- dependency-name: provider
  dependency-version: 6.1.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-13 10:35:55 +01:00
ivo 18e0c20ccb feat(theme): update primary color for improved dark mode contrast 2025-05-11 14:32:07 +01:00
Shawal Mbalire d5bd359a43 Update README.md
Added commands for building the macos desktop application
2025-05-11 14:30:30 +01:00
dependabot[bot] d5b34e9572 build(deps): bump DeterminateSystems/magic-nix-cache-action from 7 to 9
Bumps [DeterminateSystems/magic-nix-cache-action](https://github.com/determinatesystems/magic-nix-cache-action) from 7 to 9.
- [Release notes](https://github.com/determinatesystems/magic-nix-cache-action/releases)
- [Commits](https://github.com/determinatesystems/magic-nix-cache-action/compare/v7...v9)

---
updated-dependencies:
- dependency-name: DeterminateSystems/magic-nix-cache-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-11 14:29:29 +01:00
github-actions[bot] 77c6010a44 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2411.710315%2Brev-b681065d0919f7eb5309a93cea2cfa84dec9aa88/01939169-d1fd-700c-ac3b-46b9812bdcec/source.tar.gz?narHash=sha256-eq51hyiaIwtWo19fPEeE0Zr2s83DYMKJoukNLgGGpek%3D' (2024-12-03)
  → 'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2411.717484%2Brev-26245db0cb552047418cfcef9a25da91b222d6c7/01967ace-4a07-717a-a72f-cc60008c3b59/source.tar.gz?narHash=sha256-1rqa/XPSJqJg21BKWjzJZC7yU0l/YTVtjRi0RJmipus%3D' (2025-04-27)
• Updated input 'quickemu':
    'https://api.flakehub.com/f/pinned/quickemu-project/quickemu/4.9.6/01907e69-af19-7432-9708-89c294672e35/source.tar.gz?narHash=sha256-zzD9nRkbYWg1vAW8QclJfrTePq1Y0h6lcIay%2Bbv56iY%3D' (2024-07-04)
  → 'https://api.flakehub.com/f/pinned/quickemu-project/quickemu/4.9.7/0194178b-26e5-7aa4-9330-b18d2f595e4c/source.tar.gz?narHash=sha256-vDYqaMz7cEzFmmwZTptwpznHezWzjnR80yWcSgQ%2BZnc%3D' (2024-12-30)
• Updated input 'quickemu/flake-schemas':
    'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.2/018b3da8-4cc3-7fbb-8ff7-1588413c53e2/source.tar.gz?narHash=sha256-j8SR19V1SRysyJwpOBF4TLuAvAjF5t%2BgMiboN4gYQDU%3D' (2023-10-16)
  → 'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz?narHash=sha256-G5CxYeJVm4lcEtaO87LKzOsVnWeTcHGKbKxNamNWgOw%3D' (2024-07-26)
2025-05-11 14:28:52 +01:00
dependabot[bot] f64ef8a598 build(deps): bump flutter_svg from 2.0.16 to 2.0.17
Bumps [flutter_svg](https://github.com/flutter/packages/tree/main/third_party/packages) from 2.0.16 to 2.0.17.
- [Release notes](https://github.com/flutter/packages/releases)
- [Commits](https://github.com/flutter/packages/commits/flutter_svg-v2.0.17/third_party/packages)

---
updated-dependencies:
- dependency-name: flutter_svg
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-11 14:28:27 +01:00
dependabot[bot] 0e9f9a73ff build(deps): bump provider from 6.1.2 to 6.1.4
Bumps [provider](https://github.com/rrousselGit/provider) from 6.1.2 to 6.1.4.
- [Commits](https://github.com/rrousselGit/provider/compare/provider-v6.1.2...provider-v6.1.4)

---
updated-dependencies:
- dependency-name: provider
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-11 14:27:58 +01:00
dependabot[bot] c3011cf944 build(deps): bump DeterminateSystems/nix-installer-action from 13 to 16
Bumps [DeterminateSystems/nix-installer-action](https://github.com/determinatesystems/nix-installer-action) from 13 to 16.
- [Release notes](https://github.com/determinatesystems/nix-installer-action/releases)
- [Commits](https://github.com/determinatesystems/nix-installer-action/compare/v13...v16)

---
updated-dependencies:
- dependency-name: DeterminateSystems/nix-installer-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-30 10:01:06 +00:00
dependabot[bot] 463fd08ff2 build(deps): bump DeterminateSystems/update-flake-lock from 23 to 24
Bumps [DeterminateSystems/update-flake-lock](https://github.com/determinatesystems/update-flake-lock) from 23 to 24.
- [Release notes](https://github.com/determinatesystems/update-flake-lock/releases)
- [Commits](https://github.com/determinatesystems/update-flake-lock/compare/v23...v24)

---
updated-dependencies:
- dependency-name: DeterminateSystems/update-flake-lock
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-30 09:59:21 +00:00
dependabot[bot] ff1b7bb66b build(deps): bump DeterminateSystems/flakehub-push from 4 to 5
Bumps [DeterminateSystems/flakehub-push](https://github.com/determinatesystems/flakehub-push) from 4 to 5.
- [Release notes](https://github.com/determinatesystems/flakehub-push/releases)
- [Commits](https://github.com/determinatesystems/flakehub-push/compare/v4...v5)

---
updated-dependencies:
- dependency-name: DeterminateSystems/flakehub-push
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-30 09:58:52 +00:00
dependabot[bot] eec0dd890d build(deps): bump DeterminateSystems/flake-checker-action from 8 to 9
Bumps [DeterminateSystems/flake-checker-action](https://github.com/determinatesystems/flake-checker-action) from 8 to 9.
- [Release notes](https://github.com/determinatesystems/flake-checker-action/releases)
- [Commits](https://github.com/determinatesystems/flake-checker-action/compare/v8...v9)

---
updated-dependencies:
- dependency-name: DeterminateSystems/flake-checker-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-30 09:58:32 +00:00
dependabot[bot] 4009c109a8 build(deps): bump quiver from 3.2.1 to 3.2.2
Bumps [quiver](https://github.com/google/quiver-dart) from 3.2.1 to 3.2.2.
- [Release notes](https://github.com/google/quiver-dart/releases)
- [Changelog](https://github.com/google/quiver-dart/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/quiver-dart/compare/3.2.1...3.2.2)

---
updated-dependencies:
- dependency-name: quiver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-30 09:58:04 +00:00
Mark Johnson 622ea4d43b fix: #216 Increase max and default window size on Linux 2024-12-30 09:57:35 +00:00
Tristan Ross 4c2e3d403e feat: update for flutter 3.24 2024-12-30 09:55:41 +00:00
dependabot[bot] 99b207253b build(deps): bump shared_preferences from 2.2.3 to 2.3.2
Bumps [shared_preferences](https://github.com/flutter/packages/tree/main/packages/shared_preferences) from 2.2.3 to 2.3.2.
- [Release notes](https://github.com/flutter/packages/releases)
- [Commits](https://github.com/flutter/packages/commits/shared_preferences-v2.3.2/packages/shared_preferences)

---
updated-dependencies:
- dependency-name: shared_preferences
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-27 11:05:46 +01:00
Åke Engelbrektson 53cf0f9ea3 Update sv.po
Update Swedish translation from .pot
2024-08-27 11:04:57 +01:00
github-actions[bot] 99a386065e flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2405.633516%2Brev-8c50662509100d53229d4be607f1a3a31157fa12/0190f691-c019-7d99-b723-4b2dd6dfd38f/source.tar.gz?narHash=sha256-2ShmEaFi0kJVOEEu5gmlykN5dwjWYWYUJmlRTvZQRpU%3D' (2024-07-27)
  → 'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2405.634054%2Brev-4a92571f9207810b559c9eac203d1f4d79830073/01914d63-b212-712f-bb11-24565c742847/source.tar.gz?narHash=sha256-%2BCHVZnTnIYRLYsARInHYoWkujzcRkLY/gXm3s5bE52o%3D' (2024-08-13)
2024-08-27 11:04:33 +01:00
dependabot[bot] 4acd3798c8 build(deps): bump package_info_plus from 8.0.1 to 8.0.2
Bumps [package_info_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus) from 8.0.1 to 8.0.2.
- [Release notes](https://github.com/fluttercommunity/plus_plugins/releases)
- [Commits](https://github.com/fluttercommunity/plus_plugins/commits/package_info_plus-v8.0.2/packages/package_info_plus)

---
updated-dependencies:
- dependency-name: package_info_plus
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-27 11:04:11 +01:00
Phil Clifford 8d589183eb fix: repoint CONTRIBUTING discussion link 2024-08-27 11:03:49 +01:00
Yannick Mauray e8b430c909 fix: #191 : Download reported has successful on readonly storage 2024-08-02 12:25:56 +01:00
Martin Wimpress 94b98c5048 refactor: move quickemu to runtimeBinDependencies 2024-08-02 11:26:04 +01:00
Yannick Mauray 62faac71b4
feat: Enable macos desktop (#188)
* feat: macos desktop app on Apple silicon, initial config [wip]

* feat: macos desktop app on Apple silicon, initial config [wip]

* fix: use "super.key"

* chore: .vscode settings

* fix: more use of "super.key"

* chore: formating

* feat: misc macos settings.

* feat: set window size

* fix: desktop notification not (yet?) supported on macos

* fix: don't use a private variable for $version

* fix : comment

* feat: macos desktop app on Apple silicon, initial config [wip]

* fix: use "super.key"

* chore: .vscode settings

* fix: more use of "super.key"

* chore: formating

* feat: misc macos settings.

* feat: set window size

* fix: desktop notification not (yet?) supported on macos

* fix: don't use a private variable for $version

* fix : comment

* feat: in debug mode, throw an exception is a message is not translated

* chore: localizations

* feat: macos desktop app on Apple silicon, initial config [wip]

* fix: use "super.key"

* chore: .vscode settings

* fix: more use of "super.key"

* chore: formating

* feat: misc macos settings.

* feat: set window size

* fix: desktop notification not (yet?) supported on macos

* fix: don't use a private variable for $version

* fix : comment

* feat: in debug mode, throw an exception is a message is not translated

* chore: localizations

* feat: detect and use the Terminal app to connect via SSH

* fix: don't try to connect via SSH with empty username

* feat: macos desktop app on Apple silicon, initial config [wip]

* fix: use "super.key"

* chore: .vscode settings

* fix: more use of "super.key"

* chore: formating

* feat: misc macos settings.

* feat: set window size

* fix: desktop notification not (yet?) supported on macos

* fix: don't use a private variable for $version

* fix : comment

* feat: in debug mode, throw an exception is a message is not translated

* chore: localizations

* feat: detect and use the Terminal app to connect via SSH

* fix: don't try to connect via SSH with empty username

* feat: macos desktop app on Apple silicon, initial config [wip]

* feat: misc macos settings.

* feat: set window size

* fix : comment

* feat: macos desktop app on Apple silicon, initial config [wip]

* feat: misc macos settings.

* fix: app icons

* feat: packaging config

* chore: install disk name

* feat: getting ready for publication on the mac app strore

* fix: missing translations
2024-08-02 11:00:14 +01:00
Miguel Beltran 7d13a31e39 docs: fix Ubuntu ppa repository name
Went through the installation and found that there is a typo in the README.

Seems that the right ppa is the same as the one for quickemu and one with `quickgui` in it.
2024-08-02 10:56:36 +01:00
dependabot[bot] d8bdb40217 build(deps): bump package_info_plus from 8.0.0 to 8.0.1
Bumps [package_info_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus) from 8.0.0 to 8.0.1.
- [Release notes](https://github.com/fluttercommunity/plus_plugins/releases)
- [Commits](https://github.com/fluttercommunity/plus_plugins/commits/package_info_plus-v8.0.1/packages/package_info_plus)

---
updated-dependencies:
- dependency-name: package_info_plus
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-02 10:54:51 +01:00
dependabot[bot] 25d2b40d51 build(deps): bump DeterminateSystems/nix-installer-action from 12 to 13
Bumps [DeterminateSystems/nix-installer-action](https://github.com/determinatesystems/nix-installer-action) from 12 to 13.
- [Release notes](https://github.com/determinatesystems/nix-installer-action/releases)
- [Commits](https://github.com/determinatesystems/nix-installer-action/compare/v12...v13)

---
updated-dependencies:
- dependency-name: DeterminateSystems/nix-installer-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-02 10:53:52 +01:00
github-actions[bot] 13262ba46d flake.lock: Update
Flake lock file updates:

• Updated input 'flake-schemas':
    'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.2/018b3da8-4cc3-7fbb-8ff7-1588413c53e2/source.tar.gz?narHash=sha256-j8SR19V1SRysyJwpOBF4TLuAvAjF5t%2BgMiboN4gYQDU%3D' (2023-10-16)
  → 'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz?narHash=sha256-G5CxYeJVm4lcEtaO87LKzOsVnWeTcHGKbKxNamNWgOw%3D' (2024-07-26)
• Updated input 'nixpkgs':
    'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2405.632931%2Brev-f12ee5f64c6a09995e71c9626d88c4efa983b488/0190afd7-6008-74ee-a4f6-a75a0a8f29b3/source.tar.gz?narHash=sha256-FZ5dnrvKkln9ESdoTR8R7GKW9rNpXNZrxGsOXsbsTpE%3D' (2024-07-12)
  → 'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2405.633516%2Brev-8c50662509100d53229d4be607f1a3a31157fa12/0190f691-c019-7d99-b723-4b2dd6dfd38f/source.tar.gz?narHash=sha256-2ShmEaFi0kJVOEEu5gmlykN5dwjWYWYUJmlRTvZQRpU%3D' (2024-07-27)
2024-08-02 10:53:32 +01:00
Janis 37e733b280 Update README.md 2024-08-02 10:53:14 +01:00
Janis b8913f4ed7 Update README.md 2024-08-02 10:53:14 +01:00
dependabot[bot] f4edc9dc33 build(deps): bump process_run from 1.0.0+1 to 1.1.0
Bumps [process_run](https://github.com/tekartik/process_run.dart/tree/master/packages) from 1.0.0+1 to 1.1.0.
- [Commits](https://github.com/tekartik/process_run.dart/commits/v1.1.0/packages)

---
updated-dependencies:
- dependency-name: process_run
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-02 10:52:41 +01:00
github-actions[bot] aa840182b0 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2405.631440%2Brev-2819fffa7fa42156680f0d282c60d81e8fb185b7/0190034c-678d-7039-b45c-fa38168f2500/source.tar.gz?narHash=sha256-mJi4/gjiwQlSaxjA6AusXBN/6rQRaPCycR7bd8fydnQ%3D' (2024-06-09)
  → 'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2405.632931%2Brev-f12ee5f64c6a09995e71c9626d88c4efa983b488/0190afd7-6008-74ee-a4f6-a75a0a8f29b3/source.tar.gz?narHash=sha256-FZ5dnrvKkln9ESdoTR8R7GKW9rNpXNZrxGsOXsbsTpE%3D' (2024-07-12)
2024-07-14 20:09:17 +01:00
Martin Wimpress 7de1087666
chore: update flake.lock 2024-07-04 17:06:42 +01:00
Martin Wimpress fb3bce2f7b chore: bump version to 1.2.10 2024-07-04 14:15:18 +01:00
Martin Wimpress c42976c453
docs: add FUNDING.yml 2024-07-03 13:34:04 +01:00
Martin Wimpress 679f5c3523 fix: check for running VM processes using kill -0 2024-07-03 13:01:03 +01:00
Martin Wimpress ada669500f
docs: update pull_request_template.md (#184) 2024-07-03 11:52:08 +01:00
Martin Wimpress 1f4f120eb2 chore: update pubspec.lock.json 2024-07-03 11:42:13 +01:00
dependabot[bot] d591153da4 build(deps): bump gettext_i18n from 1.0.5 to 1.0.7
Bumps [gettext_i18n](https://github.com/frenchguych/gettext_i18n) from 1.0.5 to 1.0.7.
- [Release notes](https://github.com/frenchguych/gettext_i18n/releases)
- [Changelog](https://github.com/frenchguych/gettext_i18n/blob/main/CHANGELOG.md)
- [Commits](https://github.com/frenchguych/gettext_i18n/compare/v1.0.5...v1.0.7)

---
updated-dependencies:
- dependency-name: gettext_i18n
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-02 16:14:50 +01:00
dependabot[bot] 59a623abfd build(deps): bump file_picker from 8.0.5 to 8.0.6
Bumps [file_picker](https://github.com/miguelpruivo/flutter_file_picker) from 8.0.5 to 8.0.6.
- [Release notes](https://github.com/miguelpruivo/flutter_file_picker/releases)
- [Changelog](https://github.com/miguelpruivo/flutter_file_picker/blob/master/CHANGELOG.md)
- [Commits](https://github.com/miguelpruivo/flutter_file_picker/compare/8.0.5...8.0.6)

---
updated-dependencies:
- dependency-name: file_picker
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-02 11:13:53 +01:00
Yannick Mauray 275d065c74 fix: localizations 2024-07-02 02:22:18 +01:00
Martin Wimpress 3f8be1bfc0 feat: nix package, overlay and devshell use the quickemu FlakeHub flake 2024-07-02 02:21:53 +01:00
Martin Wimpress a5a4c7cd11 docs: make the pubspec description match the project tagline 2024-07-01 02:09:21 +01:00
Martin Wimpress 8b77041cf2 feat: add authors to the left menu 2024-07-01 02:09:21 +01:00
Martin Wimpress cdbe799232 chore: make the disabled dark mode toggle look like a toggle 2024-07-01 02:09:21 +01:00
Martin Wimpress dbc5e3f551 feat: kill VMs using quickemu --kill when running quickemu >= 4.9.6 2024-07-01 01:52:58 +01:00
Martin Wimpress bdce26ebb6 docs: update pull_request_template.md 2024-07-01 01:52:21 +01:00
Martin Wimpress dcadfb69f5 feat: add fetchQuickemuVersion() and display version in the menu 2024-07-01 01:24:27 +01:00
Martin Wimpress 6f30c78251 refactor: check in pubspec.lock
devshell.nix auto-regenerates pubspec.lock and pubspec.lock.json
2024-06-30 18:16:04 +01:00
Martin Wimpress c334ddd7c2 fix: correct the flake description 2024-06-30 18:16:04 +01:00
Martin Wimpress 7a59735ad9 ci: only test build quickgui if the flutter app was changed 2024-06-30 16:13:52 +01:00
Martin Wimpress 2cc24c74fe docs: add pull_request_template.md 2024-06-30 00:54:50 +01:00
Martin Wimpress c7fbc8ae5a docs: update SECURITY.md 2024-06-30 00:15:34 +01:00
Martin Wimpress b8943ed0db docs: update SECURITY.md 2024-06-30 00:12:12 +01:00
Martin Wimpress 9b70107668 docs: update issue templates 2024-06-29 23:59:29 +01:00
Martin Wimpress 1b0f9964b9 docs: add SECURITY.md 2024-06-29 23:36:06 +01:00
Martin Wimpress 88e689a9e3 docs: add CONTRIBUTING.md 2024-06-29 23:25:11 +01:00
Martin Wimpress b0511f18e0 Create CODE_OF_CONDUCT.md 2024-06-29 23:19:00 +01:00
Martin Wimpress 21347fd740 ci: add semantic commit validator 2024-06-29 22:54:50 +01:00
dependabot[bot] 1745e17c27 build(deps): bump process_run from 0.14.2 to 1.0.0+1
Bumps [process_run](https://github.com/tekartik/process_run.dart/tree/master/packages) from 0.14.2 to 1.0.0+1.
- [Commits](https://github.com/tekartik/process_run.dart/commits/v1.0.0/packages)

---
updated-dependencies:
- dependency-name: process_run
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-29 22:46:51 +01:00
dependabot[bot] 4536776082 build(deps): bump DeterminateSystems/update-flake-lock from 22 to 23
Bumps [DeterminateSystems/update-flake-lock](https://github.com/determinatesystems/update-flake-lock) from 22 to 23.
- [Release notes](https://github.com/determinatesystems/update-flake-lock/releases)
- [Commits](https://github.com/determinatesystems/update-flake-lock/compare/v22...v23)

---
updated-dependencies:
- dependency-name: DeterminateSystems/update-flake-lock
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-29 22:33:31 +01:00
Martin Wimpress 61c27e6948 ci: add pub to dependabot 2024-06-29 22:30:55 +01:00
github-actions[bot] bf3c7ec511 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.643242%2Brev-2893f56de08021cffd9b6b6dfc70fd9ccd51eb60/0190530b-f61b-7788-9601-b336b1caf671/source.tar.gz?narHash=sha256-ECni%2BIkwXjusHsm9Sexdtq8weAq/yUyt1TWIemXt3Ko%3D' (2024-06-24)
  → 'https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.644565%2Brev-b2852eb9365c6de48ffb0dc2c9562591f652242a/01906511-d0fc-7244-b596-2d790f5bfdb0/source.tar.gz?narHash=sha256-C8e9S7RzshSdHB7L%2Bv9I51af1gDM5unhJ2xO1ywxNH8%3D' (2024-06-27)
2024-06-29 22:17:55 +01:00
Martin Wimpress cc7652b1e3 ci: add Nix flake checker and updater 2024-06-29 22:16:24 +01:00
Martin Wimpress a635f6b8c3
ci: fix uploading release artifacts to GitHub release 2024-06-28 17:28:43 +01:00
Martin Wimpress 0a512da081 ci: correct typo in uses: to fix publish-quickgui workflow 2024-06-28 17:13:32 +01:00
Martin Wimpress bdb72e322e docs: update README 2024-06-28 16:59:09 +01:00
Martin Wimpress def50f53be fix: replace Divider() with Container() to prevent flickering
When the left_menu slides in from the left, the entire app window flickers and stutters.

The two `const Divider(),` references are the cause of this stuttering, so they have been replaced with `Container()`.
2024-06-28 16:40:04 +01:00
Martin Wimpress 029e098f4f style: make app name and version more prominent 2024-06-28 16:40:04 +01:00
Martin Wimpress d53d7b1177 refactor: cache supportedLocales in left_menu in initState() 2024-06-28 16:40:04 +01:00
Martin Wimpress 0490c83790 style: make theme switching inactive and enable light theme by default
Workaround for #144
2024-06-28 15:17:38 +01:00
Martin Wimpress 38055236d3 refactor: update nix flake to be consistent with other packaging 2024-06-28 14:41:10 +01:00
Martin Wimpress c534a8467c chore: remove old Makefile 2024-06-28 12:26:41 +01:00
Martin Wimpress d26b5035e0 ci: add building and pushing to PPA 2024-06-28 12:26:41 +01:00
Martin Wimpress 085081fd27 style: white space clean up 2024-06-28 12:26:41 +01:00
Martin Wimpress 9db8208755 docs: Use the same tagline in the README 2024-06-28 12:26:41 +01:00
Martin Wimpress e853e101ff chore: run quickgui icons & logos through optipng
`optipng -strip all -o7 *.png`
2024-06-28 12:26:41 +01:00
Martin Wimpress bee1a4ed37 refactor: make flutter_distributor packaging consistent with debian 2024-06-28 12:26:41 +01:00
Martin Wimpress 6bd84d57b5 feat: add initial debian packaging template; for PPA 2024-06-28 12:26:41 +01:00
Yannick Mauray 0ac635a1ca fix: more unlocalizable messages 2024-06-28 08:33:55 +01:00
Yannick Mauray 404579af36 fix: unlocalized messages (and wrong filename) 2024-06-27 23:02:43 +01:00
140 changed files with 4188 additions and 553 deletions

8
.envrc
View File

@ -1,9 +1 @@
use flake
flutter pub get
flutter config --enable-linux-desktop
dart pub global activate flutter_distributor
echo "**********************************************************************"
echo "* flutter build linux --release *"
echo "* flutter_distributor package --platform=linux --targets=zip *"
echo "* yq eval pubspec.lock -o=json -P > pubspec.lock.json *"
echo "**********************************************************************"

3
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,3 @@
# These are supported funding model platforms
github: [ymauray, marxjohnson, flexiondotorg]

35
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,35 @@
---
name: Bug report
about: Create a report to help us improve
title: 'bug: description of the bug you encountered'
labels: ''
assignees: ''
---
**I confirm this bug has not already been reported**
- [ ] I have searched the issues and this bug has not been reported previously
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Desktop (please complete the following information):**
- Quickgui Versdion: [e.g 1.2.9]
- OS: [e.g. Ubuntu]
- Version [e.g. 24.04]
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.

View File

@ -0,0 +1,23 @@
---
name: Feature request
about: Suggest an idea for this project
title: 'feat: describe the feature you are requesting'
labels: ''
assignees: ''
---
**I confirm this feature has not been previously requested**
- [ ] I have searched the issues and this feature has not previously been requested
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

BIN
.github/apple.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -3,5 +3,8 @@ updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
# Check for updates to GitHub Actions every week
interval: "weekly"
interval: "weekly"
- package-ecosystem: "pub"
directory: "/"
schedule:
interval: "daily"

BIN
.github/logo.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 18 KiB

34
.github/pull_request_template.md vendored Normal file
View File

@ -0,0 +1,34 @@
# Description
Please include a summary of the changes along with any relevant motivation and context.
<!-- Delete if not relevant -->
- Closes #
- Fixes #
- Resolves #
## Type of change
<!-- Delete any that are not relevant -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Packaging (updates the packaging)
- [ ] Documentation (updates the documentation)
# Checklist:
<!-- Delete any that are not relevant -->
- [ ] I have performed a self-review of my code
- [ ] I have tested my code in common scenarios and confirmed there are no regressions
- [ ] I have added comments to my code, particularly in hard-to-understand sections
- [ ] I have made corresponding changes to the documentation
- [ ] I have updated and committed `pubspec.yaml` and `pubspec.lock`
- `flutter pub get`
- [ ] I have updated and committed `pubspec.lock.json` (*required for Nix*)
- `yq eval pubspec.lock -o=json -P > pubspec.lock.json`
*`yq` above is [yq-go](https://github.com/mikefarah/yq)*

BIN
.github/tux.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -4,50 +4,125 @@ on:
pull_request:
branches:
- main
paths:
- pubspec.yaml
- assets/**
- lib/**
- linux/**
push:
branches:
- main
paths:
- pubspec.yaml
- assets/**
- lib/**
- linux/**
workflow_dispatch:
# TODO: arm64 runner
# https://github.blog/changelog/2024-06-03-actions-arm-based-linux-and-windows-runners-are-now-in-public-beta/
jobs:
build-linux-x64:
test-build-linux-x64:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
- name: "Checkout 🥡"
uses: actions/checkout@v6
- name: "Install Flutter 🦋"
uses: subosito/flutter-action@v2
with:
channel: stable
architecture: x64
flutter-version-file: pubspec.yaml
- name: Install system dependencies 📦️
run: sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-0 libgtk-3-dev libblkid1 liblzma5
- name: "Install dependencies 💾"
run: |
sudo apt-get -y install clang cmake libblkid1 liblzma5 libgtk-3-0 libgtk-3-dev ninja-build pkg-config
- name: Install Flutter dependencies 🦋
run: flutter pub get
- name: Enable Linux build 🐧
- name: Enable Linux Desktop 🐧
run: flutter config --enable-linux-desktop
- name: Build artifacts 🏗️
run: flutter build linux --release
- name: Show artifacts 👀
run: tree build/linux/x64/release/bundle
- name: Upload artifacts ⤴️
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Quickgui-${{github.run_number}}-linux-x64
path: build/linux/x64/release/bundle
overwrite: true
build-with-nix:
test-build-ppa-x64:
runs-on: ubuntu-22.04
steps:
- name: "Checkout 🥡"
uses: actions/checkout@v6
- name: "Install Flutter 🦋"
uses: subosito/flutter-action@v2
with:
channel: stable
architecture: x64
flutter-version-file: pubspec.yaml
- name: "Install dependencies 💾"
run: |
sudo apt-get -y install clang cmake libblkid1 liblzma5 libgtk-3-0 libgtk-3-dev ninja-build pkg-config
sudo apt-get -y install debhelper-compat distro-info dput devscripts rsync
- name: Install Flutter dependencies 🦋
run: flutter pub get
- name: Enable Linux Desktop 🐧
run: flutter config --enable-linux-desktop
- name: Build artifacts 🏗️
run: flutter build linux --release
- name: "Import gpg key 🔑"
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.PPA_GPG_PASSPHRASE }}
- name: "Upload to PPA ⤴️"
env:
DEBEMAIL: ${{ secrets.DEBEMAIL }}
DEBFULLNAME: ${{ secrets.DEBFULLNAME }}
run: |
# Version variables
DEB_VER=$(grep "^version" pubspec.yaml | cut -d' ' -f2 | sed 's/+/-/')
TAR_VER=$(grep "^version" pubspec.yaml | cut -d' ' -f2 | sed 's/+.*//')
STAMP=$(date +%y%j.%H%M)
# Create a "fake" orig.tar.xz
mkdir -p ubuntu/build
cp -a build/linux/x64/release/bundle/* ubuntu/build/
cp -a assets/resources/quickgui.desktop ubuntu/build/
for SIZE in 16 32 48 64 128 256 512; do
mkdir -p ubuntu/build/icons/hicolor/${SIZE}x${SIZE}/apps/
cp -av assets/resources/quickgui_${SIZE}.png ubuntu/build/icons/hicolor/${SIZE}x${SIZE}/apps/quickgui.png
done
tar cvf "ubuntu/quickgui_${TAR_VER}.orig.tar" --directory ubuntu/build .
xz -vv -fz "ubuntu/quickgui_${TAR_VER}.orig.tar"
# Make a debian "source" package
mkdir -p ubuntu/build/debian
cp -a linux/packaging/debian/* ubuntu/build/debian/
sed -i 's/Architecture: any/Architecture: amd64/g' ubuntu/build/debian/control
cd ubuntu/build
for CODENAME in $(distro-info --supported); do
rm debian/changelog
dch --package quickgui --newversion="${DEB_VER}~${CODENAME}${STAMP}" --distribution=${CODENAME} "New upstream release." --create
dpkg-buildpackage -d -S -sa
#dput ppa:flexiondotorg/rubbish ../quickgui_${DEB_VER}~${CODENAME}${STAMP}_source.changes
done
- name: Show artifacts 👀
run: tree ubuntu/
test-build-nix-x64:
runs-on: ubuntu-22.04
permissions:
id-token: "write"
contents: "read"
steps:
- uses: "actions/checkout@v4"
- uses: "DeterminateSystems/nix-installer-action@v12"
- uses: "DeterminateSystems/magic-nix-cache-action@v7"
- name: "Checkout 🥡"
uses: "actions/checkout@v6"
- name: "Install Nix ❄️"
uses: "DeterminateSystems/nix-installer-action@v22"
- name: "Enable Magic Nix Cache 🪄"
uses: "DeterminateSystems/magic-nix-cache-action@v9"
- name: "Build with Nix ❄️"
run: |
nix build .#quickgui

21
.github/workflows/flake-checker.yml vendored Normal file
View File

@ -0,0 +1,21 @@
name: Flake ❄️ Checker ✅
on:
push:
branches:
- main
schedule:
- cron: '42 0 * * 6'
workflow_dispatch:
jobs:
flake-checker:
name: Flake Checker
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: DeterminateSystems/nix-installer-action@v22
- uses: DeterminateSystems/magic-nix-cache-action@v9
- uses: DeterminateSystems/flake-checker-action@v12

20
.github/workflows/flake-updater.yml vendored Normal file
View File

@ -0,0 +1,20 @@
name: Flake ❄️ Lock 🔒️ Updater ✨
on:
schedule:
- cron: '37 13 14,28 * *'
workflow_dispatch:
jobs:
lock-updater:
name: Flake Lock Updater
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: DeterminateSystems/nix-installer-action@v22
- uses: DeterminateSystems/magic-nix-cache-action@v9
- uses: DeterminateSystems/update-flake-lock@v28
with:
pr-title: "chore: update flake.lock"

27
.github/workflows/lint-pr.yml vendored Normal file
View File

@ -0,0 +1,27 @@
name: "Lint Pull Request 🐙"
on:
pull_request_target:
types:
- opened
- edited
- synchronize
permissions:
pull-requests: read
jobs:
main:
name: Validate pull request title
runs-on: ubuntu-22.04
steps:
- uses: amannn/action-semantic-pull-request@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# If the PR only contains a single commit, the action will validate that
# it matches the configured pattern.
validateSingleCommit: true
# Related to `validateSingleCommit` you can opt-in to validate that the PR
# title matches a single commit to avoid confusion.
validateSingleCommitMatchesPrTitle: true

View File

@ -1,5 +1,9 @@
name: Publish Quickgui 🏷️
# To release a new version:
# - Make sure pubspec.yaml version: has been revved and is in the format "X.Y.Z+n"
# - Create a git tag with the format "X.Y.Z" and push it
# - The build and publish will run automatically if the git tag matches the
# pubspec.yaml version without the +n suffix
on:
push:
tags:
@ -20,77 +24,73 @@ jobs:
name: "Check versions ⚖️"
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: "Compare App and Git versions 🟰"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
APP_VERSION=$(grep "^version" pubspec.yaml | cut -d' ' -f2)
APP_VERSION=$(grep "^version" pubspec.yaml | cut -d' ' -f2 | sed 's/+.*//')
GIT_VERSION=$(git describe --tags | cut -d'-' -f1)
echo "App version: ${REL_VERSION}"
echo "App version: ${APP_VERSION}"
echo "Git version: ${GIT_VERSION}"
if [ "${APP_VERSION}" != "${GIT_VERSION}" ]; then
echo "ERROR! Version mismatch.";
exit 1
fi
build-linux-x64:
publish-linux-x64:
needs: [version-check]
name: "Build Linux x64 🏗️"
name: "Publish Linux (x64) 🐙"
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
- name: "Checkout 🥡"
uses: actions/checkout@v6
- name: "Install Flutter 🦋"
uses: subosito/flutter-action@v2
with:
channel: stable
architecture: x64
flutter-version-file: pubspec.yaml
- name: Install system dependencies 📦️
run: sudo apt-get install -y clang cmake libblkid1 liblzma5 libgtk-3-0 libgtk-3-dev ninja-build pkg-config
run: |
sudo apt-get -y install clang cmake libblkid1 liblzma5 libgtk-3-0 libgtk-3-dev ninja-build pkg-config
- name: Install Flutter dependencies 🦋
run: flutter pub get
- name: Activate flutter_distributor 🚀
run: dart pub global activate flutter_distributor
- name: Build AppImage 🐧
run: |
sudo apt-get install -y libfuse-dev locate
sudo apt-get -y install libfuse-dev locate
wget -q "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage" -O /usr/local/bin/appimagetool
chmod +x /usr/local/bin/appimagetool
flutter_distributor package --platform=linux --targets=appimage
- name: Build .deb 🍥
run: |
sudo apt-get install -y dpkg
sudo apt-get -y install dpkg
flutter_distributor package --platform=linux --targets=deb
- name: Build .rpm 🎩
run: |
sudo apt-get install -y patchelf rpm
sudo apt-get -y install patchelf rpm
flutter_distributor package --platform=linux --targets=rpm
- name: Build .zip 🤐
run: flutter_distributor package --platform=linux --targets=zip
- name: Show artifacts 👀
run: tree dist/
publish-release:
needs: [build-linux-x64]
name: "Publish Release 📤️"
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Publish release ${{ github.ref }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
REL_VER=$(grep "^version" pubspec.yaml | cut -d' ' -f2)
gh release create "${{ github.ref }}" --draft --generate-notes
for PKG in AppImage deb rpm zip; do
gh release upload "${{ github.ref }}" "dist/${REL_VER}/quickgui-${REL_VER}-linux.${PKG}" --clobber
done
if [ "$(gh release view "${{ github.ref }}" --json assets --template '{{len .assets}}')" -lt 0 ]; then
exit 1
fi
gh release edit "${{ github.ref }}" --draft=false
- name: "Publish Release 📤️"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
REL_VER=$(grep "^version" pubspec.yaml | cut -d' ' -f2)
gh release create "${{ github.ref }}" --draft --generate-notes
for PKG in AppImage deb rpm zip; do
gh release upload "${{ github.ref }}" "dist/${REL_VER}/quickgui-${REL_VER}-linux.${PKG}" --clobber
done
if [ "$(gh release view "${{ github.ref }}" --json assets --template '{{len .assets}}')" -lt 0 ]; then
exit 1
fi
gh release edit "${{ github.ref }}" --draft=false
publish-flakehub:
needs: [version-check]
@ -100,13 +100,74 @@ jobs:
id-token: "write"
contents: "read"
steps:
- uses: "actions/checkout@v4"
- uses: "actions/checkout@v6"
with:
ref: "${{ (inputs.tag != null) && format('refs/tags/{0}', inputs.tag) || '' }}"
- uses: "DeterminateSystems/nix-installer-action@v12"
- uses: "DeterminateSystems/magic-nix-cache-actionv7"
- uses: "DeterminateSystems/flakehub-push@v4"
- uses: "DeterminateSystems/nix-installer-action@v22"
- uses: "DeterminateSystems/magic-nix-cache-action@v9"
- uses: "DeterminateSystems/flakehub-push@v6"
with:
visibility: "public"
name: "quickemu-project/quickgui"
tag: "${{ inputs.tag }}"
publish-ppa-x64:
needs: [version-check]
name: "Publish PPA (x64) 🟠"
runs-on: ubuntu-22.04
steps:
- name: "Checkout 🥡"
uses: actions/checkout@v6
- name: "Install Flutter 🦋"
uses: subosito/flutter-action@v2
with:
channel: stable
architecture: x64
flutter-version-file: pubspec.yaml
- name: "Install dependencies 💾"
run: |
sudo apt-get -y install clang cmake libblkid1 liblzma5 libgtk-3-0 libgtk-3-dev ninja-build pkg-config
sudo apt-get -y install debhelper-compat distro-info dput devscripts rsync
- name: Install Flutter dependencies 🦋
run: flutter pub get
- name: Enable Linux Desktop 🐧
run: flutter config --enable-linux-desktop
- name: Build artifacts 🏗️
run: flutter build linux --release
- name: "Import gpg key 🔑"
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.PPA_GPG_PASSPHRASE }}
- name: "Upload to PPA ⤴️"
env:
DEBEMAIL: ${{ secrets.DEBEMAIL }}
DEBFULLNAME: ${{ secrets.DEBFULLNAME }}
run: |
# Version variables
DEB_VER=$(grep "^version" pubspec.yaml | cut -d' ' -f2 | sed 's/+/-/')
TAR_VER=$(grep "^version" pubspec.yaml | cut -d' ' -f2 | sed 's/+.*//')
STAMP=$(date +%y%j.%H%M)
# Create a "fake" orig.tar.xz
mkdir -p ubuntu/build
cp -a build/linux/x64/release/bundle/* ubuntu/build/
cp -a assets/resources/quickgui.desktop ubuntu/build/
for SIZE in 16 32 48 64 128 256 512; do
mkdir -p ubuntu/build/icons/hicolor/${SIZE}x${SIZE}/apps/
cp -av assets/resources/quickgui_${SIZE}.png ubuntu/build/icons/hicolor/${SIZE}x${SIZE}/apps/quickgui.png
done
tar cvf "ubuntu/quickgui_${TAR_VER}.orig.tar" --directory ubuntu/build .
xz -vv -fz "ubuntu/quickgui_${TAR_VER}.orig.tar"
# Make a debian "source" package
mkdir -p ubuntu/build/debian
cp -a linux/packaging/debian/* ubuntu/build/debian/
sed -i 's/Architecture: any/Architecture: amd64/g' ubuntu/build/debian/control
cd ubuntu/build
for CODENAME in $(distro-info --supported); do
rm debian/changelog
dch --package quickgui --newversion="${DEB_VER}~${CODENAME}${STAMP}" --distribution=${CODENAME} "New upstream release." --create
dpkg-buildpackage -d -S -sa
dput ppa:flexiondotorg/quickemu ../quickgui_${DEB_VER}~${CODENAME}${STAMP}_source.changes
done
- name: Show artifacts 👀
run: tree ubuntu/

2
.gitignore vendored
View File

@ -6,8 +6,6 @@
.packages
build/
dist/
# If you're building an application, you may want to check-in your pubspec.lock
pubspec.lock
# Directory created by dartdoc
# If you don't generate documentation locally you can remove this line.

View File

@ -4,7 +4,27 @@
# This file should be version controlled and should not be manually edited.
version:
revision: 3595343e20a61ff16d14e8ecc25f364276bb1b8b
channel: stable
revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: macos
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

View File

@ -1,7 +1,7 @@
{
"editor.codeActionsOnSave": {
"source.fixAll": true,
"source.organizeImports": true,
"source.fixAll": "explicit",
"source.organizeImports": "explicit"
},
"cmake.sourceDirectory": "${workspaceFolder}/linux"
}

128
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
#quickemu channel on Discord.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

9
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,9 @@
# Contributing
We welcome contributions to Quickgui.
- Help other Quickgui users by answering questions in the [Quickgui Discussions](https://github.com/quickemu-project/discussions/categories/quickgui) 🛟
- Improve the documentation in [this README](https://github.com/quickemu-project/quickgui/edit/master/README.md) and the [Quickgui Wiki](https://github.com/quickemu-project/quickgui/wiki) 📖
- File bug reports and feature requests in the [Quickgui Issues](https://github.com/quickemu-project/quickgui/issues) 📁
- Submit [Quickgui Pull requests](https://github.com/quickemu-project/quickgui/pulls) to fix bugs 🐞 or add new features ✨
- Commit messages must [conform to the Conventional Commits specification](https://www.conventionalcommits.org/).

View File

@ -1,63 +0,0 @@
SHELL := /usr/bin/env bash
VERSION := $(shell cat pubspec.yaml | grep "^version: " | cut -c 10- | sed 's/+/\-/')
SHORT_VERSION := $(shell xx="$(VERSION)"; arrVersion=($${xx//-/ }); echo $${arrVersion[0]};)
BUILD_ROOT := ../build-package
BASE_NAME := quickgui_$(SHORT_VERSION)
BUILD_DIR := $(BUILD_ROOT)/$(BASE_NAME)
BIN_TAR := $(BUILD_ROOT)/$(BASE_NAME).tar
ORIG_TAR := $(BASE_NAME).orig.tar
SRC_TAR := $(BUILD_ROOT)/$(BASE_NAME)-src.tar
FLUTTER := /opt/flutter/bin/flutter
version:
@echo VERSION is $(VERSION)
@echo SHORT_VERSION is $(SHORT_VERSION)
@echo BUILD_ROOT is $(BUILD_ROOT)
@echo type "make bin" to create binary package
@echo type "make ppa" to upload to launchpad
spawn:
echo "#! /bin/env bash" > /home/yannick/machines/focal/home/yannick/build.sh
echo "" >> /home/yannick/machines/focal/home/yannick/build.sh
echo "cd /opt/flutter-projects/quickgui" >> /home/yannick/machines/focal/home/yannick/build.sh
echo "make bin" >> /home/yannick/machines/focal/home/yannick/build.sh
chmod +x /home/yannick/machines/focal/home/yannick/build.sh
sudo systemd-nspawn -D /home/yannick/machines/focal --resolv-conf=off --bind-ro=/home/yannick/machines/resolv.conf:/etc/resolv.conf --bind=/opt/flutter:/opt/flutter --bind=/opt/flutter-projects:/opt/flutter-projects -u yannick bash /home/yannick/build.sh
distclean:
$(FLUTTER) clean
rm -rf $(BUILD_ROOT)/*
quickgui: distclean
$(FLUTTER) pub get
$(FLUTTER) build linux --release
bin: quickgui
mkdir -p $(BUILD_DIR)
cp -a build/linux/x64/release/bundle/* $(BUILD_DIR)
cp -a assets/resources $(BUILD_DIR)
tar -C $(BUILD_ROOT) -c -v --exclude "quickemu-icons/*.png" -f $(BIN_TAR) $(BASE_NAME)
xz -z $(BIN_TAR)
ppa: version
cp $(BIN_TAR).xz /mnt/data/dev/debianpackages/quickgui.deb/$(ORIG_TAR).xz
cd /mnt/data/dev/debianpackages/quickgui.deb/quickgui ; \
dch -v $(VERSION) "New changelog message" ; \
vi debian/changelog ; \
for dist in focal jammy kinetic lunar; do \
sed -i "1 s/^\(.*\)) UNRELEASED;\(.*\)\$$/\1~xxx1.0) xxx;\2/g" debian/changelog ; \
sed -i "1 s/~.*1\.0) .*;\(.*\)\$$/~$${dist}1.0) $$dist;\1/g" debian/changelog ; \
dpkg-buildpackage -d -S -sa ; \
dput ppa:yannick-mauray/quickgui ../quickgui_$(VERSION)~$${dist}1.0_source.changes ; \
done
download: version
for dist in focal jammy kinetic; do \
aria2c https://launchpad.net/~yannick-mauray/+archive/ubuntu/quickgui/+files/quickgui_$(VERSION)~$${dist}1.0_amd64.deb; \
done
src:
mkdir -p $(BUILD_ROOT)
tar -C .. -c -v -f $(SRC_TAR) --exclude .git --transform 's/^quickgui/$(BASE_NAME)/' quickgui
rm ${SRC_TAR}.xz
xz -z $(SRC_TAR)

216
README.md
View File

@ -1,119 +1,167 @@
<h1 align="center">
<img src=".github/logo.png" alt="Quickgui" width="256" />
<br />
Quickgui
</h1>
<div align="center">
<img src=".github/logo.png" alt="Quickgui" width="256" />
<p align="center">A Flutter frontend for <kbd>quickget</kbd> and <a href="https://github.com/quickemu-project/quickemu">quickemu</a>.</p>
<div align="center"><img src="assets/github/screenshot1.png" alt="Quickgui screenshot"></div>
# Quickgui
This project is discussed mainly on [![Discord](https://img.shields.io/discord/712850672223125565?color=87a556&label=WimpysWorld%20Discord&logo=discord&logoColor=ffffff&style=flat-square)](https://discord.gg/sNmz3uw) server
**An elegant virtual machine manager for the desktop**
## Install
**Made with 💝 for <img src=".github/tux.png" align="top" width="24" alt="Tux (Linux)"/>**
<!--& <img src=".github/apple.png" align="top" width="24" alt="Apple (macOS)"/>-->
</div>
### quickemu
For this tool to work, you need to have `quickget`, from the `quickemu`
package, in your current `path`.
Go to the `quickemu` [github page](https://github.com/quickemu-project/quickemu)
for more information about installing the tool.
<p align="center">
&nbsp;<a href="https://wimpysworld.io/discord" target="_blank"><img alt="Discord" src="https://img.shields.io/discord/712850672223125565?style=for-the-badge&logo=discord&logoColor=%23ffffff&label=Discord&labelColor=%234253e8&color=%23e4e2e2"></a>
</p>
### Standard package
# Introduction
On Ubuntu, `quickgui` can be installed as a standard package.
Quickgui is a graphical user interface for the [Quickemu](https://github.com/quickemu-project/quickemu) virtual machine manager.
Quickgui enables you to create and manage virtual machines from a simple and elegant interface.
Nearly 1000 operating systems supported including Windows, macOS, BSDs, and 100s of Linux distros. All with automated downloads and configuration.
First, add this ppa (this only needs to be done once):
# Install
```
sudo add-apt-repository ppa:yannick-mauray/quickgui
sudo apt update
Quickgui depends on Quickemu. Most package managers will automatically install Quickemu when you install Quickgui.
If you don't have Quickemu installed then go and follow the Quickemu installation steps for your operating system:
- [**Quickemu Installation**](https://github.com/quickemu-project/quickemu/wiki/01-Installation)
## Debian
A .deb package is available for Debian on our [release page](https://github.com/quickemu-project/quickgui/releases).
- Download the latest .deb package
- Install it with `apt-get install ./quickgui-1.2.10+1-linux.deb`
## Fedora
A .rpm package is available for Fedora on our [release page](https://github.com/quickemu-project/quickgui/releases).
## NixOS
### Flake
[![FlakeHub](https://img.shields.io/endpoint?url=https://flakehub.com/f/quickemu-project/quickgui/badge)](https://flakehub.com/flake/quickemu-project/quickgui)
Stable releases of Quickgui are published to FlakeHub for NixOS users. See the Quickemu flake on FlakeHub for more details:
- <https://flakehub.com/flake/quickemu-project/quickgui>
### Nixpkgs
Add Quickgui to your `systemPackages`. For example:
```nix
systemPackages = with pkgs; [
quickgui
];
```
Then, install the package:
```
sudo apt install quickgui
## Ubuntu
Ubuntu users can install Quickgui using the [.deb package described above for Debian](#debian) or from our PPA.
```shell
sudo apt-add-repository ppa:flexiondotorg/quickemu
sudo apt-get update
sudo apt-get install quickgui
```
## Other Linux
We provide an AppImage and a pre-compiled binary of Quickemu in a .zip file.
### AppImage
The AppImage should work on most Linux distributions.
* [Download](https://github.com/quickemu-project/quickgui/releases) the latest AppImage.
* `chmod +x quickgui-1.2.10+1-linux.AppImage`
* `./quickgui-1.2.10+1-linux.AppImage`
### Pre-compiled binary
* [Download](https://github.com/quickemu-project/quickgui/releases) the binary.
* Uncompress the tarball wherever you want.
* From anywhere on the filesystem, run the app.
* [Download](https://github.com/quickemu-project/quickgui/releases) the latest .zip file.
* `unzip quickgui-1.2.10+1-linux.zip`
* `cd quickgui-1.2.10+1-linux`
* `chmod +x quickgui`
* `./quickgui`
# Compile
To compile the Quickgui yourself:
* [Install Flutter](https://docs.flutter.dev/get-started/install/linux/desktop)
* `git clone https://github.com/quickemu-project/quickgui.git`
* `cd quickgui`
* `flutter pub get`
* `flutter config --enable-linux-desktop`
* `flutter build linux --release`
## Macos
This requires flutter to be installed as well as xcode development for macos nad cocoapods.
It will install quickgui app in the applications and after running the command below you should be able to search for it through spotlight
```bash
xz quickgui-a.b.c-d.tar.xz
tar xvf quickgui-a.b.c-d.tar
/path/to/quickgui
```
Alternatively, use `update-alternatives` to install `quickgui` system-wide:
```bash
sudo update-alternatives --install /usr/local/bin/quickgui quickgui /path/to/quickgui 50
```
## Build
If you don't want to run the binary, you can rebuild the application yourself:
* [Set up Flutter](https://ubuntu.com/blog/getting-started-with-flutter-on-ubuntu)
* Clone this repo,
* Switch to the project's directory,
* Build the project,
* Run the app.
```bash
git clone https://github.com/quickgui/quickgui.git
git clone https://github.com/quickemu-project/quickgui.git
cd quickgui
flutter build linux --release
flutter pub get
flutter config --enable-macos-desktop
flutter build macos --release
```
The compiled binary will be in `build/linux/x64/release/bundle/quickgui`.
You can run it with:
```shell
./build/linux/x64/release/bundle/quickgui
```
You can also use `update-alternatives` for easier access to the app.
# Usage
## Usage
<div align="center">
<small><b>Main Screen</b></small><br /><br />
<img src="assets/github/screenshot_01_main.png" width="346" height="290" alt="Quickgui Main screen">
</div>
### Downloading VMs
## Downloader
From the main screen, select the operating system you want to use. The list can be filtered.
- From the main screen, click "Create new machines"
- Select the Operating System you want to install
- Select the Version of the operating system you want to use.
- Click the "Download" button.
- The ISO will be downloaded
- When the download is complete, click the "Dismiss" button.
<div align="center">
<small><b>Downloader</b></small><br />
<img src="assets/github/screenshot_02_downloader.png" width="346" height="290" alt="Quickgui Downloader">
</div>
<div align="center"><img src="assets/github/screenshot1.png" alt="Main screen"></div>
## Manager
<div align="center"><img src="assets/github/screenshot2.png" alt="List of supported operating systems"></div>
- From the main screen, click "Manage existing machines"
- The Manager screen will list available Quickemu VMs in the directory you have chosen to store them.
- Start a VM by clicking the "Play" (▶) button.
- Kill a running VM by clicking the "Stop" (■) button.
- Clicking the "Trash" (🗑) button will prompt you to delete the whole VM or just its disk image.
<div align="center"><img src="assets/github/screenshot3.png" alt="Search a distribution"></div>
<div align="center">
<small><b>Manager</b></small><br />
<img src="assets/github/screenshot_03_manager.png" width="346" height="290" alt="Quickgui Manager">
</div>
Then, select the version:
When a VM is running, Quickgui will display the host ports that are mapped to the SPICE and SSH ports on the guest. These ports are used to connect to the guest for display and SSH access.
<div align="center"><img src="assets/github/screenshot4.png" alt="Main screen after selection of the operating system"></div>
### SPICE
<div align="center"><img src="assets/github/screenshot5.png" alt="Versions of the selected operating system"></div>
If you close the SPICE display and wish to reconnect, you can click the "Connect display with SPICE" button. To open an SSH session, you can click the "Connect with SSH" button.
If there are some options (Windows language, Pop!_OS nvidia or Intel, etc..), they will be displayed:
If the "Connect display with SPICE" button is disabled, the `spicy` client cannot be found. Ensure it is installed, and in your PATH (it should have been installed with `quickemu`).
<div align="center"><img src="assets/github/screenshot8.png" alt="Choose an option"></div>
### SSH
<div align="center"><img src="assets/github/screenshot9.png" alt="Option is displayed"></div>
If the "Connect with SSH" button is disabled, an SSH server cannot be detected on the guest. Most guest operating systems will not install an SSH server by default, so if it was not an option during installation, you will need to install one yourself. It must be listening on port 22 (the default SSH port). Once a server is installed and running, it should be detected automatically.
Then click "Download". The ISO will be downloaded in the current working directory, in 99% of cases that will be the directory where `quickgui` was invoked from.
<div align="center"><img src="assets/github/screenshot10.png" alt="Waiting for download"></div>
<div align="center"><img src="assets/github/screenshot11.png" alt="Downloading"></div>
<div align="center"><img src="assets/github/screenshot12.png" alt="Download finished"></div>
### Managing VMs
The "Manage running VMs" screen will list available Quickemu VMs in the current working directory.
VMs can be launched by clicking the "Play" (▶) button. Running VMs will have the "Play" and "Stop" buttons highlighted in green and red respectively, and pressing "Stop" (■) will kill the running VM.
When a VM is running, the host's ports mapped to SPICE and SSH on the guest will be displayed. If you close the SPICE display and wish to reconnect, you can click the "Connect display with SPICE" button. To open an SSH session, you can click the "Connect with SSH" button.
If the "Connect display with SPICE" button is disabled, the `spicy` client could not be found. Ensure it is installed, and in your PATH (it should have been installed with `quickemu`).
If the "Connect with SSH" button is disabled, an SSH server could not be detected on the guest. Most guest operating systems will not install an SSH server by default, so if it was not an option during install, you will need to install one yourself. It must be listening on port 22 (the default SSH port). Once a server is installed and running, it should be detected automatically.
"Connect with SSH" will use the terminal emulator symlinked to `x-terminal-emulator`. Several common terminal emulators are supported. If yours is not, please raise an issue on this repository.
"Connect with SSH" will open a terminal and attempt to connect to the guest. If the connection is successful, you will be prompted for the password. If the connection is unsuccessful, you might need to remove the host key for the guest from your `~/.ssh/known_hosts` file using something like `ssh-keygen -R [localhost]:22220`.

18
SECURITY.md Normal file
View File

@ -0,0 +1,18 @@
# Security Policy
## Supported Versions
Here are the versions of Quickgui currently being supported with security updates.
| Version | Supported |
| ------- | ------------------ |
| 1.2.x | :white_check_mark: |
| < 1.1 | :x: |
## Reporting a Vulnerability
If you discover a vulnerability in Quickgui then [file an issue](https://github.com/quickemu-project/quickgui/issues/new) and click *Report a vulnerability*.
- Quickgui is a spare-time hobby project.
- We do not have SLAs for responding to security issues.
- It is a best-efforts basis.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -49,8 +49,8 @@ msgstr "Správce stahování"
msgid "Downloading (no progress available)..."
msgstr "Probíhá stahování (průběh není k dispozici) …"
msgid "Downloading...{0}%"
msgstr "Probíhá stahování …{0}%"
msgid "Downloading... {0}%"
msgstr "Probíhá stahování  {0}%"
msgid "Downloading {0}"
msgstr "Probíhá stahování {0}"

View File

@ -55,7 +55,7 @@ msgstr "Dadlwythwr"
msgid "Downloading (no progress available)..."
msgstr "Llwytho i lawr (dim cynnydd ar gael)..."
msgid "Downloading...{0}%"
msgid "Downloading... {0}%"
msgstr "Llwytho i lawr... {0}%"
msgid "Downloading {0}"

View File

@ -50,8 +50,8 @@ msgstr "Downloader"
msgid "Downloading (no progress available)..."
msgstr "Lädt herunter (Kein Fortschritt verfügbar) …"
msgid "Downloading...{0}%"
msgstr "Herunterladen …{0}%"
msgid "Downloading... {0}%"
msgstr "Herunterladen  {0}%"
msgid "Downloading {0}"
msgstr "{0} wird herunterladen"

View File

@ -49,8 +49,8 @@ msgstr "Downloader"
msgid "Downloading (no progress available)..."
msgstr "Downloading (no progress available)..."
msgid "Downloading...{0}%"
msgstr "Downloading...{0}%"
msgid "Downloading... {0}%"
msgstr "Downloading... {0}%"
msgid "Downloading {0}"
msgstr "Downloading {0}"
@ -138,3 +138,61 @@ msgstr "Directory where the machines are stored"
msgid "Search version"
msgstr "Search version"
msgid "quickemu was not found in your PATH"
msgstr "quickemu was not found in your PATH"
msgid "Please install it and try again."
msgstr "Please install it and try again."
msgid "See"
msgstr "See"
msgid "for more information"
msgstr "for more information"
msgid "Delete {0}"
msgstr "Delete {0}"
msgid "You are about to delete {0}. This cannot be undone. Would you like to delete the disk image but keep the configuration, or delete the whole VM?"
msgstr "You are about to delete {0}. This cannot be undone. Would you like to delete the disk image but keep the configuration, or delete the whole VM?"
msgid "Delete disk image"
msgstr "Delete disk image"
msgid "Delete whole VM"
msgstr "Delete whole VM"
msgid "Connect display with SPICE"
msgstr "Connect display with SPICE"
msgid "SPICE client not found"
msgstr "SPICE client not found"
msgid "Connect with SSH"
msgstr "Connect with SSH"
msgid "SSH server not detected on guest"
msgstr "SSH server not detected on guest"
msgid "Launch SSH connection to {0}"
msgstr "Launch SSH connection to {0}"
msgid "SSH username"
msgstr "SSH username"
# Connect to the VM via SSH
msgid "Connect"
msgstr "Connect"
msgid "Loading available downloads"
msgstr "Loading available downloads"
msgid "Powered by"
msgstr "Powered by"
msgid "Error"
msgstr "Error"
msgid "Could not write to the working directory. Please check the permissions."
msgstr "Could not write to the working directory. Please check the permissions."

View File

@ -62,8 +62,8 @@ msgid "Downloading (no progress available)..."
msgstr "Descargando (progreso no disponible)..."
#, fuzzy
msgid "Downloading...{0}%"
msgstr "Descargando...{0}%"
msgid "Downloading... {0}%"
msgstr "Descargando... {0}%"
#, fuzzy
msgid "Downloading {0}"

View File

@ -49,8 +49,8 @@ msgstr "Gestionnaire de téléchargements"
msgid "Downloading (no progress available)..."
msgstr "Téléchargement (pas de barre de progression)..."
msgid "Downloading...{0}%"
msgstr "Téléchargement...{0}%"
msgid "Downloading... {0}%"
msgstr "Téléchargement... {0}%"
msgid "Downloading {0}"
msgstr "Téléchargement de {0}"
@ -138,3 +138,61 @@ msgstr "Dossier ou sont enregistrées les machines"
msgid "Search version"
msgstr "Chercher une option"
msgid "quickemu was not found in your PATH"
msgstr "quickemu n'est pas dans votre PATH"
msgid "Please install it and try again."
msgstr "Veuillez l'installer, et essayer de nouveau."
msgid "See"
msgstr "Voir"
msgid "for more information"
msgstr "pour plus d'informations"
msgid "Delete {0}"
msgstr "Supprimer {0}"
msgid "You are about to delete {0}. This cannot be undone. Would you like to delete the disk image but keep the configuration, or delete the whole VM?"
msgstr "Vous êtes sur le point de supprimer {0}. Cette action est irréversible. Voulez-vous supprimer l'image disque mais conserver la configuration, ou supprimer la machine virtuelle entière ?"
msgid "Delete disk image"
msgstr "Supprimer l'image disque"
msgid "Delete whole VM"
msgstr "Supprimer la machine virtuelle entière"
msgid "Connect display with SPICE"
msgstr "Connecter l'affichage avec SPICE"
msgid "SPICE client not found"
msgstr "Client SPICE non trouvé"
msgid "Connect with SSH"
msgstr "Se connecter avec SSH"
msgid "SSH server not detected on guest"
msgstr "Serveur SSH non détecté sur l'invité"
msgid "Launch SSH connection to {0}"
msgstr "Lancer la connexion SSH vers {0}"
msgid "SSH username"
msgstr "Nom d'utilisateur SSH"
# Connect to the VM via SSH
msgid "Connect"
msgstr "Connecter"
msgid "Error"
msgstr "Erreur"
msgid "Could not write to the working directory. Please check the permissions."
msgstr "Impossible d'écrire dans le répertoire de travail. Veuillez vérifier les permissions."
msgid "Loading available downloads"
msgstr "Chargement des téléchargements disponibles"
msgid "Powered by"
msgstr "Propulsé par"

View File

@ -51,8 +51,8 @@ msgstr "Inneal luchdachadh sìos"
msgid "Downloading (no progress available)..."
msgstr "A luchdachadh sìos (chan eil adhartas ri fhaighinn)"
msgid "Downloading...{0}%"
msgstr "A luchdachadh sìos...{0}%"
msgid "Downloading... {0}%"
msgstr "A luchdachadh sìos... {0}%"
msgid "Downloading {0}"
msgstr "Thèid {0} a luchdachadh sìos"

View File

@ -49,8 +49,8 @@ msgstr "Letöltő"
msgid "Downloading (no progress available)..."
msgstr "Letöltés (a haladásról nincs visszajelzés)..."
msgid "Downloading...{0}%"
msgstr "Letöltés...{0}%"
msgid "Downloading... {0}%"
msgstr "Letöltés... {0}%"
msgid "Downloading {0}"
msgstr "Letöltés {0}"

View File

@ -54,8 +54,8 @@ msgstr "Download"
msgid "Downloading (no progress available)..."
msgstr "Download (nessun progresso disponibile)..."
msgid "Downloading...{0}%"
msgstr "Scaricando...{0}%"
msgid "Downloading... {0}%"
msgstr "Scaricando... {0}%"
msgid "Downloading {0}"
msgstr "Scaricamento di {0}"

View File

@ -49,8 +49,8 @@ msgstr "ダウンローダ"
msgid "Downloading (no progress available)..."
msgstr "ダウンロード中(進行状況を推定中)..."
msgid "Downloading...{0}%"
msgstr "ダウンロード中...{0}%"
msgid "Downloading... {0}%"
msgstr "ダウンロード中... {0}%"
msgid "Downloading {0}"
msgstr "{0}をダウンロード中"

View File

@ -55,8 +55,8 @@ msgstr "Downloader"
msgid "Downloading (no progress available)..."
msgstr "Downloaden (geen voortgang beschikbaar)..."
msgid "Downloading...{0}%"
msgstr "Downloaden...{0}%"
msgid "Downloading... {0}%"
msgstr "Downloaden... {0}%"
msgid "Downloading {0}"
msgstr "Downloaden {0}"

View File

@ -55,8 +55,8 @@ msgstr "Nedlaster"
msgid "Downloading (no progress available)..."
msgstr "Nedlasting (ingen fremgang tilgjengelig)..."
msgid "Downloading...{0}%"
msgstr "Laster ned...{0}%"
msgid "Downloading... {0}%"
msgstr "Laster ned... {0}%"
msgid "Downloading {0}"
msgstr "Laster ned {0}"

View File

@ -48,7 +48,7 @@ msgstr "Telecargador"
msgid "Downloading (no progress available)..."
msgstr "Telecargament (cap de barra de progression pas disponibla)..."
msgid "Downloading...{0}%"
msgid "Downloading... {0}%"
msgstr "Telecargament... {0}%"
msgid "Downloading {0}"

View File

@ -49,8 +49,8 @@ msgstr "Downloader"
msgid "Downloading (no progress available)..."
msgstr "Baixando (progresso não disponível)..."
msgid "Downloading...{0}%"
msgstr "Baixando...{0}%"
msgid "Downloading... {0}%"
msgstr "Baixando... {0}%"
msgid "Downloading {0}"
msgstr "Baixando {0}"

View File

@ -49,8 +49,8 @@ msgstr "Transferidor"
msgid "Downloading (no progress available)..."
msgstr "A transferir (progresso não disponível)..."
msgid "Downloading...{0}%"
msgstr "A transferir...{0}%"
msgid "Downloading... {0}%"
msgstr "A transferir... {0}%"
msgid "Downloading {0}"
msgstr "A transferir {0}"

View File

@ -49,7 +49,7 @@ msgstr ""
msgid "Downloading (no progress available)..."
msgstr ""
msgid "Downloading...{0}%"
msgid "Downloading... {0}%"
msgstr ""
msgid "Downloading {0}"
@ -138,3 +138,63 @@ msgstr ""
msgid "Search version"
msgstr ""
msgid "quickemu was not found in your PATH"
msgstr ""
msgid "Please install it and try again."
msgstr ""
# The complete sentence is "See github.com/quickemu-project/quickemu for more information"
msgid "See"
msgstr ""
# The complete sentence is "See github.com/quickemu-project/quickemu for more information"
msgid "for more information"
msgstr ""
msgid "Delete {0}"
msgstr ""
msgid "You are about to delete {0}. This cannot be undone. Would you like to delete the disk image but keep the configuration, or delete the whole VM?"
msgstr ""
msgid "Delete disk image"
msgstr ""
msgid "Delete whole VM"
msgstr ""
msgid "Connect display with SPICE"
msgstr ""
msgid "SPICE client not found"
msgstr ""
msgid "Connect with SSH"
msgstr ""
msgid "SSH server not detected on guest"
msgstr ""
msgid "Launch SSH connection to {0}"
msgstr ""
msgid "SSH username"
msgstr ""
# Connect to the VM via SSH
msgid "Connect"
msgstr ""
msgid "Error"
msgstr ""
msgid "Could not write to the working directory. Please check the permissions."
msgstr ""
msgid "Loading available downloads"
msgstr ""
msgid "Powered by"
msgstr ""

View File

@ -55,8 +55,8 @@ msgstr "Загрузчик"
msgid "Downloading (no progress available)..."
msgstr "Загрузка (нет прогресса)..."
msgid "Downloading...{0}%"
msgstr "Загрузка...{0}%"
msgid "Downloading... {0}%"
msgstr "Загрузка... {0}%"
msgid "Downloading {0}"
msgstr "Загрузка {0}"

View File

@ -1,11 +1,11 @@
# Swedish translation for quickgui.
# Åke Engelbrektson <eson@svenskasprakfiler.se>, 2022.
# Åke Engelbrektson <eson@svenskasprakfiler.se>, 2022, 2024.
#
msgid ""
msgstr ""
"Project-Id-Version: quickgui\n"
"POT-Creation-Date: 2021-09-29 09:59+0200\n"
"PO-Revision-Date: 2022-06-13 13:19+0200\n"
"PO-Revision-Date: 2024-08-14 21:09+0200\n"
"Last-Translator: Åke Engelbrektson <eson@svenskasprakfiler.se>\n"
"Language-Team: \n"
"Language: sv\n"
@ -13,7 +13,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.1\n"
"X-Generator: Poedit 3.4.4\n"
"X-Poedit-Basepath: .\n"
msgid "Quickgui : a Flutter frontend for Quickget and Quickemu"
@ -52,7 +52,7 @@ msgstr "Nerladdare"
msgid "Downloading (no progress available)..."
msgstr "Laddar ner (inget förlopp tillgängligt)..."
msgid "Downloading...{0}%"
msgid "Downloading... {0}%"
msgstr "Laddar ner... {0}%"
msgid "Downloading {0}"
@ -135,3 +135,74 @@ msgstr "Du är på väg att stoppa den virtuella maskinen {0}"
msgid "Language"
msgstr "Språk"
msgid "Directory where the machines are stored"
msgstr "Plats där maskinerna lagras"
msgid "Search version"
msgstr "Sök version"
msgid "quickemu was not found in your PATH"
msgstr "quickemu kunde inte hittas i din PATH"
msgid "Please install it and try again."
msgstr "Installera det och försök igen."
# The complete sentence is "See github.com/quickemu-project/quickemu for more information"
msgid "See"
msgstr "Se"
# The complete sentence is "See github.com/quickemu-project/quickemu for more information"
msgid "for more information"
msgstr "för mer information"
msgid "Delete {0}"
msgstr "Ta bort {0}"
msgid ""
"You are about to delete {0}. This cannot be undone. Would you like to delete "
"the disk image but keep the configuration, or delete the whole VM?"
msgstr ""
"Du är på väg att ta bort {0}. Detta kan inte ångras. Vill du ta bort "
"diskavbildningen men behålla konfigurationen eller ta bort hela den "
"virtuella datorn?"
msgid "Delete disk image"
msgstr "Ta bor diskavbilden"
msgid "Delete whole VM"
msgstr "Ta bort hela den virtuella datorn"
msgid "Connect display with SPICE"
msgstr "Anslut skärm med SPICE"
msgid "SPICE client not found"
msgstr "Ingen SPICE-klient hittades"
msgid "Connect with SSH"
msgstr "Anslut via SSH"
msgid "SSH server not detected on guest"
msgstr "Ingen SSH-server identifierad på gästen"
msgid "Launch SSH connection to {0}"
msgstr "Starta SSH-anslutning till {0}"
msgid "SSH username"
msgstr "SSH-användarnamn"
# Connect to the VM via SSH
msgid "Connect"
msgstr "Anslut"
msgid "Error"
msgstr "Fel"
msgid "Could not write to the working directory. Please check the permissions."
msgstr "Kunde inte skriva till arbetsmappen. Kontrollera rättigheterna."
msgid "Loading available downloads"
msgstr "Läser in tillgängliga nerladdningar"
msgid "Powered by"
msgstr "Drivs av"

View File

@ -49,8 +49,8 @@ msgstr "Yükleyici"
msgid "Downloading (no progress available)..."
msgstr "Yükleniyor (ilerleme yok)..."
msgid "Downloading...{0}%"
msgstr "Yükleniyor...{0}%"
msgid "Downloading... {0}%"
msgstr "Yükleniyor... {0}%"
msgid "Downloading {0}"
msgstr "Yükleniyor {0}"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,9 +1,9 @@
[Desktop Entry]
Version=1.0
Name=quickgui
Comment=A Flutter frontend for quickemu
Exec=/usr/bin/quickgui
Name=Quickgui
Comment=An elegant virtual machine manager for the desktop
Exec=quickgui
Terminal=false
Type=Application
Icon=quickgui_512.png
Categories=System;
Icon=quickgui
Categories=Development;System;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 454 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 931 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -47,6 +47,14 @@ mkShell rec {
# Packages installed via `dart pub global activate package_name` are
# located in the `$PUB_CACHE/bin` directory.
shellHook = ''
flutter pub get
yq eval pubspec.lock -o=json -P > pubspec.lock.json
flutter config --enable-linux-desktop
dart pub global activate flutter_distributor
echo "**********************************************************************"
echo "* flutter build linux --release *"
echo "* flutter_distributor package --platform=linux --targets=zip *"
echo "**********************************************************************"
if [ -z "$PUB_CACHE" ]; then
export PATH="$PATH":"$HOME/.pub-cache/bin"
else

View File

@ -12,3 +12,10 @@ releases:
dart-define:
APP_ENV: dev
publish_to: none
- name: macos-dev
jobs:
- name: quickgui-dev-macos
package:
platform: macos
target: dmg
publish_to: none

View File

@ -2,12 +2,26 @@
"nodes": {
"flake-schemas": {
"locked": {
"lastModified": 1697467827,
"narHash": "sha256-j8SR19V1SRysyJwpOBF4TLuAvAjF5t+gMiboN4gYQDU=",
"rev": "764932025c817d4e500a8d2a4d8c565563923d29",
"revCount": 29,
"lastModified": 1775244557,
"narHash": "sha256-iYXRXIX9eafJmwJFAhqT3YxvvpNRuPFSLRCSpvGh8Ic=",
"rev": "15edbeeaf77e42216dbcba8bfd907fdeabb75a2b",
"revCount": 132,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.2/018b3da8-4cc3-7fbb-8ff7-1588413c53e2/source.tar.gz"
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.4.2/019d5cf2-ee3c-7313-964e-f3f83c35d509/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%2A.tar.gz"
}
},
"flake-schemas_2": {
"locked": {
"lastModified": 1761577921,
"narHash": "sha256-eK3/xbUOrxp9fFlei09XNjqcdiHXxndzrTXp7jFpOk8=",
"rev": "47849c7625e223d36766968cc6dc23ba0e135922",
"revCount": 107,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.2.0/019a4a84-544d-7c59-b26d-e334e320c932/source.tar.gz"
},
"original": {
"type": "tarball",
@ -16,22 +30,43 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1719254875,
"narHash": "sha256-ECni+IkwXjusHsm9Sexdtq8weAq/yUyt1TWIemXt3Ko=",
"rev": "2893f56de08021cffd9b6b6dfc70fd9ccd51eb60",
"revCount": 643242,
"lastModified": 1777077449,
"narHash": "sha256-AIiMJiqvGrN4HyLEbKAoCSRRYn0rnlW5VbKNIMIYqm4=",
"rev": "a4bf06618f0b5ee50f14ed8f0da77d34ecc19160",
"revCount": 911667,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.643242%2Brev-2893f56de08021cffd9b6b6dfc70fd9ccd51eb60/0190530b-f61b-7788-9601-b336b1caf671/source.tar.gz"
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.911667%2Brev-a4bf06618f0b5ee50f14ed8f0da77d34ecc19160/019dcae8-75b0-71d1-abd5-feab9658f0fa/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/NixOS/nixpkgs/0.1.%2A.tar.gz"
"url": "https://flakehub.com/f/NixOS/nixpkgs/%2A.tar.gz"
}
},
"quickemu": {
"inputs": {
"flake-schemas": "flake-schemas_2",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1770727319,
"narHash": "sha256-djTJr1I0LDBdbIPtTVWB4b/t1jSQ2/+RtQtWTnMLBFs=",
"rev": "81d038cbaeb8fc4f7154489447fe9f856299c742",
"revCount": 2292,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/quickemu-project/quickemu/4.9.9/019c47be-6c19-773e-881b-f7d33905672f/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/quickemu-project/quickemu/%2A.tar.gz"
}
},
"root": {
"inputs": {
"flake-schemas": "flake-schemas",
"nixpkgs": "nixpkgs"
"nixpkgs": "nixpkgs",
"quickemu": "quickemu"
}
}
},

View File

@ -1,38 +1,47 @@
{
description = "Quickemu flake";
description = "Quickgui flake";
inputs = {
flake-schemas.url = "https://flakehub.com/f/DeterminateSystems/flake-schemas/*.tar.gz";
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1.*.tar.gz";
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/*.tar.gz";
quickemu.url = "https://flakehub.com/f/quickemu-project/quickemu/*.tar.gz";
quickemu.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = {
self,
flake-schemas,
nixpkgs,
quickemu,
}: let
forAllSystems = function:
nixpkgs.lib.genAttrs [
"x86_64-linux"
# TODO: Enable when upstream supports these platforms
#"aarch64-linux"
#"x86_64-darwin"
#"aarch64-darwin"
] (system: function nixpkgs.legacyPackages.${system});
# Define supported systems and a helper function for generating system-specific outputs
#TODO: Add the following as quickemu/quickgui/GitHub builders support them:
# aarch64-darwin aarch64-linux x86_64-darwin
supportedSystems = [ "aarch64-linux" "x86_64-linux" ];
forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f {
system = system;
pkgs = import nixpkgs { inherit system; };
});
in {
# Schemas tell Nix about the structure of your flake's outputs
# Define schemas for the flake's outputs
schemas = flake-schemas.schemas;
overlays.default = final: prev: {
quickgui = final.callPackage ./package.nix {};
};
# Define overlays for each supported system
overlays = forEachSupportedSystem ({pkgs, system, ...}: {
default = final: prev: {
quickgui = final.callPackage ./package.nix { quickemu = quickemu.packages.${system}.default; };
};
});
packages = forAllSystems (pkgs: rec {
quickgui = pkgs.callPackage ./package.nix {};
# Define packages for each supported system
packages = forEachSupportedSystem ({pkgs, system, ...}: rec {
quickgui = pkgs.callPackage ./package.nix { quickemu = quickemu.packages.${system}.default; };
default = quickgui;
});
devShells = forAllSystems (pkgs: {
default = pkgs.callPackage ./devshell.nix {};
# Define devShells for each supported system
devShells = forEachSupportedSystem ({pkgs, system, ...}: {
default = pkgs.callPackage ./devshell.nix { quickemu = quickemu.packages.${system}.default; };
});
};
}

View File

@ -1,20 +1,20 @@
import 'dart:io';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart';
import 'package:window_size/window_size.dart';
import 'package:flutter/services.dart';
import 'src/app.dart';
import 'src/mixins/app_version.dart';
import 'src/model/app_settings.dart';
import 'src/model/operating_system.dart';
import 'src/model/option.dart';
import 'src/model/version.dart';
import 'src/model/osicons.dart';
import 'src/model/version.dart';
Future<List<OperatingSystem>> loadOperatingSystems(bool showUbuntus) async {
var process = await Process.run('quickget', ['--list-csv']);
@ -65,9 +65,7 @@ Future<void> getIcons() async {
.where((String key) => key.contains('.svg'))
.toList();
for (final imagePath in imagePaths) {
String filename = imagePath
.split('/')
.last;
String filename = imagePath.split('/').last;
String id = filename.substring(0, filename.lastIndexOf('.'));
osIcons[id] = imagePath;
}
@ -76,8 +74,13 @@ Future<void> getIcons() async {
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Don't forget to also change the size in linux/my_application.cc:50
setWindowMinSize(const Size(692, 580));
setWindowMaxSize(const Size(692, 580));
if (Platform.isMacOS) {
setWindowMinSize(const Size(692 + 2, 580 + 30));
setWindowMaxSize(const Size(692 + 2, 580 + 30));
} else {
setWindowMinSize(const Size(692, 580));
setWindowMaxSize(const Size(800, 720));
}
final foundQuickGet = await Process.run('which', ['quickget']);
if (foundQuickGet.exitCode == 0) {
gOperatingSystems = loadOperatingSystems(false);

View File

@ -5,7 +5,7 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:gettext_i18n/gettext_i18n.dart';
import 'package:provider/provider.dart';
import 'package:quickgui/src/mixins/app_version.dart';
import 'package:quickgui/src/pages/deget_not_found_page.dart';
import 'package:quickgui/src/pages/debget_not_found_page.dart';
import 'package:quickgui/src/supported_locales.dart';
import 'package:shared_preferences/shared_preferences.dart';
@ -15,7 +15,7 @@ import 'model/app_settings.dart';
import 'pages/main_page.dart';
class App extends StatefulWidget {
const App({Key? key}) : super(key: key);
const App({super.key});
@override
State<App> createState() => _AppState();
@ -61,15 +61,14 @@ class _AppState extends State<App> with PreferencesMixin {
builder: (context, appSettings, _) => MaterialApp(
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSwatch(
colorScheme: ColorScheme.fromSwatch(
primarySwatch: Colors.pink,
backgroundColor: Colors.white,
)
),
)),
darkTheme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSwatch(
primarySwatch: darkGrey,
primarySwatch: Colors.pink,
backgroundColor: darkGrey.shade700,
brightness: Brightness.dark,
),

View File

@ -4,3 +4,15 @@ var gIsSnap = Platform.environment['SNAP']?.isNotEmpty ?? false;
const String prefWorkingDirectory = 'workingDirectory';
const String prefThemeMode = 'themeMode';
const String prefCurrentLocale = 'currentLocale';
Future<String> fetchQuickemuVersion() async {
// Get the version of quickemu
var result = await Process.run('quickemu', ['--version']);
// If successful return the trimmed version
if (result.exitCode == 0) {
return result.stdout.trim();
} else {
return '';
}
}

View File

@ -4,10 +4,10 @@ import 'package:flutter/material.dart';
import 'package:quickgui/src/supported_locales.dart';
class AppSettings extends ChangeNotifier {
ThemeMode? _themeMode;
ThemeMode _themeMode = ThemeMode.light;
String? _activeLocale;
ThemeMode get themeMode => _themeMode ?? ThemeMode.system;
ThemeMode get themeMode => _themeMode;
String get activeLocale => _activeLocale ?? Platform.localeName;
@ -38,8 +38,7 @@ class AppSettings extends ChangeNotifier {
}
set useDarkModeSilently(bool useDarkMode) {
//_themeMode = useDarkMode ? ThemeMode.dark : ThemeMode.light;
_themeMode = ThemeMode.light;
_themeMode = useDarkMode ? ThemeMode.dark : ThemeMode.light;
}
set useDarkMode(bool useDarkMode) {

View File

@ -1,9 +1,10 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:gettext_i18n/gettext_i18n.dart';
import 'package:url_launcher/url_launcher.dart';
class DebgetNotFoundPage extends StatelessWidget {
const DebgetNotFoundPage({Key? key}) : super(key: key);
const DebgetNotFoundPage({super.key});
@override
Widget build(BuildContext context) {
@ -12,18 +13,18 @@ class DebgetNotFoundPage extends StatelessWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
'quickemu was not found in your PATH',
style: TextStyle(
Text(
context.t('quickemu was not found in your PATH'),
style: const TextStyle(
fontSize: 24,
),
),
const SizedBox(
height: 16,
),
const Text(
'Please install it and try again.',
style: TextStyle(
Text(
context.t('Please install it and try again.'),
style: const TextStyle(
fontSize: 24,
),
),
@ -35,7 +36,7 @@ class DebgetNotFoundPage extends StatelessWidget {
style: const TextStyle(
fontSize: 16,
),
text: 'See ',
text: context.t('See'),
children: [
TextSpan(
recognizer: TapGestureRecognizer()
@ -45,10 +46,10 @@ class DebgetNotFoundPage extends StatelessWidget {
'https://github.com/quickemu-project/quickemu'),
);
},
text: 'github.com/quickemu-project/quickemu',
text: ' github.com/quickemu-project/quickemu ',
style: const TextStyle(color: Colors.blue),
),
const TextSpan(text: ' for more information'),
TextSpan(text: context.t('for more information')),
],
),
),

View File

@ -15,11 +15,11 @@ import '../widgets/downloader/download_progress_bar.dart';
class Downloader extends StatefulWidget {
const Downloader({
Key? key,
required this.operatingSystem,
required this.version,
this.option,
}) : super(key: key);
super.key,
});
final OperatingSystem operatingSystem;
final Version version;
@ -30,7 +30,7 @@ class Downloader extends StatefulWidget {
}
class _DownloaderState extends State<Downloader> {
final notificationsClient = NotificationsClient();
final notificationsClient = Platform.isMacOS ? null : NotificationsClient();
final curlPattern = RegExp("( [0-9.]+%)");
late final Stream<double> _progressStream;
bool _downloadFinished = false;
@ -71,7 +71,7 @@ class _DownloaderState extends State<Downloader> {
controller.close();
setState(() {
_downloadFinished = true;
notificationsClient.notify(
notificationsClient?.notify(
_cancelled
? context.t('Download cancelled')
: context.t('Download complete'),

View File

@ -5,7 +5,7 @@ import '../widgets/home_page/downloader_menu.dart';
import '../widgets/home_page/logo.dart';
class DownloaderPage extends StatelessWidget {
const DownloaderPage({Key? key}) : super(key: key);
const DownloaderPage({super.key});
@override
Widget build(BuildContext context) {

View File

@ -7,7 +7,7 @@ import '../widgets/home_page/main_menu.dart';
import '../widgets/left_menu.dart';
class MainPage extends StatefulWidget {
const MainPage({Key? key}) : super(key: key);
const MainPage({super.key});
@override
State<MainPage> createState() => _MainPageState();
@ -23,6 +23,7 @@ class _MainPageState extends State<MainPage> {
@override
Widget build(BuildContext context) {
GettextLocalizations.of(context).enableExceptions(true);
return Scaffold(
appBar: AppBar(
title: Text(context.t('Main menu')),

View File

@ -9,17 +9,18 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:gettext_i18n/gettext_i18n.dart';
import 'package:path/path.dart' as path;
import 'package:process_run/shell.dart';
import 'package:version/version.dart';
import '../globals.dart';
import '../mixins/preferences_mixin.dart';
import '../model/vminfo.dart';
import '../model/osicons.dart';
import '../model/vminfo.dart';
/// VM manager page.
/// Displays a list of available VMs, running state and connection info,
/// with buttons to start and stop VMs.
class Manager extends StatefulWidget {
const Manager({Key? key}) : super(key: key);
const Manager({super.key});
@override
State<Manager> createState() => _ManagerState();
@ -32,6 +33,7 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
final List<String> _sshVms = [];
String? _terminalEmulator;
final List<String> _supportedTerminalEmulators = [
if (Platform.isMacOS) 'osascript',
'alacritty',
'cool-retro-term',
'gnome-terminal',
@ -48,7 +50,7 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
'uxrvt',
'xfce4-terminal',
'xrvt',
'xterm'
'xterm',
];
Timer? refreshTimer;
@ -82,8 +84,7 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
// Find out which terminal emulator we have set as the default.
String result = whichSync('x-terminal-emulator') ?? '';
if (result.isNotEmpty) {
String terminalEmulator =
await File(result).resolveSymbolicLinks();
String terminalEmulator = await File(result).resolveSymbolicLinks();
terminalEmulator = path.basenameWithoutExtension(terminalEmulator);
if (_supportedTerminalEmulators.contains(terminalEmulator)) {
setState(() {
@ -108,7 +109,7 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
void _detectSpice() async {
var result = whichSync('spicy') ?? '';
setState(() {
_spicy = result.isNotEmpty ;
_spicy = result.isNotEmpty;
});
}
@ -155,8 +156,10 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
File pidFile = File('$name/$name.pid');
if (pidFile.existsSync()) {
String pid = pidFile.readAsStringSync().trim();
Directory procDir = Directory('/proc/$pid');
if (procDir.existsSync()) {
// Check if the process is still running using kill -0, which is
// a portable way to check if a process is running on macOS and Linux.
ProcessResult result = Process.runSync('kill', ['-0', pid]);
if (result.exitCode == 0) {
if (_activeVms.containsKey(name)) {
activeVms[name] = _activeVms[name]!;
} else {
@ -270,7 +273,7 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
}
String vmStem = currentVm;
SvgPicture? osIcon;
while(vmStem.contains('-')) {
while (vmStem.contains('-')) {
vmStem = vmStem.substring(0, vmStem.lastIndexOf('-'));
if (osIcons.containsKey(vmStem)) {
osIcon = SvgPicture.asset(
@ -298,7 +301,11 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
? null
: () async {
Map<String, VmInfo> activeVms = _activeVms;
List<String> command = ['quickemu', '--vm', '$currentVm.conf'];
List<String> command = [
'quickemu',
'--vm',
'$currentVm.conf'
];
if (_spicy) {
command.addAll(['--display', 'spice']);
}
@ -324,7 +331,7 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
builder: (BuildContext context) => AlertDialog(
title: Text(context.t('Stop The Virtual Machine?')),
content: Text(context.t(
'You are about to terminate the virtual machine',
'You are about to terminate the virtual machine {0}',
args: [currentVm])),
actions: <Widget>[
TextButton(
@ -337,11 +344,24 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
),
],
),
).then((result) {
).then((result) async {
result = result ?? false;
if (result) {
var shell = Shell();
shell.run(['killall', currentVm].join(' '));
// If Quickemu is newer than 4.9.6, use the new --kill option
// which is macOS compatible.
var quickemuVersion =
Version.parse(await fetchQuickemuVersion());
if (quickemuVersion >= Version(4, 9, 6)) {
shell.run([
'quickemu',
'--vm',
'$currentVm.conf',
'--kill'
].join(' '));
} else {
shell.run(['killall', currentVm].join(' '));
}
setState(() {
_activeVms.remove(currentVm);
});
@ -359,20 +379,25 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
showDialog<String?>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: Text('Delete $currentVm'),
content: Text('You are about to delete $currentVm. This cannot be undone. Would you like to delete the disk image but keep the configuration, or delete the whole VM?'),
title: Text(
context.t('Delete {0}', args: [currentVm])),
content: Text(
context.t(
'You are about to delete {0}. This cannot be undone. Would you like to delete the disk image but keep the configuration, or delete the whole VM?',
args: [currentVm]),
),
actions: [
TextButton(
child: const Text('Cancel'),
child: Text(context.t('Cancel')),
onPressed: () =>
Navigator.pop(context, 'cancel'),
),
TextButton(
child: const Text('Delete disk image'),
child: Text(context.t('Delete disk image')),
onPressed: () => Navigator.pop(context, 'disk'),
),
TextButton(
child: const Text('Delete whole VM'),
child: Text(context.t('Delete whole VM')),
onPressed: () => Navigator.pop(context, 'vm'),
) // set up the AlertDialog
],
@ -405,8 +430,8 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
semanticLabel: 'Connect display with SPICE',
),
tooltip: _spicy
? 'Connect display with SPICE'
: 'SPICE client not found',
? context.t('Connect display with SPICE')
: context.t('SPICE client not found'),
onPressed: !_spicy
? null
: () {
@ -417,11 +442,11 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
IconButton(
icon: SvgPicture.asset('assets/images/console.svg',
semanticsLabel: 'Connect with SSH',
colorFilter: ColorFilter.mode(sshy ? buttonColor : Colors.grey, BlendMode.srcIn)
),
colorFilter: ColorFilter.mode(
sshy ? buttonColor : Colors.grey, BlendMode.srcIn)),
tooltip: sshy
? 'Connect with SSH'
: 'SSH server not detected on guest',
? context.t('Connect with SSH')
: context.t('SSH server not detected on guest'),
onPressed: !sshy
? null
: () {
@ -430,20 +455,28 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
showDialog<bool>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: Text('Launch SSH connection to $currentVm'),
title: Text(
context.t(
'Launch SSH connection to {0}',
args: [currentVm],
),
),
content: TextField(
controller: usernameController,
decoration: const InputDecoration(
hintText: "SSH username"),
decoration: InputDecoration(
hintText: context.t("SSH username")),
),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, false),
child: const Text('Cancel'),
child: Text(context.t('Cancel')),
),
TextButton(
onPressed: () => Navigator.pop(context, true),
child: const Text('Connect'),
onPressed: () {
if (usernameController.text.isEmpty) return;
Navigator.of(context).pop(true);
},
child: Text(context.t('Connect')),
),
],
),
@ -460,6 +493,11 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
// Strip the extension as x-terminal-emulator may point to a .wrapper
switch (path
.basenameWithoutExtension(_terminalEmulator!)) {
case 'osascript':
sshArgs = [
'-e \'tell app "Terminal" to do script "${sshArgs.join(' ')}"\''
];
break;
case 'gnome-terminal':
case 'mate-terminal':
sshArgs.insert(0, '--');

View File

@ -6,7 +6,7 @@ import '../model/operating_system.dart';
import '../model/osicons.dart';
class OperatingSystemSelection extends StatefulWidget {
const OperatingSystemSelection({Key? key}) : super(key: key);
const OperatingSystemSelection({super.key});
@override
State<OperatingSystemSelection> createState() =>

View File

@ -4,7 +4,7 @@ import 'package:gettext_i18n/gettext_i18n.dart';
import '../model/version.dart';
class OptionSelection extends StatefulWidget {
const OptionSelection(this.version, {Key? key}) : super(key: key);
const OptionSelection(this.version, {super.key});
final Version version;

View File

@ -8,8 +8,7 @@ import '../model/version.dart';
import 'option_selection.dart';
class VersionSelection extends StatefulWidget {
const VersionSelection({Key? key, required this.operatingSystem})
: super(key: key);
const VersionSelection({required this.operatingSystem, super.key});
final OperatingSystem operatingSystem;

View File

@ -3,10 +3,10 @@ import 'package:gettext_i18n/gettext_i18n.dart';
class CancelDismissButton extends StatelessWidget {
const CancelDismissButton({
Key? key,
required this.downloadFinished,
required this.onCancel,
}) : super(key: key);
super.key,
});
final bool downloadFinished;
final VoidCallback onCancel;

View File

@ -2,12 +2,12 @@ import 'package:flutter/material.dart';
import 'package:gettext_i18n/gettext_i18n.dart';
class DownloadLabel extends StatelessWidget {
const DownloadLabel(
{Key? key,
required this.downloadFinished,
required this.data,
required this.downloader})
: super(key: key);
const DownloadLabel({
required this.downloadFinished,
required this.data,
required this.downloader,
super.key,
});
final bool downloadFinished;
final double? data;

View File

@ -2,10 +2,10 @@ import 'package:flutter/material.dart';
class DownloadProgressBar extends StatelessWidget {
const DownloadProgressBar({
Key? key,
required this.downloadFinished,
required this.data,
}) : super(key: key);
super.key,
});
final bool downloadFinished;
final double? data;

View File

@ -8,9 +8,8 @@ import '../../globals.dart';
import '../../mixins/preferences_mixin.dart';
import '../home_page/home_page_button_group.dart';
class DownloaderMenu extends StatefulWidget {
const DownloaderMenu({Key? key}) : super(key: key);
const DownloaderMenu({super.key});
@override
State<DownloaderMenu> createState() => _DownloaderMenuState();
@ -65,7 +64,7 @@ class _DownloaderMenuState extends State<DownloaderMenu> with PreferencesMixin {
}
},
child: Text(Directory.current.path),
),
),
],
),
),

View File

@ -2,11 +2,11 @@ import 'package:flutter/material.dart';
class DownloaderPageButton extends StatelessWidget {
const DownloaderPageButton({
Key? key,
this.label,
required this.text,
this.onPressed,
}) : super(key: key);
super.key,
});
final String? label;
final String text;

View File

@ -2,11 +2,11 @@ import 'package:flutter/material.dart';
class HomePageButton extends StatelessWidget {
const HomePageButton({
Key? key,
this.label,
required this.text,
this.onPressed,
}) : super(key: key);
super.key,
});
final String? label;
final String text;

View File

@ -2,6 +2,8 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:gettext_i18n/gettext_i18n.dart';
import 'package:quickgui/src/globals.dart';
import 'package:quickgui/src/mixins/preferences_mixin.dart';
import 'package:tuple/tuple.dart';
import '../../model/operating_system.dart';
@ -13,23 +15,24 @@ import '../../pages/version_selection.dart';
import 'downloader_page_button.dart';
class HomePageButtonGroup extends StatefulWidget {
const HomePageButtonGroup({Key? key}) : super(key: key);
const HomePageButtonGroup({super.key});
@override
State<HomePageButtonGroup> createState() => _HomePageButtonGroupState();
}
class _HomePageButtonGroupState extends State<HomePageButtonGroup> {
class _HomePageButtonGroupState extends State<HomePageButtonGroup>
with PreferencesMixin {
OperatingSystem? _selectedOperatingSystem;
Version? _selectedVersion;
Option? _selectedOption;
@override
Widget build(BuildContext context) {
var _versionButtonLabel =
var versionButtonLabel =
_selectedVersion?.version ?? context.t('Select...');
if (_selectedOption?.option.isNotEmpty ?? false) {
_versionButtonLabel = "$_versionButtonLabel (${_selectedOption!.option})";
versionButtonLabel = "$versionButtonLabel (${_selectedOption!.option})";
}
return Row(
children: [
@ -60,7 +63,7 @@ class _HomePageButtonGroupState extends State<HomePageButtonGroup> {
),
DownloaderPageButton(
label: context.t('Version'),
text: _versionButtonLabel, //_selectedVersion?.version ?? 'Select...',
text: versionButtonLabel, //_selectedVersion?.version ?? 'Select...',
onPressed: (_selectedOperatingSystem != null)
? () {
Navigator.of(context)
@ -85,16 +88,50 @@ class _HomePageButtonGroupState extends State<HomePageButtonGroup> {
text: context.t('Download'),
onPressed: (_selectedVersion == null)
? null
: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => Downloader(
operatingSystem: _selectedOperatingSystem!,
version: _selectedVersion!,
option: _selectedOption,
: () async {
final workingDirectory =
await getPreference<String>(prefWorkingDirectory);
final tmpFile = File("$workingDirectory/modecheck.tmp");
if (tmpFile.existsSync()) {
tmpFile.deleteSync();
}
try {
tmpFile.createSync();
} catch (e) {
// Do nothing
}
if (tmpFile.existsSync()) {
tmpFile.deleteSync();
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => Downloader(
operatingSystem: _selectedOperatingSystem!,
version: _selectedVersion!,
option: _selectedOption,
),
),
),
);
);
} else {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text(context.t('Error')),
content: Text(
context.t(
'Could not write to the working directory. Please check the permissions.'),
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(context.t('OK')),
),
],
),
);
}
},
),
],

View File

@ -1,9 +1,7 @@
import 'package:flutter/material.dart';
class Logo extends StatelessWidget {
const Logo({
Key? key,
}) : super(key: key);
const Logo({super.key});
@override
Widget build(BuildContext context) {

View File

@ -6,7 +6,7 @@ import '../../pages/manager.dart';
import '../home_page/home_page_button.dart';
class MainMenu extends StatelessWidget {
const MainMenu({Key? key}) : super(key: key);
const MainMenu({super.key});
@override
Widget build(BuildContext context) {

View File

@ -9,18 +9,23 @@ import '../mixins/preferences_mixin.dart';
import '../model/app_settings.dart';
class LeftMenu extends StatefulWidget {
const LeftMenu({Key? key}) : super(key: key);
const LeftMenu({super.key});
@override
State<LeftMenu> createState() => _LeftMenuState();
}
class _LeftMenuState extends State<LeftMenu> with PreferencesMixin {
List<DropdownMenuItem<String>> _dropdownMenuItems = [];
late String currentLocale;
@override
void initState() {
super.initState();
fetchQuickemuVersion();
_dropdownMenuItems = supportedLocales
.map((e) => DropdownMenuItem(value: e, child: Text(e)))
.toList();
}
@override
@ -38,42 +43,88 @@ class _LeftMenuState extends State<LeftMenu> with PreferencesMixin {
@override
Widget build(BuildContext context) {
var _version = AppVersion.packageInfo!.version;
var version = AppVersion.packageInfo!.version;
return Consumer<AppSettings>(
builder: (context, appSettings, _) {
return Drawer(
child: ListView(
children: [
ListTile(
title: Text("Quickgui $_version",
style: Theme.of(context).textTheme.titleLarge),
Padding(
// Minimal bottom padding
padding: const EdgeInsets.only(bottom: 0)
.add(const EdgeInsets.symmetric(horizontal: 16)),
child: Container(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Text("Quickgui $version",
style: const TextStyle(
fontSize: 24.0, fontWeight: FontWeight.bold)),
),
),
FutureBuilder<String>(
future: fetchQuickemuVersion(),
builder:
(BuildContext context, AsyncSnapshot<String> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator(); // or some other widget while waiting
} else {
String poweredByText =
"${context.t('Powered by')} Quickemu";
if (snapshot.hasData) {
poweredByText += " ${snapshot.data}";
}
return Padding(
// Minimal top padding
padding: const EdgeInsets.only(top: 0)
.add(const EdgeInsets.symmetric(horizontal: 16)),
child: Container(
child: Text(poweredByText,
style: const TextStyle(
fontSize: 12.0, fontWeight: FontWeight.bold)),
),
);
}
},
),
Container(
height: 4.0,
),
/*
const Divider(),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Row(
children: [
Text(context.t('Use dark mode')),
Text(
context.t('Use dark mode'),
style: TextStyle(
color: Colors.grey[300],
),
),
Expanded(
child: Container(),
),
Switch(
value: Theme.of(context).colorScheme.brightness == Brightness.dark,
value: Theme.of(context).colorScheme.brightness ==
Brightness.dark,
activeColor: Colors.black26,
activeTrackColor: Theme.of(context).colorScheme.primary,
inactiveThumbColor: Colors.grey[500],
inactiveTrackColor: Colors.grey[300],
onChanged: (value) {
appSettings.useDarkMode = value;
savePreference(prefThemeMode, value);
},
activeColor: Colors.white,
activeTrackColor: Colors.black26,
inactiveThumbColor: Theme.of(context).colorScheme.onPrimary,
inactiveTrackColor: Theme.of(context).colorScheme.primary,
// activeColor: Colors.white,
// activeTrackColor: Colors.black26,
// inactiveThumbColor:
// Theme.of(context).colorScheme.onPrimary,
// inactiveTrackColor: Theme.of(context).colorScheme.primary,
),
],
),
),
*/
const Divider(),
Container(
height: 4.0,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Row(
@ -84,10 +135,7 @@ class _LeftMenuState extends State<LeftMenu> with PreferencesMixin {
),
DropdownButton<String>(
value: currentLocale,
items: supportedLocales
.map(
(e) => DropdownMenuItem(child: Text(e), value: e))
.toList(),
items: _dropdownMenuItems,
onChanged: (value) {
setState(() {
currentLocale = value!;
@ -99,6 +147,42 @@ class _LeftMenuState extends State<LeftMenu> with PreferencesMixin {
],
),
),
Container(
height: 32.0,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Column(
children: [
RichText(
textAlign: TextAlign.center,
text: TextSpan(
style: DefaultTextStyle.of(context).style,
children: const <TextSpan>[
TextSpan(
text: 'Authors\n',
style: TextStyle(fontWeight: FontWeight.bold)),
TextSpan(text: 'Yannick Mauray\n'),
TextSpan(text: 'Mark Johnson\n'),
TextSpan(text: 'Martin Wimpress\n'),
],
),
),
RichText(
textAlign: TextAlign.center,
text: TextSpan(
style: DefaultTextStyle.of(context).style,
children: const <TextSpan>[
TextSpan(text: '© 2021 - 2024\n'),
TextSpan(
text: 'Quickemu Project\n',
style: TextStyle(fontWeight: FontWeight.bold)),
],
),
),
],
),
),
],
),
);

View File

@ -47,7 +47,7 @@ static void my_application_activate(GApplication* application) {
gtk_window_set_title(window, "quickgui");
}
gtk_window_set_default_size(window, 692, 580);
gtk_window_set_default_size(window, 800, 720);
gtk_widget_show(GTK_WIDGET(window));
g_autoptr(FlDartProject) project = fl_dart_project_new();

View File

@ -1,5 +1,6 @@
appId: com.github.quickemu-project.quickgui
display_name: Quickgui
appId: com.github.quickemu-project.quickgui
generic_name: An elegant virtual machine manager for the desktop
icon: assets/images/logo_pink.png
keywords:
@ -11,12 +12,9 @@ keywords:
- macOS
- Windows
generic_name: Desktop frontend for Quickget and Quickemu
categories:
- System
- Development
- Emulator
startup_notify: true

View File

@ -1,22 +1,24 @@
display_name: Quickgui
package_name: quickgui
generic_name: An elegant virtual machine manager for the desktop
icon: assets/images/logo_pink.png
maintainer:
name: Mark Johnson
email: mark@barrenfrozenwasteland.com
name: Martin Wimpress
email: code@wimpress.io
co_authors:
- name: Martin Wimpress
email: code@wimpress.io
- name: Mark Johnson
email: mark@barrenfrozenwasteland.com
- name: Yannick Mauray
email: yannick.mauray@gmail.com
priority: optional
section: x11
installed_size: 16777216
essential: false
icon: assets/images/logo_pink.png
dependencies:
- zenity
recommended_dependencies:
- quickemu
priority: optional
section: x11
installed_size: 16777216
essential: false
keywords:
- QEMU
@ -27,12 +29,9 @@ keywords:
- macOS
- Windows
generic_name: Desktop frontend for Quickget and Quickemu
categories:
- System
- Development
- Emulator
startup_notify: true

View File

@ -0,0 +1,5 @@
quickgui (1.2.9-1) unstable; urgency=medium
* New upstream release.
-- Martin Wimpress <code@wimpress.io> Fri, 25 Feb 2022 08:27:45 +0100

View File

@ -0,0 +1,27 @@
Source: quickgui
Section: utils
Priority: optional
Maintainer: Martin Wimpress <code@wimpress.io>
Build-Depends:
debhelper-compat (= 12),
Standards-Version: 4.5.1
Homepage: https://github.com/quickemu-project/quickgui
Vcs-Browser: https://github.com/quickemu-project/quickgui
Vcs-Git: https://github.com/quickemu-project/quickgui.git
Rules-Requires-Root: no
Package: quickgui
Architecture: any
Depends:
zenity,
${misc:Depends},
${shlibs:Depends},
Recommends:
quickemu,
Description: An elegant virtual machine manager for the desktop
An elegant desktop application to quickly create an run optimised virtual
machines using Quickget and Quickemu.
.
Nearly 1000 operating systems supported including Windows, macOS, BSDs, and
100s of Linux distros. All with automated download and configuration.
.

View File

@ -0,0 +1,45 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: quickgui
Upstream-Contact: Martin Wimpress <code@wimpress.io>
Source: https://github.com/quickemu-project/quickgui
Files: *
Copyright: 2021 - 2024 Yannick Mauray <yannick.mauray@gmail.com>
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# If you want to use GPL v2 or later for the /debian/* files use
# the following clauses, or change it to suit. Delete these two lines
Files: debian/*
Copyright: 2021 - 2024 Martin Wimpress <code@wimpress.io>
License: GPL-2+
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>
.
On Debian systems, the complete text of the GNU General
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".

View File

@ -0,0 +1,5 @@
quickgui usr/share/quickgui
data/ usr/share/quickgui
lib/ usr/share/quickgui
icons/ usr/share
quickgui.desktop usr/share/applications

View File

@ -0,0 +1 @@
/usr/share/quickgui/quickgui /usr/bin/quickgui

Some files were not shown because too many files have changed in this diff Show More