From a35eada8eb479870111306c66698975dd279629f Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 30 Jan 2026 19:35:18 +0100 Subject: [PATCH] Konflike behoben --- BeWo/AI/Controls/Icon_KI_Chat_Weiss_TEMP.png | Bin 0 -> 8456 bytes .../AI/Controls/VoiceToTextButtonControl.xaml | 21 ++ .../Controls/VoiceToTextButtonControl.xaml.cs | 102 ++++++++ BeWo/AI/View/AiTranskriptionView.xaml | 222 ++++++++++++++++++ BeWo/AI/View/AiTranskriptionView.xaml.cs | 163 +++++++++++++ BeWo/AI/View/Icon_KI_Chat_Weiss_TEMP.png | Bin 0 -> 8456 bytes BeWo/BeWo.csproj | 26 ++ BeWo/BeWoApp.xaml.cs | 11 +- BeWo/Core/Config/AppSettings.cs | 18 +- .../Icons/Icon_KI_Chat_Weiss_TEMP.png | Bin 0 -> 8456 bytes .../GeneratedOperationsService.cs | 19 ++ .../Zeiterfassung/ServiceRecordView2.xaml | 5 +- Model/Changes_alle_fuer_neue_db.txt | 30 ++- Service/OwnChat/OwnChatHelper.cs | 65 ++--- Service/Plugins/PluginLoader.cs | 4 +- Service/Service.csproj | 2 + .../ServiceContracts/IOperationsService.cs | 8 + .../OperationsServiceImp.cs | 36 +++ Service/ai/AiVoiceData.cs | 20 ++ Service/ai/TranscriptionService.cs | 206 ++++++++++++++++ Shared/Core/SettingsKeys.cs | 2 + Shared/DataContracts/AiVoiceDataDC.cs | 25 ++ Shared/Shared.csproj | 1 + 23 files changed, 948 insertions(+), 38 deletions(-) create mode 100644 BeWo/AI/Controls/Icon_KI_Chat_Weiss_TEMP.png create mode 100644 BeWo/AI/Controls/VoiceToTextButtonControl.xaml create mode 100644 BeWo/AI/Controls/VoiceToTextButtonControl.xaml.cs create mode 100644 BeWo/AI/View/AiTranskriptionView.xaml create mode 100644 BeWo/AI/View/AiTranskriptionView.xaml.cs create mode 100644 BeWo/AI/View/Icon_KI_Chat_Weiss_TEMP.png create mode 100644 BeWo/Ressources/Icons/Icon_KI_Chat_Weiss_TEMP.png create mode 100644 Service/ai/AiVoiceData.cs create mode 100644 Service/ai/TranscriptionService.cs create mode 100644 Shared/DataContracts/AiVoiceDataDC.cs diff --git a/BeWo/AI/Controls/Icon_KI_Chat_Weiss_TEMP.png b/BeWo/AI/Controls/Icon_KI_Chat_Weiss_TEMP.png new file mode 100644 index 0000000000000000000000000000000000000000..5bdf51d2fb62a48065ebed2c91f1eb78ab47fce0 GIT binary patch literal 8456 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 Ha{Ye+dHWM` literal 0 HcmV?d00001 diff --git a/BeWo/AI/Controls/VoiceToTextButtonControl.xaml b/BeWo/AI/Controls/VoiceToTextButtonControl.xaml new file mode 100644 index 000000000..f27da309c --- /dev/null +++ b/BeWo/AI/Controls/VoiceToTextButtonControl.xaml @@ -0,0 +1,21 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/BeWo/AI/Controls/VoiceToTextButtonControl.xaml.cs b/BeWo/AI/Controls/VoiceToTextButtonControl.xaml.cs new file mode 100644 index 000000000..2d3968ee3 --- /dev/null +++ b/BeWo/AI/Controls/VoiceToTextButtonControl.xaml.cs @@ -0,0 +1,102 @@ +using BeWo.AI.View; +using BeWo.Services; +using BS.Shared.Translation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace BeWo.AI.Controls +{ + /// + /// Interaktionslogik für VoiceToTextButtonControl.xaml + /// + public partial class VoiceToTextButtonControl : UserControl + { + public static readonly DependencyProperty TargetTextBoxProperty = + DependencyProperty.Register( + nameof(TargetTextBox), + typeof(TextBox), + typeof(VoiceToTextButtonControl)); + + public VoiceToTextButtonControl() + { + InitializeComponent(); + } + + public TextBox TargetTextBox + { + get => (TextBox)GetValue(TargetTextBoxProperty); + set => SetValue(TargetTextBoxProperty, value); + } + + private void ButtonOpenTranskriptionView_Click(object sender, RoutedEventArgs e) + { + OpenTranskriptionView(); + } + + public void OpenTranskriptionView() + { + + var view = new AiTranskriptionView(); + + view.InitView(); + + var factory = new BeWoWindowFactory(); + var beWoWindow = factory.GetAnimatedBeWoWindow(Translator.Translate("BeWoPlaner"), view, 500, 600); + + view.ApplyClicked += (s, e) => + { + if (TargetTextBox != null) + { + InsertTextAtSelection(view.GetText()); + } + + beWoWindow.Close(); + }; + + view.CancelClicked += (s, e) => + { + if (!String.IsNullOrEmpty(view.GetText())) + { + if (MessageBox.Show("Sind Sie sicher, dass Sie abbrechnen und den Text verwerfen möchten?", "Abbrechen", MessageBoxButton.OKCancel) == MessageBoxResult.OK) + { + beWoWindow.Close(); + } + } + else + { + beWoWindow.Close(); + } + + }; + + + + beWoWindow.ShowDialog(); + } + + private void InsertTextAtSelection(string neuerText) + { + int start = TargetTextBox.SelectionStart; + int length = TargetTextBox.SelectionLength; + + TargetTextBox.Text = + TargetTextBox.Text.Remove(start, length) + .Insert(start, neuerText); + + TargetTextBox.CaretIndex = start + neuerText.Length; + } + + } +} diff --git a/BeWo/AI/View/AiTranskriptionView.xaml b/BeWo/AI/View/AiTranskriptionView.xaml new file mode 100644 index 000000000..c78684b1f --- /dev/null +++ b/BeWo/AI/View/AiTranskriptionView.xaml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +