bool OnSashPositionChange(int new_position) override
{
/* Try to stop the top bit of the splitter getting so small that buttons disappear */
- return new_position > 220;
+ auto const ok = new_position > 220;
+ if (ok) {
+ Config::instance()->set_main_content_divider_sash_position(new_position);
+ }
+ return ok;
}
void first_shown(wxWindow* top, wxWindow* bottom)
{
int const sn = wxDisplay::GetFromWindow(this);
+ /* Fallback for when GetFromWindow fails for reasons that aren't clear */
+ int pos = -600;
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.
*/
- SplitHorizontally(top, bottom, screen.height > 800 ? -600 : -_top_panel_minimum_size);
- } else {
- /* Fallback for when GetFromWindow fails for reasons that aren't clear */
- SplitHorizontally(top, bottom, -600);
+ pos = screen.height > 800 ? -600 : -_top_panel_minimum_size;
}
+ SplitHorizontally(top, bottom, Config::instance()->main_content_divider_sash_position().get_value_or(pos));
_first_shown = true;
}
/* The window is now fairly big but the top panel is small; this happens when the DCP-o-matic window
* is shrunk and then made larger again. Try to set a sensible top panel size in this case (#1839).
*/
- SetSashPosition(_top_panel_minimum_size);
+ SetSashPosition(Config::instance()->main_content_divider_sash_position().get_value_or(_top_panel_minimum_size));
}
ev.Skip ();
};
+/** A wxListCtrl that can middle-ellipsize its text */
+class ContentListCtrl : public wxListCtrl
+{
+public:
+ ContentListCtrl(wxWindow* parent)
+ : wxListCtrl(parent, wxID_ANY, wxDefaultPosition, wxSize(320, 160), wxLC_REPORT | wxLC_NO_HEADER | wxLC_VIRTUAL)
+ {
+ _red.SetTextColour(*wxRED);
+ }
+
+ struct Item
+ {
+ wxString text;
+ bool error;
+ };
+
+ void set(vector<Item> const& items)
+ {
+ _items = items;
+ SetItemCount(items.size());
+ }
+
+ wxString OnGetItemText(long item, long) const override
+ {
+ DCPOMATIC_ASSERT(item >= 0 && item < static_cast<long>(_items.size()));
+ wxClientDC dc(const_cast<wxWindow*>(static_cast<wxWindow const*>(this)));
+ return wxControl::Ellipsize(_items[item].text, dc, wxELLIPSIZE_MIDDLE, GetSize().GetWidth());
+ }
+
+ wxListItemAttr* OnGetItemAttr(long item) const override
+ {
+ DCPOMATIC_ASSERT(item >= 0 && item < static_cast<long>(_items.size()));
+ return _items[item].error ? const_cast<wxListItemAttr*>(&_red) : nullptr;
+ }
+
+private:
+ std::vector<Item> _items;
+ wxListItemAttr _red;
+};
+
+
ContentPanel::ContentPanel(wxNotebook* n, shared_ptr<Film> film, FilmViewer& viewer)
: _parent (n)
, _film (film)
{
auto s = new wxBoxSizer (wxHORIZONTAL);
- _content = new wxListCtrl (_top_panel, wxID_ANY, wxDefaultPosition, wxSize (320, 160), wxLC_REPORT | wxLC_NO_HEADER);
+ _content = new ContentListCtrl(_top_panel);
_content->DragAcceptFiles (true);
s->Add (_content, 1, wxEXPAND | wxTOP | wxBOTTOM, 6);
_content->InsertColumn (0, wxT(""));
- _content->SetColumnWidth (0, 512);
+ _content->SetColumnWidth(0, 2048);
auto b = new wxBoxSizer (wxVERTICAL);
selected_content = reinterpret_cast<Content*> (item.GetData ());
}
- _content->DeleteAllItems ();
+ vector<ContentListCtrl::Item> items;
for (auto i: content) {
int const t = _content->GetItemCount ();
s = _("NEEDS OV: ") + s;
}
- wxListItem item;
- item.SetId (t);
- item.SetText (s);
- item.SetData (i.get ());
- _content->InsertItem (item);
+ items.push_back({s, !valid || needs_kdm || needs_assets});
if (i.get() == selected_content) {
set_selected_state(t, true);
}
-
- if (!valid || needs_kdm || needs_assets) {
- _content->SetItemTextColour (t, *wxRED);
- }
}
+ _content->set(items);
+
if (!selected_content && !content.empty ()) {
/* Select the item of content if none was selected before */
set_selected_state(0, true);