diff options
| author | Carl Hetherington <cth@carlh.net> | 2026-02-10 00:40:40 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2026-02-10 01:07:58 +0100 |
| commit | fa98ed827fa805c6d34b0f4f4e4e683a186b13c1 (patch) | |
| tree | 1440199b8aba5421790556ec9d024d9b983ed139 /src/wx | |
| parent | b371e9946d60fa9885220d81da7b73a4ba34b3e1 (diff) | |
Add link button for subtitle scale.
Diffstat (limited to 'src/wx')
| -rw-r--r-- | src/wx/text_panel.cc | 55 | ||||
| -rw-r--r-- | src/wx/text_panel.h | 8 | ||||
| -rw-r--r-- | src/wx/video_panel.cc | 6 | ||||
| -rw-r--r-- | src/wx/wx_util.cc | 6 | ||||
| -rw-r--r-- | src/wx/wx_util.h | 1 |
5 files changed, 60 insertions, 16 deletions
diff --git a/src/wx/text_panel.cc b/src/wx/text_panel.cc index 6fef885f1..b7ae439d1 100644 --- a/src/wx/text_panel.cc +++ b/src/wx/text_panel.cc @@ -53,6 +53,7 @@ #include <dcp/warnings.h> LIBDCP_DISABLE_WARNINGS #include <wx/spinctrl.h> +#include <wx/tglbtn.h> LIBDCP_ENABLE_WARNINGS @@ -95,12 +96,15 @@ TextPanel::create () _scale_label = create_label (this, _("Scale"), true); _x_scale_label = create_label (this, _("X"), true); - _x_scale = new SpinCtrl(this); + _x_scale = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(dcpomatic::wx::linked_value_width(), -1)); _x_scale_pc_label = new StaticText (this, _("%")); _y_scale_label = create_label (this, S_("Coord|Y"), true); - _y_scale = new SpinCtrl(this); + _y_scale = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(dcpomatic::wx::linked_value_width(), -1)); _y_scale_pc_label = new StaticText (this, _("%")); + _link = new wxToggleButton(this, wxID_ANY, {}, wxDefaultPosition, dcpomatic::wx::link_size(this)); + _link->SetBitmap(wxBitmap(dcpomatic::wx::link_bitmap_path(), wxBITMAP_TYPE_PNG)); + _line_spacing_label = create_label (this, _("Line spacing"), true); _line_spacing = new SpinCtrl(this); _line_spacing_pc_label = new StaticText (this, _("%")); @@ -125,6 +129,7 @@ TextPanel::create () _y_offset->Bind (wxEVT_SPINCTRL, boost::bind (&TextPanel::y_offset_changed, this)); _x_scale->Bind (wxEVT_SPINCTRL, boost::bind (&TextPanel::x_scale_changed, this)); _y_scale->Bind (wxEVT_SPINCTRL, boost::bind (&TextPanel::y_scale_changed, this)); + _link->Bind (wxEVT_TOGGLEBUTTON, boost::bind(&TextPanel::link_clicked, this)); _line_spacing->Bind (wxEVT_SPINCTRL, boost::bind (&TextPanel::line_spacing_changed, this)); _stream->Bind (wxEVT_CHOICE, boost::bind (&TextPanel::stream_changed, this)); _text_view_button->Bind (wxEVT_BUTTON, boost::bind (&TextPanel::text_view_clicked, this)); @@ -222,10 +227,10 @@ TextPanel::add_to_grid () auto use = new wxBoxSizer (wxHORIZONTAL); use->Add (_use, 0, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP); use->Add (_type, 1, wxEXPAND, 0); - _grid->Add (use, wxGBPosition (r, 0), wxGBSpan (1, 2)); + _grid->Add(use, wxGBPosition(r, 0), wxGBSpan(1, 3)); ++r; - _grid->Add (_burn, wxGBPosition (r, 0), wxGBSpan (1, 2)); + _grid->Add(_burn, wxGBPosition(r, 0), wxGBSpan(1, 3)); ++r; _outline_subtitles_row = r; @@ -235,11 +240,16 @@ TextPanel::add_to_grid () auto offset = new wxBoxSizer (wxHORIZONTAL); add_label_to_sizer (offset, _x_offset_label, true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); offset->Add (_x_offset, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP); - offset->Add (_x_offset_pc_label, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP * 2); #ifdef __WXGTK3__ + offset->Add (_x_offset_pc_label, 0, wxALIGN_CENTER_VERTICAL); _grid->Add (offset, wxGBPosition(r, 1)); ++r; offset = new wxBoxSizer (wxHORIZONTAL); +#else + offset->Add(_x_offset_pc_label, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP); + /* Pad so that Y scale aligns with Y offset even though there's no link button for scale */ + auto padding = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, dcpomatic::wx::link_size(this)); + offset->Add(padding, 0, 0); #endif add_label_to_sizer (offset, _y_offset_label, true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); offset->Add (_y_offset, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP); @@ -251,15 +261,19 @@ TextPanel::add_to_grid () auto scale = new wxBoxSizer (wxHORIZONTAL); add_label_to_sizer (scale, _x_scale_label, true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); scale->Add (_x_scale, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP); - scale->Add (_x_scale_pc_label, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP * 2); #ifdef __WXGTK3__ + scale->Add (_x_scale_pc_label, 0, wxALIGN_CENTER_VERTICAL); _grid->Add (scale, wxGBPosition(r, 1)); + _grid->Add(_link, wxGBPosition(r, 2), wxGBSpan(2, 1), wxALIGN_CENTER_VERTICAL); ++r; scale = new wxBoxSizer (wxHORIZONTAL); +#else + scale->Add (_x_scale_pc_label, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP); + scale->Add(_link, 0, wxALIGN_CENTER_VERTICAL); #endif add_label_to_sizer (scale, _y_scale_label, true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); scale->Add (_y_scale, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP); - add_label_to_sizer (scale, _y_scale_pc_label, false, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL); + add_label_to_sizer(scale, _y_scale_pc_label, false, 0, wxALIGN_CENTER_VERTICAL); _grid->Add (scale, wxGBPosition (r, 1)); ++r; @@ -286,7 +300,7 @@ TextPanel::add_to_grid () s->Add (_fonts_dialog_button, 0, wxALL, DCPOMATIC_SIZER_GAP); s->Add (_appearance_dialog_button, 0, wxALL, DCPOMATIC_SIZER_GAP); - _grid->Add (s, wxGBPosition(r, 0), wxGBSpan(1, 2)); + _grid->Add(s, wxGBPosition(r, 0), wxGBSpan(1, 3)); ++r; } @@ -649,8 +663,13 @@ TextPanel::y_offset_changed () void TextPanel::x_scale_changed () { + _x_changed_last = true; for (auto i: _parent->selected_text ()) { - i->text_of_original_type(_original_type)->set_x_scale (_x_scale->GetValue() / 100.0); + auto text = i->text_of_original_type(_original_type); + text->set_x_scale(_x_scale->GetValue() / 100.0); + if (_link->GetValue()) { + text->set_y_scale(_x_scale->GetValue() / 100.0); + } } } @@ -658,8 +677,13 @@ TextPanel::x_scale_changed () void TextPanel::y_scale_changed () { + _x_changed_last = false; for (auto i: _parent->selected_text ()) { - i->text_of_original_type(_original_type)->set_y_scale (_y_scale->GetValue() / 100.0); + auto text = i->text_of_original_type(_original_type); + text->set_y_scale(_y_scale->GetValue() / 100.0); + if (_link->GetValue()) { + text->set_x_scale(_y_scale->GetValue() / 100.0); + } } } @@ -874,3 +898,14 @@ TextPanel::language_is_additional_changed () } } + +void +TextPanel::link_clicked() +{ + if (_x_changed_last) { + x_scale_changed(); + } else { + y_scale_changed(); + } +} + diff --git a/src/wx/text_panel.h b/src/wx/text_panel.h index 3c6e183dc..a4ba07876 100644 --- a/src/wx/text_panel.h +++ b/src/wx/text_panel.h @@ -52,6 +52,7 @@ private: void y_offset_changed (); void x_scale_changed (); void y_scale_changed (); + void link_clicked(); void line_spacing_changed (); void dcp_track_changed (); void stream_changed (); @@ -90,8 +91,9 @@ private: wxStaticText* _x_scale_pc_label; wxStaticText* _y_scale_label; wxStaticText* _y_scale_pc_label; - SpinCtrl* _x_scale; - SpinCtrl* _y_scale; + wxSpinCtrl* _x_scale; + wxSpinCtrl* _y_scale; + wxToggleButton* _link; wxStaticText* _line_spacing_label; wxStaticText* _line_spacing_pc_label; SpinCtrl* _line_spacing; @@ -113,6 +115,8 @@ private: int _outline_subtitles_row; int _ccap_track_or_language_row; + bool _x_changed_last = false; + std::weak_ptr<Content> _analysis_content; boost::signals2::scoped_connection _analysis_finished_connection; std::shared_ptr<SubtitleAnalysis> _analysis; diff --git a/src/wx/video_panel.cc b/src/wx/video_panel.cc index 7842f0266..771d3e2b7 100644 --- a/src/wx/video_panel.cc +++ b/src/wx/video_panel.cc @@ -101,10 +101,8 @@ VideoPanel::create() boost::bind(&VideoPanel::left_crop_changed, this) ); - auto const link_path = bitmap_path(gui_is_dark() ? "link_white.png" : "link_black.png"); - _left_right_link = new wxToggleButton(this, wxID_ANY, {}, wxDefaultPosition, dcpomatic::wx::link_size(this)); - _left_right_link->SetBitmap(wxBitmap(link_path, wxBITMAP_TYPE_PNG)); + _left_right_link->SetBitmap(wxBitmap(dcpomatic::wx::link_bitmap_path(), wxBITMAP_TYPE_PNG)); _right_crop_label = create_label(this, _("Right"), true); _right_crop = new ContentSpinCtrl<VideoContent>( @@ -129,7 +127,7 @@ VideoPanel::create() ); _top_bottom_link = new wxToggleButton(this, wxID_ANY, {}, wxDefaultPosition, dcpomatic::wx::link_size(this)); - _top_bottom_link->SetBitmap(wxBitmap(link_path, wxBITMAP_TYPE_PNG)); + _top_bottom_link->SetBitmap(wxBitmap(dcpomatic::wx::link_bitmap_path(), wxBITMAP_TYPE_PNG)); _bottom_crop_label = create_label(this, _("Bottom"), true); _bottom_crop = new ContentSpinCtrl<VideoContent>( diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc index 4e5f77d33..8d21a3e63 100644 --- a/src/wx/wx_util.cc +++ b/src/wx/wx_util.cc @@ -776,3 +776,9 @@ dcpomatic::wx::link_size(wxWindow*) #endif +wxString +dcpomatic::wx::link_bitmap_path() +{ + return bitmap_path(gui_is_dark() ? "link_white.png" : "link_black.png"); +} + diff --git a/src/wx/wx_util.h b/src/wx/wx_util.h index 9ca9c7888..6f84705fb 100644 --- a/src/wx/wx_util.h +++ b/src/wx/wx_util.h @@ -144,6 +144,7 @@ namespace wx { extern wxString report_problem(); extern int linked_value_width(); extern wxSize link_size(wxWindow* parent); + extern wxString link_bitmap_path(); } } |
