X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fwx_util.cc;h=db63400315e899cb1488705dffa3dda15adad12d;hb=ce9bb37168f52a8d1348e1334fc15d5778fffa75;hp=3d37c373b0aee49177c5a55397a54ebd8dc98161;hpb=1d68fe1e3ad1a9aa85fa7fc6071a0b8c64973953;p=dcpomatic.git diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc index 3d37c373b..db6340031 100644 --- a/src/wx/wx_util.cc +++ b/src/wx/wx_util.cc @@ -1,19 +1,20 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic 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, + DCP-o-matic 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. + along with DCP-o-matic. If not, see . */ @@ -21,15 +22,35 @@ * @brief Some utility functions and classes. */ -#include -#include -#include +#include "wx_util.h" +#include "file_picker_ctrl.h" #include "lib/config.h" #include "lib/util.h" -#include "wx_util.h" +#include "lib/cross.h" +#include +#include +#include +#include +#include using namespace std; using namespace boost; +using dcp::locale_convert; + +wxStaticText * +#ifdef __WXOSX__ +create_label (wxWindow* p, wxString t, bool left) +#else +create_label (wxWindow* p, wxString t, bool) +#endif +{ +#ifdef __WXOSX__ + if (left) { + t += wxT (":"); + } +#endif + return new wxStaticText (p, wxID_ANY, t); +} /** Add a wxStaticText to a wxSizer, aligning it at vertical centre. * @param s Sizer to add to. @@ -39,42 +60,82 @@ using namespace boost; * of label which should be right-aligned on OS X. * @param prop Proportion to pass when calling Add() on the wxSizer. */ +wxStaticText * +add_label_to_sizer (wxSizer* s, wxWindow* p, wxString t, bool left, int prop, int flags) +{ +#ifdef __WXOSX__ + if (left) { + flags |= wxALIGN_RIGHT; + } +#endif + wxStaticText* m = create_label (p, t, left); + s->Add (m, prop, flags, 6); + return m; +} + wxStaticText * #ifdef __WXOSX__ -add_label_to_sizer (wxSizer* s, wxWindow* p, wxString t, bool left, int prop) +add_label_to_sizer (wxSizer* s, wxStaticText* t, bool left, int prop, int flags) #else -add_label_to_sizer (wxSizer* s, wxWindow* p, wxString t, bool, int prop) +add_label_to_sizer (wxSizer* s, wxStaticText* t, bool, int prop, int flags) #endif +{ +#ifdef __WXOSX__ + if (left) { + flags |= wxALIGN_RIGHT; + } +#endif + s->Add (t, prop, flags, 6); + return t; +} + +wxStaticText * +add_label_to_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool left, wxGBPosition pos, wxGBSpan span) { int flags = wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT; #ifdef __WXOSX__ if (left) { flags |= wxALIGN_RIGHT; - t += wxT (":"); } #endif - wxStaticText* m = new wxStaticText (p, wxID_ANY, t); - s->Add (m, prop, flags, 6); + wxStaticText* m = create_label (p, t, left); + s->Add (m, pos, span, flags); return m; } wxStaticText * #ifdef __WXOSX__ -add_label_to_grid_bag_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool left, wxGBPosition pos, wxGBSpan span) +add_label_to_sizer (wxGridBagSizer* s, wxStaticText* t, bool left, wxGBPosition pos, wxGBSpan span) #else -add_label_to_grid_bag_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool, wxGBPosition pos, wxGBSpan span) +add_label_to_sizer (wxGridBagSizer* s, wxStaticText* t, bool, wxGBPosition pos, wxGBSpan span) #endif { int flags = wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT; #ifdef __WXOSX__ if (left) { flags |= wxALIGN_RIGHT; - t += wxT (":"); } #endif - wxStaticText* m = new wxStaticText (p, wxID_ANY, t); - s->Add (m, pos, span, flags); - return m; + s->Add (t, pos, span, flags); + return t; +} + +/** Pop up an error dialogue box. + * @param parent Parent. + * @param m Message. + * @param e Extended message. + */ +void +error_dialog (wxWindow* parent, wxString m, optional e) +{ + wxMessageDialog* d = new wxMessageDialog (parent, m, _("DCP-o-matic"), wxOK | wxICON_ERROR); + if (e) { + wxString em = *e; + em[0] = wxToupper (em[0]); + d->SetExtendedMessage (em); + } + d->ShowModal (); + d->Destroy (); } /** Pop up an error dialogue box. @@ -82,9 +143,9 @@ add_label_to_grid_bag_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, bool, w * @param m Message. */ void -error_dialog (wxWindow* parent, wxString m) +message_dialog (wxWindow* parent, wxString m) { - wxMessageDialog* d = new wxMessageDialog (parent, m, _("DCP-o-matic"), wxOK); + wxMessageDialog* d = new wxMessageDialog (parent, m, _("DCP-o-matic"), wxOK | wxICON_INFORMATION); d->ShowModal (); d->Destroy (); } @@ -124,16 +185,30 @@ string_client_data (wxClientData* o) } void -checked_set (wxFilePickerCtrl* widget, string value) +checked_set (FilePickerCtrl* widget, boost::filesystem::path value) { - if (widget->GetPath() != std_to_wx (value)) { + if (widget->GetPath() != std_to_wx (value.string())) { if (value.empty()) { /* Hack to make wxWidgets clear the control when we are passed an empty value. */ value = " "; } - widget->SetPath (std_to_wx (value)); + widget->SetPath (std_to_wx (value.string())); + } +} + +void +checked_set (wxDirPickerCtrl* widget, boost::filesystem::path value) +{ + if (widget->GetPath() != std_to_wx (value.string())) { + if (value.empty()) { + /* Hack to make wxWidgets clear the control when we are passed + an empty value. + */ + value = " "; + } + widget->SetPath (std_to_wx (value.string())); } } @@ -344,3 +419,80 @@ time_to_timecode (DCPTime t, double fps) int const f = lrint (w * fps); return wxString::Format (wxT("%02d:%02d:%02d.%02d"), h, m, s, f); } + +void +setup_audio_channels_choice (wxChoice* choice, int minimum) +{ + vector > items; + for (int i = minimum; i <= 16; i += 2) { + if (i == 2) { + items.push_back (make_pair (wx_to_std (_("2 - stereo")), locale_convert (i))); + } else if (i == 4) { + items.push_back (make_pair (wx_to_std (_("4 - L/C/R/Lfe")), locale_convert (i))); + } else if (i == 6) { + items.push_back (make_pair (wx_to_std (_("6 - 5.1")), locale_convert (i))); + } else if (i == 8) { + items.push_back (make_pair (wx_to_std (_("8 - 5.1/HI/VI")), locale_convert (i))); + } else if (i == 12) { + items.push_back (make_pair (wx_to_std (_("12 - 7.1/HI/VI")), locale_convert (i))); + } else { + items.push_back (make_pair (locale_convert (i), locale_convert (i))); + } + } + + checked_set (choice, items); +} + +wxSplashScreen * +maybe_show_splash () +{ + wxSplashScreen* splash = 0; + try { + if (!Config::have_existing ("config.xml")) { + wxBitmap bitmap; + boost::filesystem::path p = shared_path () / "splash.png"; + if (bitmap.LoadFile (std_to_wx (p.string ()), wxBITMAP_TYPE_PNG)) { + splash = new wxSplashScreen (bitmap, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, 0, -1); + wxYield (); + } + } + } catch (boost::filesystem::filesystem_error& e) { + /* Maybe we couldn't find the splash image; never mind */ + } + + return splash; +} + +optional +path_from_file_dialog (wxFileDialog* dialog, string extension) +{ + boost::filesystem::path p(wx_to_std(dialog->GetPath())); + p.replace_extension(extension); + if (boost::filesystem::is_regular_file(p) && !confirm_dialog(dialog, wxString::Format(_("A file named %s already exists. Do you want to replace it?"), std_to_wx(p.filename().string())))) { + return optional(); + } + return p; +} + +double +calculate_mark_interval (double mark_interval) +{ + if (mark_interval > 5) { + mark_interval -= lrint (mark_interval) % 5; + } + if (mark_interval > 10) { + mark_interval -= lrint (mark_interval) % 10; + } + if (mark_interval > 60) { + mark_interval -= lrint (mark_interval) % 60; + } + if (mark_interval > 3600) { + mark_interval -= lrint (mark_interval) % 3600; + } + + if (mark_interval < 1) { + mark_interval = 1; + } + + return mark_interval; +}