swaroop: refresh buttons for playlists / content.
[dcpomatic.git] / src / wx / swaroop_controls.cc
index dc65f1b85f7635f14672106d94ec70cce87ccd11..2f51fed3f3833d840005f2120fb2159f351d4f19 100644 (file)
 #include "film_viewer.h"
 #include "wx_util.h"
 #include "content_view.h"
+#include "dcpomatic_button.h"
+#include "static_text.h"
 #include "lib/player_video.h"
 #include "lib/dcp_content.h"
 #include <wx/listctrl.h>
+#include <wx/progdlg.h>
 
 using std::string;
 using std::cout;
@@ -35,9 +38,10 @@ using boost::optional;
 
 SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr<FilmViewer> viewer)
        : Controls (parent, viewer, false)
-       , _play_button (new wxButton(this, wxID_ANY, _("Play")))
-       , _pause_button (new wxButton(this, wxID_ANY, _("Pause")))
-       , _stop_button (new wxButton(this, wxID_ANY, _("Stop")))
+       , _play_button (new Button(this, _("Play")))
+       , _pause_button (new Button(this, _("Pause")))
+       , _stop_button (new Button(this, _("Stop")))
+       , _current_disable_timeline (false)
 {
        _button_sizer->Add (_play_button, 0, wxEXPAND);
        _button_sizer->Add (_pause_button, 0, wxEXPAND);
@@ -49,10 +53,34 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr<FilmViewer> viewe
        wxBoxSizer* left_sizer = new wxBoxSizer (wxVERTICAL);
        wxBoxSizer* e_sizer = new wxBoxSizer (wxHORIZONTAL);
 
-       left_sizer->Add (_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP);
+       wxFont subheading_font (*wxNORMAL_FONT);
+       subheading_font.SetWeight (wxFONTWEIGHT_BOLD);
+
+       wxBoxSizer* spl_header = new wxBoxSizer (wxHORIZONTAL);
+       {
+               wxStaticText* m = new StaticText (this, "Playlists");
+               m->SetFont (subheading_font);
+               spl_header->Add (m, 1, wxALIGN_CENTER_VERTICAL);
+       }
+       _refresh_spl_view = new Button (this, "Refresh");
+       spl_header->Add (_refresh_spl_view, 0, wxBOTTOM, DCPOMATIC_SIZER_GAP / 2);
+
+       left_sizer->Add (spl_header, 0, wxLEFT | wxRIGHT | wxEXPAND, DCPOMATIC_SIZER_GAP);
+       left_sizer->Add (_spl_view, 1, wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, DCPOMATIC_SIZER_GAP);
 
        _content_view = new ContentView (this);
-       left_sizer->Add (_content_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP);
+
+       wxBoxSizer* content_header = new wxBoxSizer (wxHORIZONTAL);
+       {
+               wxStaticText* m = new StaticText (this, "Content");
+               m->SetFont (subheading_font);
+               content_header->Add (m, 1, wxALIGN_CENTER_VERTICAL);
+       }
+       _refresh_content_view = new Button (this, "Refresh");
+       content_header->Add (_refresh_content_view, 0, wxBOTTOM, DCPOMATIC_SIZER_GAP / 2);
+
+       left_sizer->Add (content_header, 0, wxTOP | wxLEFT | wxRIGHT | wxEXPAND, DCPOMATIC_SIZER_GAP);
+       left_sizer->Add (_content_view, 1, wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, DCPOMATIC_SIZER_GAP);
 
        _current_spl_view = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER);
        _current_spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 500);
@@ -71,6 +99,8 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr<FilmViewer> viewe
        _spl_view->Bind     (wxEVT_LIST_ITEM_SELECTED,   boost::bind(&SwaroopControls::spl_selection_changed, this));
        _spl_view->Bind     (wxEVT_LIST_ITEM_DESELECTED, boost::bind(&SwaroopControls::spl_selection_changed, this));
        _viewer->ImageChanged.connect (boost::bind(&SwaroopControls::image_changed, this, _1));
+       _refresh_spl_view->Bind (wxEVT_BUTTON, boost::bind(&SwaroopControls::update_playlist_directory, this));
+       _refresh_content_view->Bind (wxEVT_BUTTON, boost::bind(&ContentView::update, _content_view));
 
        _content_view->update ();
        update_playlist_directory ();
@@ -107,7 +137,8 @@ SwaroopControls::setup_sensitivity ()
        _play_button->Enable (c && !_viewer->playing());
        _pause_button->Enable (c && (!_current_kind || _current_kind != dcp::ADVERTISEMENT) && _viewer->playing());
        _stop_button->Enable (c && (!_current_kind || _current_kind != dcp::ADVERTISEMENT));
-       _slider->Enable (c && (!_current_kind || _current_kind != dcp::ADVERTISEMENT));
+       _slider->Enable (c && (!_current_kind || _current_kind != dcp::ADVERTISEMENT) && !_current_disable_timeline);
+       _spl_view->Enable (!_viewer->playing());
 }
 
 void
@@ -149,6 +180,21 @@ SwaroopControls::image_changed (boost::weak_ptr<PlayerVideo> weak_pv)
                return;
        }
 
+       if (c == _current_content.lock()) {
+               return;
+       }
+
+       _current_content = c;
+
+       if (_selected_playlist) {
+               BOOST_FOREACH (SPLEntry i, _playlists[*_selected_playlist].get()) {
+                       if (i.content == c) {
+                               _current_disable_timeline = i.disable_timeline;
+                               setup_sensitivity ();
+                       }
+               }
+       }
+
        shared_ptr<DCPContent> dc = dynamic_pointer_cast<DCPContent> (c);
        if (!dc) {
                return;
@@ -202,12 +248,16 @@ SwaroopControls::update_playlist_directory ()
 void
 SwaroopControls::spl_selection_changed ()
 {
+       _current_spl_view->DeleteAllItems ();
+
        long int selected = _spl_view->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
        if (selected == -1) {
-               _current_spl_view->DeleteAllItems ();
+               _selected_playlist = boost::none;
                return;
        }
 
+       wxProgressDialog progress (_("DCP-o-matic"), _("Loading playlist"));
+
        shared_ptr<Film> film (new Film(optional<boost::filesystem::path>()));
 
        int N = 0;
@@ -219,8 +269,13 @@ SwaroopControls::spl_selection_changed ()
                _current_spl_view->InsertItem (it);
                film->add_content (i.content);
                ++N;
+               if (!progress.Pulse()) {
+                       /* user pressed cancel */
+                       return;
+               }
        }
 
+       _selected_playlist = selected;
        ResetFilm (film);
 }
 
@@ -240,6 +295,5 @@ void
 SwaroopControls::set_film (shared_ptr<Film> film)
 {
        Controls::set_film (film);
-       update_playlist_directory ();
        setup_sensitivity ();
 }