From 8db8a74b3dd949a6765a40698681b2f754d64bf4 Mon Sep 17 00:00:00 2001 From: yum Date: Mon, 19 Dec 2022 16:58:48 -0800 Subject: GUI: Sketch out Unity panel Now there are two panels: one to run transcription, one to generate avatar assets. Also, getting mics & python version can no longer crash the app. --- GUI/GUI/GUI/Frame.cpp | 356 +++++++++++++++++++++++++++++++----------- GUI/GUI/GUI/Frame.h | 24 ++- GUI/GUI/GUI/PythonWrapper.cpp | 6 +- 3 files changed, 292 insertions(+), 94 deletions(-) (limited to 'GUI') diff --git a/GUI/GUI/GUI/Frame.cpp b/GUI/GUI/GUI/Frame.cpp index 4f23beb..0f8a3b5 100644 --- a/GUI/GUI/GUI/Frame.cpp +++ b/GUI/GUI/GUI/Frame.cpp @@ -4,9 +4,14 @@ #include #include #include +#include namespace { enum FrameIds { + ID_MAIN_PANEL, + ID_NAVBAR, + ID_NAVBAR_BUTTON_TRANSCRIBE, + ID_NAVBAR_BUTTON_UNITY, ID_PY_PANEL, ID_PY_CONFIG_PANEL, ID_PY_CONFIG_DROPDOWN_PANEL, @@ -14,13 +19,25 @@ namespace { ID_PY_DUMP_MICS_BUTTON, ID_PY_APP_START_BUTTON, ID_PY_APP_STOP_BUTTON, - ID_PY_OUT, + ID_TRANSCRIBE_OUT, ID_PY_APP_MIC, ID_PY_APP_MIC_PANEL, ID_PY_APP_LANG, ID_PY_APP_LANG_PANEL, ID_PY_APP_MODEL, ID_PY_APP_MODEL_PANEL, + ID_UNITY_PANEL, + ID_UNITY_CONFIG_PANEL, + ID_UNITY_OUT, + ID_UNITY_ANIMATOR_FILE_PICKER, + ID_UNITY_PARAMETERS_FILE_PICKER, + ID_UNITY_MENU_FILE_PICKER, + ID_UNITY_CONFIG_PANEL_PAIRS, + ID_UNITY_ANIMATOR_GENERATED_DIR, + ID_UNITY_ANIMATOR_GENERATED_NAME, + ID_UNITY_PARAMETERS_GENERATED_NAME, + ID_UNITY_MENU_GENERATED_NAME, + ID_UNITY_BUTTON_GEN_ANIMATOR, }; const wxString kMicChoices[] = { @@ -165,90 +182,219 @@ Frame::Frame() : wxFrame(nullptr, wxID_ANY, "TaSTT"), py_app_(nullptr) { - auto* py_panel = new wxPanel(this, ID_PY_PANEL); + auto* main_panel = new wxPanel(this, ID_MAIN_PANEL); + main_panel_ = main_panel; { - const auto py_out_sz = wxSize(/*x_px=*/320, /*y_px=*/160); - auto* py_out = new wxTextCtrl(py_panel, ID_PY_OUT, - wxEmptyString, - wxDefaultPosition, - py_out_sz, wxTE_MULTILINE | wxTE_READONLY); - py_out->SetMinSize(py_out_sz); - py_out_ = py_out; - - py_out_->AppendText(PythonWrapper::GetVersion() + "\n"); - - auto* py_config_panel = new wxPanel(py_panel, ID_PY_CONFIG_PANEL); + auto* navbar = new wxPanel(main_panel, ID_NAVBAR); { - auto* py_setup_button = new wxButton(py_config_panel, ID_PY_SETUP_BUTTON, "Set up Python virtual environment"); - auto* py_dump_mics_button = new wxButton(py_config_panel, ID_PY_DUMP_MICS_BUTTON, "List input devices"); + auto* navbar_button_transcribe = new wxButton(navbar, ID_NAVBAR_BUTTON_TRANSCRIBE, "Transcription"); + auto* navbar_button_unity = new wxButton(navbar, ID_NAVBAR_BUTTON_UNITY, "Unity"); - auto* py_config_dropdown_panel = new wxPanel(py_config_panel, ID_PY_CONFIG_DROPDOWN_PANEL); - { - auto* py_app_mic = new wxChoice(py_config_dropdown_panel, ID_PY_APP_MIC, wxDefaultPosition, - wxDefaultSize, kNumMicChoices, kMicChoices); - py_app_mic->SetSelection(kMicDefault); - py_app_mic_ = py_app_mic; + auto* sizer = new wxBoxSizer(wxVERTICAL); + navbar->SetSizer(sizer); - auto* py_app_lang = new wxChoice(py_config_dropdown_panel, ID_PY_APP_LANG, wxDefaultPosition, - wxDefaultSize, kNumLangChoices, kLangChoices); - py_app_lang->SetSelection(kLangDefault); - py_app_lang_ = py_app_lang; + sizer->Add(navbar_button_transcribe, /*proportion=*/0, /*flags=*/wxEXPAND); + sizer->Add(navbar_button_unity, /*proportion=*/0, /*flags=*/wxEXPAND); + } - auto* py_app_model = new wxChoice(py_config_dropdown_panel, ID_PY_APP_MODEL, wxDefaultPosition, - wxDefaultSize, kNumModelChoices, kModelChoices); - py_app_model->SetSelection(kModelDefault); - py_app_model_ = py_app_model; + auto* transcribe_panel = new wxPanel(main_panel, ID_PY_PANEL); + transcribe_panel_ = transcribe_panel; + { + const auto transcribe_out_sz = wxSize(/*x_px=*/320, /*y_px=*/160); + auto* transcribe_out = new wxTextCtrl(transcribe_panel, ID_TRANSCRIBE_OUT, + wxEmptyString, + wxDefaultPosition, + transcribe_out_sz, wxTE_MULTILINE | wxTE_READONLY); + transcribe_out->SetMinSize(transcribe_out_sz); + transcribe_out_ = transcribe_out; - auto* sizer = new wxGridSizer(/*cols=*/2); - py_config_dropdown_panel->SetSizer(sizer); + transcribe_out_->AppendText(PythonWrapper::GetVersion() + "\n"); - sizer->Add(new wxStaticText(py_config_dropdown_panel, wxID_ANY, /*label=*/"Microphone:")); - sizer->Add(py_app_mic); + auto* py_config_panel = new wxPanel(transcribe_panel, ID_PY_CONFIG_PANEL); + { + auto* py_setup_button = new wxButton(py_config_panel, ID_PY_SETUP_BUTTON, "Set up Python virtual environment"); + auto* py_dump_mics_button = new wxButton(py_config_panel, ID_PY_DUMP_MICS_BUTTON, "List input devices"); + + auto* py_config_dropdown_panel = new wxPanel(py_config_panel, ID_PY_CONFIG_DROPDOWN_PANEL); + { + auto* py_app_mic = new wxChoice(py_config_dropdown_panel, ID_PY_APP_MIC, wxDefaultPosition, + wxDefaultSize, kNumMicChoices, kMicChoices); + py_app_mic->SetSelection(kMicDefault); + py_app_mic_ = py_app_mic; + + auto* py_app_lang = new wxChoice(py_config_dropdown_panel, ID_PY_APP_LANG, wxDefaultPosition, + wxDefaultSize, kNumLangChoices, kLangChoices); + py_app_lang->SetSelection(kLangDefault); + py_app_lang_ = py_app_lang; + + auto* py_app_model = new wxChoice(py_config_dropdown_panel, ID_PY_APP_MODEL, wxDefaultPosition, + wxDefaultSize, kNumModelChoices, kModelChoices); + py_app_model->SetSelection(kModelDefault); + py_app_model_ = py_app_model; + + auto* sizer = new wxFlexGridSizer(/*cols=*/2); + py_config_dropdown_panel->SetSizer(sizer); + + sizer->Add(new wxStaticText(py_config_dropdown_panel, wxID_ANY, /*label=*/"Microphone:")); + sizer->Add(py_app_mic, /*proportion=*/0, /*flags=*/wxEXPAND); + + sizer->Add(new wxStaticText(py_config_dropdown_panel, wxID_ANY, /*label=*/"Language:")); + sizer->Add(py_app_lang, /*proportion=*/0, /*flags=*/wxEXPAND); + + sizer->Add(new wxStaticText(py_config_dropdown_panel, wxID_ANY, /*label=*/"Model:")); + sizer->Add(py_app_model, /*proportion=*/0, /*flags=*/wxEXPAND); + } + + auto* py_app_start_button = new wxButton(py_config_panel, ID_PY_APP_START_BUTTON, "Begin transcribing"); + auto* py_app_stop_button = new wxButton(py_config_panel, ID_PY_APP_STOP_BUTTON, "Stop transcribing"); + + auto* sizer = new wxBoxSizer(wxVERTICAL); + py_config_panel->SetSizer(sizer); + sizer->Add(py_setup_button, /*proportion=*/0, /*flags=*/wxEXPAND); + sizer->Add(py_dump_mics_button, /*proportion=*/0, /*flags=*/wxEXPAND); + sizer->Add(py_config_dropdown_panel, /*proportion=*/0, /*flags=*/wxEXPAND); + sizer->Add(py_app_start_button, /*proportion=*/0, /*flags=*/wxEXPAND); + sizer->Add(py_app_stop_button, /*proportion=*/0, /*flags=*/wxEXPAND); + } - sizer->Add(new wxStaticText(py_config_dropdown_panel, wxID_ANY, /*label=*/"Language:")); - sizer->Add(py_app_lang); + auto* sizer = new wxBoxSizer(wxHORIZONTAL); + transcribe_panel->SetSizer(sizer); + sizer->Add(py_config_panel); + sizer->Add(transcribe_out); + } - sizer->Add(new wxStaticText(py_config_dropdown_panel, wxID_ANY, /*label=*/"Model:")); - sizer->Add(py_app_model); + auto* unity_panel = new wxPanel(main_panel, ID_UNITY_PANEL); + unity_panel_ = unity_panel; + { + const auto unity_out_sz = wxSize(/*x_px=*/320, /*y_px=*/160); + auto* unity_out = new wxTextCtrl(unity_panel, ID_UNITY_OUT, + wxEmptyString, + wxDefaultPosition, + unity_out_sz, wxTE_MULTILINE | wxTE_READONLY); + unity_out->SetMinSize(unity_out_sz); + unity_out_ = unity_out; + + auto* unity_config_panel = new wxPanel(unity_panel, ID_UNITY_CONFIG_PANEL); + { + auto* unity_config_panel_pairs = new wxPanel(unity_config_panel, ID_UNITY_CONFIG_PANEL_PAIRS); + { + auto* unity_animator_file_picker = new wxFilePickerCtrl( + unity_config_panel_pairs, + ID_UNITY_ANIMATOR_FILE_PICKER, + /*path=*/wxEmptyString, + /*message=*/"FX controller path", + /*wildcard=*/wxFileSelectorDefaultWildcardStr, + /*pos=*/wxDefaultPosition, + /*size=*/wxDefaultSize + ); + unity_animator_file_picker_ = unity_animator_file_picker; + + auto* unity_parameters_file_picker = new wxFilePickerCtrl( + unity_config_panel_pairs, + ID_UNITY_PARAMETERS_FILE_PICKER, + /*path=*/wxEmptyString, + /*message=*/"Avatar parameters path", + /*wildcard=*/wxFileSelectorDefaultWildcardStr, + /*pos=*/wxDefaultPosition, + /*size=*/wxDefaultSize + ); + unity_parameters_file_picker_ = unity_parameters_file_picker; + + auto* unity_menu_file_picker = new wxFilePickerCtrl( + unity_config_panel_pairs, + ID_UNITY_MENU_FILE_PICKER, + /*path=*/wxEmptyString, + /*message=*/"Avatar menu path", + /*wildcard=*/wxFileSelectorDefaultWildcardStr, + /*pos=*/wxDefaultPosition, + /*size=*/wxDefaultSize + ); + unity_parameters_file_picker_ = unity_parameters_file_picker; + + auto* unity_animator_generated_dir = new wxTextCtrl(unity_config_panel_pairs, + ID_UNITY_ANIMATOR_GENERATED_DIR, + wxEmptyString, + wxDefaultPosition); + unity_animator_generated_dir->AppendText("TaSTT_Generated"); + unity_animator_generated_dir_ = unity_animator_generated_dir; + + auto* unity_animator_generated_name = new wxTextCtrl(unity_config_panel_pairs, + ID_UNITY_ANIMATOR_GENERATED_NAME); + unity_animator_generated_name->AppendText("TaSTT.controller"); + unity_animator_generated_name_ = unity_animator_generated_name; + + auto* unity_parameters_generated_name = new wxTextCtrl(unity_config_panel_pairs, + ID_UNITY_PARAMETERS_GENERATED_NAME); + unity_parameters_generated_name->AppendText("TaSTT_Menu.asset"); + unity_parameters_generated_name_ = unity_parameters_generated_name; + + auto* unity_menu_generated_name = new wxTextCtrl(unity_config_panel_pairs, + ID_UNITY_MENU_GENERATED_NAME); + unity_menu_generated_name->AppendText("TaSTT_Parameters.asset"); + unity_menu_generated_name_ = unity_menu_generated_name; + + auto* sizer = new wxFlexGridSizer(/*cols=*/2); + unity_config_panel_pairs->SetSizer(sizer); + + sizer->Add(new wxStaticText(unity_config_panel_pairs, wxID_ANY, /*label=*/"FX controller:")); + sizer->Add(unity_animator_file_picker); + + sizer->Add(new wxStaticText(unity_config_panel_pairs, wxID_ANY, /*label=*/"Avatar parameters:")); + sizer->Add(unity_parameters_file_picker); + + sizer->Add(new wxStaticText(unity_config_panel_pairs, wxID_ANY, /*label=*/"Avatar menu:")); + sizer->Add(unity_menu_file_picker); + + sizer->Add(new wxStaticText(unity_config_panel_pairs, wxID_ANY, /*label=*/"Generated assets folder:")); + sizer->Add(unity_animator_generated_dir); + + sizer->Add(new wxStaticText(unity_config_panel_pairs, wxID_ANY, /*label=*/"Generated FX controller:")); + sizer->Add(unity_animator_generated_name); + + sizer->Add(new wxStaticText(unity_config_panel_pairs, wxID_ANY, /*label=*/"Generated parameters:")); + sizer->Add(unity_parameters_generated_name); + + sizer->Add(new wxStaticText(unity_config_panel_pairs, wxID_ANY, /*label=*/"Generated menu:")); + sizer->Add(unity_menu_generated_name); + } + + auto* unity_button_gen_fx = new wxButton(unity_config_panel, ID_UNITY_BUTTON_GEN_ANIMATOR, "Generate avatar assets"); + unity_button_gen_fx->SetWindowStyleFlag(wxBU_EXACTFIT); + + auto* sizer = new wxBoxSizer(wxVERTICAL); + unity_config_panel->SetSizer(sizer); + sizer->Add(unity_config_panel_pairs); + sizer->Add(unity_button_gen_fx, /*proportion=*/0, /*flags=*/wxEXPAND); } - auto* py_app_start_button = new wxButton(py_config_panel, ID_PY_APP_START_BUTTON, "Begin transcribing"); - auto* py_app_stop_button = new wxButton(py_config_panel, ID_PY_APP_STOP_BUTTON, "Stop transcribing"); - - auto* sizer = new wxBoxSizer(wxVERTICAL); - py_config_panel->SetSizer(sizer); - sizer->Add(py_setup_button); - sizer->Add(py_dump_mics_button); - sizer->Add(py_config_dropdown_panel); - sizer->Add(py_app_start_button); - sizer->Add(py_app_stop_button); + auto* sizer = new wxBoxSizer(wxHORIZONTAL); + unity_panel->SetSizer(sizer); + sizer->Add(unity_config_panel); + sizer->Add(unity_out); } + unity_panel_->Hide(); auto* sizer = new wxBoxSizer(wxHORIZONTAL); - py_panel->SetSizer(sizer); - sizer->Add(py_config_panel); - sizer->Add(py_out); + main_panel->SetSizer(sizer); + sizer->Add(navbar); + sizer->Add(transcribe_panel); + sizer->Add(unity_panel); } Bind(wxEVT_MENU, &Frame::OnExit, this, wxID_EXIT); + Bind(wxEVT_BUTTON, &Frame::OnNavbarTranscribe, this, ID_NAVBAR_BUTTON_TRANSCRIBE); + Bind(wxEVT_BUTTON, &Frame::OnNavbarUnity, this, ID_NAVBAR_BUTTON_UNITY); Bind(wxEVT_BUTTON, &Frame::OnAppStart, this, ID_PY_APP_START_BUTTON); Bind(wxEVT_BUTTON, &Frame::OnAppStop, this, ID_PY_APP_STOP_BUTTON); Bind(wxEVT_BUTTON, &Frame::OnSetupPython, this, ID_PY_SETUP_BUTTON); Bind(wxEVT_BUTTON, &Frame::OnDumpMics, this, ID_PY_DUMP_MICS_BUTTON); + Bind(wxEVT_BUTTON, &Frame::OnGenerateFX, this, ID_UNITY_BUTTON_GEN_ANIMATOR); // wx needs this to be able to load PNGs. wxImage::AddHandler(&png_handler_); LoadAndSetIcons(); - { - auto frame_sz = GetBestSize(); - auto panel_sz = py_panel->GetBestSize(); - - auto ideal_sz = panel_sz; - ideal_sz.y += frame_sz.y; - - this->SetSize(ideal_sz); - } + Resize(); } void Frame::OnExit(wxCommandEvent& event) @@ -257,21 +403,35 @@ void Frame::OnExit(wxCommandEvent& event) Close(true); } +void Frame::OnNavbarTranscribe(wxCommandEvent& event) +{ + transcribe_panel_->Show(); + unity_panel_->Hide(); + Resize(); +} + +void Frame::OnNavbarUnity(wxCommandEvent& event) +{ + transcribe_panel_->Hide(); + unity_panel_->Show(); + Resize(); +} + void Frame::OnSetupPython(wxCommandEvent& event) { - py_out_->AppendText("Setting up Python virtual environment\n"); - py_out_->AppendText("This could take several minutes, please be patient!\n"); - py_out_->AppendText("This will download ~5GB of dependencies.\n"); + transcribe_out_->AppendText("Setting up Python virtual environment\n"); + transcribe_out_->AppendText("This could take several minutes, please be patient!\n"); + transcribe_out_->AppendText("This will download ~5GB of dependencies.\n"); { - std::string py_out; - std::ostringstream py_out_oss; - py_out_oss << " Installing pip" << std::endl; - py_out_->AppendText(py_out_oss.str()); - if (!PythonWrapper::InstallPip(&py_out)) { - std::ostringstream py_out_oss; - py_out_oss << "Failed to install pip: " << py_out; - py_out_->AppendText(py_out_oss.str()); + std::string transcribe_out; + std::ostringstream transcribe_out_oss; + transcribe_out_oss << " Installing pip" << std::endl; + transcribe_out_->AppendText(transcribe_out_oss.str()); + if (!PythonWrapper::InstallPip(&transcribe_out)) { + std::ostringstream transcribe_out_oss; + transcribe_out_oss << "Failed to install pip: " << transcribe_out; + transcribe_out_->AppendText(transcribe_out_oss.str()); } } @@ -288,45 +448,49 @@ void Frame::OnSetupPython(wxCommandEvent& event) for (const auto& pip_dep : pip_deps) { { - std::ostringstream py_out_oss; - py_out_oss << " Installing " << pip_dep << std::endl; - py_out_->AppendText(py_out_oss.str()); + std::ostringstream transcribe_out_oss; + transcribe_out_oss << " Installing " << pip_dep << std::endl; + transcribe_out_->AppendText(transcribe_out_oss.str()); } - std::string py_out; - bool res = PythonWrapper::InvokeWithArgs({ "-m", "pip", "install", pip_dep }, &py_out); + std::string transcribe_out; + bool res = PythonWrapper::InvokeWithArgs({ "-m", "pip", "install", pip_dep }, &transcribe_out); if (!res) { - std::ostringstream py_out_oss; - py_out_oss << "Failed to install " << pip_dep << ": " << py_out << std::endl; - py_out_->AppendText(py_out_oss.str()); + std::ostringstream transcribe_out_oss; + transcribe_out_oss << "Failed to install " << pip_dep << ": " << transcribe_out << std::endl; + transcribe_out_->AppendText(transcribe_out_oss.str()); return; } } - py_out_->AppendText("Python virtual environment successfully set up!\n"); + transcribe_out_->AppendText("Python virtual environment successfully set up!\n"); } void Frame::OnDumpMics(wxCommandEvent& event) { - py_out_->AppendText(PythonWrapper::DumpMics()); + transcribe_out_->AppendText(PythonWrapper::DumpMics()); +} + +void Frame::OnGenerateFX(wxCommandEvent& event) +{ } void Frame::OnAppStart(wxCommandEvent& event) { if (py_app_) { if (wxProcess::Exists(py_app_->GetPid())) { - py_out_->AppendText("Transcription engine already running\n"); + transcribe_out_->AppendText("Transcription engine already running\n"); return; } delete py_app_; py_app_ = nullptr; } - py_out_->AppendText("Launching transcription engine\n"); + transcribe_out_->AppendText("Launching transcription engine\n"); auto cb = [&](wxProcess* proc, int ret) -> void { - std::ostringstream py_out_oss; - py_out_oss << "Transcription engine exited with code " << ret << std::endl; + std::ostringstream transcribe_out_oss; + transcribe_out_oss << "Transcription engine exited with code " << ret << std::endl; - py_out_->AppendText(py_out_oss.str()); + transcribe_out_->AppendText(transcribe_out_oss.str()); return; }; @@ -348,7 +512,7 @@ void Frame::OnAppStart(wxCommandEvent& event) { kLangChoices[which_lang].ToStdString(), kModelChoices[which_model].ToStdString()); if (!p) { - py_out_->AppendText("Failed to launch transcription engine\n"); + transcribe_out_->AppendText("Failed to launch transcription engine\n"); return; } @@ -374,11 +538,11 @@ void Frame::OnAppStop(wxCommandEvent& event) { while (wxProcess::Exists(pid)) { if (first) { first = false; - py_out_->AppendText("Timed out trying to stop transcription engine " + transcribe_out_->AppendText("Timed out trying to stop transcription engine " "cleanly, sending SIGKILL\n"); } else if (++loop_cnt % 100 == 0) { - py_out_->AppendText("Waiting for transcription engine to exit"); + transcribe_out_->AppendText("Waiting for transcription engine to exit"); } wxProcess::Kill(pid, wxSIGKILL); wxMilliSleep(10); @@ -386,10 +550,10 @@ void Frame::OnAppStop(wxCommandEvent& event) { // Since we don't process the termination event, py_app_ deletes itself! py_app_ = nullptr; - py_out_->AppendText("Stopped transcription engine\n"); + transcribe_out_->AppendText("Stopped transcription engine\n"); } else { - py_out_->AppendText("Transcription engine already stopped\n"); + transcribe_out_->AppendText("Transcription engine already stopped\n"); } } @@ -409,3 +573,15 @@ void Frame::LoadAndSetIcons() { SetIcons(icon_bundle); } +void Frame::Resize() +{ + auto frame_sz = GetBestSize(); + auto panel_sz = main_panel_->GetBestSize(); + + auto ideal_sz = panel_sz; + ideal_sz.x += frame_sz.x; + ideal_sz.y += frame_sz.y; + + this->SetSize(ideal_sz); +} + diff --git a/GUI/GUI/GUI/Frame.h b/GUI/GUI/GUI/Frame.h index e5b3ae3..ccfb931 100644 --- a/GUI/GUI/GUI/Frame.h +++ b/GUI/GUI/GUI/Frame.h @@ -1,5 +1,6 @@ #pragma once +#include #include #ifndef WX_PRECOMP @@ -16,18 +17,37 @@ public: private: wxPNGHandler png_handler_; - wxTextCtrl* py_out_; + wxPanel* main_panel_; + wxPanel* transcribe_panel_; + wxPanel* unity_panel_; + + wxTextCtrl* transcribe_out_; + wxTextCtrl* unity_out_; + + wxTextCtrl* unity_animator_generated_dir_; + wxTextCtrl* unity_animator_generated_name_; + wxTextCtrl* unity_parameters_generated_name_; + wxTextCtrl* unity_menu_generated_name_; + + wxFilePickerCtrl* unity_animator_file_picker_; + wxFilePickerCtrl* unity_parameters_file_picker_; + wxChoice* py_app_mic_; wxChoice* py_app_lang_; wxChoice* py_app_model_; + wxProcess* py_app_; void OnExit(wxCommandEvent& event); - void OnGetPythonVersion(wxCommandEvent& event); + void OnNavbarTranscribe(wxCommandEvent& event); + void OnNavbarUnity(wxCommandEvent& event); void OnSetupPython(wxCommandEvent& event); void OnDumpMics(wxCommandEvent& event); void OnAppStart(wxCommandEvent& event); void OnAppStop(wxCommandEvent& event); + void OnGenerateFX(wxCommandEvent& event); void LoadAndSetIcons(); + void Resize(); }; + diff --git a/GUI/GUI/GUI/PythonWrapper.cpp b/GUI/GUI/GUI/PythonWrapper.cpp index 6e9e0f1..71ddc4d 100644 --- a/GUI/GUI/GUI/PythonWrapper.cpp +++ b/GUI/GUI/GUI/PythonWrapper.cpp @@ -73,7 +73,8 @@ std::string PythonWrapper::GetVersion() { std::string result; bool ok = InvokeWithArgs({ "--version" }, &result); if (!ok) { - wxLogFatalError("Failed to get python version: %s", result.c_str()); + wxLogError("Failed to get python version: %s", result.c_str()); + result = ""; } return result; } @@ -83,7 +84,8 @@ std::string PythonWrapper::DumpMics() { const std::string dump_mics_path = "Resources/Scripts/dump_mic_devices.py"; bool ok = InvokeWithArgs({ dump_mics_path }, &result); if (!ok) { - wxLogFatalError("Failed to dump mic devices: %s", result.c_str()); + wxLogError("Failed to dump mic devices: %s", result.c_str()); + result = ""; } return result; } -- cgit v1.2.3