diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-08-18 23:30:42 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-08-18 23:30:42 +0100 |
| commit | fe6921ea758a84d3982180cb2a8e6d95be9cf732 (patch) | |
| tree | 6a8aefb6bdbaf3b4f7100ac24e004837dfffb536 /src/wx/system_font_dialog.cc | |
| parent | 8aeb1ed834bf6d61896b5478ba2c4529cb3fb706 (diff) | |
Add custom dialog to select system fonts on Windows (#491).
Diffstat (limited to 'src/wx/system_font_dialog.cc')
| -rw-r--r-- | src/wx/system_font_dialog.cc | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/wx/system_font_dialog.cc b/src/wx/system_font_dialog.cc new file mode 100644 index 000000000..62fd04660 --- /dev/null +++ b/src/wx/system_font_dialog.cc @@ -0,0 +1,102 @@ +/* + 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 "system_font_dialog.h" +#include "wx_util.h" +#include <wx/listctrl.h> +#include <boost/filesystem.hpp> +#include <boost/foreach.hpp> + +using std::cout; +using std::string; +using boost::optional; + +SystemFontDialog::SystemFontDialog (wxWindow* parent) + : wxDialog (parent, wxID_ANY, _("Choose a font")) +{ + wxSizer* sizer = new wxBoxSizer (wxVERTICAL); + + boost::filesystem::path fonts = "c:\\Windows\\Fonts"; + char* windir = getenv ("windir"); + if (windir) { + fonts = boost::filesystem::path (windir) / "Fonts"; + } + + for ( + boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator (fonts); + i != boost::filesystem::directory_iterator (); + ++i + ) { + + string ext = i->path().extension().string (); + transform (ext.begin(), ext.end(), ext.begin(), ::tolower); + + if (ext == ".ttf") { + _fonts.push_back (i->path()); + } + } + + sort (_fonts.begin (), _fonts.end ()); + + _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER); + _list->InsertColumn (0, wxT ("")); + _list->SetColumnWidth (0, 512); + sizer->Add (_list, 0, wxALL, DCPOMATIC_SIZER_X_GAP); + + int n = 0; + BOOST_FOREACH (boost::filesystem::path i, _fonts) { + _list->InsertItem (n++, std_to_wx (i.leaf().stem().string ())); + } + + wxSizer* buttons = CreateSeparatedButtonSizer (wxOK | wxCANCEL); + if (buttons) { + sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder()); + } + + SetSizerAndFit (sizer); + + _list->Bind (wxEVT_COMMAND_LIST_ITEM_SELECTED, boost::bind (&SystemFontDialog::setup_sensitivity, this)); + _list->Bind (wxEVT_COMMAND_LIST_ITEM_DESELECTED, boost::bind (&SystemFontDialog::setup_sensitivity, this)); + + setup_sensitivity (); +} + +optional<boost::filesystem::path> +SystemFontDialog::get_font () const +{ + int const s = _list->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + if (s == -1) { + return optional<boost::filesystem::path> (); + } + + if (s < int (_fonts.size ())) { + return _fonts[s]; + } + + return optional<boost::filesystem::path> (); +} + +void +SystemFontDialog::setup_sensitivity () +{ + wxButton* ok = dynamic_cast<wxButton *> (FindWindowById (wxID_OK, this)); + if (ok) { + ok->Enable (_list->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED) != -1); + } +} |
