Compare commits

..

10 Commits

Author SHA1 Message Date
Yannick Mauray 97f7832c27 fix: desktop notification not (yet?) supported on macos 2024-06-27 20:48:05 +02:00
Yannick Mauray 02c3a9031a feat: set window size 2024-06-27 20:35:52 +02:00
Yannick Mauray 39970236cf feat: misc macos settings. 2024-06-27 20:35:37 +02:00
Yannick Mauray bb793040bc chore: formating 2024-06-27 19:27:04 +02:00
Yannick Mauray 703094c825 fix: more use of "super.key" 2024-06-27 19:26:45 +02:00
Yannick Mauray 07a29cb109 chore: .vscode settings 2024-06-27 19:23:31 +02:00
Yannick Mauray 8d0a5da746 fix: use "super.key" 2024-06-27 19:21:51 +02:00
Yannick Mauray c89ed06b83 Merge branch 'macos_desktop' of https://github.com/quickemu-project/quickgui into macos_desktop 2024-06-27 19:08:19 +02:00
Yannick Mauray fea175c1f9 feat: macos desktop app on Apple silicon, initial config [wip] 2024-06-27 18:39:27 +02:00
Yannick Mauray 6ad3bc498f feat: macos desktop app on Apple silicon, initial config [wip] 2024-06-27 06:54:09 +02:00
100 changed files with 499 additions and 2534 deletions

8
.envrc
View File

@ -1 +1,9 @@
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
View File

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

View File

@ -1,35 +0,0 @@
---
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

@ -1,23 +0,0 @@
---
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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

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

BIN
.github/logo.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -1,34 +0,0 @@
# 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -4,125 +4,50 @@ 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:
test-build-linux-x64:
build-linux-x64:
runs-on: ubuntu-22.04
steps:
- name: "Checkout 🥡"
uses: actions/checkout@v6
- name: "Install Flutter 🦋"
uses: subosito/flutter-action@v2
- uses: actions/checkout@v4
- 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
- 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 Flutter dependencies 🦋
run: flutter pub get
- name: Enable Linux Desktop 🐧
- name: Enable Linux build 🐧
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@v7
uses: actions/upload-artifact@v4
with:
name: Quickgui-${{github.run_number}}-linux-x64
path: build/linux/x64/release/bundle
overwrite: true
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:
build-with-nix:
runs-on: ubuntu-22.04
permissions:
id-token: "write"
contents: "read"
steps:
- 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"
- uses: "actions/checkout@v4"
- uses: "DeterminateSystems/nix-installer-action@v12"
- uses: "DeterminateSystems/magic-nix-cache-action@v7"
- name: "Build with Nix ❄️"
run: |
nix build .#quickgui

View File

@ -1,21 +0,0 @@
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

View File

@ -1,20 +0,0 @@
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"

View File

@ -1,27 +0,0 @@
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,9 +1,5 @@
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:
@ -24,73 +20,77 @@ jobs:
name: "Check versions ⚖️"
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
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 | sed 's/+.*//')
APP_VERSION=$(grep "^version" pubspec.yaml | cut -d' ' -f2)
GIT_VERSION=$(git describe --tags | cut -d'-' -f1)
echo "App version: ${APP_VERSION}"
echo "App version: ${REL_VERSION}"
echo "Git version: ${GIT_VERSION}"
if [ "${APP_VERSION}" != "${GIT_VERSION}" ]; then
echo "ERROR! Version mismatch.";
exit 1
fi
publish-linux-x64:
build-linux-x64:
needs: [version-check]
name: "Publish Linux (x64) 🐙"
name: "Build Linux x64 🏗️"
runs-on: ubuntu-22.04
steps:
- name: "Checkout 🥡"
uses: actions/checkout@v6
- name: "Install Flutter 🦋"
uses: subosito/flutter-action@v2
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with:
channel: stable
architecture: x64
flutter-version-file: pubspec.yaml
- name: Install system dependencies 📦️
run: |
sudo apt-get -y install clang cmake libblkid1 liblzma5 libgtk-3-0 libgtk-3-dev ninja-build pkg-config
run: sudo apt-get install -y 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 -y install libfuse-dev locate
sudo apt-get install -y 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 -y install dpkg
sudo apt-get install -y dpkg
flutter_distributor package --platform=linux --targets=deb
- name: Build .rpm 🎩
run: |
sudo apt-get -y install patchelf rpm
sudo apt-get install -y 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/
- 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-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
publish-flakehub:
needs: [version-check]
@ -100,74 +100,13 @@ jobs:
id-token: "write"
contents: "read"
steps:
- uses: "actions/checkout@v6"
- uses: "actions/checkout@v4"
with:
ref: "${{ (inputs.tag != null) && format('refs/tags/{0}', inputs.tag) || '' }}"
- uses: "DeterminateSystems/nix-installer-action@v22"
- uses: "DeterminateSystems/magic-nix-cache-action@v9"
- uses: "DeterminateSystems/flakehub-push@v6"
- uses: "DeterminateSystems/nix-installer-action@v12"
- uses: "DeterminateSystems/magic-nix-cache-actionv7"
- uses: "DeterminateSystems/flakehub-push@v4"
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,6 +6,8 @@
.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

