diff --git a/simplistic_calculator/analysis_options.yaml b/simplistic_calculator/analysis_options.yaml index 5e2133eb6..6b4cdb02f 100644 --- a/simplistic_calculator/analysis_options.yaml +++ b/simplistic_calculator/analysis_options.yaml @@ -1 +1,6 @@ include: ../analysis_options.yaml + +# Files under typer/ are partially completed files, and often invalid +analyzer: + exclude: + - typer/** diff --git a/simplistic_calculator/lib/main.dart b/simplistic_calculator/lib/main.dart index d5d0a0534..c9aba3cde 100644 --- a/simplistic_calculator/lib/main.dart +++ b/simplistic_calculator/lib/main.dart @@ -12,9 +12,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:math_expressions/math_expressions.dart'; import 'package:window_size/window_size.dart'; -const double windowWidth = 600; -const double windowHeight = 900; - void main() { if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { WidgetsFlutterBinding.ensureInitialized(); @@ -472,7 +469,7 @@ class CalcButton extends ConsumerWidget { return SizedBox.expand( child: Padding( - padding: const EdgeInsets.all(8), + padding: const EdgeInsets.all(4), child: buttonConstructor( onPressed: () => op(ref.read(calculatorStateProvider.notifier)), child: AutoSizeText( diff --git a/simplistic_calculator/typer/main_01.dart b/simplistic_calculator/typer/main_01.dart new file mode 100644 index 000000000..26a960c70 --- /dev/null +++ b/simplistic_calculator/typer/main_01.dart @@ -0,0 +1,33 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +void main() { + runApp( + const CalculatorApp(), + ); +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_02.dart b/simplistic_calculator/typer/main_02.dart new file mode 100644 index 000000000..964d428df --- /dev/null +++ b/simplistic_calculator/typer/main_02.dart @@ -0,0 +1,37 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + runApp( + const CalculatorApp(), + ); +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_03.dart b/simplistic_calculator/typer/main_03.dart new file mode 100644 index 000000000..ff71e4445 --- /dev/null +++ b/simplistic_calculator/typer/main_03.dart @@ -0,0 +1,42 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const CalculatorApp(), + ); +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_04.dart b/simplistic_calculator/typer/main_04.dart new file mode 100644 index 000000000..3c87f4ad4 --- /dev/null +++ b/simplistic_calculator/typer/main_04.dart @@ -0,0 +1,43 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const CalculatorApp(), + ); +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_05.dart b/simplistic_calculator/typer/main_05.dart new file mode 100644 index 000000000..513aaf6ac --- /dev/null +++ b/simplistic_calculator/typer/main_05.dart @@ -0,0 +1,45 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_06.dart b/simplistic_calculator/typer/main_06.dart new file mode 100644 index 000000000..5250d2c55 --- /dev/null +++ b/simplistic_calculator/typer/main_06.dart @@ -0,0 +1,48 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState {} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_07.dart b/simplistic_calculator/typer/main_07.dart new file mode 100644 index 000000000..b3b4f03d1 --- /dev/null +++ b/simplistic_calculator/typer/main_07.dart @@ -0,0 +1,50 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + final String buffer; +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_08.dart b/simplistic_calculator/typer/main_08.dart new file mode 100644 index 000000000..0a8abcc41 --- /dev/null +++ b/simplistic_calculator/typer/main_08.dart @@ -0,0 +1,51 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + final String buffer; + final String error; +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_09.dart b/simplistic_calculator/typer/main_09.dart new file mode 100644 index 000000000..1d00c22a2 --- /dev/null +++ b/simplistic_calculator/typer/main_09.dart @@ -0,0 +1,56 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + this.buffer, + this.error, + }); + + final String buffer; + final String error; +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_10.dart b/simplistic_calculator/typer/main_10.dart new file mode 100644 index 000000000..480f920e8 --- /dev/null +++ b/simplistic_calculator/typer/main_10.dart @@ -0,0 +1,56 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_11.dart b/simplistic_calculator/typer/main_11.dart new file mode 100644 index 000000000..dadf5482e --- /dev/null +++ b/simplistic_calculator/typer/main_11.dart @@ -0,0 +1,65 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_12.dart b/simplistic_calculator/typer/main_12.dart new file mode 100644 index 000000000..61e220aad --- /dev/null +++ b/simplistic_calculator/typer/main_12.dart @@ -0,0 +1,67 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier {} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_13.dart b/simplistic_calculator/typer/main_13.dart new file mode 100644 index 000000000..22fbb6ffe --- /dev/null +++ b/simplistic_calculator/typer/main_13.dart @@ -0,0 +1,69 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine(CalculatorState state) : super(state); +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_14.dart b/simplistic_calculator/typer/main_14.dart new file mode 100644 index 000000000..4d9480f0b --- /dev/null +++ b/simplistic_calculator/typer/main_14.dart @@ -0,0 +1,75 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_15.dart b/simplistic_calculator/typer/main_15.dart new file mode 100644 index 000000000..ede116f18 --- /dev/null +++ b/simplistic_calculator/typer/main_15.dart @@ -0,0 +1,77 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) {} +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_16.dart b/simplistic_calculator/typer/main_16.dart new file mode 100644 index 000000000..b66dcc28d --- /dev/null +++ b/simplistic_calculator/typer/main_16.dart @@ -0,0 +1,82 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_17.dart b/simplistic_calculator/typer/main_17.dart new file mode 100644 index 000000000..5fa18b9db --- /dev/null +++ b/simplistic_calculator/typer/main_17.dart @@ -0,0 +1,86 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends StatelessWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_18.dart b/simplistic_calculator/typer/main_18.dart new file mode 100644 index 000000000..699bd45fb --- /dev/null +++ b/simplistic_calculator/typer/main_18.dart @@ -0,0 +1,86 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_19.dart b/simplistic_calculator/typer/main_19.dart new file mode 100644 index 000000000..3be4e49d8 --- /dev/null +++ b/simplistic_calculator/typer/main_19.dart @@ -0,0 +1,86 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_20.dart b/simplistic_calculator/typer/main_20.dart new file mode 100644 index 000000000..8a9110a99 --- /dev/null +++ b/simplistic_calculator/typer/main_20.dart @@ -0,0 +1,88 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + 'Hello GDSC!', + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_21.dart b/simplistic_calculator/typer/main_21.dart new file mode 100644 index 000000000..ce0844fed --- /dev/null +++ b/simplistic_calculator/typer/main_21.dart @@ -0,0 +1,88 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: const Center( + child: Text( + state.buffer, + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_22.dart b/simplistic_calculator/typer/main_22.dart new file mode 100644 index 000000000..4dd84e39d --- /dev/null +++ b/simplistic_calculator/typer/main_22.dart @@ -0,0 +1,88 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: Center( + child: Text( + state.buffer, + style: TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_23.dart b/simplistic_calculator/typer/main_23.dart new file mode 100644 index 000000000..8d0f28b34 --- /dev/null +++ b/simplistic_calculator/typer/main_23.dart @@ -0,0 +1,88 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: Center( + child: Text( + state.buffer, + style: const TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_24.dart b/simplistic_calculator/typer/main_24.dart new file mode 100644 index 000000000..f81b97686 --- /dev/null +++ b/simplistic_calculator/typer/main_24.dart @@ -0,0 +1,89 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: Center( + child: Text( + state.buffer, + style: const TextStyle(fontSize: 40), + ), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_25.dart b/simplistic_calculator/typer/main_25.dart new file mode 100644 index 000000000..4e29eabe3 --- /dev/null +++ b/simplistic_calculator/typer/main_25.dart @@ -0,0 +1,91 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + children: [ + Text( + state.buffer, + style: const TextStyle(fontSize: 40), + ), + ], + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_26.dart b/simplistic_calculator/typer/main_26.dart new file mode 100644 index 000000000..55f93d89b --- /dev/null +++ b/simplistic_calculator/typer/main_26.dart @@ -0,0 +1,93 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + columnSizes: [1.fr], + rowSizes: [1.fr], + children: [ + Text( + state.buffer, + style: const TextStyle(fontSize: 40), + ), + ], + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_27.dart b/simplistic_calculator/typer/main_27.dart new file mode 100644 index 000000000..8b7f654a4 --- /dev/null +++ b/simplistic_calculator/typer/main_27.dart @@ -0,0 +1,106 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + Text( + state.buffer, + style: const TextStyle(fontSize: 40), + ), + ], + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_28.dart b/simplistic_calculator/typer/main_28.dart new file mode 100644 index 000000000..a3319a592 --- /dev/null +++ b/simplistic_calculator/typer/main_28.dart @@ -0,0 +1,109 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: Text( + state.buffer, + style: const TextStyle(fontSize: 40), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_29.dart b/simplistic_calculator/typer/main_29.dart new file mode 100644 index 000000000..5d413fd92 --- /dev/null +++ b/simplistic_calculator/typer/main_29.dart @@ -0,0 +1,110 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 40), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_30.dart b/simplistic_calculator/typer/main_30.dart new file mode 100644 index 000000000..bbad58ca4 --- /dev/null +++ b/simplistic_calculator/typer/main_30.dart @@ -0,0 +1,112 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 40), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_31.dart b/simplistic_calculator/typer/main_31.dart new file mode 100644 index 000000000..01e11e03b --- /dev/null +++ b/simplistic_calculator/typer/main_31.dart @@ -0,0 +1,112 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 40), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_32.dart b/simplistic_calculator/typer/main_32.dart new file mode 100644 index 000000000..98e69c1eb --- /dev/null +++ b/simplistic_calculator/typer/main_32.dart @@ -0,0 +1,112 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_33.dart b/simplistic_calculator/typer/main_33.dart new file mode 100644 index 000000000..aa3d631ac --- /dev/null +++ b/simplistic_calculator/typer/main_33.dart @@ -0,0 +1,114 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class CalcButton extends ConsumerWidget {} diff --git a/simplistic_calculator/typer/main_34.dart b/simplistic_calculator/typer/main_34.dart new file mode 100644 index 000000000..429ac7021 --- /dev/null +++ b/simplistic_calculator/typer/main_34.dart @@ -0,0 +1,120 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class CalcButton extends ConsumerWidget { + @override + Widget build(BuildContext context, WidgetRef ref) { + // TODO: implement build + throw UnimplementedError(); + } +} diff --git a/simplistic_calculator/typer/main_35.dart b/simplistic_calculator/typer/main_35.dart new file mode 100644 index 000000000..5995b1ff4 --- /dev/null +++ b/simplistic_calculator/typer/main_35.dart @@ -0,0 +1,119 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class CalcButton extends ConsumerWidget { + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton(); + } +} diff --git a/simplistic_calculator/typer/main_36.dart b/simplistic_calculator/typer/main_36.dart new file mode 100644 index 000000000..8048558b1 --- /dev/null +++ b/simplistic_calculator/typer/main_36.dart @@ -0,0 +1,121 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class CalcButton extends ConsumerWidget { + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + child: null, + ); + } +} diff --git a/simplistic_calculator/typer/main_37.dart b/simplistic_calculator/typer/main_37.dart new file mode 100644 index 000000000..e6932e21d --- /dev/null +++ b/simplistic_calculator/typer/main_37.dart @@ -0,0 +1,122 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class CalcButton extends ConsumerWidget { + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () {}, + child: null, + ); + } +} diff --git a/simplistic_calculator/typer/main_38.dart b/simplistic_calculator/typer/main_38.dart new file mode 100644 index 000000000..b1c3a7e3e --- /dev/null +++ b/simplistic_calculator/typer/main_38.dart @@ -0,0 +1,122 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class CalcButton extends ConsumerWidget { + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () {}, + child: Text(), + ); + } +} diff --git a/simplistic_calculator/typer/main_39.dart b/simplistic_calculator/typer/main_39.dart new file mode 100644 index 000000000..e94ee5b55 --- /dev/null +++ b/simplistic_calculator/typer/main_39.dart @@ -0,0 +1,124 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class CalcButton extends ConsumerWidget { + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () {}, + child: Text(), + ); + } +} diff --git a/simplistic_calculator/typer/main_40.dart b/simplistic_calculator/typer/main_40.dart new file mode 100644 index 000000000..0605e2973 --- /dev/null +++ b/simplistic_calculator/typer/main_40.dart @@ -0,0 +1,124 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class CalcButton extends ConsumerWidget { + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () {}, + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_41.dart b/simplistic_calculator/typer/main_41.dart new file mode 100644 index 000000000..201666c75 --- /dev/null +++ b/simplistic_calculator/typer/main_41.dart @@ -0,0 +1,129 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.label, + }) : super(key: key); + + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () {}, + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_42.dart b/simplistic_calculator/typer/main_42.dart new file mode 100644 index 000000000..7b6459d5e --- /dev/null +++ b/simplistic_calculator/typer/main_42.dart @@ -0,0 +1,131 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.label, + }) : super(key: key); + + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () {}, + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_43.dart b/simplistic_calculator/typer/main_43.dart new file mode 100644 index 000000000..181afd466 --- /dev/null +++ b/simplistic_calculator/typer/main_43.dart @@ -0,0 +1,132 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () {}, + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_44.dart b/simplistic_calculator/typer/main_44.dart new file mode 100644 index 000000000..35aa7d219 --- /dev/null +++ b/simplistic_calculator/typer/main_44.dart @@ -0,0 +1,133 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_45.dart b/simplistic_calculator/typer/main_45.dart new file mode 100644 index 000000000..e1f36eb91 --- /dev/null +++ b/simplistic_calculator/typer/main_45.dart @@ -0,0 +1,135 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition {} + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_46.dart b/simplistic_calculator/typer/main_46.dart new file mode 100644 index 000000000..8353ab131 --- /dev/null +++ b/simplistic_calculator/typer/main_46.dart @@ -0,0 +1,139 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_47.dart b/simplistic_calculator/typer/main_47.dart new file mode 100644 index 000000000..6fea23d39 --- /dev/null +++ b/simplistic_calculator/typer/main_47.dart @@ -0,0 +1,145 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_48.dart b/simplistic_calculator/typer/main_48.dart new file mode 100644 index 000000000..4ace6b4b3 --- /dev/null +++ b/simplistic_calculator/typer/main_48.dart @@ -0,0 +1,147 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = []; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_49.dart b/simplistic_calculator/typer/main_49.dart new file mode 100644 index 000000000..1e8466cf2 --- /dev/null +++ b/simplistic_calculator/typer/main_49.dart @@ -0,0 +1,153 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_50.dart b/simplistic_calculator/typer/main_50.dart new file mode 100644 index 000000000..fc9da9ebf --- /dev/null +++ b/simplistic_calculator/typer/main_50.dart @@ -0,0 +1,158 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_51.dart b/simplistic_calculator/typer/main_51.dart new file mode 100644 index 000000000..90e29b2a4 --- /dev/null +++ b/simplistic_calculator/typer/main_51.dart @@ -0,0 +1,163 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_52.dart b/simplistic_calculator/typer/main_52.dart new file mode 100644 index 000000000..17c5da937 --- /dev/null +++ b/simplistic_calculator/typer/main_52.dart @@ -0,0 +1,168 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_53.dart b/simplistic_calculator/typer/main_53.dart new file mode 100644 index 000000000..688e8dfba --- /dev/null +++ b/simplistic_calculator/typer/main_53.dart @@ -0,0 +1,173 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_54.dart b/simplistic_calculator/typer/main_54.dart new file mode 100644 index 000000000..be3659bf9 --- /dev/null +++ b/simplistic_calculator/typer/main_54.dart @@ -0,0 +1,178 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_55.dart b/simplistic_calculator/typer/main_55.dart new file mode 100644 index 000000000..5998fe4c7 --- /dev/null +++ b/simplistic_calculator/typer/main_55.dart @@ -0,0 +1,183 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_56.dart b/simplistic_calculator/typer/main_56.dart new file mode 100644 index 000000000..67eda0ce6 --- /dev/null +++ b/simplistic_calculator/typer/main_56.dart @@ -0,0 +1,188 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_57.dart b/simplistic_calculator/typer/main_57.dart new file mode 100644 index 000000000..b2d163292 --- /dev/null +++ b/simplistic_calculator/typer/main_57.dart @@ -0,0 +1,193 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_58.dart b/simplistic_calculator/typer/main_58.dart new file mode 100644 index 000000000..103a1507b --- /dev/null +++ b/simplistic_calculator/typer/main_58.dart @@ -0,0 +1,198 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_59.dart b/simplistic_calculator/typer/main_59.dart new file mode 100644 index 000000000..71fb2adcd --- /dev/null +++ b/simplistic_calculator/typer/main_59.dart @@ -0,0 +1,203 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_60.dart b/simplistic_calculator/typer/main_60.dart new file mode 100644 index 000000000..2627ca56e --- /dev/null +++ b/simplistic_calculator/typer/main_60.dart @@ -0,0 +1,208 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_61.dart b/simplistic_calculator/typer/main_61.dart new file mode 100644 index 000000000..8cde348bf --- /dev/null +++ b/simplistic_calculator/typer/main_61.dart @@ -0,0 +1,217 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ); + } +} diff --git a/simplistic_calculator/typer/main_62.dart b/simplistic_calculator/typer/main_62.dart new file mode 100644 index 000000000..7114ef727 --- /dev/null +++ b/simplistic_calculator/typer/main_62.dart @@ -0,0 +1,219 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return SizedBox( + child: OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_63.dart b/simplistic_calculator/typer/main_63.dart new file mode 100644 index 000000000..05e4c32e2 --- /dev/null +++ b/simplistic_calculator/typer/main_63.dart @@ -0,0 +1,219 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return SizedBox.expand( + child: OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_64.dart b/simplistic_calculator/typer/main_64.dart new file mode 100644 index 000000000..0692d63fa --- /dev/null +++ b/simplistic_calculator/typer/main_64.dart @@ -0,0 +1,222 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text(label), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_65.dart b/simplistic_calculator/typer/main_65.dart new file mode 100644 index 000000000..7489a966f --- /dev/null +++ b/simplistic_calculator/typer/main_65.dart @@ -0,0 +1,225 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_66.dart b/simplistic_calculator/typer/main_66.dart new file mode 100644 index 000000000..dbda34bfc --- /dev/null +++ b/simplistic_calculator/typer/main_66.dart @@ -0,0 +1,226 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_67.dart b/simplistic_calculator/typer/main_67.dart new file mode 100644 index 000000000..dbb75242d --- /dev/null +++ b/simplistic_calculator/typer/main_67.dart @@ -0,0 +1,227 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_68.dart b/simplistic_calculator/typer/main_68.dart new file mode 100644 index 000000000..02a3200b3 --- /dev/null +++ b/simplistic_calculator/typer/main_68.dart @@ -0,0 +1,228 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_69.dart b/simplistic_calculator/typer/main_69.dart new file mode 100644 index 000000000..2d4407778 --- /dev/null +++ b/simplistic_calculator/typer/main_69.dart @@ -0,0 +1,232 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: OutlinedButton( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_70.dart b/simplistic_calculator/typer/main_70.dart new file mode 100644 index 000000000..8d9c91c99 --- /dev/null +++ b/simplistic_calculator/typer/main_70.dart @@ -0,0 +1,232 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_71.dart b/simplistic_calculator/typer/main_71.dart new file mode 100644 index 000000000..888daf595 --- /dev/null +++ b/simplistic_calculator/typer/main_71.dart @@ -0,0 +1,233 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_72.dart b/simplistic_calculator/typer/main_72.dart new file mode 100644 index 000000000..efdb66f16 --- /dev/null +++ b/simplistic_calculator/typer/main_72.dart @@ -0,0 +1,234 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_73.dart b/simplistic_calculator/typer/main_73.dart new file mode 100644 index 000000000..2f04db7ab --- /dev/null +++ b/simplistic_calculator/typer/main_73.dart @@ -0,0 +1,235 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_74.dart b/simplistic_calculator/typer/main_74.dart new file mode 100644 index 000000000..ee51e8b9f --- /dev/null +++ b/simplistic_calculator/typer/main_74.dart @@ -0,0 +1,236 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_75.dart b/simplistic_calculator/typer/main_75.dart new file mode 100644 index 000000000..ce7d06e64 --- /dev/null +++ b/simplistic_calculator/typer/main_75.dart @@ -0,0 +1,238 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_76.dart b/simplistic_calculator/typer/main_76.dart new file mode 100644 index 000000000..4592738ed --- /dev/null +++ b/simplistic_calculator/typer/main_76.dart @@ -0,0 +1,239 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_77.dart b/simplistic_calculator/typer/main_77.dart new file mode 100644 index 000000000..4a504cf92 --- /dev/null +++ b/simplistic_calculator/typer/main_77.dart @@ -0,0 +1,240 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_78.dart b/simplistic_calculator/typer/main_78.dart new file mode 100644 index 000000000..15b9ecc62 --- /dev/null +++ b/simplistic_calculator/typer/main_78.dart @@ -0,0 +1,241 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_79.dart b/simplistic_calculator/typer/main_79.dart new file mode 100644 index 000000000..760f44c71 --- /dev/null +++ b/simplistic_calculator/typer/main_79.dart @@ -0,0 +1,242 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_80.dart b/simplistic_calculator/typer/main_80.dart new file mode 100644 index 000000000..a42a1f70a --- /dev/null +++ b/simplistic_calculator/typer/main_80.dart @@ -0,0 +1,243 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_81.dart b/simplistic_calculator/typer/main_81.dart new file mode 100644 index 000000000..7c4901488 --- /dev/null +++ b/simplistic_calculator/typer/main_81.dart @@ -0,0 +1,251 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display + seven eight nine + four five six + one two three + zero point equals + ''', + columnSizes: [1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_82.dart b/simplistic_calculator/typer/main_82.dart new file mode 100644 index 000000000..a31c3f999 --- /dev/null +++ b/simplistic_calculator/typer/main_82.dart @@ -0,0 +1,251 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_83.dart b/simplistic_calculator/typer/main_83.dart new file mode 100644 index 000000000..03c7a8fab --- /dev/null +++ b/simplistic_calculator/typer/main_83.dart @@ -0,0 +1,256 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_84.dart b/simplistic_calculator/typer/main_84.dart new file mode 100644 index 000000000..c6d4d82be --- /dev/null +++ b/simplistic_calculator/typer/main_84.dart @@ -0,0 +1,261 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_85.dart b/simplistic_calculator/typer/main_85.dart new file mode 100644 index 000000000..997546d05 --- /dev/null +++ b/simplistic_calculator/typer/main_85.dart @@ -0,0 +1,266 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_86.dart b/simplistic_calculator/typer/main_86.dart new file mode 100644 index 000000000..473ab6e44 --- /dev/null +++ b/simplistic_calculator/typer/main_86.dart @@ -0,0 +1,271 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), + ButtonDefinition( + areaName: 'divide', + op: (engine) => engine.addToBuffer('/'), + label: '/', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_87.dart b/simplistic_calculator/typer/main_87.dart new file mode 100644 index 000000000..5c208ff02 --- /dev/null +++ b/simplistic_calculator/typer/main_87.dart @@ -0,0 +1,272 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:math_expressions/math_expressions.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), + ButtonDefinition( + areaName: 'divide', + op: (engine) => engine.addToBuffer('/'), + label: '/', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_88.dart b/simplistic_calculator/typer/main_88.dart new file mode 100644 index 000000000..fade893b0 --- /dev/null +++ b/simplistic_calculator/typer/main_88.dart @@ -0,0 +1,274 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:math_expressions/math_expressions.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } + + void evaluate() {} +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), + ButtonDefinition( + areaName: 'divide', + op: (engine) => engine.addToBuffer('/'), + label: '/', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_89.dart b/simplistic_calculator/typer/main_89.dart new file mode 100644 index 000000000..25cddadda --- /dev/null +++ b/simplistic_calculator/typer/main_89.dart @@ -0,0 +1,282 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:math_expressions/math_expressions.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } + + void evaluate() { + try {} catch (err) { + state = state.copyWith( + error: err.toString(), + buffer: '', + mode: CalculatorEngineMode.result, + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), + ButtonDefinition( + areaName: 'divide', + op: (engine) => engine.addToBuffer('/'), + label: '/', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_90.dart b/simplistic_calculator/typer/main_90.dart new file mode 100644 index 000000000..672925625 --- /dev/null +++ b/simplistic_calculator/typer/main_90.dart @@ -0,0 +1,287 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:math_expressions/math_expressions.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } + + void evaluate() { + try { + final parser = Parser(); + final cm = ContextModel(); + final exp = parser.parse(state.buffer); + final result = exp.evaluate(EvaluationType.REAL, cm) as double; + } catch (err) { + state = state.copyWith( + error: err.toString(), + buffer: '', + mode: CalculatorEngineMode.result, + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), + ButtonDefinition( + areaName: 'divide', + op: (engine) => engine.addToBuffer('/'), + label: '/', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_91.dart b/simplistic_calculator/typer/main_91.dart new file mode 100644 index 000000000..eec03ca8b --- /dev/null +++ b/simplistic_calculator/typer/main_91.dart @@ -0,0 +1,300 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:math_expressions/math_expressions.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } + + void evaluate() { + try { + final parser = Parser(); + final cm = ContextModel(); + final exp = parser.parse(state.buffer); + final result = exp.evaluate(EvaluationType.REAL, cm) as double; + + if (result.isInfinite) { + state = state.copyWith( + error: 'Result is Infinite', + buffer: '', + mode: CalculatorEngineMode.result, + ); + } else if (result.isNaN) { + state = state.copyWith( + error: 'Result is Not a Number', + buffer: '', + mode: CalculatorEngineMode.result, + ); + } catch (err) { + state = state.copyWith( + error: err.toString(), + buffer: '', + mode: CalculatorEngineMode.result, + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), + ButtonDefinition( + areaName: 'divide', + op: (engine) => engine.addToBuffer('/'), + label: '/', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_92.dart b/simplistic_calculator/typer/main_92.dart new file mode 100644 index 000000000..4dd78c08f --- /dev/null +++ b/simplistic_calculator/typer/main_92.dart @@ -0,0 +1,309 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:math_expressions/math_expressions.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } + + void evaluate() { + try { + final parser = Parser(); + final cm = ContextModel(); + final exp = parser.parse(state.buffer); + final result = exp.evaluate(EvaluationType.REAL, cm) as double; + + if (result.isInfinite) { + state = state.copyWith( + error: 'Result is Infinite', + buffer: '', + mode: CalculatorEngineMode.result, + ); + } else if (result.isNaN) { + state = state.copyWith( + error: 'Result is Not a Number', + buffer: '', + mode: CalculatorEngineMode.result, + ); + } else { + final resultStr = result.ceil() == result + ? result.toInt().toString() + : result.toString(); + state = state.copyWith( + buffer: resultStr, + mode: CalculatorEngineMode.result, + ); + } + } catch (err) { + state = state.copyWith( + error: err.toString(), + buffer: '', + mode: CalculatorEngineMode.result, + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) {}, + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), + ButtonDefinition( + areaName: 'divide', + op: (engine) => engine.addToBuffer('/'), + label: '/', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_93.dart b/simplistic_calculator/typer/main_93.dart new file mode 100644 index 000000000..c7e8351bd --- /dev/null +++ b/simplistic_calculator/typer/main_93.dart @@ -0,0 +1,309 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:math_expressions/math_expressions.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } + + void evaluate() { + try { + final parser = Parser(); + final cm = ContextModel(); + final exp = parser.parse(state.buffer); + final result = exp.evaluate(EvaluationType.REAL, cm) as double; + + if (result.isInfinite) { + state = state.copyWith( + error: 'Result is Infinite', + buffer: '', + mode: CalculatorEngineMode.result, + ); + } else if (result.isNaN) { + state = state.copyWith( + error: 'Result is Not a Number', + buffer: '', + mode: CalculatorEngineMode.result, + ); + } else { + final resultStr = result.ceil() == result + ? result.toInt().toString() + : result.toString(); + state = state.copyWith( + buffer: resultStr, + mode: CalculatorEngineMode.result, + ); + } + } catch (err) { + state = state.copyWith( + error: err.toString(), + buffer: '', + mode: CalculatorEngineMode.result, + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) => engine.evaluate(), + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), + ButtonDefinition( + areaName: 'divide', + op: (engine) => engine.addToBuffer('/'), + label: '/', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/main_94.dart b/simplistic_calculator/typer/main_94.dart new file mode 100644 index 000000000..0a57e86d5 --- /dev/null +++ b/simplistic_calculator/typer/main_94.dart @@ -0,0 +1,319 @@ +// Copyright 2022 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:math_expressions/math_expressions.dart'; +import 'package:window_size/window_size.dart'; + +void main() { + if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { + WidgetsFlutterBinding.ensureInitialized(); + setWindowTitle('Simplistic Calculator'); + } + + runApp( + const ProviderScope( + child: CalculatorApp(), + ), + ); +} + +@immutable +class CalculatorState { + const CalculatorState({ + required this.buffer, + required this.mode, + required this.error, + }); + + final String buffer; + final CalculatorEngineMode mode; + final String error; + + CalculatorState copyWith({ + String? buffer, + CalculatorEngineMode? mode, + String? error, + }) => + CalculatorState( + buffer: buffer ?? this.buffer, + mode: mode ?? this.mode, + error: error ?? this.error, + ); +} + +enum CalculatorEngineMode { input, result } + +class CalculatorEngine extends StateNotifier { + CalculatorEngine() + : super( + const CalculatorState( + buffer: '0', + mode: CalculatorEngineMode.result, + error: '', + ), + ); + + void addToBuffer(String str) { + if (state.mode == CalculatorEngineMode.result) { + state = state.copyWith( + buffer: str, + mode: CalculatorEngineMode.input, + error: '', + ); + } else { + state = state.copyWith( + buffer: state.buffer + str, + error: '', + ); + } + } + + void evaluate() { + try { + final parser = Parser(); + final cm = ContextModel(); + final exp = parser.parse(state.buffer); + final result = exp.evaluate(EvaluationType.REAL, cm) as double; + + if (result.isInfinite) { + state = state.copyWith( + error: 'Result is Infinite', + buffer: '', + mode: CalculatorEngineMode.result, + ); + } else if (result.isNaN) { + state = state.copyWith( + error: 'Result is Not a Number', + buffer: '', + mode: CalculatorEngineMode.result, + ); + } else { + final resultStr = result.ceil() == result + ? result.toInt().toString() + : result.toString(); + state = state.copyWith( + buffer: resultStr, + mode: CalculatorEngineMode.result, + ); + } + } catch (err) { + state = state.copyWith( + error: err.toString(), + buffer: '', + mode: CalculatorEngineMode.result, + ); + } + } +} + +final calculatorStateProvider = + StateNotifierProvider( + (_) => CalculatorEngine()); + +class ButtonDefinition { + const ButtonDefinition({ + required this.areaName, + required this.label, + required this.op, + this.type = CalcButtonType.outlined, + }); + + final String areaName; + final String label; + final CalculatorEngineCallback op; + final CalcButtonType type; +} + +final buttonDefinitions = [ + ButtonDefinition( + areaName: 'seven', + op: (engine) => engine.addToBuffer('7'), + label: '7', + ), + ButtonDefinition( + areaName: 'eight', + op: (engine) => engine.addToBuffer('8'), + label: '8', + ), + ButtonDefinition( + areaName: 'nine', + op: (engine) => engine.addToBuffer('9'), + label: '9', + ), + ButtonDefinition( + areaName: 'four', + op: (engine) => engine.addToBuffer('4'), + label: '4', + ), + ButtonDefinition( + areaName: 'five', + op: (engine) => engine.addToBuffer('5'), + label: '5', + ), + ButtonDefinition( + areaName: 'six', + op: (engine) => engine.addToBuffer('6'), + label: '6', + ), + ButtonDefinition( + areaName: 'one', + op: (engine) => engine.addToBuffer('1'), + label: '1', + ), + ButtonDefinition( + areaName: 'two', + op: (engine) => engine.addToBuffer('2'), + label: '2', + ), + ButtonDefinition( + areaName: 'three', + op: (engine) => engine.addToBuffer('3'), + label: '3', + ), + ButtonDefinition( + areaName: 'zero', + op: (engine) => engine.addToBuffer('0'), + label: '0', + ), + ButtonDefinition( + areaName: 'point', + op: (engine) => engine.addToBuffer('.'), + label: '.', + ), + ButtonDefinition( + areaName: 'equals', + op: (engine) => engine.evaluate(), + label: '=', + type: CalcButtonType.elevated, + ), + ButtonDefinition( + areaName: 'plus', + op: (engine) => engine.addToBuffer('+'), + label: '+', + ), + ButtonDefinition( + areaName: 'minus', + op: (engine) => engine.addToBuffer('-'), + label: '-', + ), + ButtonDefinition( + areaName: 'multiply', + op: (engine) => engine.addToBuffer('*'), + label: '*', + ), + ButtonDefinition( + areaName: 'divide', + op: (engine) => engine.addToBuffer('/'), + label: '/', + ), +]; + +class CalculatorApp extends ConsumerWidget { + const CalculatorApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final state = ref.watch(calculatorStateProvider); + + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Container( + color: Colors.white, + child: LayoutGrid( + areas: ''' + display display display display + seven eight nine divide + four five six multiply + one two three minus + zero point equals plus + ''', + columnSizes: [1.fr, 1.fr, 1.fr, 1.fr], + rowSizes: [ + 1.fr, + 1.fr, + 1.fr, + 1.fr, + 1.fr, + ], + children: [ + NamedAreaGridPlacement( + areaName: 'display', + child: SizedBox.expand( + child: state.error.isEmpty + ? Text( + state.buffer, + textAlign: TextAlign.end, + style: const TextStyle(fontSize: 80), + ) + : Text( + state.error, + textAlign: TextAlign.start, + style: const TextStyle( + fontSize: 40, + color: Colors.red, + ), + maxLines: 2, + ), + ), + ), + ...buttonDefinitions.map( + (definition) => NamedAreaGridPlacement( + areaName: definition.areaName, + child: CalcButton( + label: definition.label, + op: definition.op, + type: definition.type, + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); +enum CalcButtonType { outlined, elevated } + +class CalcButton extends ConsumerWidget { + const CalcButton({ + Key? key, + required this.op, + required this.label, + required this.type, + }) : super(key: key); + + final CalculatorEngineCallback op; + final String label; + final CalcButtonType type; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final buttonConstructor = type == CalcButtonType.elevated + ? ElevatedButton.new + : OutlinedButton.new; + + return SizedBox.expand( + child: Padding( + padding: const EdgeInsets.all(8), + child: buttonConstructor( + onPressed: () => op(ref.read(calculatorStateProvider.notifier)), + child: Text( + label, + style: const TextStyle(fontSize: 40, color: Colors.black54), + ), + ), + ), + ); + } +} diff --git a/simplistic_calculator/typer/steps.json b/simplistic_calculator/typer/steps.json new file mode 100644 index 000000000..9fd2c2335 --- /dev/null +++ b/simplistic_calculator/typer/steps.json @@ -0,0 +1,378 @@ +[ + { + "file":"lib/main.dart", + "content":"typer/main_01.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_02.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_03.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_04.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_05.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_06.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_07.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_08.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_09.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_10.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_11.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_12.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_13.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_14.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_15.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_16.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_17.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_18.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_19.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_20.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_21.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_22.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_23.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_24.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_25.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_26.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_27.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_28.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_29.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_30.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_31.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_32.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_33.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_34.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_35.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_36.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_37.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_38.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_39.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_40.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_41.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_42.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_43.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_44.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_45.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_46.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_47.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_48.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_49.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_50.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_51.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_52.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_53.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_54.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_55.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_56.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_57.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_58.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_59.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_60.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_61.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_62.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_63.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_64.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_65.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_66.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_67.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_68.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_69.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_70.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_71.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_72.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_73.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_74.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_75.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_76.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_77.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_78.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_79.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_80.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_81.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_82.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_83.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_84.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_85.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_86.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_87.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_88.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_89.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_90.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_91.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_92.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_93.dart" + }, + { + "file":"lib/main.dart", + "content":"typer/main_94.dart" + } +] \ No newline at end of file