Hide Font members behind accessors.
[dcpomatic.git] / src / wx / fonts_dialog.cc
1 /*
2     Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include "lib/font.h"
21 #include "lib/subtitle_content.h"
22 #include "fonts_dialog.h"
23 #include "wx_util.h"
24 #include <wx/wx.h>
25
26 using std::list;
27 using std::string;
28 using std::cout;
29 using boost::shared_ptr;
30
31 FontsDialog::FontsDialog (wxWindow* parent, shared_ptr<SubtitleContent> content)
32         : wxDialog (parent, wxID_ANY, _("Fonts"))
33         , _content (content)
34 {
35         _fonts = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (400, 200), wxLC_REPORT | wxLC_SINGLE_SEL);
36
37         {
38                 wxListItem ip;
39                 ip.SetId (0);
40                 ip.SetText (_("ID"));
41                 ip.SetWidth (100);
42                 _fonts->InsertColumn (0, ip);
43         }
44         
45         {
46                 wxListItem ip;
47                 ip.SetId (1);
48                 ip.SetText (_("Font file"));
49                 ip.SetWidth (300);
50                 _fonts->InsertColumn (1, ip);
51         }
52
53         wxBoxSizer* sizer = new wxBoxSizer (wxHORIZONTAL);
54         sizer->Add (_fonts, 1, wxEXPAND);
55
56         {
57                 wxSizer* s = new wxBoxSizer (wxVERTICAL);
58                 _set_file = new wxButton (this, wxID_ANY, _("Set file..."));
59                 s->Add (_set_file, 0, wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
60                 sizer->Add (s, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP);
61         }
62
63         wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL);
64         overall_sizer->Add (sizer, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_X_GAP);
65
66         wxSizer* buttons = CreateSeparatedButtonSizer (wxOK);
67         if (buttons) {
68                 overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
69         }
70
71         SetSizerAndFit (overall_sizer);
72
73         _set_file->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FontsDialog::set_file_clicked, this));
74         _fonts->Bind (wxEVT_COMMAND_LIST_ITEM_SELECTED, boost::bind (&FontsDialog::selection_changed, this));
75         _fonts->Bind (wxEVT_COMMAND_LIST_ITEM_DESELECTED, boost::bind (&FontsDialog::selection_changed, this));
76
77         setup ();
78         update_sensitivity ();
79 }
80
81 void
82 FontsDialog::setup ()
83 {
84         shared_ptr<SubtitleContent> content = _content.lock ();
85         if (!content) {
86                 return;
87         }
88         
89         _fonts->DeleteAllItems ();
90         list<shared_ptr<Font> > fonts = content->fonts ();
91         size_t n = 0;
92         for (list<shared_ptr<Font> >::const_iterator i = fonts.begin(); i != fonts.end(); ++i) {
93                 wxListItem item;
94                 item.SetId (n);
95                 _fonts->InsertItem (item);
96                 _fonts->SetItem (n, 0, std_to_wx ((*i)->id ()));
97                 if ((*i)->file ()) {
98                         _fonts->SetItem (n, 1, (*i)->file().get().leaf().string ());
99                 }
100                 ++n;
101         }
102 }
103
104 void
105 FontsDialog::set_file_clicked ()
106 {
107         shared_ptr<SubtitleContent> content = _content.lock ();
108         if (!content) {
109                 return;
110         }
111
112         int item = _fonts->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
113         if (item == -1) {
114                 return;
115         }
116         
117         /* The wxFD_CHANGE_DIR here prevents a `could not set working directory' error 123 on Windows when using
118            non-Latin filenames or paths.
119         */
120         wxFileDialog* d = new wxFileDialog (this, _("Choose a font file"), wxT (""), wxT (""), wxT ("*.ttf"), wxFD_CHANGE_DIR);
121         int const r = d->ShowModal ();
122
123         if (r != wxID_OK) {
124                 d->Destroy ();
125                 return;
126         }
127
128         string id = wx_to_std (_fonts->GetItemText (item, 0));
129
130         list<shared_ptr<Font> > fonts = content->fonts ();
131         for (list<shared_ptr<Font> >::iterator i = fonts.begin(); i != fonts.end(); ++i) {
132                 if ((*i)->id() == id) {
133                         (*i)->set_file (wx_to_std (d->GetPath ()));
134                 }
135         }
136
137         d->Destroy ();
138
139         setup ();
140 }
141
142 void
143 FontsDialog::selection_changed ()
144 {
145         update_sensitivity ();
146 }
147
148 void
149 FontsDialog::update_sensitivity ()
150 {
151         int const item = _fonts->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
152         _set_file->Enable (item != -1);
153 }