Skip to content

Commit ab20bf5

Browse files
author
Kirill Belousov
committed
Adds spoken phrases history
1 parent dc6d01a commit ab20bf5

4 files changed

Lines changed: 83 additions & 1 deletion

File tree

src/historyStorage.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include "historyStorage.h"
2+
3+
#include <algorithm>
4+
5+
void HistoryStorage::push(const std::string& text) {
6+
m_messages.push_back(text);
7+
}
8+
9+
std::string HistoryStorage::getNextByText(const std::string& text) {
10+
if (m_messages.empty()) {
11+
return "";
12+
}
13+
if (text.empty()) {
14+
return "";
15+
}
16+
if (m_messages.size() == 1) {
17+
return "";
18+
}
19+
auto iter = std::find(m_messages.begin(), m_messages.end(), text);
20+
if (iter == m_messages.end()) {
21+
return "";
22+
}
23+
auto idx = std::distance(m_messages.begin(), iter);
24+
if (idx >= (m_messages.size() - 1)) {
25+
return "";
26+
}
27+
return m_messages[idx + 1];
28+
}
29+
30+
std::string HistoryStorage::getPreviousByText(const std::string& text) {
31+
if (m_messages.empty()) {
32+
return "";
33+
}
34+
if (text.empty()) {
35+
return m_messages[m_messages.size() - 1];
36+
}
37+
auto iter = std::find(m_messages.begin(), m_messages.end(), text);
38+
if (iter == m_messages.end()) {
39+
return "";
40+
}
41+
auto idx = std::distance(m_messages.begin(), iter);
42+
if (idx <= 0) {
43+
return m_messages[0];
44+
}
45+
return m_messages[idx - 1];
46+
}

src/historyStorage.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
3+
#include "singleton.h"
4+
5+
#include <string>
6+
#include <vector>
7+
8+
class HistoryStorage {
9+
public:
10+
void push(const std::string& text);
11+
std::string getNextByText(const std::string& text);
12+
std::string getPreviousByText(const std::string& text);
13+
14+
private:
15+
std::vector<std::string> m_messages;
16+
};
17+
18+
#define g_HistoryStorage CSingleton<HistoryStorage>::GetInstance()

src/ui.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "ui.h"
22

33
#include "audio.h"
4+
#include "historyStorage.h"
45
#include "loggerSetup.h"
56
#include "speech.h"
67

@@ -62,6 +63,7 @@ MainFrame::MainFrame(const wxString& title) : wxFrame(nullptr, wxID_ANY, title)
6263
m_rateSlider->Bind(wxEVT_SLIDER, &MainFrame::OnRateSliderChange, this);
6364
m_volumeSlider->Bind(wxEVT_SLIDER, &MainFrame::OnVolumeSliderChange, this);
6465
m_messageField->Bind(wxEVT_TEXT_ENTER, &MainFrame::OnEnterPress, this);
66+
m_messageField->Bind(wxEVT_KEY_DOWN, &MainFrame::OnMessageFieldKeyDown, this);
6567
m_voicesList->Bind(wxEVT_LISTBOX, &MainFrame::OnVoiceChange, this);
6668
m_outputDevicesList->Bind(wxEVT_LISTBOX, &MainFrame::OnOutputDeviceChange, this);
6769
populateVoicesList();
@@ -104,10 +106,25 @@ void MainFrame::OnVolumeSliderChange(wxCommandEvent& event) {
104106
}
105107

106108
void MainFrame::OnEnterPress(wxCommandEvent& event) {
107-
Speech::GetInstance().speak(m_messageField->GetValue().ToUTF8().data());
109+
auto text = m_messageField->GetValue();
110+
Speech::GetInstance().speak(text.ToUTF8().data());
111+
g_HistoryStorage.push(text.ToStdString());
108112
m_messageField->Clear();
109113
}
110114

115+
void MainFrame::OnMessageFieldKeyDown(wxKeyEvent& event) {
116+
auto text = m_messageField->GetValue().ToStdString();
117+
switch (event.GetKeyCode()) {
118+
case WXK_UP:
119+
m_messageField->SetValue(g_HistoryStorage.getPreviousByText(text));
120+
break;
121+
case WXK_DOWN:
122+
m_messageField->SetValue(g_HistoryStorage.getNextByText(text));
123+
break;
124+
}
125+
event.Skip();
126+
}
127+
111128
void MainFrame::OnVoiceChange(wxCommandEvent& event) {
112129
int value = m_voicesList->GetSelection();
113130
Speech::GetInstance().setVoice(value);

src/ui.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class MainFrame : public wxFrame {
1818
void populateVoicesList();
1919
void populateDevicesList();
2020
void OnEnterPress(wxCommandEvent& event);
21+
void OnMessageFieldKeyDown(wxKeyEvent& event);
2122
void OnVoiceChange(wxCommandEvent& event);
2223
void OnOutputDeviceChange(wxCommandEvent& event);
2324
void OnRateSliderChange(wxCommandEvent& event);

0 commit comments

Comments
 (0)