use new input in settings

This commit is contained in:
2025-06-10 12:05:14 +02:00
parent 67a84d52d9
commit fa406431bd

View File

@@ -4,10 +4,11 @@ import 'dart:convert';
import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_numeric_stepper.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_radio_options.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_env/env.dart'; import 'package:mzansi_innovation_hub/mih_env/env.dart';
import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart';
@@ -370,26 +371,30 @@ class _AiChatState extends State<AiChat> {
), ),
], ],
), ),
const SizedBox(height: 5), const SizedBox(height: 15),
Row( Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
SizedBox( SizedBox(
width: 300, width: 300,
child: MIHDropdownField( child: MihRadioOptions(
controller: _modelController, controller: _modelController,
hintText: "AI Model", hintText: "AI Model",
dropdownOptions: const [ fillColor: MzanziInnovationHub.of(context)!
.theme
.secondaryColor(),
secondaryFillColor:
MzanziInnovationHub.of(context)!
.theme
.primaryColor(),
requiredText: true,
radioOptions: const [
'gemma3:4b', 'gemma3:4b',
], ],
required: true,
editable: true,
enableSearch: false,
), ),
), ),
], ],
), ),
const SizedBox(height: 15), const SizedBox(height: 20),
Row( Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
@@ -433,49 +438,24 @@ class _AiChatState extends State<AiChat> {
), ),
], ],
), ),
const SizedBox(height: 15), const SizedBox(height: 10),
Row( Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
IconButton.filled( SizedBox(
onPressed: () { width: 300,
setState(() { child: MihNumericStepper(
_chatFrontSize -= 1; controller: _fontSizeController,
_fontSizeController.text = fillColor: MzanziInnovationHub.of(context)!
_chatFrontSize.ceil().toString(); .theme
}); .secondaryColor(),
}, inputColor: MzanziInnovationHub.of(context)!
icon: const Icon( .theme
Icons.remove, .primaryColor(),
), hintText: "Font Size",
), requiredText: true,
const SizedBox(width: 10), minValue: 1,
MihTextFormField( // maxValue: 5,
width: 200, validationOn: true,
fillColor: MzanziInnovationHub.of(context)!
.theme
.secondaryColor(),
inputColor: MzanziInnovationHub.of(context)!
.theme
.primaryColor(),
controller: _fontSizeController,
multiLineInput: false,
requiredText: true,
readOnly: true,
hintText: "Time",
),
const SizedBox(width: 10),
IconButton.filled(
onPressed: () {
setState(() {
_chatFrontSize += 1;
_fontSizeController.text =
_chatFrontSize.ceil().toString();
});
},
icon: const Icon(
Icons.add,
), ),
), ),
], ],
@@ -537,6 +517,12 @@ class _AiChatState extends State<AiChat> {
} }
} }
void fontSizeChanged() {
setState(() {
_chatFrontSize = double.parse(_fontSizeController.text);
});
}
@override @override
void dispose() { void dispose() {
// TODO: implement dispose // TODO: implement dispose
@@ -545,12 +531,14 @@ class _AiChatState extends State<AiChat> {
_fontSizeController.dispose(); _fontSizeController.dispose();
_ttsVoiceController.dispose(); _ttsVoiceController.dispose();
_ttsVoiceController.removeListener(voiceSelected); _ttsVoiceController.removeListener(voiceSelected);
_fontSizeController.removeListener(fontSizeChanged);
client.endSession(); client.endSession();
_flutterTts.stop(); _flutterTts.stop();
} }
void initTTS() { void initTTS() {
_flutterTts.setVolume(0.7); _flutterTts.setVolume(1);
_fontSizeController.addListener(fontSizeChanged);
// _flutterTts.setSpeechRate(0.6); // _flutterTts.setSpeechRate(0.6);
// _flutterTts.setPitch(1.0); // _flutterTts.setPitch(1.0);
_flutterTts.getVoices.then( _flutterTts.getVoices.then(
@@ -650,27 +638,75 @@ class _AiChatState extends State<AiChat> {
], ],
), ),
Positioned( Positioned(
left: 0, left: 15,
top: 0, top: 15,
child: Visibility( child: Visibility(
visible: _showModelOptions.value == true, visible: _showModelOptions.value == true,
child: IconButton.filled( child: Container(
iconSize: 20, // color: Colors.white,
onPressed: () { decoration: BoxDecoration(
if (_showModelOptions.value == true) { borderRadius:
setState(() { BorderRadius.circular(25), // Optional: rounds the corners
_showModelOptions.value = false; boxShadow: const [
}); BoxShadow(
} else { color: Color.fromARGB(
setState(() { 60, 0, 0, 0), // 0.2 opacity = 51 in alpha (255 * 0.2)
_showModelOptions.value = true; spreadRadius: -2,
}); blurRadius: 10,
} offset: Offset(0, 5),
}, ),
icon: const Icon( ],
Icons.settings, ),
child: Padding(
padding: const EdgeInsets.only(
top: 2.0,
left: 5.0,
),
child: SizedBox(
width: 40,
child: IconButton.filled(
style: ButtonStyle(
backgroundColor: WidgetStateProperty.all<Color>(
MzanziInnovationHub.of(context)!.theme.errorColor()),
),
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
iconSize: 20,
onPressed: () {
if (_showModelOptions.value == true) {
setState(() {
_showModelOptions.value = false;
});
} else {
setState(() {
_showModelOptions.value = true;
});
}
},
icon: const Icon(
Icons.close,
),
),
),
), ),
), ),
// IconButton.filled(
// iconSize: 20,
// onPressed: () {
// if (_showModelOptions.value == true) {
// setState(() {
// _showModelOptions.value = false;
// });
// } else {
// setState(() {
// _showModelOptions.value = true;
// });
// }
// },
// icon: const Icon(
// Icons.settings,
// ),
// ),
), ),
), ),
Positioned( Positioned(