summaryrefslogtreecommitdiff
path: root/src/wx
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-11-02 22:47:57 +0000
committerCarl Hetherington <cth@carlh.net>2015-11-02 22:47:57 +0000
commit9bf2cf3509380663e6943f6b0d22dbec6002c332 (patch)
tree86999381629818072353ffb15d78f5815efabf69 /src/wx
parent8a673bcf0cd26268899face63723c0f201fabcce (diff)
Fix incorrect preview of italic subtitles (#728).
This requires fonts to be configured with their italic versions so that the italic font can be given to FontConfig and hence used to render text. Bold font configuration is also added here although bold subtitles aren't yet supported.
Diffstat (limited to 'src/wx')
-rw-r--r--src/wx/font_files_dialog.cc113
-rw-r--r--src/wx/font_files_dialog.h48
-rw-r--r--src/wx/fonts_dialog.cc132
-rw-r--r--src/wx/fonts_dialog.h7
-rw-r--r--src/wx/hints_dialog.cc8
-rw-r--r--src/wx/screen_dialog.h1
-rw-r--r--src/wx/wscript1
7 files changed, 218 insertions, 92 deletions
diff --git a/src/wx/font_files_dialog.cc b/src/wx/font_files_dialog.cc
new file mode 100644
index 000000000..080a8ebc6
--- /dev/null
+++ b/src/wx/font_files_dialog.cc
@@ -0,0 +1,113 @@
+/*
+ Copyright (C) 2015 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "font_files_dialog.h"
+#include "system_font_dialog.h"
+
+using boost::bind;
+
+FontFilesDialog::FontFilesDialog (wxWindow* parent, FontFiles files)
+#ifdef DCPOMATIC_WINDOWS
+ : TableDialog (parent, _("Fonts"), 4, 1, true)
+#else
+ : TableDialog (parent, _("Fonts"), 3, 1, true)
+#endif
+ , _files (files)
+{
+ wxString labels[] = {
+ _("Normal font"),
+ _("Italic font"),
+ _("Bold font")
+ };
+
+ DCPOMATIC_ASSERT (FontFiles::VARIANTS == 3);
+
+ for (int i = 0; i < FontFiles::VARIANTS; ++i) {
+ add (labels[i], true);
+ _name[i] = new wxStaticText (
+ this, wxID_ANY,
+ std_to_wx(_files.get(static_cast<FontFiles::Variant>(i)).get_value_or("").string()),
+ wxDefaultPosition,
+ wxSize (200, -1)
+ );
+ _table->Add (_name[i], 1, wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 6);
+ add (_set_file[i] = new wxButton (this, wxID_ANY, _("Set from file...")));
+ _set_file[i]->Bind (wxEVT_COMMAND_BUTTON_CLICKED, bind (&FontFilesDialog::set_from_file_clicked, this, static_cast<FontFiles::Variant>(i)));
+#ifdef DCPOMATIC_WINDOWS
+ add (_set_system[i] = new wxButton (this, wxID_ANY, _("Set from system font...")));
+ _set_system[i]->Bind (wxEVT_COMMAND_BUTTON_CLICKED, bind (&FontFilesDialog::set_from_system_clicked, this, static_cast<FontFiles::Variant>(i)));
+#endif
+ }
+
+ layout ();
+}
+
+void
+FontFilesDialog::set_from_file_clicked (FontFiles::Variant variant)
+{
+ /* The wxFD_CHANGE_DIR here prevents a `could not set working directory' error 123 on Windows when using
+ non-Latin filenames or paths.
+ */
+ wxString default_dir = "";
+#ifdef DCPOMATIC_LINUX
+ if (boost::filesystem::exists ("/usr/share/fonts/truetype")) {
+ default_dir = "/usr/share/fonts/truetype";
+ } else {
+ default_dir = "/usr/share/fonts";
+ }
+#endif
+#ifdef DCPOMATIC_OSX
+ default_dir = "/System/Library/Fonts";
+#endif
+
+ wxFileDialog* d = new wxFileDialog (this, _("Choose a font file"), default_dir, wxT (""), wxT ("*.ttf"), wxFD_CHANGE_DIR);
+ int const r = d->ShowModal ();
+
+ if (r != wxID_OK) {
+ d->Destroy ();
+ return;
+ }
+
+ set (variant, wx_to_std (d->GetPath ()));
+ d->Destroy ();
+}
+
+#ifdef DCPOMATIC_WINDOWS
+void
+FontFilesDialog::set_from_system_clicked (FontFiles::Variant variant)
+{
+ SystemFontDialog* d = new SystemFontDialog (this);
+ int const r = d->ShowModal ();
+
+ if (r != wxID_OK) {
+ d->Destroy ();
+ return;
+ }
+
+ set (variant, d->get_font().get());
+ d->Destroy ();
+}
+#endif
+
+void
+FontFilesDialog::set (FontFiles::Variant variant, boost::filesystem::path path)
+{
+ _files.set (variant, path);
+ _name[variant]->SetLabel (std_to_wx (path.leaf().string()));
+}
diff --git a/src/wx/font_files_dialog.h b/src/wx/font_files_dialog.h
new file mode 100644
index 000000000..dd53cd5ab
--- /dev/null
+++ b/src/wx/font_files_dialog.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2015 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "table_dialog.h"
+#include "wx_util.h"
+#include "lib/font_files.h"
+
+class FontFilesDialog : public TableDialog
+{
+public:
+ FontFilesDialog (wxWindow* parent, FontFiles files);
+
+ FontFiles get () const {
+ return _files;
+ }
+
+private:
+ void set_from_file_clicked (FontFiles::Variant variant);
+#ifdef DCPOMATIC_WINDOWS
+ void set_from_system_clicked (FontFiles::Variant variant);
+#endif
+ void set (FontFiles::Variant variant, boost::filesystem::path path);
+
+ FontFiles _files;
+
+ wxStaticText* _name[FontFiles::VARIANTS];
+ wxButton* _set_file[FontFiles::VARIANTS];
+
+#ifdef DCPOMATIC_WINDOWS
+ wxButton* _set_system[FontFiles::VARIANTS];
+#endif
+};
diff --git a/src/wx/fonts_dialog.cc b/src/wx/fonts_dialog.cc
index ff5b107c9..b79580d7c 100644
--- a/src/wx/fonts_dialog.cc
+++ b/src/wx/fonts_dialog.cc
@@ -20,6 +20,7 @@
#include "fonts_dialog.h"
#include "wx_util.h"
#include "system_font_dialog.h"
+#include "font_files_dialog.h"
#include "lib/font.h"
#include "lib/subtitle_content.h"
#include <wx/wx.h>
@@ -34,9 +35,8 @@ using boost::shared_ptr;
FontsDialog::FontsDialog (wxWindow* parent, shared_ptr<SubtitleContent> content)
: wxDialog (parent, wxID_ANY, _("Fonts"))
, _content (content)
- , _set_from_system (0)
{
- _fonts = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (400, 200), wxLC_REPORT | wxLC_SINGLE_SEL);
+ _fonts = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (550, 200), wxLC_REPORT | wxLC_SINGLE_SEL);
{
wxListItem ip;
@@ -49,25 +49,33 @@ FontsDialog::FontsDialog (wxWindow* parent, shared_ptr<SubtitleContent> content)
{
wxListItem ip;
ip.SetId (1);
- ip.SetText (_("Font file"));
- ip.SetWidth (300);
+ ip.SetText (_("Normal file"));
+ ip.SetWidth (150);
_fonts->InsertColumn (1, ip);
}
- wxBoxSizer* sizer = new wxBoxSizer (wxHORIZONTAL);
- sizer->Add (_fonts, 1, wxEXPAND);
+ {
+ wxListItem ip;
+ ip.SetId (2);
+ ip.SetText (_("Italic file"));
+ ip.SetWidth (150);
+ _fonts->InsertColumn (2, ip);
+ }
{
- wxSizer* s = new wxBoxSizer (wxVERTICAL);
- _set_from_file = new wxButton (this, wxID_ANY, _("Set from .ttf file..."));
- s->Add (_set_from_file, 0, wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
-#ifdef DCPOMATIC_WINDOWS
- _set_from_system = new wxButton (this, wxID_ANY, _("Set from system font..."));
- s->Add (_set_from_system, 0, wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
-#endif
- sizer->Add (s, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP);
+ wxListItem ip;
+ ip.SetId (3);
+ ip.SetText (_("Bold file"));
+ ip.SetWidth (150);
+ _fonts->InsertColumn (3, ip);
}
+ wxBoxSizer* sizer = new wxBoxSizer (wxHORIZONTAL);
+ sizer->Add (_fonts, 1, wxEXPAND | wxLEFT | wxRIGHT, DCPOMATIC_SIZER_X_GAP);
+
+ _edit = new wxButton (this, wxID_ANY, _("Edit..."));
+ sizer->Add (_edit, 0, wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
+
wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL);
overall_sizer->Add (sizer, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_X_GAP);
@@ -78,10 +86,7 @@ FontsDialog::FontsDialog (wxWindow* parent, shared_ptr<SubtitleContent> content)
SetSizerAndFit (overall_sizer);
- _set_from_file->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FontsDialog::set_from_file_clicked, this));
- if (_set_from_system) {
- _set_from_system->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FontsDialog::set_from_system_clicked, this));
- }
+ _edit->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FontsDialog::edit_clicked, this));
_fonts->Bind (wxEVT_COMMAND_LIST_ITEM_SELECTED, boost::bind (&FontsDialog::selection_changed, this));
_fonts->Bind (wxEVT_COMMAND_LIST_ITEM_DESELECTED, boost::bind (&FontsDialog::selection_changed, this));
@@ -97,15 +102,14 @@ FontsDialog::setup ()
}
_fonts->DeleteAllItems ();
- list<shared_ptr<Font> > fonts = content->fonts ();
size_t n = 0;
- for (list<shared_ptr<Font> >::const_iterator i = fonts.begin(); i != fonts.end(); ++i) {
+ BOOST_FOREACH (shared_ptr<Font> i, content->fonts ()) {
wxListItem item;
item.SetId (n);
_fonts->InsertItem (item);
- _fonts->SetItem (n, 0, std_to_wx ((*i)->id ()));
- if ((*i)->file ()) {
- _fonts->SetItem (n, 1, (*i)->file().get().leaf().string ());
+ _fonts->SetItem (n, 0, std_to_wx (i->id ()));
+ if (i->file(FontFiles::NORMAL)) {
+ _fonts->SetItem (n, 1, i->file(FontFiles::NORMAL).get().leaf().string ());
}
++n;
}
@@ -114,86 +118,44 @@ FontsDialog::setup ()
}
void
-FontsDialog::set_from_file_clicked ()
+FontsDialog::selection_changed ()
{
- /* The wxFD_CHANGE_DIR here prevents a `could not set working directory' error 123 on Windows when using
- non-Latin filenames or paths.
- */
- wxString default_dir = "";
-#ifdef DCPOMATIC_LINUX
- if (boost::filesystem::exists ("/usr/share/fonts/truetype")) {
- default_dir = "/usr/share/fonts/truetype";
- } else {
- default_dir = "/usr/share/fonts";
- }
-#endif
-#ifdef DCPOMATIC_OSX
- default_dir = "/System/Library/Fonts";
-#endif
-
- wxFileDialog* d = new wxFileDialog (this, _("Choose a font file"), default_dir, wxT (""), wxT ("*.ttf"), wxFD_CHANGE_DIR);
- int const r = d->ShowModal ();
-
- if (r != wxID_OK) {
- d->Destroy ();
- return;
- }
-
- set_selected_font_file (wx_to_std (d->GetPath ()));
- d->Destroy ();
+ setup_sensitivity ();
}
void
-FontsDialog::set_from_system_clicked ()
+FontsDialog::setup_sensitivity ()
{
- SystemFontDialog* d = new SystemFontDialog (this);
- int const r = d->ShowModal ();
-
- if (r != wxID_OK) {
- d->Destroy ();
- return;
- }
-
- set_selected_font_file (d->get_font().get ());
- d->Destroy ();
+ int const item = _fonts->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
+ _edit->Enable (item != -1);
}
void
-FontsDialog::set_selected_font_file (boost::filesystem::path file)
+FontsDialog::edit_clicked ()
{
shared_ptr<SubtitleContent> content = _content.lock ();
if (!content) {
return;
}
- int item = _fonts->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- if (item == -1) {
- return;
- }
-
- string id = wx_to_std (_fonts->GetItemText (item, 0));
-
- BOOST_FOREACH (shared_ptr<Font> i, content->fonts ()) {
+ int const item = _fonts->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
+ string const id = wx_to_std (_fonts->GetItemText (item, 0));
+ shared_ptr<Font> font;
+ BOOST_FOREACH (shared_ptr<Font> i, content->fonts()) {
if (i->id() == id) {
- i->set_file (file);
+ font = i;
}
}
- setup ();
-}
-
-void
-FontsDialog::selection_changed ()
-{
- setup_sensitivity ();
-}
+ if (!font) {
+ return;
+ }
-void
-FontsDialog::setup_sensitivity ()
-{
- int const item = _fonts->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- _set_from_file->Enable (item != -1);
- if (_set_from_system) {
- _set_from_system->Enable (item != -1);
+ FontFilesDialog* d = new FontFilesDialog (this, font->files ());
+ if (d->ShowModal () == wxID_OK) {
+ font->set_files (d->get ());
}
+ d->Destroy ();
+
+ setup ();
}
diff --git a/src/wx/fonts_dialog.h b/src/wx/fonts_dialog.h
index 26c2a5eaa..e04dc9937 100644
--- a/src/wx/fonts_dialog.h
+++ b/src/wx/fonts_dialog.h
@@ -32,14 +32,11 @@ public:
private:
void setup ();
- void set_from_file_clicked ();
- void set_from_system_clicked ();
void setup_sensitivity ();
void selection_changed ();
- void set_selected_font_file (boost::filesystem::path file);
+ void edit_clicked ();
boost::weak_ptr<SubtitleContent> _content;
wxListCtrl* _fonts;
- wxButton* _set_from_file;
- wxButton* _set_from_system;
+ wxButton* _edit;
};
diff --git a/src/wx/hints_dialog.cc b/src/wx/hints_dialog.cc
index e15263670..a63c6be62 100644
--- a/src/wx/hints_dialog.cc
+++ b/src/wx/hints_dialog.cc
@@ -28,6 +28,7 @@
#include <boost/foreach.hpp>
using boost::shared_ptr;
+using boost::optional;
using boost::dynamic_pointer_cast;
HintsDialog::HintsDialog (wxWindow* parent, boost::weak_ptr<Film> film)
@@ -79,8 +80,11 @@ HintsDialog::film_changed ()
shared_ptr<SubtitleContent> s = dynamic_pointer_cast<SubtitleContent> (i);
if (s) {
BOOST_FOREACH (shared_ptr<Font> j, s->fonts ()) {
- if (j->file() && boost::filesystem::file_size (j->file().get ()) >= (640 * 1024)) {
- big_font_files = true;
+ for (int i = 0; i < FontFiles::VARIANTS; ++i) {
+ optional<boost::filesystem::path> const p = j->file (static_cast<FontFiles::Variant> (i));
+ if (p && boost::filesystem::file_size (p.get()) >= (640 * 1024)) {
+ big_font_files = true;
+ }
}
}
}
diff --git a/src/wx/screen_dialog.h b/src/wx/screen_dialog.h
index c88b3bb31..66f3f422f 100644
--- a/src/wx/screen_dialog.h
+++ b/src/wx/screen_dialog.h
@@ -21,6 +21,7 @@
#include <dcp/certificate.h>
#include <wx/wx.h>
#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
class Progress;
diff --git a/src/wx/wscript b/src/wx/wscript
index 346d292c6..d2bf33cd3 100644
--- a/src/wx/wscript
+++ b/src/wx/wscript
@@ -51,6 +51,7 @@ sources = """
filter_dialog.cc
filter_editor.cc
fonts_dialog.cc
+ font_files_dialog.cc
gain_calculator_dialog.cc
hints_dialog.cc
job_view.cc