From: Carl Hetherington Date: Fri, 7 Aug 2020 19:37:35 +0000 (+0200) Subject: Fix layout bug where the stuff in the content panel would be completely X-Git-Tag: v2.15.96~4 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=563fc75855b9649cf135cf137cc1b0c43ebc8286 Fix layout bug where the stuff in the content panel would be completely hidden in some cases (seen on Linux only, I think). wxDisplay::GetFromWindow sometimes returns -1 (perhaps when multiple monitors are connected) and we have to set the splitter position in this case. --- diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 1a6c1195c..3275984e6 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -268,6 +268,7 @@ public: , _history_position (0) , _history_separator (0) , _update_news_requested (false) + , _first_shown_called (false) { #if defined(DCPOMATIC_WINDOWS) if (Config::instance()->win32_console ()) { @@ -336,6 +337,7 @@ public: Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem); Bind (wxEVT_CLOSE_WINDOW, boost::bind (&DOMFrame::close, this, _1)); + Bind (wxEVT_SHOW, boost::bind (&DOMFrame::show, this, _1)); /* Use a panel as the only child of the Frame so that we avoid the dark-grey background on Windows. @@ -490,6 +492,14 @@ public: private: + void show (wxShowEvent& ev) + { + if (ev.IsShown() && !_first_shown_called) { + _film_editor->first_shown (); + _first_shown_called = true; + } + } + void film_message (string m) { message_dialog (this, std_to_wx(m)); @@ -1498,6 +1508,7 @@ private: boost::signals2::scoped_connection _analytics_message_connection; bool _update_news_requested; shared_ptr _clipboard; + bool _first_shown_called; }; static const wxCmdLineEntryDesc command_line_description[] = { diff --git a/src/wx/content_panel.cc b/src/wx/content_panel.cc index 7d854224d..ef770484c 100644 --- a/src/wx/content_panel.cc +++ b/src/wx/content_panel.cc @@ -99,20 +99,14 @@ ContentPanel::ContentPanel (wxNotebook* n, shared_ptr film, weak_ptr screen; - int const sn = wxDisplay::GetFromWindow(_splitter); - if (sn >= 0) { - screen = wxDisplay(sn).GetClientArea(); - } - wxPanel* top = new wxPanel (_splitter); + _top_panel = new wxPanel (_splitter); _menu = new ContentMenu (_splitter); - { wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); - _content = new wxListCtrl (top, wxID_ANY, wxDefaultPosition, wxSize (320, 160), wxLC_REPORT | wxLC_NO_HEADER); + _content = new wxListCtrl (_top_panel, wxID_ANY, wxDefaultPosition, wxSize (320, 160), wxLC_REPORT | wxLC_NO_HEADER); _content->DragAcceptFiles (true); s->Add (_content, 1, wxEXPAND | wxTOP | wxBOTTOM, 6); @@ -121,47 +115,40 @@ ContentPanel::ContentPanel (wxNotebook* n, shared_ptr film, weak_ptrSetToolTip (_("Add video, image, sound or subtitle files to the film.")); b->Add (_add_file, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _add_folder = new Button (top, _("Add folder...")); + _add_folder = new Button (_top_panel, _("Add folder...")); _add_folder->SetToolTip (_("Add a folder of image files (which will be used as a moving image sequence) or a folder of sound files.")); b->Add (_add_folder, 1, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _add_dcp = new Button (top, _("Add DCP...")); + _add_dcp = new Button (_top_panel, _("Add DCP...")); _add_dcp->SetToolTip (_("Add a DCP.")); b->Add (_add_dcp, 1, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _remove = new Button (top, _("Remove")); + _remove = new Button (_top_panel, _("Remove")); _remove->SetToolTip (_("Remove the selected piece of content from the film.")); b->Add (_remove, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _earlier = new Button (top, _("Earlier")); + _earlier = new Button (_top_panel, _("Earlier")); _earlier->SetToolTip (_("Move the selected piece of content earlier in the film.")); b->Add (_earlier, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _later = new Button (top, _("Later")); + _later = new Button (_top_panel, _("Later")); _later->SetToolTip (_("Move the selected piece of content later in the film.")); b->Add (_later, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); - _timeline = new Button (top, _("Timeline...")); + _timeline = new Button (_top_panel, _("Timeline...")); _timeline->SetToolTip (_("Open the timeline for the film.")); b->Add (_timeline, 0, wxEXPAND | wxALL, DCPOMATIC_BUTTON_STACK_GAP); s->Add (b, 0, wxALL, 4); - top->SetSizer (s); + _top_panel->SetSizer (s); } _notebook = new wxNotebook (_splitter, wxID_ANY); - /* This is a hack to try and make the content notebook a sensible size; large on big displays but small - enough on small displays to leave space for the content area. - */ - if (screen) { - _splitter->SplitHorizontally (top, _notebook, screen->height > 800 ? -600 : -150); - } - _timing_panel = new TimingPanel (this, _film_viewer); _notebook->AddPage (_timing_panel, _("Timing"), false); @@ -178,6 +165,24 @@ ContentPanel::ContentPanel (wxNotebook* n, shared_ptr film, weak_ptrBind (wxEVT_BUTTON, boost::bind (&ContentPanel::timeline_clicked, this)); } + +void +ContentPanel::first_shown () +{ + int const sn = wxDisplay::GetFromWindow(_splitter); + if (sn >= 0) { + wxRect const screen = wxDisplay(sn).GetClientArea(); + /* This is a hack to try and make the content notebook a sensible size; large on big displays but small + enough on small displays to leave space for the content area. + */ + _splitter->SplitHorizontally (_top_panel, _notebook, screen.height > 800 ? -600 : -150); + } else { + /* Fallback for when GetFromWindow fails for reasons that aren't clear */ + _splitter->SplitHorizontally (_top_panel, _notebook, -600); + } +} + + ContentList ContentPanel::selected () { diff --git a/src/wx/content_panel.h b/src/wx/content_panel.h index 13393f632..a4a172a7f 100644 --- a/src/wx/content_panel.h +++ b/src/wx/content_panel.h @@ -58,6 +58,8 @@ public: void film_changed (Film::Property p); void film_content_changed (int p); + void first_shown (); + wxWindow* window () const { return _splitter; } @@ -101,6 +103,7 @@ private: std::list panels () const; wxSplitterWindow* _splitter; + wxPanel* _top_panel; wxNotebook* _notebook; wxListCtrl* _content; wxButton* _add_file; diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index ae0868f27..894d1d4bf 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -156,3 +156,11 @@ FilmEditor::active_jobs_changed (optional j) { set_general_sensitivity (!j); } + + +void +FilmEditor::first_shown () +{ + _content_panel->first_shown (); +} + diff --git a/src/wx/film_editor.h b/src/wx/film_editor.h index 84a1d361b..0e61f4898 100644 --- a/src/wx/film_editor.h +++ b/src/wx/film_editor.h @@ -44,6 +44,7 @@ public: FilmEditor (wxWindow *, boost::weak_ptr viewer); void set_film (boost::shared_ptr); + void first_shown (); boost::signals2::signal FileChanged; boost::signals2::signal SelectionChanged;