diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index be7c492a3e..63e27cce8f 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -31,6 +31,7 @@ set(SLIC3R_GUI_SOURCES GUI/ConfigSnapshotDialog.hpp GUI/3DScene.cpp GUI/3DScene.hpp + GUI/Accessibility.cpp GUI/format.hpp GUI/GLShadersManager.hpp GUI/GLShadersManager.cpp diff --git a/src/slic3r/GUI/Accessibility.cpp b/src/slic3r/GUI/Accessibility.cpp new file mode 100644 index 0000000000..aa028cc978 --- /dev/null +++ b/src/slic3r/GUI/Accessibility.cpp @@ -0,0 +1,27 @@ +///|/ Copyright (c) Prusa Research 2023 Dawid Pieper @dawidpieper +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ + +#include + +#include "Accessibility.hpp" + +namespace Slic3r { namespace GUI { + + wxString Accessibility::GetLastLabelString() {return Accessibility::sLastLabel;} + + void Accessibility::SetNextLabelString(wxString labelString) { + Accessibility::sLastLabel = labelString.Clone(); + Accessibility::bLabelAvailable = true; + } + + void Accessibility::ClearLabelString() { + Accessibility::sLastLabel = ""; + Accessibility::bLabelAvailable = false; + } + + bool Accessibility::IsLabelAvailable() {return Accessibility::bLabelAvailable;} + + } // GUI +} // Slic3r diff --git a/src/slic3r/GUI/Accessibility.hpp b/src/slic3r/GUI/Accessibility.hpp new file mode 100644 index 0000000000..6bf76bee1c --- /dev/null +++ b/src/slic3r/GUI/Accessibility.hpp @@ -0,0 +1,29 @@ +///|/ Copyright (c) Prusa Research 2023 Dawid Pieper @dawidpieper +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef SLIC3R_GUI_ACCESSIBILITY_HPP +#define SLIC3R_GUI_ACCESSIBILITY_HPP + +#include + +namespace Slic3r { namespace GUI { + + class Accessibility { + + public: + static wxString GetLastLabelString(); + static void SetNextLabelString(wxString labelString); + static void ClearLabelString(); + static bool IsLabelAvailable(); + + private: + inline static wxString sLastLabel = ""; + inline static bool bLabelAvailable = false; + + }; + + } // GUI +} // Slic3r + +#endif /* SLIC3R_GUI_ACCESSIBILITY_HPP */ diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index eb5860b451..1fc820b557 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -18,6 +18,7 @@ #include "OG_CustomCtrl.hpp" #include "MsgDialog.hpp" #include "format.hpp" +#include "Accessibility.hpp" #include #include @@ -125,6 +126,8 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co this->back_to_sys_value(opt_id); }; + Accessibility::ClearLabelString(); + // assign function objects for callbacks, etc. return field; } @@ -256,6 +259,7 @@ void OptionsGroup::append_separator() void OptionsGroup::activate_line(Line& line) { + if(!line.label.IsEmpty()) Accessibility::SetNextLabelString(line.label); if (line.is_separator()) return; diff --git a/src/slic3r/GUI/Widgets/BitmapToggleButton.cpp b/src/slic3r/GUI/Widgets/BitmapToggleButton.cpp index ccb6b42f54..b567bc5433 100644 --- a/src/slic3r/GUI/Widgets/BitmapToggleButton.cpp +++ b/src/slic3r/GUI/Widgets/BitmapToggleButton.cpp @@ -6,7 +6,7 @@ BitmapToggleButton::BitmapToggleButton(wxWindow* parent, const wxString& label, { const long style = wxBORDER_NONE | wxBU_EXACTFIT | wxBU_LEFT; if (label.IsEmpty()) - wxBitmapToggleButton::Create(parent, id, wxNullBitmap, wxDefaultPosition, wxDefaultSize, style); + wxBitmapToggleButton::Create(parent, id, wxNullBitmap, wxDefaultPosition, wxDefaultSize, style | wxBU_NOTEXT); else { #ifdef __WXGTK3__ wxSize label_size = parent->GetTextExtent(label); @@ -15,7 +15,7 @@ BitmapToggleButton::BitmapToggleButton(wxWindow* parent, const wxString& label, wxSize def_size = wxDefaultSize; #endif // Call Create() from wxToggleButton instead of wxBitmapToggleButton to allow add Label text under Linux - wxToggleButton::Create(parent, id, label, wxDefaultPosition, def_size, style); + wxToggleButton::Create(parent, id, label, wxDefaultPosition, def_size, style | wxBU_NOTEXT); } #ifdef __WXMSW__ diff --git a/src/slic3r/GUI/Widgets/CheckBox.cpp b/src/slic3r/GUI/Widgets/CheckBox.cpp index 618c9a9ccd..54407c132f 100644 --- a/src/slic3r/GUI/Widgets/CheckBox.cpp +++ b/src/slic3r/GUI/Widgets/CheckBox.cpp @@ -1,4 +1,5 @@ #include "CheckBox.hpp" +#include "slic3r/GUI/Accessibility.hpp" //#include "../wxExtensions.hpp" @@ -13,6 +14,11 @@ CheckBox::CheckBox(wxWindow* parent, const wxString& name) , m_on_focused(this, "check_on_focused", px_cnt) , m_off_focused(this, "check_off_focused", px_cnt) { + if(Slic3r::GUI::Accessibility::IsLabelAvailable()) + m_accessibility_label = Slic3r::GUI::Accessibility::GetLastLabelString(); + else + m_accessibility_label = ""; + #ifdef __WXOSX__ // State not fully implement on MacOS Bind(wxEVT_SET_FOCUS, &CheckBox::updateBitmap, this); Bind(wxEVT_KILL_FOCUS, &CheckBox::updateBitmap, this); @@ -57,6 +63,8 @@ void CheckBox::update() if (GetBitmapMargins().GetWidth() == 0 && !GetLabelText().IsEmpty()) SetBitmapMargins(4, 0); update_size(); + + this->SetLabel(m_accessibility_label+((val)?(" X"):(""))); } #ifdef __WXMSW__ diff --git a/src/slic3r/GUI/Widgets/CheckBox.hpp b/src/slic3r/GUI/Widgets/CheckBox.hpp index 727bbce9b5..d220c30325 100644 --- a/src/slic3r/GUI/Widgets/CheckBox.hpp +++ b/src/slic3r/GUI/Widgets/CheckBox.hpp @@ -40,6 +40,8 @@ private: ScalableBitmap m_off_disabled; ScalableBitmap m_on_focused; ScalableBitmap m_off_focused; + + wxString m_accessibility_label; }; #endif // !slic3r_GUI_CheckBox_hpp_ diff --git a/src/slic3r/GUI/Widgets/SpinInput.cpp b/src/slic3r/GUI/Widgets/SpinInput.cpp index 0456d1a067..0671f839e2 100644 --- a/src/slic3r/GUI/Widgets/SpinInput.cpp +++ b/src/slic3r/GUI/Widgets/SpinInput.cpp @@ -4,6 +4,7 @@ #include "UIColors.hpp" #include "../GUI_App.hpp" +#include "../Accessibility.hpp" #include #include @@ -286,6 +287,10 @@ void SpinInput::Create(wxWindow *parent, state_handler.attach({&label_color, &text_color}); state_handler.update_binds(); + if(Slic3r::GUI::Accessibility::IsLabelAvailable()) + wxStaticText *virtualLabel = new wxStaticText( + this, wxID_ANY, Slic3r::GUI::Accessibility::GetLastLabelString(), wxDefaultPosition, wxSize(0, 0), wxST_NO_AUTORESIZE + ); text_ctrl = new wxTextCtrl(this, wxID_ANY, text, {20, 4}, wxDefaultSize, style | wxBORDER_NONE | wxTE_PROCESS_ENTER, wxTextValidator(wxFILTER_NUMERIC)); #ifdef __WXOSX__ text_ctrl->OSXDisableAllSmartSubstitutions(); diff --git a/src/slic3r/GUI/Widgets/TextInput.cpp b/src/slic3r/GUI/Widgets/TextInput.cpp index b4f1b1a707..e6538e30dd 100644 --- a/src/slic3r/GUI/Widgets/TextInput.cpp +++ b/src/slic3r/GUI/Widgets/TextInput.cpp @@ -5,6 +5,7 @@ #include #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Accessibility.hpp" BEGIN_EVENT_TABLE(TextInput, wxPanel) @@ -56,6 +57,11 @@ void TextInput::Create(wxWindow * parent, state_handler.attach({&label_color, &text_color}); state_handler.update_binds(); + if(Slic3r::GUI::Accessibility::IsLabelAvailable()) + wxStaticText *virtualLabel = new wxStaticText( + this, wxID_ANY, Slic3r::GUI::Accessibility::GetLastLabelString(), wxDefaultPosition, wxSize(0, 0), wxST_NO_AUTORESIZE + ); + text_ctrl = new wxTextCtrl(this, wxID_ANY, text, {4, 4}, size, style | wxBORDER_NONE); #ifdef __WXOSX__ text_ctrl->OSXDisableAllSmartSubstitutions();