public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3
@ 2022-09-08  9:55 Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav Dominik Csapak
                   ` (13 more replies)
  0 siblings, 14 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

updates to the code for flutter 3.3 and includes some fixes & improvements

i included aarons patches from december to make it easier to apply

the changes necesseary for flutter 3.3 are
proxmox-login-manager: 2/3
pve-flutter-frontend: 2/10 - 6/10

patches after that are only fixes & improvements
(so stricly not necessary for flutter 3.3)

i noticed some other things too, but for now this should be ok:
e.g. we have quite some widgets/code that are not in use currently
(from tims desktop variant AFAIR), maybe we should remove them
for now (or move it to another repo if we want to use them)
since then we could better use 'flutter analyze'
(now these widgets/files make much noise to the point where it's hard
to see which warnings/infos are even relevant for the app)

proxmox-login-manager:

Aaron Lauterer (1):
  login_form: keep Continue button above Android softnav

Dominik Csapak (2):
  migrate from FlatButton to TextButton
  improve colors of login screen

 lib/proxmox_login_form.dart | 288 +++++++++++++++++++-----------------
 lib/proxmox_tfa_form.dart   |  11 +-
 2 files changed, 156 insertions(+), 143 deletions(-)

pve-flutter-frontend:

Aaron Lauterer (1):
  avoid elements hiding behind Android softnav buttons

Dominik Csapak (9):
  increase compileSdkVersion to 32
  fix null handling in MainActivity.kt
  move to OutlinedButton from OutlineButton
  move to TextButton from FlatButton
  move to ElevatedButton from RaisedButton
  improve colors for indicator/toggles
  fix typo Opague -> Opaque
  fix guest backup widget start display
  fix options view when ostype is null

 android/app/build.gradle                      |   2 +-
 .../app/pve_flutter_frontend/MainActivity.kt  |   2 +-
 lib/main.dart                                 |  14 +
 lib/pages/main_layout_slim.dart               |   2 +-
 .../firstWelcomeScreen/pve_welcome_faq.dart   |  10 +-
 .../firstWelcomeScreen/pve_welcome_last.dart  |  26 +-
 lib/widgets/pve_cd_selector_widget.dart       |   7 +-
 lib/widgets/pve_console_menu_widget.dart      |   4 +-
 lib/widgets/pve_first_welcome_screen.dart     |  32 +-
 lib/widgets/pve_guest_backup_widget.dart      | 157 ++++-----
 lib/widgets/pve_lxc_options_widget.dart       | 140 ++++----
 lib/widgets/pve_main_navigation_drawer.dart   |   4 +-
 lib/widgets/pve_qemu_options_widget.dart      | 259 +++++++-------
 lib/widgets/pve_qemu_overview.dart            | 319 +++++++++---------
 .../pve_qemu_power_settings_widget.dart       | 178 +++++-----
 .../pve_subscription_alert_dialog.dart        |   2 +-
 .../pve_task_log_expansiontile_widget.dart    |   4 +-
 17 files changed, 602 insertions(+), 560 deletions(-)

-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 2/3] migrate from FlatButton to TextButton Dominik Csapak
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

From: Aaron Lauterer <a.lauterer@proxmox.com>

By placing the items in a SafeArea we avoid having the "Continue" button
behind the Android soft navigation buttons.

Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/proxmox_login_form.dart | 265 ++++++++++++++++++------------------
 1 file changed, 135 insertions(+), 130 deletions(-)

diff --git a/lib/proxmox_login_form.dart b/lib/proxmox_login_form.dart
index 2609f71..bb00b5c 100644
--- a/lib/proxmox_login_form.dart
+++ b/lib/proxmox_login_form.dart
@@ -232,152 +232,157 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> {
               child: ConstrainedBox(
                 constraints: BoxConstraints.tightFor(
                     height: MediaQuery.of(context).size.height),
-                child: Padding(
-                  padding: const EdgeInsets.all(8.0),
-                  child: FutureBuilder<List<PveAccessDomainModel?>?>(
-                      future: _accessDomains,
-                      builder: (context, snapshot) {
-                        return Form(
-                          key: _formKey,
-                          onChanged: () {
-                            setState(() {
-                              _submittButtonEnabled =
-                                  _formKey.currentState!.validate();
-                            });
-                          },
-                          child: Column(
-                            mainAxisAlignment: MainAxisAlignment.center,
-                            children: [
-                              Expanded(
-                                child: Container(
-                                  child: Column(
-                                    mainAxisAlignment: MainAxisAlignment.center,
-                                    children: [
-                                      Image.asset(
-                                        'assets/images/proxmox_logo_symbol_wordmark.png',
-                                        package: 'proxmox_login_manager',
-                                      ),
-                                    ],
+                child: SafeArea(
+                  child: Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: FutureBuilder<List<PveAccessDomainModel?>?>(
+                        future: _accessDomains,
+                        builder: (context, snapshot) {
+                          return Form(
+                            key: _formKey,
+                            onChanged: () {
+                              setState(() {
+                                _submittButtonEnabled =
+                                    _formKey.currentState!.validate();
+                              });
+                            },
+                            child: Column(
+                              mainAxisAlignment: MainAxisAlignment.center,
+                              children: [
+                                Expanded(
+                                  child: Container(
+                                    child: Column(
+                                      mainAxisAlignment:
+                                          MainAxisAlignment.center,
+                                      children: [
+                                        Image.asset(
+                                          'assets/images/proxmox_logo_symbol_wordmark.png',
+                                          package: 'proxmox_login_manager',
+                                        ),
+                                      ],
+                                    ),
                                   ),
                                 ),
-                              ),
-                              ProxmoxLoginForm(
-                                originController: _originController,
-                                originValidator: (value) {
-                                  if (value == null || value.isEmpty) {
-                                    return 'Please enter origin';
-                                  }
-                                  if (value.startsWith('https://') ||
-                                      value.startsWith('http://')) {
-                                    return 'Do not prefix with scheme';
-                                  }
-                                  try {
-                                    Uri.https(value, '');
-                                    return null;
-                                  } on FormatException catch (_) {
-                                    return 'Invalid URI';
-                                  }
-                                },
-                                usernameController: _usernameController,
-                                passwordController: _passwordController,
-                                accessDomains: snapshot.data,
-                                selectedDomain: _selectedDomain,
-                                onDomainChanged: (value) {
-                                  setState(() {
-                                    _selectedDomain = value;
-                                  });
-                                },
-                                onOriginSubmitted: _submittButtonEnabled
-                                    ? () {
-                                        final isValid =
-                                            _formKey.currentState!.validate();
-                                        setState(() {
-                                          _submittButtonEnabled = isValid;
-                                        });
-                                        if (isValid) {
+                                ProxmoxLoginForm(
+                                  originController: _originController,
+                                  originValidator: (value) {
+                                    if (value == null || value.isEmpty) {
+                                      return 'Please enter origin';
+                                    }
+                                    if (value.startsWith('https://') ||
+                                        value.startsWith('http://')) {
+                                      return 'Do not prefix with scheme';
+                                    }
+                                    try {
+                                      Uri.https(value, '');
+                                      return null;
+                                    } on FormatException catch (_) {
+                                      return 'Invalid URI';
+                                    }
+                                  },
+                                  usernameController: _usernameController,
+                                  passwordController: _passwordController,
+                                  accessDomains: snapshot.data,
+                                  selectedDomain: _selectedDomain,
+                                  onDomainChanged: (value) {
+                                    setState(() {
+                                      _selectedDomain = value;
+                                    });
+                                  },
+                                  onOriginSubmitted: _submittButtonEnabled
+                                      ? () {
+                                          final isValid =
+                                              _formKey.currentState!.validate();
                                           setState(() {
-                                            _accessDomains =
-                                                _getAccessDomains();
+                                            _submittButtonEnabled = isValid;
                                           });
+                                          if (isValid) {
+                                            setState(() {
+                                              _accessDomains =
+                                                  _getAccessDomains();
+                                            });
+                                          }
                                         }
-                                      }
-                                    : null,
-                                onPasswordSubmitted: _submittButtonEnabled
-                                    ? () {
-                                        final isValid =
-                                            _formKey.currentState!.validate();
-                                        setState(() {
-                                          _submittButtonEnabled = isValid;
-                                        });
-                                        if (isValid) {
-                                          _onLoginButtonPressed();
+                                      : null,
+                                  onPasswordSubmitted: _submittButtonEnabled
+                                      ? () {
+                                          final isValid =
+                                              _formKey.currentState!.validate();
+                                          setState(() {
+                                            _submittButtonEnabled = isValid;
+                                          });
+                                          if (isValid) {
+                                            _onLoginButtonPressed();
+                                          }
                                         }
-                                      }
-                                    : null,
-                              ),
-                              if (snapshot.hasData)
-                                Expanded(
-                                  child: Align(
-                                    alignment: Alignment.bottomCenter,
-                                    child: Container(
-                                      width: MediaQuery.of(context).size.width,
-                                      child: FlatButton(
-                                        onPressed: _submittButtonEnabled
-                                            ? () {
-                                                final isValid = _formKey
-                                                    .currentState!
-                                                    .validate();
-                                                setState(() {
-                                                  _submittButtonEnabled =
-                                                      isValid;
-                                                });
-                                                if (isValid) {
-                                                  _onLoginButtonPressed();
+                                      : null,
+                                ),
+                                if (snapshot.hasData)
+                                  Expanded(
+                                    child: Align(
+                                      alignment: Alignment.bottomCenter,
+                                      child: Container(
+                                        width:
+                                            MediaQuery.of(context).size.width,
+                                        child: FlatButton(
+                                          onPressed: _submittButtonEnabled
+                                              ? () {
+                                                  final isValid = _formKey
+                                                      .currentState!
+                                                      .validate();
+                                                  setState(() {
+                                                    _submittButtonEnabled =
+                                                        isValid;
+                                                  });
+                                                  if (isValid) {
+                                                    _onLoginButtonPressed();
+                                                  }
                                                 }
-                                              }
-                                            : null,
-                                        color: ProxmoxColors.orange,
-                                        disabledColor: Colors.grey,
-                                        child: Text('Continue'),
+                                              : null,
+                                          color: ProxmoxColors.orange,
+                                          disabledColor: Colors.grey,
+                                          child: Text('Continue'),
+                                        ),
                                       ),
                                     ),
                                   ),
-                                ),
-                              if (!snapshot.hasData)
-                                Expanded(
-                                  child: Align(
-                                    alignment: Alignment.bottomCenter,
-                                    child: Container(
-                                      width: MediaQuery.of(context).size.width,
-                                      child: FlatButton(
-                                        onPressed: _submittButtonEnabled
-                                            ? () {
-                                                final isValid = _formKey
-                                                    .currentState!
-                                                    .validate();
-                                                setState(() {
-                                                  _submittButtonEnabled =
-                                                      isValid;
-                                                });
-                                                if (isValid) {
+                                if (!snapshot.hasData)
+                                  Expanded(
+                                    child: Align(
+                                      alignment: Alignment.bottomCenter,
+                                      child: Container(
+                                        width:
+                                            MediaQuery.of(context).size.width,
+                                        child: FlatButton(
+                                          onPressed: _submittButtonEnabled
+                                              ? () {
+                                                  final isValid = _formKey
+                                                      .currentState!
+                                                      .validate();
                                                   setState(() {
-                                                    _accessDomains =
-                                                        _getAccessDomains();
+                                                    _submittButtonEnabled =
+                                                        isValid;
                                                   });
+                                                  if (isValid) {
+                                                    setState(() {
+                                                      _accessDomains =
+                                                          _getAccessDomains();
+                                                    });
+                                                  }
                                                 }
-                                              }
-                                            : null,
-                                        color: ProxmoxColors.orange,
-                                        child: Text('Continue'),
-                                        disabledColor: Colors.grey,
+                                              : null,
+                                          color: ProxmoxColors.orange,
+                                          child: Text('Continue'),
+                                          disabledColor: Colors.grey,
+                                        ),
                                       ),
                                     ),
                                   ),
-                                ),
-                            ],
-                          ),
-                        );
-                      }),
+                              ],
+                            ),
+                          );
+                        }),
+                  ),
                 ),
               ),
             ),
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH proxmox-login-manager 2/3] migrate from FlatButton to TextButton
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 3/3] improve colors of login screen Dominik Csapak
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

since flutter 3 removed FlatButton. For this we have to do the colors a
little different, so i moved the color/disabledColor into the
textButtonTheme, which does not modify anything else here.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/proxmox_login_form.dart | 33 +++++++++++++++++++--------------
 lib/proxmox_tfa_form.dart   | 11 +++++++----
 2 files changed, 26 insertions(+), 18 deletions(-)

diff --git a/lib/proxmox_login_form.dart b/lib/proxmox_login_form.dart
index bb00b5c..5e9198f 100644
--- a/lib/proxmox_login_form.dart
+++ b/lib/proxmox_login_form.dart
@@ -212,9 +212,18 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> {
     return Theme(
       //data: ThemeData.dark().copyWith(accentColor: Color(0xFFE47225)),
       data: ThemeData.dark().copyWith(
-          colorScheme: ColorScheme.dark().copyWith(
-              secondary: ProxmoxColors.orange,
-              onSecondary: ProxmoxColors.supportGrey)),
+        textButtonTheme: TextButtonThemeData(
+          style: TextButton.styleFrom(
+            foregroundColor: Colors.white,
+            backgroundColor: ProxmoxColors.orange,
+            disabledBackgroundColor: Colors.grey,
+          ),
+        ),
+        colorScheme: ColorScheme.dark().copyWith(
+            secondary: ProxmoxColors.orange,
+            onSecondary: ProxmoxColors.supportGrey
+        ),
+      ),
       child: Scaffold(
         backgroundColor: ProxmoxColors.supportBlue,
         extendBodyBehindAppBar: true,
@@ -324,7 +333,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> {
                                       child: Container(
                                         width:
                                             MediaQuery.of(context).size.width,
-                                        child: FlatButton(
+                                        child: TextButton(
                                           onPressed: _submittButtonEnabled
                                               ? () {
                                                   final isValid = _formKey
@@ -339,8 +348,6 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> {
                                                   }
                                                 }
                                               : null,
-                                          color: ProxmoxColors.orange,
-                                          disabledColor: Colors.grey,
                                           child: Text('Continue'),
                                         ),
                                       ),
@@ -353,7 +360,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> {
                                       child: Container(
                                         width:
                                             MediaQuery.of(context).size.width,
-                                        child: FlatButton(
+                                        child: TextButton(
                                           onPressed: _submittButtonEnabled
                                               ? () {
                                                   final isValid = _formKey
@@ -371,9 +378,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> {
                                                   }
                                                 }
                                               : null,
-                                          color: ProxmoxColors.orange,
                                           child: Text('Continue'),
-                                          disabledColor: Colors.grey,
                                         ),
                                       ),
                                     ),
@@ -459,7 +464,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> {
             content: Text(
                 'Proxmox VE version not supported, please update your instance to use this app.'),
             actions: [
-              FlatButton(
+              TextButton(
                 onPressed: () => Navigator.of(context).pop(),
                 child: Text('Close'),
               ),
@@ -532,7 +537,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> {
             title: Text('Connection error'),
             content: Text('Could not establish connection.'),
             actions: [
-              FlatButton(
+              TextButton(
                 onPressed: () => Navigator.of(context).pop(),
                 child: Text('Close'),
               ),
@@ -616,7 +621,7 @@ class ProxmoxApiErrorDialog extends StatelessWidget {
         child: Text(exception.message),
       ),
       actions: [
-        FlatButton(
+        TextButton(
           onPressed: () => Navigator.of(context).pop(),
           child: Text('Close'),
         ),
@@ -648,11 +653,11 @@ class ProxmoxCertificateErrorDialog extends StatelessWidget {
         ),
       ),
       actions: [
-        FlatButton(
+        TextButton(
           onPressed: () => Navigator.of(context).pop(),
           child: Text('Close'),
         ),
-        FlatButton(
+        TextButton(
           onPressed: () => Navigator.of(context).pushReplacement(
               MaterialPageRoute(
                   builder: (context) => ProxmoxGeneralSettingsForm())),
diff --git a/lib/proxmox_tfa_form.dart b/lib/proxmox_tfa_form.dart
index 3743455..945c75c 100644
--- a/lib/proxmox_tfa_form.dart
+++ b/lib/proxmox_tfa_form.dart
@@ -81,11 +81,14 @@ class _ProxmoxTfaFormState extends State<ProxmoxTfaForm> {
                           alignment: Alignment.bottomCenter,
                           child: Container(
                             width: MediaQuery.of(context).size.width,
-                            child: FlatButton(
+                            child: TextButton(
+                              style: TextButton.styleFrom(
+                                foregroundColor: Colors.white,
+                                backgroundColor: Color(0xFFE47225),
+                                disabledBackgroundColor: Colors.grey,
+                              ),
                               onPressed: () => _submitTfaCode(),
-                              color: Color(0xFFE47225),
                               child: Text('Continue'),
-                              disabledColor: Colors.grey,
                             ),
                           ),
                         ),
@@ -129,7 +132,7 @@ class _ProxmoxTfaFormState extends State<ProxmoxTfaForm> {
           title: Text('Connection error'),
           content: Text('Could not establish connection.'),
           actions: [
-            FlatButton(
+            TextButton(
               onPressed: () => Navigator.of(context).pop(),
               child: Text('Close'),
             ),
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH proxmox-login-manager 3/3] improve colors of login screen
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 2/3] migrate from FlatButton to TextButton Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 01/10] avoid elements hiding behind Android softnav buttons Dominik Csapak
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

default primary color was a purple hue that did not really fit with our
theme. That was used on highlighting form fields and the progress
indicator. I replaced it with orange since that fits nicely with
the rest of the look and feel

also removed the use of accentColor int he ProxmoxProgressOverlay, so
that the text appears now white instead of some shade of cyan.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/proxmox_login_form.dart | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/proxmox_login_form.dart b/lib/proxmox_login_form.dart
index 5e9198f..706315f 100644
--- a/lib/proxmox_login_form.dart
+++ b/lib/proxmox_login_form.dart
@@ -220,6 +220,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> {
           ),
         ),
         colorScheme: ColorScheme.dark().copyWith(
+          primary: ProxmoxColors.orange,
             secondary: ProxmoxColors.orange,
             onSecondary: ProxmoxColors.supportGrey
         ),
@@ -590,7 +591,6 @@ class ProxmoxProgressOverlay extends StatelessWidget {
             Text(
               message,
               style: TextStyle(
-                color: Theme.of(context).accentColor,
                 fontSize: 20,
               ),
             ),
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 01/10] avoid elements hiding behind Android softnav buttons
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (2 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 3/3] improve colors of login screen Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 02/10] increase compileSdkVersion to 32 Dominik Csapak
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

From: Aaron Lauterer <a.lauterer@proxmox.com>

In a few places we had elements hiding behind the Android soft nav
buttons at the bottom.

Those were:
* Qemu HW overview list
* Qemu Power Control menu
* LXC and Qemu Options list

Placing them within a SafeArea avoids that.

Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/widgets/pve_lxc_options_widget.dart       | 140 ++++----
 lib/widgets/pve_qemu_options_widget.dart      | 256 +++++++-------
 lib/widgets/pve_qemu_overview.dart            | 319 +++++++++---------
 .../pve_qemu_power_settings_widget.dart       | 178 +++++-----
 4 files changed, 451 insertions(+), 442 deletions(-)

diff --git a/lib/widgets/pve_lxc_options_widget.dart b/lib/widgets/pve_lxc_options_widget.dart
index 89912dc..70db577 100644
--- a/lib/widgets/pve_lxc_options_widget.dart
+++ b/lib/widgets/pve_lxc_options_widget.dart
@@ -15,75 +15,77 @@ class PveLxcOptions extends StatelessWidget {
         builder: (context, state) {
           final config = state.config;
           if (config != null) {
-            return Scaffold(
-              appBar: AppBar(),
-              body: SingleChildScrollView(
-                child: Column(
-                  children: <Widget>[
-                    ListTile(
-                      title: Text("Name"),
-                      subtitle: Text(config.hostname ?? 'undefined'),
-                    ),
-                    PveConfigSwitchListTile(
-                      title: Text("Start on boot"),
-                      value: config.onboot,
-                      defaultValue: false,
-                      pending: config.getPending('onboot'),
-                      onChanged: (v) =>
-                          lxcBloc!.events.add(UpdateLxcConfigBool('onboot', v)),
-                      onDeleted: () =>
-                          lxcBloc!.events.add(RevertPendingLxcConfig('onboot')),
-                    ),
-                    ListTile(
-                      title: Text("Start/Shutdown order"),
-                      subtitle: Text(config.startup ?? "Default (any)"),
-                    ),
-                    ListTile(
-                      title: Text("OS Type"),
-                      subtitle: Text("${config.ostype}"),
-                    ),
-                    ListTile(
-                      title: Text("Architecture"),
-                      subtitle: Text("${config.arch}"),
-                    ),
-                    PveConfigSwitchListTile(
-                      title: Text("/dev/console"),
-                      value: config.console,
-                      defaultValue: true,
-                      pending: config.getPending('console'),
-                      onChanged: (v) => lxcBloc!.events
-                          .add(UpdateLxcConfigBool('console', v)),
-                      onDeleted: () => lxcBloc!.events
-                          .add(RevertPendingLxcConfig('console')),
-                    ),
-                    ListTile(
-                      title: Text("TTY Count"),
-                      subtitle: Text("${config.tty ?? 2}"),
-                    ),
-                    ListTile(
-                      title: Text("Console Mode"),
-                      subtitle: Text(config.cmode?.name ?? 'tty'),
-                    ),
-                    PveConfigSwitchListTile(
-                      title: Text("Protection"),
-                      value: config.protection,
-                      defaultValue: false,
-                      pending: config.getPending('protection'),
-                      onChanged: (v) => lxcBloc!.events
-                          .add(UpdateLxcConfigBool('protection', v)),
-                      onDeleted: () => lxcBloc!.events
-                          .add(RevertPendingLxcConfig('protection')),
-                    ),
-                    ListTile(
-                      title: Text("Unprivileged"),
-                      subtitle:
-                          Text(config.unprivileged ?? false ? 'Yes' : 'No'),
-                    ),
-                    ListTile(
-                      title: Text("Features"),
-                      subtitle: Text(config.features?.toString() ?? 'none'),
-                    ),
-                  ],
+            return SafeArea(
+              child: Scaffold(
+                appBar: AppBar(),
+                body: SingleChildScrollView(
+                  child: Column(
+                    children: <Widget>[
+                      ListTile(
+                        title: Text("Name"),
+                        subtitle: Text(config.hostname ?? 'undefined'),
+                      ),
+                      PveConfigSwitchListTile(
+                        title: Text("Start on boot"),
+                        value: config.onboot,
+                        defaultValue: false,
+                        pending: config.getPending('onboot'),
+                        onChanged: (v) => lxcBloc!.events
+                            .add(UpdateLxcConfigBool('onboot', v)),
+                        onDeleted: () => lxcBloc!.events
+                            .add(RevertPendingLxcConfig('onboot')),
+                      ),
+                      ListTile(
+                        title: Text("Start/Shutdown order"),
+                        subtitle: Text(config.startup ?? "Default (any)"),
+                      ),
+                      ListTile(
+                        title: Text("OS Type"),
+                        subtitle: Text("${config.ostype}"),
+                      ),
+                      ListTile(
+                        title: Text("Architecture"),
+                        subtitle: Text("${config.arch}"),
+                      ),
+                      PveConfigSwitchListTile(
+                        title: Text("/dev/console"),
+                        value: config.console,
+                        defaultValue: true,
+                        pending: config.getPending('console'),
+                        onChanged: (v) => lxcBloc!.events
+                            .add(UpdateLxcConfigBool('console', v)),
+                        onDeleted: () => lxcBloc!.events
+                            .add(RevertPendingLxcConfig('console')),
+                      ),
+                      ListTile(
+                        title: Text("TTY Count"),
+                        subtitle: Text("${config.tty ?? 2}"),
+                      ),
+                      ListTile(
+                        title: Text("Console Mode"),
+                        subtitle: Text(config.cmode?.name ?? 'tty'),
+                      ),
+                      PveConfigSwitchListTile(
+                        title: Text("Protection"),
+                        value: config.protection,
+                        defaultValue: false,
+                        pending: config.getPending('protection'),
+                        onChanged: (v) => lxcBloc!.events
+                            .add(UpdateLxcConfigBool('protection', v)),
+                        onDeleted: () => lxcBloc!.events
+                            .add(RevertPendingLxcConfig('protection')),
+                      ),
+                      ListTile(
+                        title: Text("Unprivileged"),
+                        subtitle:
+                            Text(config.unprivileged ?? false ? 'Yes' : 'No'),
+                      ),
+                      ListTile(
+                        title: Text("Features"),
+                        subtitle: Text(config.features?.toString() ?? 'none'),
+                      ),
+                    ],
+                  ),
                 ),
               ),
             );
diff --git a/lib/widgets/pve_qemu_options_widget.dart b/lib/widgets/pve_qemu_options_widget.dart
index fb28051..788923d 100644
--- a/lib/widgets/pve_qemu_options_widget.dart
+++ b/lib/widgets/pve_qemu_options_widget.dart
@@ -18,134 +18,136 @@ class PveQemuOptions extends StatelessWidget {
         builder: (context, state) {
           if (state.config != null) {
             final config = state.config!;
-            return Scaffold(
-              appBar: AppBar(
-                leading: IconButton(
-                  icon: Icon(Icons.close),
-                  onPressed: () => Navigator.of(context).pop(),
+            return SafeArea(
+              child: Scaffold(
+                appBar: AppBar(
+                  leading: IconButton(
+                    icon: Icon(Icons.close),
+                    onPressed: () => Navigator.of(context).pop(),
+                  ),
                 ),
-              ),
-              body: SingleChildScrollView(
-                child: Form(
-                  key: _formKey,
-                  onChanged: () {},
-                  child: Column(
-                    children: <Widget>[
-                      ListTile(
-                        title: Text("Name"),
-                        subtitle: Text(config.name ?? 'VM$guestID'),
-                      ),
-                      PveConfigSwitchListTile(
-                        title: Text("Start on boot"),
-                        value: config.onboot,
-                        defaultValue: false,
-                        pending: config.getPending('onboot'),
-                        onChanged: (v) =>
-                            bloc.events.add(UpdateQemuConfigBool('onboot', v)),
-                        onDeleted: () =>
-                            bloc.events.add(RevertPendingQemuConfig('onboot')),
-                      ),
-                      ListTile(
-                        title: Text("Start/Shutdown order"),
-                        subtitle: Text(config.startup ?? "Default (any)"),
-                      ),
-                      ListTile(
-                        title: Text("OS Type"),
-                        subtitle: Text(
-                            "${config.ostype!.type} ${config.ostype!.description}"),
-                      ),
-                      //TODO add better ui component e.g. collapseable
-                      ListTile(
-                        title: Text("Boot Device"),
-                        subtitle: Text(config.boot ?? 'Disk, Network, USB'),
-                      ),
-                      PveConfigSwitchListTile(
-                        title: Text("Use tablet for pointer"),
-                        value: config.tablet,
-                        defaultValue: true,
-                        pending: config.getPending('tablet'),
-                        onChanged: (v) =>
-                            bloc.events.add(UpdateQemuConfigBool('tablet', v)),
-                        onDeleted: () =>
-                            bloc.events.add(RevertPendingQemuConfig('tablet')),
-                      ),
-                      ListTile(
-                        title: Text("Hotplug"),
-                        subtitle: Text(config.hotplug ?? 'disk,network,usb'),
-                      ),
-                      PveConfigSwitchListTile(
-                        title: Text("ACPI support"),
-                        value: config.acpi,
-                        defaultValue: true,
-                        pending: config.getPending('acpi'),
-                        onChanged: (v) =>
-                            bloc.events.add(UpdateQemuConfigBool('acpi', v)),
-                        onDeleted: () =>
-                            bloc.events.add(RevertPendingQemuConfig('acpi')),
-                      ),
-                      PveConfigSwitchListTile(
-                        title: Text("KVM hardware virtualization"),
-                        value: config.kvm,
-                        defaultValue: true,
-                        pending: config.getPending('kvm'),
-                        onChanged: (v) =>
-                            bloc.events.add(UpdateQemuConfigBool('kvm', v)),
-                        onDeleted: () =>
-                            bloc.events.add(RevertPendingQemuConfig('kvm')),
-                      ),
-                      PveConfigSwitchListTile(
-                        title: Text("Freeze CPU on startup"),
-                        value: config.freeze,
-                        defaultValue: false,
-                        pending: config.getPending('freeze'),
-                        onChanged: (v) =>
-                            bloc.events.add(UpdateQemuConfigBool('freeze', v)),
-                        onDeleted: () =>
-                            bloc.events.add(RevertPendingQemuConfig('freeze')),
-                      ),
-                      PveConfigSwitchListTile(
-                        title: Text("Use local time for RTC"),
-                        value: config.localtime,
-                        defaultValue: false,
-                        pending: config.getPending('localtime'),
-                        onChanged: (v) => bloc.events
-                            .add(UpdateQemuConfigBool('localtime', v)),
-                        onDeleted: () => bloc.events
-                            .add(RevertPendingQemuConfig('localtime')),
-                      ),
-                      ListTile(
-                        title: Text("RTC start date"),
-                        subtitle: Text(config.startdate ?? 'now'),
-                      ),
-                      ListTile(
-                        title: Text("SMBIOS settings (type1)"),
-                        subtitle: Text(config.smbios1 ?? ''),
-                      ),
-                      //Todo enhance UI
-                      ListTile(
-                        title: Text("QEMU Guest Agent"),
-                        subtitle: Text(config.agent ?? 'Default (disabled)'),
-                      ),
-                      PveConfigSwitchListTile(
-                        title: Text("Protection"),
-                        value: config.protection,
-                        defaultValue: false,
-                        pending: config.getPending('protection'),
-                        onChanged: (v) => bloc.events
-                            .add(UpdateQemuConfigBool('protection', v)),
-                        onDeleted: () => bloc.events
-                            .add(RevertPendingQemuConfig('protection')),
-                      ),
-                      ListTile(
-                        title: Text("Spice Enhancements"),
-                        subtitle:
-                            Text(config.spiceEnhancements ?? 'No enhancements'),
-                      ),
-                      ListTile(
-                        title: Text("VM State Storage"),
-                        subtitle: Text(config.vmstatestorage ?? 'Automatic'),
-                      ),
-                    ],
+                body: SingleChildScrollView(
+                  child: Form(
+                    key: _formKey,
+                    onChanged: () {},
+                    child: Column(
+                      children: <Widget>[
+                        ListTile(
+                          title: Text("Name"),
+                          subtitle: Text(config.name ?? 'VM$guestID'),
+                        ),
+                        PveConfigSwitchListTile(
+                          title: Text("Start on boot"),
+                          value: config.onboot,
+                          defaultValue: false,
+                          pending: config.getPending('onboot'),
+                          onChanged: (v) => bloc.events
+                              .add(UpdateQemuConfigBool('onboot', v)),
+                          onDeleted: () => bloc.events
+                              .add(RevertPendingQemuConfig('onboot')),
+                        ),
+                        ListTile(
+                          title: Text("Start/Shutdown order"),
+                          subtitle: Text(config.startup ?? "Default (any)"),
+                        ),
+                        ListTile(
+                          title: Text("OS Type"),
+                          subtitle: Text(
+                              "${config.ostype!.type} ${config.ostype!.description}"),
+                        ),
+                        //TODO add better ui component e.g. collapseable
+                        ListTile(
+                          title: Text("Boot Device"),
+                          subtitle: Text(config.boot ?? 'Disk, Network, USB'),
+                        ),
+                        PveConfigSwitchListTile(
+                          title: Text("Use tablet for pointer"),
+                          value: config.tablet,
+                          defaultValue: true,
+                          pending: config.getPending('tablet'),
+                          onChanged: (v) => bloc.events
+                              .add(UpdateQemuConfigBool('tablet', v)),
+                          onDeleted: () => bloc.events
+                              .add(RevertPendingQemuConfig('tablet')),
+                        ),
+                        ListTile(
+                          title: Text("Hotplug"),
+                          subtitle: Text(config.hotplug ?? 'disk,network,usb'),
+                        ),
+                        PveConfigSwitchListTile(
+                          title: Text("ACPI support"),
+                          value: config.acpi,
+                          defaultValue: true,
+                          pending: config.getPending('acpi'),
+                          onChanged: (v) =>
+                              bloc.events.add(UpdateQemuConfigBool('acpi', v)),
+                          onDeleted: () =>
+                              bloc.events.add(RevertPendingQemuConfig('acpi')),
+                        ),
+                        PveConfigSwitchListTile(
+                          title: Text("KVM hardware virtualization"),
+                          value: config.kvm,
+                          defaultValue: true,
+                          pending: config.getPending('kvm'),
+                          onChanged: (v) =>
+                              bloc.events.add(UpdateQemuConfigBool('kvm', v)),
+                          onDeleted: () =>
+                              bloc.events.add(RevertPendingQemuConfig('kvm')),
+                        ),
+                        PveConfigSwitchListTile(
+                          title: Text("Freeze CPU on startup"),
+                          value: config.freeze,
+                          defaultValue: false,
+                          pending: config.getPending('freeze'),
+                          onChanged: (v) => bloc.events
+                              .add(UpdateQemuConfigBool('freeze', v)),
+                          onDeleted: () => bloc.events
+                              .add(RevertPendingQemuConfig('freeze')),
+                        ),
+                        PveConfigSwitchListTile(
+                          title: Text("Use local time for RTC"),
+                          value: config.localtime,
+                          defaultValue: false,
+                          pending: config.getPending('localtime'),
+                          onChanged: (v) => bloc.events
+                              .add(UpdateQemuConfigBool('localtime', v)),
+                          onDeleted: () => bloc.events
+                              .add(RevertPendingQemuConfig('localtime')),
+                        ),
+                        ListTile(
+                          title: Text("RTC start date"),
+                          subtitle: Text(config.startdate ?? 'now'),
+                        ),
+                        ListTile(
+                          title: Text("SMBIOS settings (type1)"),
+                          subtitle: Text(config.smbios1 ?? ''),
+                        ),
+                        //Todo enhance UI
+                        ListTile(
+                          title: Text("QEMU Guest Agent"),
+                          subtitle: Text(config.agent ?? 'Default (disabled)'),
+                        ),
+                        PveConfigSwitchListTile(
+                          title: Text("Protection"),
+                          value: config.protection,
+                          defaultValue: false,
+                          pending: config.getPending('protection'),
+                          onChanged: (v) => bloc.events
+                              .add(UpdateQemuConfigBool('protection', v)),
+                          onDeleted: () => bloc.events
+                              .add(RevertPendingQemuConfig('protection')),
+                        ),
+                        ListTile(
+                          title: Text("Spice Enhancements"),
+                          subtitle: Text(
+                              config.spiceEnhancements ?? 'No enhancements'),
+                        ),
+                        ListTile(
+                          title: Text("VM State Storage"),
+                          subtitle: Text(config.vmstatestorage ?? 'Automatic'),
+                        ),
+                      ],
+                    ),
                   ),
                 ),
               ),
diff --git a/lib/widgets/pve_qemu_overview.dart b/lib/widgets/pve_qemu_overview.dart
index df8867e..45f3f66 100644
--- a/lib/widgets/pve_qemu_overview.dart
+++ b/lib/widgets/pve_qemu_overview.dart
@@ -70,181 +70,184 @@ class PveQemuOverview extends StatelessWidget {
             final config = state.config;
             final rrdData = state.rrdData;
 
-            return Scaffold(
-                appBar: AppBar(
-                  //backgroundColor: Colors.transparent,
-                  elevation: 0,
-                  title: Text(config?.name ?? 'VM $guestID'),
-                ),
-                backgroundColor: Theme.of(context).colorScheme.background,
-                body: SingleChildScrollView(
-                    child: Column(
-                  children: <Widget>[
-                    PveGuestOverviewHeader(
-                      background: !(status?.template ?? false)
-                          ? PveGuestHeaderRRDPageView(
-                              rrdData: rrdData,
-                            )
-                          : Center(
-                              child: Text(
-                                "TEMPLATE",
-                                style: TextStyle(
-                                  color: Colors.white,
-                                ),
-                              ),
-                            ),
-                      width: width,
-                      guestID: guestID,
-                      guestStatus: status?.getQemuStatus(),
-                      guestName: config?.name ?? 'VM $guestID',
-                      guestNodeID: state.nodeID,
-                      guestType: 'qemu',
-                      ha: status?.ha,
-                      template: status?.template ?? false,
-                    ),
-                    ProxmoxStreamBuilder<PveTaskLogBloc, PveTaskLogState>(
-                      bloc: taskBloc,
-                      builder: (context, taskState) {
-                        if (taskState.tasks != null &&
-                            taskState.tasks.isNotEmpty) {
-                          return PveTaskExpansionTile(
-                            headerColor:
-                                Theme.of(context).colorScheme.onBackground,
-                            task: taskState.tasks.first,
-                            showMorePage: Provider<PveTaskLogBloc>(
-                              create: (context) => PveTaskLogBloc(
-                                apiClient: taskBloc.apiClient,
-                                init: PveTaskLogState.init(state.nodeID),
+            return SafeArea(
+              child: Scaffold(
+                  appBar: AppBar(
+                    //backgroundColor: Colors.transparent,
+                    elevation: 0,
+                    title: Text(config?.name ?? 'VM $guestID'),
+                  ),
+                  backgroundColor: Theme.of(context).colorScheme.background,
+                  body: SingleChildScrollView(
+                      child: Column(
+                    children: <Widget>[
+                      PveGuestOverviewHeader(
+                        background: !(status?.template ?? false)
+                            ? PveGuestHeaderRRDPageView(
+                                rrdData: rrdData,
                               )
-                                ..events.add(
-                                  FilterTasksByGuestID(
-                                    guestID: guestID,
+                            : Center(
+                                child: Text(
+                                  "TEMPLATE",
+                                  style: TextStyle(
+                                    color: Colors.white,
                                   ),
+                                ),
+                              ),
+                        width: width,
+                        guestID: guestID,
+                        guestStatus: status?.getQemuStatus(),
+                        guestName: config?.name ?? 'VM $guestID',
+                        guestNodeID: state.nodeID,
+                        guestType: 'qemu',
+                        ha: status?.ha,
+                        template: status?.template ?? false,
+                      ),
+                      ProxmoxStreamBuilder<PveTaskLogBloc, PveTaskLogState>(
+                        bloc: taskBloc,
+                        builder: (context, taskState) {
+                          if (taskState.tasks != null &&
+                              taskState.tasks.isNotEmpty) {
+                            return PveTaskExpansionTile(
+                              headerColor:
+                                  Theme.of(context).colorScheme.onBackground,
+                              task: taskState.tasks.first,
+                              showMorePage: Provider<PveTaskLogBloc>(
+                                create: (context) => PveTaskLogBloc(
+                                  apiClient: taskBloc.apiClient,
+                                  init: PveTaskLogState.init(state.nodeID),
                                 )
-                                ..events.add(LoadTasks()),
-                              dispose: (context, bloc) => bloc.dispose(),
-                              child: PveTaskLog(),
-                            ),
-                          );
-                        }
-                        return Container();
-                      },
-                    ),
-                    Container(
-                      height: 130,
-                      child: SingleChildScrollView(
-                        scrollDirection: Axis.horizontal,
-                        child: Row(
-                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
-                          children: <Widget>[
-                            if (!(status?.template ?? false))
-                              createActionCard(
-                                  'Power Settings',
-                                  Icons.power_settings_new,
-                                  () =>
-                                      showPowerMenuBottomSheet(context, bloc)),
-                            if (!(status?.template ?? false))
+                                  ..events.add(
+                                    FilterTasksByGuestID(
+                                      guestID: guestID,
+                                    ),
+                                  )
+                                  ..events.add(LoadTasks()),
+                                dispose: (context, bloc) => bloc.dispose(),
+                                child: PveTaskLog(),
+                              ),
+                            );
+                          }
+                          return Container();
+                        },
+                      ),
+                      Container(
+                        height: 130,
+                        child: SingleChildScrollView(
+                          scrollDirection: Axis.horizontal,
+                          child: Row(
+                            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+                            children: <Widget>[
+                              if (!(status?.template ?? false))
+                                createActionCard(
+                                    'Power Settings',
+                                    Icons.power_settings_new,
+                                    () => showPowerMenuBottomSheet(
+                                        context, bloc)),
+                              if (!(status?.template ?? false))
+                                createActionCard(
+                                    'Console',
+                                    Icons.queue_play_next,
+                                    () => showConsoleMenuBottomSheet(
+                                          context,
+                                          bloc.apiClient,
+                                          guestID,
+                                          state.nodeID,
+                                          'qemu',
+                                          allowSpice: status?.spice ?? false,
+                                        )),
                               createActionCard(
-                                  'Console',
-                                  Icons.queue_play_next,
-                                  () => showConsoleMenuBottomSheet(
-                                        context,
-                                        bloc.apiClient,
-                                        guestID,
-                                        state.nodeID,
-                                        'qemu',
-                                        allowSpice: status?.spice ?? false,
-                                      )),
-                            createActionCard(
-                                'Options',
-                                Icons.settings,
-                                () => Navigator.of(context)
-                                    .push(_createOptionsRoute(bloc))),
-                            if (!rBloc.latestState.isStandalone)
+                                  'Options',
+                                  Icons.settings,
+                                  () => Navigator.of(context)
+                                      .push(_createOptionsRoute(bloc))),
+                              if (!rBloc.latestState.isStandalone)
+                                createActionCard(
+                                    'Migrate',
+                                    FontAwesomeIcons.paperPlane,
+                                    () => Navigator.of(context).push(
+                                        _createMigrationRoute(guestID,
+                                            state.nodeID, bloc.apiClient))),
                               createActionCard(
-                                  'Migrate',
-                                  FontAwesomeIcons.paperPlane,
+                                  'Backup',
+                                  FontAwesomeIcons.save,
                                   () => Navigator.of(context).push(
-                                      _createMigrationRoute(guestID,
-                                          state.nodeID, bloc.apiClient))),
-                            createActionCard(
-                                'Backup',
-                                FontAwesomeIcons.save,
-                                () => Navigator.of(context).push(
-                                    _createBackupRoute(guestID, state.nodeID,
-                                        bloc.apiClient))),
-                          ],
+                                      _createBackupRoute(guestID, state.nodeID,
+                                          bloc.apiClient))),
+                            ],
+                          ),
                         ),
                       ),
-                    ),
-                    if (config != null)
-                      PveResourceDataCardWidget(
-                          expandable: false,
-                          title: Text(
-                            'Hardware',
-                            style: TextStyle(
-                              fontWeight: FontWeight.bold,
-                              fontSize: 20,
-                            ),
-                          ),
-                          children: [
-                            ListTile(
-                              leading: Icon(FontAwesomeIcons.memory),
-                              title: Text('${config.memory}'),
-                              subtitle: Text('Memory'),
-                              dense: true,
-                            ),
-                            ListTile(
-                              leading: Icon(Icons.memory),
-                              title: Text(
-                                  '${config.cores} Cores ${config.sockets} Socket'),
-                              subtitle: Text('Processor'),
-                              dense: true,
-                            ),
-                            ListTile(
-                              leading: Icon(FontAwesomeIcons.microchip),
-                              title: Text(
-                                  config.bios?.name ?? 'Default (SeaBIOS)'),
-                              subtitle: Text('BIOS'),
-                              dense: true,
-                            ),
-                            ListTile(
-                              leading: Icon(FontAwesomeIcons.cogs),
-                              dense: true,
-                              title: Text(config.machine ?? 'Default (i440fx)'),
-                              subtitle: Text('Machine Type'),
-                            ),
-                            ListTile(
-                              leading: Icon(FontAwesomeIcons.database),
-                              title: Text(
-                                  config.scsihw?.name ?? 'Default (i440fx)'),
-                              subtitle: Text('SCSI Controller'),
-                              dense: true,
+                      if (config != null)
+                        PveResourceDataCardWidget(
+                            expandable: false,
+                            title: Text(
+                              'Hardware',
+                              style: TextStyle(
+                                fontWeight: FontWeight.bold,
+                                fontSize: 20,
+                              ),
                             ),
-                            for (var ide in config.ide!)
+                            children: [
                               ListTile(
-                                leading: Icon(FontAwesomeIcons.compactDisc),
-                                title: Text(ide),
-                                subtitle: Text('CD/DVD Drive'),
+                                leading: Icon(FontAwesomeIcons.memory),
+                                title: Text('${config.memory}'),
+                                subtitle: Text('Memory'),
                                 dense: true,
                               ),
-                            for (var scsi in config.scsi!)
                               ListTile(
-                                leading: Icon(FontAwesomeIcons.hdd),
-                                title: Text(scsi),
-                                subtitle: Text('Hard Disk'),
+                                leading: Icon(Icons.memory),
+                                title: Text(
+                                    '${config.cores} Cores ${config.sockets} Socket'),
+                                subtitle: Text('Processor'),
                                 dense: true,
                               ),
-                            for (var net in config.net!)
                               ListTile(
-                                leading: Icon(FontAwesomeIcons.ethernet),
+                                leading: Icon(FontAwesomeIcons.microchip),
+                                title: Text(
+                                    config.bios?.name ?? 'Default (SeaBIOS)'),
+                                subtitle: Text('BIOS'),
                                 dense: true,
-                                subtitle: Text('Network Device'),
-                                title: Text(net),
-                              )
-                          ]),
-                  ],
-                )));
+                              ),
+                              ListTile(
+                                leading: Icon(FontAwesomeIcons.cogs),
+                                dense: true,
+                                title:
+                                    Text(config.machine ?? 'Default (i440fx)'),
+                                subtitle: Text('Machine Type'),
+                              ),
+                              ListTile(
+                                leading: Icon(FontAwesomeIcons.database),
+                                title: Text(
+                                    config.scsihw?.name ?? 'Default (i440fx)'),
+                                subtitle: Text('SCSI Controller'),
+                                dense: true,
+                              ),
+                              for (var ide in config.ide!)
+                                ListTile(
+                                  leading: Icon(FontAwesomeIcons.compactDisc),
+                                  title: Text(ide),
+                                  subtitle: Text('CD/DVD Drive'),
+                                  dense: true,
+                                ),
+                              for (var scsi in config.scsi!)
+                                ListTile(
+                                  leading: Icon(FontAwesomeIcons.hdd),
+                                  title: Text(scsi),
+                                  subtitle: Text('Hard Disk'),
+                                  dense: true,
+                                ),
+                              for (var net in config.net!)
+                                ListTile(
+                                  leading: Icon(FontAwesomeIcons.ethernet),
+                                  dense: true,
+                                  subtitle: Text('Network Device'),
+                                  title: Text(net),
+                                )
+                            ]),
+                    ],
+                  ))),
+            );
           }),
     );
   }
diff --git a/lib/widgets/pve_qemu_power_settings_widget.dart b/lib/widgets/pve_qemu_power_settings_widget.dart
index 2d4c496..46c07cc 100644
--- a/lib/widgets/pve_qemu_power_settings_widget.dart
+++ b/lib/widgets/pve_qemu_power_settings_widget.dart
@@ -18,103 +18,105 @@ class PveQemuPowerSettings extends StatelessWidget {
         builder: (context, state) {
           final qemuStatus = state.currentStatus?.getQemuStatus();
           final disableShutdown = qemuStatus != PveResourceStatusType.running;
-          return SingleChildScrollView(
-            child: Container(
-              constraints: BoxConstraints(
-                  minHeight: MediaQuery.of(context).size.height / 3),
-              child: Column(
-                mainAxisSize: MainAxisSize.min,
-                children: <Widget>[
-                  if (qemuStatus == PveResourceStatusType.stopped &&
-                      !(state.currentStatus!.template ?? false))
-                    ListTile(
-                      leading: Icon(Icons.play_arrow),
-                      title: Text(
-                        "Start",
-                        style: TextStyle(fontWeight: FontWeight.bold),
+          return SafeArea(
+            child: SingleChildScrollView(
+              child: Container(
+                constraints: BoxConstraints(
+                    minHeight: MediaQuery.of(context).size.height / 3),
+                child: Column(
+                  mainAxisSize: MainAxisSize.min,
+                  children: <Widget>[
+                    if (qemuStatus == PveResourceStatusType.stopped &&
+                        !(state.currentStatus!.template ?? false))
+                      ListTile(
+                        leading: Icon(Icons.play_arrow),
+                        title: Text(
+                          "Start",
+                          style: TextStyle(fontWeight: FontWeight.bold),
+                        ),
+                        subtitle: Text("Turn on QEMU virtual machine"),
+                        onTap: () => action(
+                            context, PveClusterResourceAction.start, bloc),
                       ),
-                      subtitle: Text("Turn on QEMU virtual machine"),
-                      onTap: () =>
-                          action(context, PveClusterResourceAction.start, bloc),
-                    ),
-                  if ([
-                        PveResourceStatusType.paused,
-                        PveResourceStatusType.suspended
-                      ].contains(qemuStatus) &&
-                      !(state.currentStatus!.template ?? false))
-                    ListTile(
-                      leading: Icon(Icons.play_arrow),
-                      title: Text(
-                        "Resume",
-                        style: TextStyle(fontWeight: FontWeight.bold),
+                    if ([
+                          PveResourceStatusType.paused,
+                          PveResourceStatusType.suspended
+                        ].contains(qemuStatus) &&
+                        !(state.currentStatus!.template ?? false))
+                      ListTile(
+                        leading: Icon(Icons.play_arrow),
+                        title: Text(
+                          "Resume",
+                          style: TextStyle(fontWeight: FontWeight.bold),
+                        ),
+                        subtitle: Text("Resume QEMU virtual machine"),
+                        onTap: () => action(
+                            context, PveClusterResourceAction.resume, bloc),
                       ),
-                      subtitle: Text("Resume QEMU virtual machine"),
-                      onTap: () => action(
-                          context, PveClusterResourceAction.resume, bloc),
-                    ),
-                  if (!disableShutdown) ...[
-                    ListTile(
-                      leading: Icon(Icons.power_settings_new),
-                      title: Text(
-                        "Shutdown",
-                        style: TextStyle(fontWeight: FontWeight.bold),
+                    if (!disableShutdown) ...[
+                      ListTile(
+                        leading: Icon(Icons.power_settings_new),
+                        title: Text(
+                          "Shutdown",
+                          style: TextStyle(fontWeight: FontWeight.bold),
+                        ),
+                        subtitle: Text("Shutdown QEMU virtual machine"),
+                        onTap: () => action(
+                            context, PveClusterResourceAction.shutdown, bloc),
                       ),
-                      subtitle: Text("Shutdown QEMU virtual machine"),
-                      onTap: () => action(
-                          context, PveClusterResourceAction.shutdown, bloc),
-                    ),
-                    ListTile(
-                      leading: Icon(Icons.autorenew),
-                      title: Text(
-                        "Reboot",
-                        style: TextStyle(fontWeight: FontWeight.bold),
+                      ListTile(
+                        leading: Icon(Icons.autorenew),
+                        title: Text(
+                          "Reboot",
+                          style: TextStyle(fontWeight: FontWeight.bold),
+                        ),
+                        subtitle: Text("Reboot QEMU virtual machine"),
+                        onTap: () => action(
+                            context, PveClusterResourceAction.reboot, bloc),
                       ),
-                      subtitle: Text("Reboot QEMU virtual machine"),
-                      onTap: () => action(
-                          context, PveClusterResourceAction.reboot, bloc),
-                    ),
-                    ListTile(
-                      leading: Icon(Icons.pause),
-                      title: Text(
-                        "Pause",
-                        style: TextStyle(fontWeight: FontWeight.bold),
+                      ListTile(
+                        leading: Icon(Icons.pause),
+                        title: Text(
+                          "Pause",
+                          style: TextStyle(fontWeight: FontWeight.bold),
+                        ),
+                        subtitle: Text("Pause QEMU virtual machine"),
+                        onTap: () => action(
+                            context, PveClusterResourceAction.suspend, bloc),
                       ),
-                      subtitle: Text("Pause QEMU virtual machine"),
-                      onTap: () => action(
-                          context, PveClusterResourceAction.suspend, bloc),
-                    ),
-                    ListTile(
-                      leading: Icon(FontAwesomeIcons.download),
-                      title: Text(
-                        "Hibernate",
-                        style: TextStyle(fontWeight: FontWeight.bold),
+                      ListTile(
+                        leading: Icon(FontAwesomeIcons.download),
+                        title: Text(
+                          "Hibernate",
+                          style: TextStyle(fontWeight: FontWeight.bold),
+                        ),
+                        subtitle: Text("Hibernate QEMU virtual machine"),
+                        onTap: () => action(
+                            context, PveClusterResourceAction.hibernate, bloc),
                       ),
-                      subtitle: Text("Hibernate QEMU virtual machine"),
-                      onTap: () => action(
-                          context, PveClusterResourceAction.hibernate, bloc),
-                    ),
-                    ListTile(
-                      leading: Icon(Icons.stop),
-                      title: Text(
-                        "Stop",
-                        style: TextStyle(fontWeight: FontWeight.bold),
+                      ListTile(
+                        leading: Icon(Icons.stop),
+                        title: Text(
+                          "Stop",
+                          style: TextStyle(fontWeight: FontWeight.bold),
+                        ),
+                        subtitle: Text("Stop QEMU virtual machine"),
+                        onTap: () => action(
+                            context, PveClusterResourceAction.stop, bloc),
                       ),
-                      subtitle: Text("Stop QEMU virtual machine"),
-                      onTap: () =>
-                          action(context, PveClusterResourceAction.stop, bloc),
-                    ),
-                    ListTile(
-                      leading: Icon(FontAwesomeIcons.bolt),
-                      title: Text(
-                        "Reset",
-                        style: TextStyle(fontWeight: FontWeight.bold),
+                      ListTile(
+                        leading: Icon(FontAwesomeIcons.bolt),
+                        title: Text(
+                          "Reset",
+                          style: TextStyle(fontWeight: FontWeight.bold),
+                        ),
+                        subtitle: Text("Reset QEMU virtual machine"),
+                        onTap: () => action(
+                            context, PveClusterResourceAction.reset, bloc),
                       ),
-                      subtitle: Text("Reset QEMU virtual machine"),
-                      onTap: () =>
-                          action(context, PveClusterResourceAction.reset, bloc),
-                    ),
+                    ],
                   ],
-                ],
+                ),
               ),
             ),
           );
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 02/10] increase compileSdkVersion to 32
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (3 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 01/10] avoid elements hiding behind Android softnav buttons Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 03/10] fix null handling in MainActivity.kt Dominik Csapak
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

current version of webview_flutter_android (2.10.0) needs it

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 android/app/build.gradle | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/android/app/build.gradle b/android/app/build.gradle
index d287d5b..27e8d55 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -32,7 +32,7 @@ if (keystorePropertiesFile.exists()) {
 }
 
 android {
-    compileSdkVersion 31
+    compileSdkVersion 32
 
     sourceSets {
         main.java.srcDirs += 'src/main/kotlin'
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 03/10] fix null handling in MainActivity.kt
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (4 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 02/10] increase compileSdkVersion to 32 Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 04/10] move to OutlinedButton from OutlineButton Dominik Csapak
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

in newer flutter versions, call.arguments() can return null, so handle that

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 .../kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/android/app/src/main/kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt b/android/app/src/main/kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt
index 8754f8c..e8aad23 100644
--- a/android/app/src/main/kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt
+++ b/android/app/src/main/kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt
@@ -32,7 +32,7 @@ class MainActivity: FlutterActivity() {
                 // Note: this method is invoked on the main thread.
                 Log.d("METHODCHANNEL", call.method)
                 if (call.method == "shareFile") {
-                    val serializedShortcuts: Map<String, String> = call.arguments()
+                    val serializedShortcuts: Map<String, String> = call.arguments()!!
                     val path: String = serializedShortcuts.get("path")!!;
                     val type: String = serializedShortcuts.get("type")!!;
                     try {
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 04/10] move to OutlinedButton from OutlineButton
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (5 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 03/10] fix null handling in MainActivity.kt Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 05/10] move to TextButton from FlatButton Dominik Csapak
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

flutter 3.0 removed OutlineButton in favor of OutlinedButton.
also change the default text color to white, and drop an unnecessary
padding in one case

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/main.dart                                  | 10 ++++++++++
 .../firstWelcomeScreen/pve_welcome_faq.dart    |  8 +++++---
 .../firstWelcomeScreen/pve_welcome_last.dart   | 18 ++++++++++--------
 lib/widgets/pve_cd_selector_widget.dart        |  7 ++++---
 lib/widgets/pve_guest_backup_widget.dart       |  9 ++++-----
 lib/widgets/pve_main_navigation_drawer.dart    |  4 ++--
 .../pve_task_log_expansiontile_widget.dart     |  4 ++--
 7 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/lib/main.dart b/lib/main.dart
index fca91c6..d467626 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -117,6 +117,11 @@ class MyApp extends StatelessWidget {
           textButtonTheme: TextButtonThemeData(
             style: TextButton.styleFrom(primary: ProxmoxColors.grey),
           ),
+          outlinedButtonTheme: OutlinedButtonThemeData(
+            style: OutlinedButton.styleFrom(
+              foregroundColor: Colors.black,
+            ),
+          ),
           fontFamily: "Open Sans",
           primaryTextTheme: TextTheme(
             headline6:
@@ -149,6 +154,11 @@ class MyApp extends StatelessWidget {
           textButtonTheme: TextButtonThemeData(
             style: TextButton.styleFrom(primary: ProxmoxColors.greyTint80),
           ),
+          outlinedButtonTheme: OutlinedButtonThemeData(
+            style: OutlinedButton.styleFrom(
+              foregroundColor: Colors.white,
+            ),
+          ),
           fontFamily: "Open Sans",
           primaryTextTheme: TextTheme(
             headline6:
diff --git a/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart b/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart
index 2e0e44e..470d118 100644
--- a/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart
+++ b/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart
@@ -42,14 +42,16 @@ class PveWelcomePageFAQ extends StatelessWidget {
               text:
                   'Currently only the following 3rd party Spice client works:'),
           Center(
-            child: OutlineButton(
+            child: OutlinedButton(
               onPressed: () => {
                 launch(
                     'https://play.google.com/store/apps/details?id=com.undatech.opaque')
               },
               child: Text('Opague'),
-              borderSide: BorderSide(color: ProxmoxColors.supportGrey),
-              textColor: Colors.white,
+              style: OutlinedButton.styleFrom(
+                side: BorderSide(color: ProxmoxColors.supportGrey),
+                foregroundColor: Colors.white,
+              ),
             ),
           ),
         ],
diff --git a/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart b/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart
index 5f135e0..3a6391e 100644
--- a/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart
+++ b/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart
@@ -57,23 +57,25 @@ class PveWelcomePageLast extends StatelessWidget {
                         Row(
                           mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                           children: [
-                            OutlineButton(
+                            OutlinedButton(
                               onPressed: () =>
                                   {launch('https://forum.proxmox.com')},
                               child: Text('Forum'),
-                              borderSide:
-                                  BorderSide(color: ProxmoxColors.supportGrey),
-                              textColor: Colors.white,
+                              style: OutlinedButton.styleFrom(
+                                side: BorderSide(color: ProxmoxColors.supportGrey),
+                                foregroundColor: Colors.white,
+                              ),
                             ),
-                            OutlineButton(
+                            OutlinedButton(
                               onPressed: () => {
                                 launch(
                                     'https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-user')
                               },
                               child: Text('User Mailing List'),
-                              borderSide:
-                                  BorderSide(color: ProxmoxColors.supportGrey),
-                              textColor: Colors.white,
+                              style: OutlinedButton.styleFrom(
+                                side: BorderSide(color: ProxmoxColors.supportGrey),
+                                foregroundColor: Colors.white,
+                              ),
                             ),
                           ],
                         ),
diff --git a/lib/widgets/pve_cd_selector_widget.dart b/lib/widgets/pve_cd_selector_widget.dart
index c7600fe..cac5288 100644
--- a/lib/widgets/pve_cd_selector_widget.dart
+++ b/lib/widgets/pve_cd_selector_widget.dart
@@ -29,9 +29,10 @@ class PveCdSelector extends StatelessWidget {
                 onChanged: (value) => cdBloc.events.add(ChangeValue(value)),
               ),
               if (state.value == CdType.iso)
-                OutlineButton(
-                  borderSide:
-                      state.hasError ? BorderSide(color: Colors.red) : null,
+                OutlinedButton(
+                  style: OutlinedButton.styleFrom(
+                    side: state.hasError ? BorderSide(color: Colors.red) : null,
+                  ),
                   child: Text((state.file == null || state.file!.isEmpty)
                       ? "Choose File"
                       : state.file!),
diff --git a/lib/widgets/pve_guest_backup_widget.dart b/lib/widgets/pve_guest_backup_widget.dart
index 72a81c4..b766efb 100644
--- a/lib/widgets/pve_guest_backup_widget.dart
+++ b/lib/widgets/pve_guest_backup_widget.dart
@@ -258,13 +258,12 @@ class PveGuestBackupContent extends StatelessWidget {
                 child: Padding(
                   padding: const EdgeInsets.all(8.0),
                   child: ListView(children: [
-                    OutlineButton.icon(
-                      padding: EdgeInsets.symmetric(horizontal: 8),
+                    OutlinedButton.icon(
                       onPressed: null,
                       icon: Icon(Icons.restore),
                       label: Text("Restore"),
                     ),
-                    OutlineButton.icon(
+                    OutlinedButton.icon(
                       onPressed: () async {
                         final guard = await (_showConfirmDialog(
                                 context,
@@ -279,7 +278,7 @@ class PveGuestBackupContent extends StatelessWidget {
                       icon: Icon(Icons.delete),
                       label: Text("Remove"),
                     ),
-                    OutlineButton.icon(
+                    OutlinedButton.icon(
                       onPressed: () =>
                           _showConfigurationDialog(context, fBloc, volid),
                       icon: Icon(Icons.featured_play_list),
@@ -462,7 +461,7 @@ class _PveBackupFormState extends State<PveBackupForm> {
                     return null;
                   },
                 ),
-                OutlineButton.icon(
+                OutlinedButton.icon(
                     onPressed: enableSubmitButton
                         ? () {
                             //TODO remove when async validation is implemented
diff --git a/lib/widgets/pve_main_navigation_drawer.dart b/lib/widgets/pve_main_navigation_drawer.dart
index 57ad0ce..757d05e 100644
--- a/lib/widgets/pve_main_navigation_drawer.dart
+++ b/lib/widgets/pve_main_navigation_drawer.dart
@@ -130,14 +130,14 @@ class PveMainNavigationDrawer extends StatelessWidget {
                       Row(
                         mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                         children: <Widget>[
-                          OutlineButton(
+                          OutlinedButton(
                             child: Text("new VM"),
                             onPressed: () {
                               Navigator.pushNamed(context, '/qemu/create');
                             },
                           ),
                           // TODO General new button or distinct ones??
-                          OutlineButton(
+                          OutlinedButton(
                             child: Text("new CT"),
                             onPressed: null,
                           )
diff --git a/lib/widgets/pve_task_log_expansiontile_widget.dart b/lib/widgets/pve_task_log_expansiontile_widget.dart
index 03ed1bf..dabe309 100644
--- a/lib/widgets/pve_task_log_expansiontile_widget.dart
+++ b/lib/widgets/pve_task_log_expansiontile_widget.dart
@@ -108,13 +108,13 @@ class _PveTaskExpansionTileState extends State<PveTaskExpansionTile> {
         ButtonBar(
           children: <Widget>[
             if (widget.showMorePage != null)
-              OutlineButton.icon(
+              OutlinedButton.icon(
                 onPressed: () => Navigator.of(context).push(
                     _createTaskLogRoute(taskLogBloc, widget.showMorePage)),
                 icon: Icon(Icons.format_list_bulleted),
                 label: Text('More Tasks'),
               ),
-            OutlineButton.icon(
+            OutlinedButton.icon(
               onPressed: () => showTaskLogBottomSheet(context,
                   taskLogBloc.apiClient, widget.task.node, widget.task.upid),
               icon: Icon(Icons.article),
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 05/10] move to TextButton from FlatButton
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (6 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 04/10] move to OutlinedButton from OutlineButton Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 06/10] move to ElevatedButton from RaisedButton Dominik Csapak
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

flutter 3.0 removed FlatButton

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/pages/main_layout_slim.dart               |  2 +-
 lib/widgets/pve_console_menu_widget.dart      |  4 +--
 lib/widgets/pve_first_welcome_screen.dart     | 32 ++++++++++++-------
 lib/widgets/pve_guest_backup_widget.dart      |  6 ++--
 .../pve_subscription_alert_dialog.dart        |  2 +-
 5 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/lib/pages/main_layout_slim.dart b/lib/pages/main_layout_slim.dart
index 9839428..ba95fe8 100644
--- a/lib/pages/main_layout_slim.dart
+++ b/lib/pages/main_layout_slim.dart
@@ -853,7 +853,7 @@ class _MobileResourceFilterSheet extends StatelessWidget {
                     'Filter Results',
                   ),
                   trailing: rBloc.isFiltered
-                      ? FlatButton(
+                      ? TextButton(
                           onPressed: () => rBloc.events.add(ResetFilter()),
                           child: Text(
                             'Reset',
diff --git a/lib/widgets/pve_console_menu_widget.dart b/lib/widgets/pve_console_menu_widget.dart
index 17be9a3..ac5ad26 100644
--- a/lib/widgets/pve_console_menu_widget.dart
+++ b/lib/widgets/pve_console_menu_widget.dart
@@ -83,7 +83,7 @@ class PveConsoleMenu extends StatelessWidget {
                               title: Text('Got Exception'),
                               content: Text(e.message!),
                               actions: [
-                                FlatButton(
+                                TextButton(
                                     onPressed: () =>
                                         Navigator.of(context).pop(),
                                     child: Text('Close'))
@@ -154,7 +154,7 @@ class PveConsoleMenu extends StatelessWidget {
         title: Text(title),
         content: Text(content),
         actions: [
-          FlatButton(
+          TextButton(
               onPressed: () => Navigator.of(context).pop(),
               child: Text('Close'))
         ],
diff --git a/lib/widgets/pve_first_welcome_screen.dart b/lib/widgets/pve_first_welcome_screen.dart
index 3a09943..46d2ee0 100644
--- a/lib/widgets/pve_first_welcome_screen.dart
+++ b/lib/widgets/pve_first_welcome_screen.dart
@@ -67,9 +67,11 @@ class _PveWelcomeState extends State<PveWelcome> with TickerProviderStateMixin {
 
   Widget nextDoneButton() {
     if (_isLast) {
-      return FlatButton(
-        textColor: _buttonTextColor,
-        disabledTextColor: _buttonDisabledTextColor,
+      return TextButton(
+        style: TextButton.styleFrom(
+          foregroundColor: _buttonTextColor,
+          disabledForegroundColor: _buttonDisabledTextColor,
+        ),
         child: Text(
           "Done",
         ),
@@ -78,10 +80,12 @@ class _PveWelcomeState extends State<PveWelcome> with TickerProviderStateMixin {
         },
       );
     } else {
-      return FlatButton(
+      return TextButton(
         child: Text("Next"),
-        textColor: _buttonTextColor,
-        disabledTextColor: _buttonDisabledTextColor,
+        style: TextButton.styleFrom(
+          foregroundColor: _buttonTextColor,
+          disabledForegroundColor: _buttonDisabledTextColor,
+        ),
         onPressed: () {
           _controller!
               .nextPage(duration: _pageChangeDuration, curve: _pageChangeCurve);
@@ -92,9 +96,11 @@ class _PveWelcomeState extends State<PveWelcome> with TickerProviderStateMixin {
 
   Widget skipPrevButton() {
     if (_isFirst) {
-      return FlatButton(
-        textColor: _buttonTextColor,
-        disabledTextColor: _buttonDisabledTextColor,
+      return TextButton(
+        style: TextButton.styleFrom(
+          foregroundColor: _buttonTextColor,
+          disabledForegroundColor: _buttonDisabledTextColor,
+        ),
         onPressed: () {
           skipDone();
         },
@@ -103,9 +109,11 @@ class _PveWelcomeState extends State<PveWelcome> with TickerProviderStateMixin {
         ),
       );
     } else {
-      return FlatButton(
-        textColor: _buttonTextColor,
-        disabledTextColor: _buttonDisabledTextColor,
+      return TextButton(
+        style: TextButton.styleFrom(
+          foregroundColor: _buttonTextColor,
+          disabledForegroundColor: _buttonDisabledTextColor,
+        ),
         child: Text(
           "Prev",
         ),
diff --git a/lib/widgets/pve_guest_backup_widget.dart b/lib/widgets/pve_guest_backup_widget.dart
index b766efb..e6aebde 100644
--- a/lib/widgets/pve_guest_backup_widget.dart
+++ b/lib/widgets/pve_guest_backup_widget.dart
@@ -302,14 +302,14 @@ class PveGuestBackupContent extends StatelessWidget {
         title: Text(title),
         content: Text(body),
         actions: [
-          FlatButton(
+          TextButton(
             onPressed: () => Navigator.of(context).pop(false),
             child: Text(
               'Cancel',
               style: TextStyle(fontWeight: FontWeight.bold),
             ),
           ),
-          FlatButton(
+          TextButton(
             onPressed: () => Navigator.of(context).pop(true),
             child: Text(
               'Confirm',
@@ -371,7 +371,7 @@ class _PveConfigurationDialogState extends State<PveConfigurationDialog> {
                 child: CircularProgressIndicator(),
               ),
         actions: [
-          FlatButton(
+          TextButton(
             onPressed: () => Navigator.of(context).pop(true),
             child: Text(
               'Close',
diff --git a/lib/widgets/pve_subscription_alert_dialog.dart b/lib/widgets/pve_subscription_alert_dialog.dart
index df880f7..e5d85a4 100644
--- a/lib/widgets/pve_subscription_alert_dialog.dart
+++ b/lib/widgets/pve_subscription_alert_dialog.dart
@@ -11,7 +11,7 @@ class PveSubscriptionAlertDialog extends StatelessWidget {
           ' software and getting stable updates and security enhancements,'
           ' as well as quick enterprise support.\n\nPlease consider to buy a subscription.'),
       actions: [
-        FlatButton(
+        TextButton(
             onPressed: () async {
               final url = 'https://www.proxmox.com/proxmox-ve/pricing';
               if (await canLaunch(url)) {
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 06/10] move to ElevatedButton from RaisedButton
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (7 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 05/10] move to TextButton from FlatButton Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 07/10] improve colors for indicator/toggles Dominik Csapak
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

flutter 3.0 removed RaisedButton

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/widgets/firstWelcomeScreen/pve_welcome_last.dart | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart b/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart
index 3a6391e..f0fa0c2 100644
--- a/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart
+++ b/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart
@@ -36,10 +36,12 @@ class PveWelcomePageLast extends StatelessWidget {
                       ),
                       Padding(
                         padding: const EdgeInsets.all(8.0),
-                        child: RaisedButton(
+                        child: ElevatedButton(
                           onPressed: () => {onDone!()},
-                          color: ProxmoxColors.orange,
-                          textColor: Colors.white,
+                          style: ElevatedButton.styleFrom(
+                            backgroundColor: ProxmoxColors.orange,
+                            foregroundColor: Colors.white,
+                          ),
                           child: Text("Start"),
                         ),
                       ),
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 07/10] improve colors for indicator/toggles
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (8 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 06/10] move to ElevatedButton from RaisedButton Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 08/10] fix typo Opague -> Opaque Dominik Csapak
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

so that it fits better with our color schemes instead of using the
flutter defaults (which are especially bad in dark mode for our scheme)

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/main.dart | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/lib/main.dart b/lib/main.dart
index d467626..c9b862e 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -114,6 +114,8 @@ class MyApp extends StatelessWidget {
             background: ProxmoxColors.supportGreyTint75,
             onBackground: Colors.black,
           ),
+          toggleableActiveColor: ProxmoxColors.supportBlue,
+          indicatorColor: ProxmoxColors.orange,
           textButtonTheme: TextButtonThemeData(
             style: TextButton.styleFrom(primary: ProxmoxColors.grey),
           ),
@@ -145,6 +147,8 @@ class MyApp extends StatelessWidget {
             background: ProxmoxColors.grey,
             onBackground: ProxmoxColors.supportGreyTint75,
           ),
+          toggleableActiveColor: ProxmoxColors.blue500,
+          indicatorColor: ProxmoxColors.orange,
           // flutter has a weird logic where it pulls colors from different
           // scheme properties depending on light/dark mode, avoid that...
           appBarTheme: AppBarTheme(
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 08/10] fix typo Opague -> Opaque
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (9 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 07/10] improve colors for indicator/toggles Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 09/10] fix guest backup widget start display Dominik Csapak
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart b/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart
index 470d118..f2be574 100644
--- a/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart
+++ b/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart
@@ -47,7 +47,7 @@ class PveWelcomePageFAQ extends StatelessWidget {
                 launch(
                     'https://play.google.com/store/apps/details?id=com.undatech.opaque')
               },
-              child: Text('Opague'),
+              child: Text('Opaque'),
               style: OutlinedButton.styleFrom(
                 side: BorderSide(color: ProxmoxColors.supportGrey),
                 foregroundColor: Colors.white,
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 09/10] fix guest backup widget start display
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (10 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 08/10] fix typo Opague -> Opaque Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 10/10] fix options view when ostype is null Dominik Csapak
  2022-09-08 15:31 ` [pve-devel] applied-series: [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Thomas Lamprecht
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

when we changed from ScaffoldState to ScaffoldMessengerState, we missed
that we have to wrap the scaffold in a ScaffoldMessenger, otherwise
there is no current state and we never could show a snack

we also have to do the null safety of the 'nodesVZDumpCreateBackup'
differently, since we get a Future<String?>, which cannot be converted
to FutureOr<String>, we got an exception (that we never saw because
of the Missing ScaffoldMessenger)

same is true for the 'remove' button

despite that the backup always actually ran, but the user did not get
any visual feedback

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/widgets/pve_guest_backup_widget.dart | 144 ++++++++++++-----------
 1 file changed, 73 insertions(+), 71 deletions(-)

diff --git a/lib/widgets/pve_guest_backup_widget.dart b/lib/widgets/pve_guest_backup_widget.dart
index e6aebde..05cd725 100644
--- a/lib/widgets/pve_guest_backup_widget.dart
+++ b/lib/widgets/pve_guest_backup_widget.dart
@@ -265,11 +265,11 @@ class PveGuestBackupContent extends StatelessWidget {
                     ),
                     OutlinedButton.icon(
                       onPressed: () async {
-                        final guard = await (_showConfirmDialog(
+                        final guard = (await _showConfirmDialog(
                                 context,
                                 'Attention',
                                 'Do you really want to delete this backup?')
-                            as FutureOr<bool>);
+                           )!;
                         if (guard) {
                           fBloc.events.add(DeleteFile(volid));
                           Navigator.of(context).pop();
@@ -417,77 +417,79 @@ class _PveBackupFormState extends State<PveBackupForm> {
 
   @override
   Widget build(BuildContext context) {
-    return Scaffold(
+    return ScaffoldMessenger(
       key: _scaffoldKey,
-      appBar: AppBar(
-        iconTheme: IconThemeData(color: Colors.black),
-        backgroundColor: Colors.transparent,
-        elevation: 0,
-        title: Text(
-          "Schedule backup",
-          style: TextStyle(color: Colors.black),
+      child: Scaffold(
+        appBar: AppBar(
+          iconTheme: IconThemeData(color: Colors.black),
+          backgroundColor: Colors.transparent,
+          elevation: 0,
+          title: Text(
+            "Schedule backup",
+            style: TextStyle(color: Colors.black),
+          ),
         ),
-      ),
-      body: SingleChildScrollView(
-          padding: EdgeInsets.all(8),
-          child: Form(
-            key: _formKey,
-            onChanged: () {
-              final isValid = _formKey.currentState!.validate();
-              setState(() {
-                enableSubmitButton = isValid;
-              });
-            },
-            child: Column(
-              children: [
-                PveStorageSelectorDropdown(
-                  labelText: 'Storage',
-                  sBloc: widget.sBloc,
-                  allowBlank: false,
-                ),
-                _createModeDropdown(),
-                _createCompressionDropdown(),
-                TextFormField(
-                  decoration: InputDecoration(
-                    labelText: 'Email to',
-                    helperText: ' ',
+        body: SingleChildScrollView(
+            padding: EdgeInsets.all(8),
+            child: Form(
+              key: _formKey,
+              onChanged: () {
+                final isValid = _formKey.currentState!.validate();
+                setState(() {
+                  enableSubmitButton = isValid;
+                });
+              },
+              child: Column(
+                children: [
+                  PveStorageSelectorDropdown(
+                    labelText: 'Storage',
+                    sBloc: widget.sBloc,
+                    allowBlank: false,
                   ),
-                  controller: emailToController,
-                  autovalidateMode: AutovalidateMode.onUserInteraction,
-                  validator: (value) {
-                    if (value!.isNotEmpty && !Validators.isValidEmail(value)) {
-                      return 'Please enter valid email address';
-                    }
-                    return null;
-                  },
-                ),
-                OutlinedButton.icon(
-                    onPressed: enableSubmitButton
-                        ? () {
-                            //TODO remove when async validation is implemented
-                            if (!_formKey.currentState!.validate()) {
-                              setState(() {
-                                enableSubmitButton = false;
-                              });
-                              return;
-                            }
+                  _createModeDropdown(),
+                  _createCompressionDropdown(),
+                  TextFormField(
+                    decoration: InputDecoration(
+                      labelText: 'Email to',
+                      helperText: ' ',
+                    ),
+                    controller: emailToController,
+                    autovalidateMode: AutovalidateMode.onUserInteraction,
+                    validator: (value) {
+                      if (value!.isNotEmpty && !Validators.isValidEmail(value)) {
+                        return 'Please enter valid email address';
+                      }
+                      return null;
+                    },
+                  ),
+                  OutlinedButton.icon(
+                      onPressed: enableSubmitButton
+                          ? () {
+                              //TODO remove when async validation is implemented
+                              if (!_formKey.currentState!.validate()) {
+                                setState(() {
+                                  enableSubmitButton = false;
+                                });
+                                return;
+                              }
 
-                            startBackup(
-                              widget.sBloc.apiClient,
-                              widget.sBloc.latestState.nodeID,
-                              widget.sBloc.latestState.selected!.id,
-                              widget.guestID,
-                              compression,
-                              mode!,
-                              mailTo: emailToController!.text,
-                            );
-                          }
-                        : null,
-                    icon: Icon(Icons.save),
-                    label: Text('Start backup now'))
-              ],
-            ),
-          )),
+                              startBackup(
+                                widget.sBloc.apiClient,
+                                widget.sBloc.latestState.nodeID,
+                                widget.sBloc.latestState.selected!.id,
+                                widget.guestID,
+                                compression,
+                                mode!,
+                                mailTo: emailToController!.text,
+                              );
+                            }
+                          : null,
+                      icon: Icon(Icons.save),
+                      label: Text('Start backup now'))
+                ],
+              ),
+            )),
+      )
     );
   }
 
@@ -501,11 +503,11 @@ class _PveBackupFormState extends State<PveBackupForm> {
     String? mailTo,
   }) async {
     try {
-      final jobId = await (apiClient.nodesVZDumpCreateBackup(
+      final jobId = (await apiClient.nodesVZDumpCreateBackup(
           node, storage, guestId,
           compressionType: compression,
           mode: mode,
-          mailTo: mailTo) as FutureOr<String>);
+          mailTo: mailTo))!;
 
       await showTaskLogBottomSheet(context, apiClient, node, jobId,
           icon: Icon(Icons.save), jobTitle: Text('Backup $guestId'));
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] [PATCH pve-flutter-frontend 10/10] fix options view when ostype is null
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (11 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 09/10] fix guest backup widget start display Dominik Csapak
@ 2022-09-08  9:55 ` Dominik Csapak
  2022-09-08 15:31 ` [pve-devel] applied-series: [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Thomas Lamprecht
  13 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2022-09-08  9:55 UTC (permalink / raw)
  To: pve-devel

can happen when no ostype is set in the config (defaults to 'other')

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/widgets/pve_qemu_options_widget.dart | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lib/widgets/pve_qemu_options_widget.dart b/lib/widgets/pve_qemu_options_widget.dart
index 788923d..cd32cff 100644
--- a/lib/widgets/pve_qemu_options_widget.dart
+++ b/lib/widgets/pve_qemu_options_widget.dart
@@ -53,7 +53,10 @@ class PveQemuOptions extends StatelessWidget {
                         ListTile(
                           title: Text("OS Type"),
                           subtitle: Text(
-                              "${config.ostype!.type} ${config.ostype!.description}"),
+                            config.ostype != null ?
+                              "${config.ostype!.type} ${config.ostype!.description}" :
+                              "Other"
+                          ),
                         ),
                         //TODO add better ui component e.g. collapseable
                         ListTile(
-- 
2.30.2





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pve-devel] applied-series: [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3
  2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
                   ` (12 preceding siblings ...)
  2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 10/10] fix options view when ostype is null Dominik Csapak
@ 2022-09-08 15:31 ` Thomas Lamprecht
  13 siblings, 0 replies; 15+ messages in thread
From: Thomas Lamprecht @ 2022-09-08 15:31 UTC (permalink / raw)
  To: Proxmox VE development discussion, Dominik Csapak

Am 08/09/2022 um 11:55 schrieb Dominik Csapak:
> updates to the code for flutter 3.3 and includes some fixes & improvements
> 
> i included aarons patches from december to make it easier to apply
> 
> the changes necesseary for flutter 3.3 are
> proxmox-login-manager: 2/3
> pve-flutter-frontend: 2/10 - 6/10
> 
> patches after that are only fixes & improvements
> (so stricly not necessary for flutter 3.3)
> 
> i noticed some other things too, but for now this should be ok:
> e.g. we have quite some widgets/code that are not in use currently
> (from tims desktop variant AFAIR), maybe we should remove them
> for now (or move it to another repo if we want to use them)
> since then we could better use 'flutter analyze'
> (now these widgets/files make much noise to the point where it's hard
> to see which warnings/infos are even relevant for the app)
> 

I'd like to have a layout for desktop/tablets with a always visible, resoure-tree like
panel at the side, but no high priority for such things and some widgets may be deleted
nonetheless.

> proxmox-login-manager:
> 
> Aaron Lauterer (1):
>   login_form: keep Continue button above Android softnav
> 
> Dominik Csapak (2):
>   migrate from FlatButton to TextButton
>   improve colors of login screen
> 
>  lib/proxmox_login_form.dart | 288 +++++++++++++++++++-----------------
>  lib/proxmox_tfa_form.dart   |  11 +-
>  2 files changed, 156 insertions(+), 143 deletions(-)
> 
> pve-flutter-frontend:
> 
> Aaron Lauterer (1):
>   avoid elements hiding behind Android softnav buttons
> 
> Dominik Csapak (9):
>   increase compileSdkVersion to 32
>   fix null handling in MainActivity.kt
>   move to OutlinedButton from OutlineButton
>   move to TextButton from FlatButton
>   move to ElevatedButton from RaisedButton
>   improve colors for indicator/toggles
>   fix typo Opague -> Opaque
>   fix guest backup widget start display
>   fix options view when ostype is null
> 
>  android/app/build.gradle                      |   2 +-
>  .../app/pve_flutter_frontend/MainActivity.kt  |   2 +-
>  lib/main.dart                                 |  14 +
>  lib/pages/main_layout_slim.dart               |   2 +-
>  .../firstWelcomeScreen/pve_welcome_faq.dart   |  10 +-
>  .../firstWelcomeScreen/pve_welcome_last.dart  |  26 +-
>  lib/widgets/pve_cd_selector_widget.dart       |   7 +-
>  lib/widgets/pve_console_menu_widget.dart      |   4 +-
>  lib/widgets/pve_first_welcome_screen.dart     |  32 +-
>  lib/widgets/pve_guest_backup_widget.dart      | 157 ++++-----
>  lib/widgets/pve_lxc_options_widget.dart       | 140 ++++----
>  lib/widgets/pve_main_navigation_drawer.dart   |   4 +-
>  lib/widgets/pve_qemu_options_widget.dart      | 259 +++++++-------
>  lib/widgets/pve_qemu_overview.dart            | 319 +++++++++---------
>  .../pve_qemu_power_settings_widget.dart       | 178 +++++-----
>  .../pve_subscription_alert_dialog.dart        |   2 +-
>  .../pve_task_log_expansiontile_widget.dart    |   4 +-
>  17 files changed, 602 insertions(+), 560 deletions(-)
> 

applied, thanks!




^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2022-09-08 15:31 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-08  9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 2/3] migrate from FlatButton to TextButton Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH proxmox-login-manager 3/3] improve colors of login screen Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 01/10] avoid elements hiding behind Android softnav buttons Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 02/10] increase compileSdkVersion to 32 Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 03/10] fix null handling in MainActivity.kt Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 04/10] move to OutlinedButton from OutlineButton Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 05/10] move to TextButton from FlatButton Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 06/10] move to ElevatedButton from RaisedButton Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 07/10] improve colors for indicator/toggles Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 08/10] fix typo Opague -> Opaque Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 09/10] fix guest backup widget start display Dominik Csapak
2022-09-08  9:55 ` [pve-devel] [PATCH pve-flutter-frontend 10/10] fix options view when ostype is null Dominik Csapak
2022-09-08 15:31 ` [pve-devel] applied-series: [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Thomas Lamprecht

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal