summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2026-02-10 00:40:40 +0100
committerCarl Hetherington <cth@carlh.net>2026-02-10 01:07:58 +0100
commitfa98ed827fa805c6d34b0f4f4e4e683a186b13c1 (patch)
tree1440199b8aba5421790556ec9d024d9b983ed139
parentb371e9946d60fa9885220d81da7b73a4ba34b3e1 (diff)
Add link button for subtitle scale.
-rw-r--r--src/wx/text_panel.cc55
-rw-r--r--src/wx/text_panel.h8
-rw-r--r--src/wx/video_panel.cc6
-rw-r--r--src/wx/wx_util.cc6
-rw-r--r--src/wx/wx_util.h1
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();
}
}