@ -1,128 +0,0 @@
# 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.

View File

@ -1,9 +0,0 @@
# 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/).

63
Makefile Normal file
View File

@ -0,0 +1,63 @@
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)

212
README.md
View File

@ -1,167 +1,119 @@
<div align="center">
<img src=".github/logo.png" alt="Quickgui" width="256" />
<h1 align="center">
<img src=".github/logo.png" alt="Quickgui" width="256" />
<br />
Quickgui
</h1>
# Quickgui
<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>
**An elegant virtual machine manager for the desktop**
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
**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>
## Install
### quickemu
<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>
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.
# Introduction
### 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.
On Ubuntu, `quickgui` can be installed as a standard package.
# Install
First, add this ppa (this only needs to be done once):
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
];
```
sudo add-apt-repository ppa:yannick-mauray/quickgui
sudo apt update
```
## 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
Then, install the package:
```
sudo apt 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 latest .zip file.
* `unzip quickgui-1.2.10+1-linux.zip`
* `cd quickgui-1.2.10+1-linux`
* `chmod +x quickgui`
* `./quickgui`
* [Download](https://github.com/quickemu-project/quickgui/releases) the binary.
* Uncompress the tarball wherever you want.
* From anywhere on the filesystem, run the app.
# 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
git clone https://github.com/quickemu-project/quickgui.git
cd quickgui
flutter pub get
flutter config --enable-macos-desktop
flutter build macos --release
xz quickgui-a.b.c-d.tar.xz
tar xvf quickgui-a.b.c-d.tar
/path/to/quickgui
```
The compiled binary will be in `build/linux/x64/release/bundle/quickgui`.
You can run it with:
Alternatively, use `update-alternatives` to install `quickgui` system-wide:
```shell
```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
cd quickgui
flutter build linux --release
./build/linux/x64/release/bundle/quickgui
```
# Usage
You can also use `update-alternatives` for easier access to the app.
<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>
## Usage
## Downloader
### Downloading VMs
- 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.
From the main screen, select the operating system you want to use. The list can be filtered.
<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>
## Manager
<div align="center"><img src="assets/github/screenshot1.png" alt="Main screen"></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/screenshot2.png" alt="List of supported operating systems"></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>
<div align="center"><img src="assets/github/screenshot3.png" alt="Search a distribution"></div>
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.
Then, select the version:
### SPICE
<div align="center"><img src="assets/github/screenshot4.png" alt="Main screen after selection of the 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.
<div align="center"><img src="assets/github/screenshot5.png" alt="Versions of the selected operating system"></div>
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`).
If there are some options (Windows language, Pop!_OS nvidia or Intel, etc..), they will be displayed:
### SSH
<div align="center"><img src="assets/github/screenshot8.png" alt="Choose an option"></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.
<div align="center"><img src="assets/github/screenshot9.png" alt="Option is displayed"></div>
"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`.
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.

View File

@ -1,18 +0,0 @@
# 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.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

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,61 +138,3 @@ 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,61 +138,3 @@ 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,63 +138,3 @@ 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, 2024.
# Åke Engelbrektson <eson@svenskasprakfiler.se>, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: quickgui\n"
"POT-Creation-Date: 2021-09-29 09:59+0200\n"
"PO-Revision-Date: 2024-08-14 21:09+0200\n"
"PO-Revision-Date: 2022-06-13 13:19+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.4.4\n"
"X-Generator: Poedit 3.1\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,74 +135,3 @@ 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: 6.8 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 454 B

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 931 B

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -47,14 +47,6 @@ 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,10 +12,3 @@ 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,26 +2,12 @@
"nodes": {
"flake-schemas": {
"locked": {
"lastModified": 1775244557,
"narHash": "sha256-iYXRXIX9eafJmwJFAhqT3YxvvpNRuPFSLRCSpvGh8Ic=",
"rev": "15edbeeaf77e42216dbcba8bfd907fdeabb75a2b",
"revCount": 132,
"lastModified": 1697467827,
"narHash": "sha256-j8SR19V1SRysyJwpOBF4TLuAvAjF5t+gMiboN4gYQDU=",
"rev": "764932025c817d4e500a8d2a4d8c565563923d29",
"revCount": 29,
"type": "tarball",
"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"
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.2/018b3da8-4cc3-7fbb-8ff7-1588413c53e2/source.tar.gz"
},
"original": {
"type": "tarball",
@ -30,43 +16,22 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1777077449,
"narHash": "sha256-AIiMJiqvGrN4HyLEbKAoCSRRYn0rnlW5VbKNIMIYqm4=",
"rev": "a4bf06618f0b5ee50f14ed8f0da77d34ecc19160",
"revCount": 911667,
"lastModified": 1719254875,
"narHash": "sha256-ECni+IkwXjusHsm9Sexdtq8weAq/yUyt1TWIemXt3Ko=",
"rev": "2893f56de08021cffd9b6b6dfc70fd9ccd51eb60",
"revCount": 643242,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.911667%2Brev-a4bf06618f0b5ee50f14ed8f0da77d34ecc19160/019dcae8-75b0-71d1-abd5-feab9658f0fa/source.tar.gz"
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.643242%2Brev-2893f56de08021cffd9b6b6dfc70fd9ccd51eb60/0190530b-f61b-7788-9601-b336b1caf671/source.tar.gz"
},
"original": {
"type": "tarball",
"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"
"url": "https://flakehub.com/f/NixOS/nixpkgs/0.1.%2A.tar.gz"
}
},
"root": {
"inputs": {
"flake-schemas": "flake-schemas",
"nixpkgs": "nixpkgs",
"quickemu": "quickemu"
"nixpkgs": "nixpkgs"
}
}
},

View File

@ -1,47 +1,38 @@
{
description = "Quickgui flake";
description = "Quickemu flake";
inputs = {
flake-schemas.url = "https://flakehub.com/f/DeterminateSystems/flake-schemas/*.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";
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1.*.tar.gz";
};
outputs = {
self,
flake-schemas,
nixpkgs,
quickemu,
}: let
# 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; };
});
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});
in {
# Define schemas for the flake's outputs
# Schemas tell Nix about the structure of your flake's outputs
schemas = flake-schemas.schemas;
# Define overlays for each supported system
overlays = forEachSupportedSystem ({pkgs, system, ...}: {
default = final: prev: {
quickgui = final.callPackage ./package.nix { quickemu = quickemu.packages.${system}.default; };
};
});
overlays.default = final: prev: {
quickgui = final.callPackage ./package.nix {};
};
# Define packages for each supported system
packages = forEachSupportedSystem ({pkgs, system, ...}: rec {
quickgui = pkgs.callPackage ./package.nix { quickemu = quickemu.packages.${system}.default; };
packages = forAllSystems (pkgs: rec {
quickgui = pkgs.callPackage ./package.nix {};
default = quickgui;
});
# Define devShells for each supported system
devShells = forEachSupportedSystem ({pkgs, system, ...}: {
default = pkgs.callPackage ./devshell.nix { quickemu = quickemu.packages.${system}.default; };
devShells = forAllSystems (pkgs: {
default = pkgs.callPackage ./devshell.nix {};
});
};
}

View File

@ -74,12 +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
// Don't forget to also change the size in macos/Runner/MainFlutterWindow.swift:7
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));
setWindowMaxSize(const Size(692, 580));
}
final foundQuickGet = await Process.run('which', ['quickget']);
if (foundQuickGet.exitCode == 0) {

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/debget_not_found_page.dart';
import 'package:quickgui/src/pages/deget_not_found_page.dart';
import 'package:quickgui/src/supported_locales.dart';
import 'package:shared_preferences/shared_preferences.dart';
@ -68,7 +68,7 @@ class _AppState extends State<App> with PreferencesMixin {
darkTheme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSwatch(
primarySwatch: Colors.pink,
primarySwatch: darkGrey,
backgroundColor: darkGrey.shade700,
brightness: Brightness.dark,
),

View File

@ -4,15 +4,3 @@ 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.light;
ThemeMode? _themeMode;
String? _activeLocale;
ThemeMode get themeMode => _themeMode;
ThemeMode get themeMode => _themeMode ?? ThemeMode.system;
String get activeLocale => _activeLocale ?? Platform.localeName;
@ -38,7 +38,8 @@ class AppSettings extends ChangeNotifier {
}
set useDarkModeSilently(bool useDarkMode) {
_themeMode = useDarkMode ? ThemeMode.dark : ThemeMode.light;
//_themeMode = useDarkMode ? ThemeMode.dark : ThemeMode.light;
_themeMode = ThemeMode.light;
}
set useDarkMode(bool useDarkMode) {

View File

@ -1,10 +1,9 @@
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({super.key});
const DebgetNotFoundPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -13,18 +12,18 @@ class DebgetNotFoundPage extends StatelessWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
context.t('quickemu was not found in your PATH'),
style: const TextStyle(
const Text(
'quickemu was not found in your PATH',
style: TextStyle(
fontSize: 24,
),
),
const SizedBox(
height: 16,
),
Text(
context.t('Please install it and try again.'),
style: const TextStyle(
const Text(
'Please install it and try again.',
style: TextStyle(
fontSize: 24,
),
),
@ -36,7 +35,7 @@ class DebgetNotFoundPage extends StatelessWidget {
style: const TextStyle(
fontSize: 16,
),
text: context.t('See'),
text: 'See ',
children: [
TextSpan(
recognizer: TapGestureRecognizer()
@ -46,10 +45,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),
),
TextSpan(text: context.t('for more information')),
const TextSpan(text: ' for more information'),
],
),
),

View File

@ -23,7 +23,6 @@ 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,12 +9,11 @@ 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/osicons.dart';
import '../model/vminfo.dart';
import '../model/osicons.dart';
/// VM manager page.
/// Displays a list of available VMs, running state and connection info,
@ -33,7 +32,6 @@ 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',
@ -50,7 +48,7 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
'uxrvt',
'xfce4-terminal',
'xrvt',
'xterm',
'xterm'
];
Timer? refreshTimer;
@ -84,7 +82,8 @@ 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(() {
@ -109,7 +108,7 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
void _detectSpice() async {
var result = whichSync('spicy') ?? '';
setState(() {
_spicy = result.isNotEmpty;
_spicy = result.isNotEmpty ;
});
}
@ -156,10 +155,8 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
File pidFile = File('$name/$name.pid');
if (pidFile.existsSync()) {
String pid = pidFile.readAsStringSync().trim();
// 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) {
Directory procDir = Directory('/proc/$pid');
if (procDir.existsSync()) {
if (_activeVms.containsKey(name)) {
activeVms[name] = _activeVms[name]!;
} else {
@ -273,7 +270,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(
@ -301,11 +298,7 @@ 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']);
}
@ -331,7 +324,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 {0}',
'You are about to terminate the virtual machine',
args: [currentVm])),
actions: <Widget>[
TextButton(
@ -344,24 +337,11 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
),
],
),
).then((result) async {
).then((result) {
result = result ?? false;
if (result) {
var shell = Shell();
// 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(' '));
}
shell.run(['killall', currentVm].join(' '));
setState(() {
_activeVms.remove(currentVm);
});
@ -379,25 +359,20 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
showDialog<String?>(
context: context,
builder: (BuildContext context) => AlertDialog(
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]),
),
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?'),
actions: [
TextButton(
child: Text(context.t('Cancel')),
child: const Text('Cancel'),
onPressed: () =>
Navigator.pop(context, 'cancel'),
),
TextButton(
child: Text(context.t('Delete disk image')),
child: const Text('Delete disk image'),
onPressed: () => Navigator.pop(context, 'disk'),
),
TextButton(
child: Text(context.t('Delete whole VM')),
child: const Text('Delete whole VM'),
onPressed: () => Navigator.pop(context, 'vm'),
) // set up the AlertDialog
],
@ -430,8 +405,8 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
semanticLabel: 'Connect display with SPICE',
),
tooltip: _spicy
? context.t('Connect display with SPICE')
: context.t('SPICE client not found'),
? 'Connect display with SPICE'
: 'SPICE client not found',
onPressed: !_spicy
? null
: () {
@ -442,11 +417,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
? context.t('Connect with SSH')
: context.t('SSH server not detected on guest'),
? 'Connect with SSH'
: 'SSH server not detected on guest',
onPressed: !sshy
? null
: () {
@ -455,28 +430,20 @@ class _ManagerState extends State<Manager> with PreferencesMixin {
showDialog<bool>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: Text(
context.t(
'Launch SSH connection to {0}',
args: [currentVm],
),
),
title: Text('Launch SSH connection to $currentVm'),
content: TextField(
controller: usernameController,
decoration: InputDecoration(
hintText: context.t("SSH username")),
decoration: const InputDecoration(
hintText: "SSH username"),
),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context, false),
child: Text(context.t('Cancel')),
child: const Text('Cancel'),
),
TextButton(
onPressed: () {
if (usernameController.text.isEmpty) return;
Navigator.of(context).pop(true);
},
child: Text(context.t('Connect')),
onPressed: () => Navigator.pop(context, true),
child: const Text('Connect'),
),
],
),
@ -493,11 +460,6 @@ 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

@ -2,8 +2,6 @@ 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';
@ -21,8 +19,7 @@ class HomePageButtonGroup extends StatefulWidget {
State<HomePageButtonGroup> createState() => _HomePageButtonGroupState();
}
class _HomePageButtonGroupState extends State<HomePageButtonGroup>
with PreferencesMixin {
class _HomePageButtonGroupState extends State<HomePageButtonGroup> {
OperatingSystem? _selectedOperatingSystem;
Version? _selectedVersion;
Option? _selectedOption;
@ -88,50 +85,16 @@ class _HomePageButtonGroupState extends State<HomePageButtonGroup>
text: context.t('Download'),
onPressed: (_selectedVersion == null)
? null
: () 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,
),
: () {
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

@ -16,16 +16,11 @@ class LeftMenu extends StatefulWidget {
}
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
@ -49,82 +44,36 @@ class _LeftMenuState extends State<LeftMenu> with PreferencesMixin {
return Drawer(
child: ListView(
children: [
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,
ListTile(
title: Text("Quickgui $version",
style: Theme.of(context).textTheme.titleLarge),
),
/*
const Divider(),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Row(
children: [
Text(
context.t('Use dark mode'),
style: TextStyle(
color: Colors.grey[300],
),
),
Text(context.t('Use dark mode')),
Expanded(
child: Container(),
),
Switch(
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],
value: Theme.of(context).colorScheme.brightness == Brightness.dark,
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,
),
],
),
),
Container(
height: 4.0,
),
*/
const Divider(),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Row(
@ -135,7 +84,10 @@ class _LeftMenuState extends State<LeftMenu> with PreferencesMixin {
),
DropdownButton<String>(
value: currentLocale,
items: _dropdownMenuItems,
items: supportedLocales
.map(
(e) => DropdownMenuItem(value: e, child: Text(e)))
.toList(),
onChanged: (value) {
setState(() {
currentLocale = value!;
@ -147,42 +99,6 @@ 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, 800, 720);
gtk_window_set_default_size(window, 692, 580);
gtk_widget_show(GTK_WIDGET(window));
g_autoptr(FlDartProject) project = fl_dart_project_new();

View File

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

View File

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

View File

@ -1,5 +0,0 @@
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

@ -1,27 +0,0 @@
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

@ -1,45 +0,0 @@
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

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

View File

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

View File

@ -1,9 +0,0 @@
#!/usr/bin/make -f
export DH_VERBOSE = 1
%:
dh $@
override_dh_usrlocal:
override_dh_shlibdeps:

View File

@ -1 +0,0 @@
3.0 (quilt)

View File

@ -1,4 +0,0 @@
lib/libapp.so
lib/libflutter_linux_gtk.so
lib/liburl_launcher_linux_plugin.so
lib/libwindow_size_plugin.so

View File

@ -1,15 +1,13 @@
display_name: Quickgui
summary: An elegant virtual machine manager for the desktop
icon: assets/images/logo_pink.png
group: Application/Emulator
vendor: Quickemu Project
packager: Martin Wimpress
packagerEmail: code@wimpress.io
vendor: Quickemu Project
requires:
- zenity
group: Application/Emulator
license: MIT
url: https://github.com/quickemu-project/quickgui
icon: assets/images/logo_pink.png
requires:
- zenity
keywords:
- QEMU
@ -20,9 +18,12 @@ keywords:
- macOS
- Windows
summary: Desktop frontend for Quickget and Quickemu
categories:
- System
- Development
- Emulator
startup_notify: true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 931 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,10 +0,0 @@
title: quickgui
contents:
- x: 456
y: 200
type: link
path: "/Applications"
- x: 200
y: 200
type: file
path: quickgui.app

View File

@ -7,7 +7,7 @@
, quickemu
}:
let
runtimeBinDependencies = [ quickemu gnome.zenity ];
runtimeBinDependencies = [ gnome.zenity ];
versionMatches = builtins.match ''
.*
.*version:[[:blank:]]([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\+?[[:digit:]]*)
@ -25,15 +25,14 @@ flutter.buildFlutterApplication rec {
};
# These things are added to LD_LIBRARY_PATH, but not PATH
runtimeDependencies = [ quickemu ];
extraWrapProgramArgs = "--prefix PATH : ${lib.makeBinPath runtimeBinDependencies}";
nativeBuildInputs = [ copyDesktopItems ];
postFixup = ''
for SIZE in 16 32 48 64 128 256 512; do
mkdir -p $out/share/icons/hicolor/$SIZEx$SIZE/apps/
cp -av assets/resources/quickgui_$SIZE.png $out/share/icons/hicolor/$SIZEx$SIZE/apps/quickgui.png
done
mkdir -p $out/share/pixmaps
cp $out/app/data/flutter_assets/assets/images/logo_pink.png $out/share/pixmaps/quickemu.png
'';
desktopItems = [
@ -42,13 +41,12 @@ flutter.buildFlutterApplication rec {
exec = "quickgui";
icon = "quickgui";
desktopName = "Quickgui";
comment = "An elegant virtual machine manager for the desktop";
categories = [ "Development" "System" ];
})
];
meta = with lib; {
description = "An elegant virtual machine manager for the desktop";
description = "Flutter frontend for quickemu";
homepage = "https://github.com/quickemu-project/quickgui";
changelog = "https://github.com/quickemu-project/quickgui/releases/";
license = licenses.mit;

File diff suppressed because it is too large Load Diff

View File

@ -4,21 +4,21 @@
"dependency": "transitive",
"description": {
"name": "_discoveryapis_commons",
"sha256": "113c4100b90a5b70a983541782431b82168b3cae166ab130649c36eb3559d498",
"sha256": "f8bb1fdbd77f3d5c1d62b5b0eca75fbf1e41bf4f6c62628f880582e2182ae45d",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.7"
"version": "1.0.6"
},
"ansicolor": {
"dependency": "transitive",
"description": {
"name": "ansicolor",
"sha256": "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f",
"sha256": "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.3"
"version": "2.0.2"
},
"archive": {
"dependency": "transitive",
@ -34,11 +34,11 @@
"dependency": "transitive",
"description": {
"name": "args",
"sha256": "bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6",
"sha256": "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.6.0"
"version": "2.5.0"
},
"async": {
"dependency": "transitive",
@ -94,11 +94,11 @@
"dependency": "transitive",
"description": {
"name": "cli_util",
"sha256": "ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c",
"sha256": "c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.4.2"
"version": "0.4.1"
},
"clock": {
"dependency": "transitive",
@ -134,21 +134,21 @@
"dependency": "transitive",
"description": {
"name": "cross_file",
"sha256": "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670",
"sha256": "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.3.4+2"
"version": "0.3.4+1"
},
"crypto": {
"dependency": "transitive",
"description": {
"name": "crypto",
"sha256": "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855",
"sha256": "ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.6"
"version": "3.0.3"
},
"cupertino_icons": {
"dependency": "direct main",
@ -184,21 +184,11 @@
"dependency": "transitive",
"description": {
"name": "dio",
"sha256": "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260",
"sha256": "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "5.7.0"
},
"dio_web_adapter": {
"dependency": "transitive",
"description": {
"name": "dio_web_adapter",
"sha256": "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.0"
"version": "5.4.3+1"
},
"fake_async": {
"dependency": "transitive",
@ -214,31 +204,31 @@
"dependency": "transitive",
"description": {
"name": "ffi",
"sha256": "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6",
"sha256": "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.3"
"version": "2.1.2"
},
"file": {
"dependency": "transitive",
"description": {
"name": "file",
"sha256": "a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4",
"sha256": "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "7.0.1"
"version": "7.0.0"
},
"file_picker": {
"dependency": "direct main",
"description": {
"name": "file_picker",
"sha256": "16dc141db5a2ccc6520ebb6a2eb5945b1b09e95085c021d9f914f8ded7f1465c",
"sha256": "2ca051989f69d1b2ca012b2cf3ccf78c70d40144f0861ff2c063493f7c8c3d45",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "8.1.4"
"version": "8.0.5"
},
"flutter": {
"dependency": "direct main",
@ -306,21 +296,21 @@
"dependency": "transitive",
"description": {
"name": "flutter_plugin_android_lifecycle",
"sha256": "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398",
"sha256": "c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.23"
"version": "2.0.20"
},
"flutter_svg": {
"dependency": "direct main",
"description": {
"name": "flutter_svg",
"sha256": "54900a1a1243f3c4a5506d853a2b5c2dbc38d5f27e52a52618a8054401431123",
"sha256": "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.16"
"version": "2.0.10+1"
},
"flutter_test": {
"dependency": "direct dev",
@ -358,11 +348,11 @@
"dependency": "direct main",
"description": {
"name": "gettext_i18n",
"sha256": "1acdb7f6bb7c06aaa69016a248de20123ac9af2e1a29321244012fbf6f2d4bdd",
"sha256": "e15f1a6bd5b79435377d8245359e68750af5091d30f571abe36fd10ba5cc5eee",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.7"
"version": "1.0.5"
},
"gettext_parser": {
"dependency": "direct main",
@ -388,11 +378,11 @@
"dependency": "transitive",
"description": {
"name": "google_identity_services_web",
"sha256": "55580f436822d64c8ff9a77e37d61f5fb1e6c7ec9d632a43ee324e2a05c3c6c9",
"sha256": "9482364c9f8b7bd36902572ebc3a7c2b5c8ee57a9c93e6eb5099c1a9ec5265d8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.3.3"
"version": "0.3.1+1"
},
"googleapis": {
"dependency": "transitive",
@ -418,11 +408,11 @@
"dependency": "transitive",
"description": {
"name": "http",
"sha256": "b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010",
"sha256": "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.2.2"
"version": "1.2.1"
},
"http_parser": {
"dependency": "transitive",
@ -438,11 +428,11 @@
"dependency": "transitive",
"description": {
"name": "image",
"sha256": "f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d",
"sha256": "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "4.3.0"
"version": "4.2.0"
},
"intl": {
"dependency": "transitive",
@ -478,21 +468,21 @@
"dependency": "transitive",
"description": {
"name": "leak_tracker",
"sha256": "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05",
"sha256": "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "10.0.5"
"version": "10.0.4"
},
"leak_tracker_flutter_testing": {
"dependency": "transitive",
"description": {
"name": "leak_tracker_flutter_testing",
"sha256": "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806",
"sha256": "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.5"
"version": "3.0.3"
},
"leak_tracker_testing": {
"dependency": "transitive",
@ -528,11 +518,11 @@
"dependency": "transitive",
"description": {
"name": "logging",
"sha256": "c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61",
"sha256": "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.3.0"
"version": "1.2.0"
},
"matcher": {
"dependency": "transitive",
@ -548,31 +538,31 @@
"dependency": "transitive",
"description": {
"name": "material_color_utilities",
"sha256": "f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec",
"sha256": "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.11.1"
"version": "0.8.0"
},
"meta": {
"dependency": "transitive",
"description": {
"name": "meta",
"sha256": "bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7",
"sha256": "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.15.0"
"version": "1.12.0"
},
"msix": {
"dependency": "transitive",
"description": {
"name": "msix",
"sha256": "c50d6bd1aafe0d071a3c1e5a5ccb056404502935cb0a549e3178c4aae16caf33",
"sha256": "519b183d15dc9f9c594f247e2d2339d855cf0eaacc30e19b128e14f3ecc62047",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.16.8"
"version": "3.16.7"
},
"mustache_template": {
"dependency": "transitive",
@ -608,21 +598,21 @@
"dependency": "direct main",
"description": {
"name": "package_info_plus",
"sha256": "da8d9ac8c4b1df253d1a328b7bf01ae77ef132833479ab40763334db13b91cce",
"sha256": "b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "8.1.1"
"version": "8.0.0"
},
"package_info_plus_platform_interface": {
"dependency": "transitive",
"description": {
"name": "package_info_plus_platform_interface",
"sha256": "ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66",
"sha256": "f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.1"
"version": "3.0.0"
},
"parse_app_package": {
"dependency": "transitive",
@ -648,11 +638,11 @@
"dependency": "transitive",
"description": {
"name": "path_parsing",
"sha256": "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca",
"sha256": "e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.1.0"
"version": "1.0.1"
},
"path_provider_linux": {
"dependency": "transitive",
@ -678,11 +668,11 @@
"dependency": "transitive",
"description": {
"name": "path_provider_windows",
"sha256": "bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7",
"sha256": "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.0"
"version": "2.2.1"
},
"petitparser": {
"dependency": "transitive",
@ -698,11 +688,11 @@
"dependency": "transitive",
"description": {
"name": "platform",
"sha256": "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984",
"sha256": "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.6"
"version": "3.1.5"
},
"plist_parser": {
"dependency": "transitive",
@ -728,11 +718,11 @@
"dependency": "direct main",
"description": {
"name": "process_run",
"sha256": "a68fa9727392edad97a2a96a77ce8b0c17d28336ba1b284b1dfac9595a4299ea",
"sha256": "8d9c6198b98fbbfb511edd42e7364e24d85c163e47398919871b952dc86a423e",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.2.2+1"
"version": "0.14.2"
},
"provider": {
"dependency": "direct main",
@ -778,11 +768,11 @@
"dependency": "direct main",
"description": {
"name": "quiver",
"sha256": "ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2",
"sha256": "b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.2.2"
"version": "3.2.1"
},
"recase": {
"dependency": "transitive",
@ -798,71 +788,71 @@
"dependency": "direct main",
"description": {
"name": "shared_preferences",
"sha256": "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82",
"sha256": "d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.3"
"version": "2.2.3"
},
"shared_preferences_android": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_android",
"sha256": "7f172d1b06de5da47b6264c2692ee2ead20bbbc246690427cdb4fc301cd0c549",
"sha256": "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.4"
"version": "2.2.3"
},
"shared_preferences_foundation": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_foundation",
"sha256": "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d",
"sha256": "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.5.3"
"version": "2.4.0"
},
"shared_preferences_linux": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_linux",
"sha256": "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f",
"sha256": "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.4.1"
"version": "2.3.2"
},
"shared_preferences_platform_interface": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_platform_interface",
"sha256": "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80",
"sha256": "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.4.1"
"version": "2.3.2"
},
"shared_preferences_web": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_web",
"sha256": "d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e",
"sha256": "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.4.2"
"version": "2.3.0"
},
"shared_preferences_windows": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_windows",
"sha256": "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1",
"sha256": "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.4.1"
"version": "2.3.2"
},
"shell_executor": {
"dependency": "transitive",
@ -934,11 +924,11 @@
"dependency": "transitive",
"description": {
"name": "synchronized",
"sha256": "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225",
"sha256": "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.3.0+3"
"version": "3.1.0+1"
},
"term_glyph": {
"dependency": "transitive",
@ -954,11 +944,11 @@
"dependency": "transitive",
"description": {
"name": "test_api",
"sha256": "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb",
"sha256": "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.7.2"
"version": "0.7.0"
},
"tuple": {
"dependency": "direct main",
@ -974,61 +964,61 @@
"dependency": "transitive",
"description": {
"name": "typed_data",
"sha256": "f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006",
"sha256": "facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.4.0"
"version": "1.3.2"
},
"url_launcher": {
"dependency": "direct main",
"description": {
"name": "url_launcher",
"sha256": "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603",
"sha256": "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.3.1"
"version": "6.3.0"
},
"url_launcher_android": {
"dependency": "transitive",
"description": {
"name": "url_launcher_android",
"sha256": "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193",
"sha256": "ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.3.14"
"version": "6.3.3"
},
"url_launcher_ios": {
"dependency": "transitive",
"description": {
"name": "url_launcher_ios",
"sha256": "e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e",
"sha256": "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.3.1"
"version": "6.3.0"
},
"url_launcher_linux": {
"dependency": "transitive",
"description": {
"name": "url_launcher_linux",
"sha256": "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935",
"sha256": "ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.2.1"
"version": "3.1.1"
},
"url_launcher_macos": {
"dependency": "transitive",
"description": {
"name": "url_launcher_macos",
"sha256": "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672",
"sha256": "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.2.1"
"version": "3.2.0"
},
"url_launcher_platform_interface": {
"dependency": "transitive",
@ -1044,21 +1034,21 @@
"dependency": "transitive",
"description": {
"name": "url_launcher_web",
"sha256": "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e",
"sha256": "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.3"
"version": "2.3.1"
},
"url_launcher_windows": {
"dependency": "transitive",
"description": {
"name": "url_launcher_windows",
"sha256": "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4",
"sha256": "ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.3"
"version": "3.1.1"
},
"uuid": {
"dependency": "transitive",
@ -1074,31 +1064,31 @@
"dependency": "transitive",
"description": {
"name": "vector_graphics",
"sha256": "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7",
"sha256": "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.1.15"
"version": "1.1.11+1"
},
"vector_graphics_codec": {
"dependency": "transitive",
"description": {
"name": "vector_graphics_codec",
"sha256": "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb",
"sha256": "c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.1.12"
"version": "1.1.11+1"
},
"vector_graphics_compiler": {
"dependency": "transitive",
"description": {
"name": "vector_graphics_compiler",
"sha256": "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad",
"sha256": "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.1.16"
"version": "1.1.11+1"
},
"vector_math": {
"dependency": "transitive",
@ -1110,45 +1100,35 @@
"source": "hosted",
"version": "2.1.4"
},
"version": {
"dependency": "direct main",
"description": {
"name": "version",
"sha256": "3d4140128e6ea10d83da32fef2fa4003fccbf6852217bb854845802f04191f94",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.2"
},
"vm_service": {
"dependency": "transitive",
"description": {
"name": "vm_service",
"sha256": "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d",
"sha256": "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "14.2.5"
"version": "14.2.1"
},
"web": {
"dependency": "transitive",
"description": {
"name": "web",
"sha256": "cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb",
"sha256": "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.1.0"
"version": "0.5.1"
},
"win32": {
"dependency": "transitive",
"description": {
"name": "win32",
"sha256": "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69",
"sha256": "a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "5.9.0"
"version": "5.5.1"
},
"window_size": {
"dependency": "direct main",
@ -1165,11 +1145,11 @@
"dependency": "transitive",
"description": {
"name": "xdg_directories",
"sha256": "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15",
"sha256": "faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.1.0"
"version": "1.0.4"
},
"xml": {
"dependency": "transitive",
@ -1193,7 +1173,7 @@
}
},
"sdks": {
"dart": ">=3.5.0 <4.0.0",
"flutter": ">=3.24.0"
"dart": ">=3.4.0 <4.0.0",
"flutter": ">=3.22.0"
}
}

View File

@ -1,7 +1,7 @@
name: quickgui
description: An elegant virtual machine manager for the desktop
description: Desktop frontend for Quickget and Quickemu
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.2.10+1
version: 1.2.9+1
environment:
flutter: "3.22.0"
@ -14,19 +14,18 @@ dependencies:
sdk: flutter
cupertino_icons: ^1.0.8
desktop_notifications: ^0.6.3
file_picker: ^8.0.6
flutter_svg: ^2.1.0
file_picker: ^8.0.5
flutter_svg: ^2.0.10+1
gettext: ^1.2.0
gettext_i18n: ^1.0.7
gettext_i18n: ^1.0.5
gettext_parser: ^0.2.0
package_info_plus: ^9.0.1
process_run: ^1.1.0
provider: ^6.1.5
quiver: ^3.2.2
package_info_plus: ^8.0.0
process_run: ^0.14.2
provider: ^6.1.2
quiver: ^3.2.1
url_launcher: ^6.3.0
shared_preferences: ^2.3.2
shared_preferences: ^2.2.3
tuple: ^2.0.2
version: ^3.0.2
window_size:
git:
url: https://github.com/google/flutter-desktop-embedding.git
@ -36,7 +35,7 @@ dependencies:
dev_dependencies:
flutter_test:
sdk: flutter
flutter_distributor: ^0.6.6
flutter_distributor: ^0.4.5
flutter_lints: ^4.0.0
flutter: