summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelipe Erias <felipeerias@igalia.com>2021-11-24 23:40:32 +0900
committerFelipe Erias <felipeerias@igalia.com>2021-11-24 23:40:32 +0900
commit23f7cad0b4b33f797837f66e42b36c231b1f1801 (patch)
treea76255d69847a1050208b18a5bdea1b1648c8cad
parent49b05e81ee5f173bf960faf8cbc8207447a9bb60 (diff)
Responsive HVAC
-rw-r--r--lib/page_hvac.dart270
1 files changed, 161 insertions, 109 deletions
diff --git a/lib/page_hvac.dart b/lib/page_hvac.dart
index df5027e..230233d 100644
--- a/lib/page_hvac.dart
+++ b/lib/page_hvac.dart
@@ -1,8 +1,9 @@
+import 'dart:math';
+
import 'package:flutter/material.dart';
import 'package:numberpicker/numberpicker.dart';
class HVACPage extends StatelessWidget {
-
const HVACPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
@@ -15,6 +16,10 @@ class HVACPage extends StatelessWidget {
}
class _TemperatureSelector extends StatefulWidget {
+double referenceFontSize = 24;
+
+ _TemperatureSelector({Key? key, referenceFontSize}) : super(key: key);
+
@override
_TemperatureSelectorState createState() => _TemperatureSelectorState();
}
@@ -31,6 +36,16 @@ class _TemperatureSelectorState extends State<_TemperatureSelector> {
minValue: 18,
maxValue: 25,
onChanged: (value) => setState(() => _currentValue = value),
+ textStyle: DefaultTextStyle.of(context).style.copyWith(
+ color: Colors.teal.shade200,
+ fontSize: widget.referenceFontSize,
+ ),
+ selectedTextStyle: DefaultTextStyle.of(context).style.copyWith(
+ color: Colors.white,
+ fontSize: widget.referenceFontSize * 1.5,
+ ),
+ itemHeight: widget.referenceFontSize * 3,
+ itemWidth: widget.referenceFontSize * 6,
),
],
);
@@ -80,109 +95,156 @@ bool selected = true; // Get from API
class _MyHomePageState extends State<MainPage> {
final double fanSpeed = 20;
- Widget titleSection = Container(
- padding: const EdgeInsets.all(32),
- child: Row(
- children: [
- Expanded(flex: 2, child: const HVACFanSpeed()),
- Image.asset('images/HMI_HVAC_Fan_Icon.png',
- width: 100, height: 100, fit: BoxFit.cover),
- ],
- ),
- );
-
- Widget rightSeat = Container(
- padding: const EdgeInsets.all(32),
- child: Column(
- children: [
- IconButton(
- iconSize: 100.0,
- icon: Image.asset(selected ? chairOn : chairOff,
- width: 100, height: 100, fit: BoxFit.cover),
- onPressed: () {
- selected = !selected;
- },
- ),
- _TemperatureSelector(),
- ],
- ),
- );
-
- Widget leftSeat = Container(
- padding: const EdgeInsets.all(32),
- child: Column(
- children: [
- Image.asset('images/HMI_HVAC_Right_Chair_ON.png',
- width: 100, height: 100, fit: BoxFit.cover),
- _TemperatureSelector()
- ],
- ),
- );
-
- Widget centerView = Container(
- padding: const EdgeInsets.all(32),
- child: Column(
- children: [
- Container(
- width: 140,
- height: 100,
- margin: const EdgeInsets.all(15.0),
- decoration: BoxDecoration(
- border: Border.all(color: Colors.green),
- borderRadius: BorderRadius.circular(20)),
- child: OutlinedButton(
+ Widget _buildLayout(BuildContext context, BoxConstraints constraints) {
+ // describe the layout in terms of fractions of the container size
+ double mainDimension = max(constraints.maxWidth, constraints.maxHeight);
+ double minDimension = min(constraints.maxWidth, constraints.maxHeight);
+ double iconSize = mainDimension / 12.0;
+ double largeIconSize = mainDimension / 8.0;
+ double spacingSize = minDimension / 48.0;
+ double buttonWidth = constraints.maxWidth / 6.0;
+ double buttonHeight = constraints.maxHeight / 6.0;
+ double defaultFontSize = constraints.maxHeight / 24.0;
+ TextStyle buttonTextStyle = DefaultTextStyle.of(context).style.copyWith(
+ color: Colors.white,
+ fontSize: defaultFontSize,
+ );
+
+ Widget fanSpeedControl = Container(
+ padding: EdgeInsets.symmetric(
+ vertical: spacingSize,
+ horizontal: 3 * spacingSize,
+ ),
+ child: Row(
+ children: [
+ Expanded(flex: 4, child: const HVACFanSpeed()),
+ SizedBox(width: spacingSize),
+ Expanded(
+ flex: 1,
+ child: Image.asset('images/HMI_HVAC_Fan_Icon.png',
+ width: iconSize, height: iconSize, fit: BoxFit.contain)),
+ ],
+ ),
+ );
+
+ Widget rightSeat = Container(
+ padding: EdgeInsets.all(spacingSize),
+ child: Column(
+ children: [
+ IconButton(
+ iconSize: largeIconSize,
+ icon: Image.asset(selected ? chairOn : chairOff,
+ width: largeIconSize,
+ height: largeIconSize,
+ fit: BoxFit.contain),
onPressed: () {
- // Respond to button press
+ selected = !selected;
},
- child: Text("A / C"),
),
- ),
- Container(
- width: 140,
- height: 100,
- margin: const EdgeInsets.all(15.0),
- decoration: BoxDecoration(
- border: Border.all(color: Colors.green),
- borderRadius: BorderRadius.circular(20)),
- child: OutlinedButton(
- onPressed: () {
- // Respond to button press
- },
- child: Text("Auto"),
+ SizedBox(height: spacingSize),
+ _TemperatureSelector(
+ referenceFontSize: defaultFontSize,
),
- ),
- Container(
- width: 140,
- height: 100,
- margin: const EdgeInsets.all(15.0),
- decoration: BoxDecoration(
- border: Border.all(color: Colors.green),
- borderRadius: BorderRadius.circular(20)),
- child: OutlinedButton(
+ ],
+ ),
+ );
+
+ Widget leftSeat = Container(
+ padding: EdgeInsets.all(spacingSize),
+ child: Column(
+ children: [
+ Image.asset('images/HMI_HVAC_Right_Chair_ON.png',
+ width: largeIconSize, height: largeIconSize, fit: BoxFit.contain),
+ SizedBox(height: spacingSize),
+ _TemperatureSelector(
+ referenceFontSize: defaultFontSize,
+ ),
+ ],
+ ),
+ );
+
+ Widget centerView = Container(
+ padding: EdgeInsets.all(spacingSize),
+ child: Column(
+ children: [
+ Container(
+ width: buttonWidth,
+ height: buttonHeight,
+ margin: EdgeInsets.all(spacingSize),
+ decoration: BoxDecoration(
+ border: Border.all(color: Colors.green),
+ borderRadius: BorderRadius.circular(20)),
+ child: OutlinedButton(
onPressed: () {
// Respond to button press
},
- child: Image.asset('images/HMI_HVAC_Circulation_Inactive.png',
- width: 100, height: 100, fit: BoxFit.cover)),
- ),
- ],
- ),
- );
- Widget actions = Container(
- padding: const EdgeInsets.all(32),
- child: Column(
- children: [
- Image.asset('images/HMI_HVAC_AirDown_Inactive.png',
- width: 100, height: 100, fit: BoxFit.cover),
- Image.asset('images/HMI_HVAC_AirUp_Inactive.png',
- width: 100, height: 100, fit: BoxFit.cover),
- Image.asset('images/HMI_HVAC_Front_Inactive.png',
- width: 100, height: 100, fit: BoxFit.cover),
- Image.asset('images/HMI_HVAC_Rear_Active.png',
- width: 100, height: 100, fit: BoxFit.cover),
+ child: Text("A / C", style: buttonTextStyle),
+ ),
+ ),
+ Container(
+ width: buttonWidth,
+ height: buttonHeight,
+ margin: EdgeInsets.all(spacingSize),
+ decoration: BoxDecoration(
+ border: Border.all(color: Colors.green),
+ borderRadius: BorderRadius.circular(20)),
+ child: OutlinedButton(
+ onPressed: () {
+ // Respond to button press
+ },
+ child: Text("Auto", style: buttonTextStyle),
+ ),
+ ),
+ Container(
+ width: buttonWidth,
+ height: buttonHeight,
+ margin: EdgeInsets.all(spacingSize),
+ decoration: BoxDecoration(
+ border: Border.all(color: Colors.green),
+ borderRadius: BorderRadius.circular(20)),
+ child: OutlinedButton(
+ onPressed: () {
+ // Respond to button press
+ },
+ child: Image.asset('images/HMI_HVAC_Circulation_Inactive.png',
+ width: iconSize, height: iconSize, fit: BoxFit.contain)),
+ ),
+ ],
+ ),
+ );
+ Widget actions = Container(
+ padding: EdgeInsets.all(spacingSize),
+ child: Column(
+ children: [
+ Image.asset('images/HMI_HVAC_AirDown_Inactive.png',
+ width: iconSize, height: iconSize, fit: BoxFit.contain),
+ SizedBox(height: spacingSize),
+ Image.asset('images/HMI_HVAC_AirUp_Inactive.png',
+ width: iconSize, height: iconSize, fit: BoxFit.contain),
+ SizedBox(height: spacingSize),
+ Image.asset('images/HMI_HVAC_Front_Inactive.png',
+ width: iconSize, height: iconSize, fit: BoxFit.contain),
+ SizedBox(height: spacingSize),
+ Image.asset('images/HMI_HVAC_Rear_Active.png',
+ width: iconSize, height: iconSize, fit: BoxFit.contain),
+ ],
+
+ ),
+ );
+
+ return Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: <Widget>[
+ fanSpeedControl,
+ Row(children: [
+ Expanded(flex: 1, child: rightSeat),
+ Expanded(flex: 1, child: centerView),
+ Expanded(flex: 1, child: leftSeat),
+ Expanded(flex: 1, child: actions)
+ ])
],
- ),
- );
+ );
+ }
@override
Widget build(BuildContext context) {
@@ -193,18 +255,8 @@ class _MyHomePageState extends State<MainPage> {
end: Alignment.bottomRight,
colors: [Colors.black, Colors.teal.shade900])),
child: Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: <Widget>[
- titleSection,
- Row(children: [
- Expanded(flex: 2, child: rightSeat),
- Expanded(flex: 2, child: centerView),
- Expanded(flex: 2, child: leftSeat),
- Expanded(flex: 2, child: actions)
- ])
- ],
- ),
- ));
+ child: LayoutBuilder(
+ builder: _buildLayout,
+ )));
}
}