Make frame mode handling in grid columns a little less ugly

This commit is contained in:
Thomas Goyne 2014-04-19 06:57:17 -07:00
parent 6c6f60eb98
commit c3e024954c
3 changed files with 29 additions and 20 deletions

View File

@ -366,7 +366,7 @@ void BaseGrid::OnPaint(wxPaintEvent &) {
if (column_widths[j] == 0) continue; if (column_widths[j] == 0) continue;
if (paint_columns[j]) if (paint_columns[j])
paint_text(columns[j]->Value(curDiag, byFrame ? context : nullptr), x, y, j); paint_text(columns[j]->Value(curDiag, context), x, y, j);
x += column_widths[j]; x += column_widths[j];
} }
@ -581,14 +581,14 @@ void BaseGrid::SetColumnWidths() {
wxClientDC dc(this); wxClientDC dc(this);
dc.SetFont(font); dc.SetFont(font);
WidthHelper helper{dc, {}}; WidthHelper helper{dc, std::unordered_map<boost::flyweight<std::string>, int>{}};
column_widths.clear(); column_widths.clear();
for (auto i : agi::util::range(columns.size())) { for (auto i : agi::util::range(columns.size())) {
if (!column_shown[i]) if (!column_shown[i])
column_widths.push_back(0); column_widths.push_back(0);
else { else {
int width = columns[i]->Width(context, helper, byFrame); int width = columns[i]->Width(context, helper);
if (width) // 10 is an arbitrary amount of padding if (width) // 10 is an arbitrary amount of padding
width = 10 + std::max(width, column_header_widths[i]); width = 10 + std::max(width, column_header_widths[i]);
column_widths.push_back(width); column_widths.push_back(width);
@ -706,6 +706,8 @@ void BaseGrid::OnKeyDown(wxKeyEvent &event) {
void BaseGrid::SetByFrame(bool state) { void BaseGrid::SetByFrame(bool state) {
if (byFrame == state) return; if (byFrame == state) return;
byFrame = state; byFrame = state;
for (auto& column : columns)
column->SetByFrame(byFrame);
SetColumnWidths(); SetColumnWidths();
Refresh(false); Refresh(false);
} }

View File

@ -61,7 +61,7 @@ struct GridColumnLineNumber final : GridColumn {
return std::to_wstring(d->Row + 1); return std::to_wstring(d->Row + 1);
} }
int Width(const agi::Context *c, WidthHelper &helper, bool) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
return helper(Value(&c->ass->Events.back())); return helper(Value(&c->ass->Events.back()));
} }
}; };
@ -85,24 +85,30 @@ struct GridColumnLayer final : GridColumn {
return d->Layer ? wxString(std::to_wstring(d->Layer)) : wxString(); return d->Layer ? wxString(std::to_wstring(d->Layer)) : wxString();
} }
int Width(const agi::Context *c, WidthHelper &helper, bool) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
int max_layer = max_value(&AssDialogue::Layer, c->ass->Events); int max_layer = max_value(&AssDialogue::Layer, c->ass->Events);
return max_layer == 0 ? 0 : helper(std::to_wstring(max_layer)); return max_layer == 0 ? 0 : helper(std::to_wstring(max_layer));
} }
}; };
struct GridColumnStartTime final : GridColumn { struct GridColumnTime : GridColumn {
bool by_frame = false;
bool Centered() const override { return true; }
void SetByFrame(bool by_frame) override { this->by_frame = by_frame; }
};
struct GridColumnStartTime final : GridColumnTime {
COLUMN_HEADER(_("Start")) COLUMN_HEADER(_("Start"))
COLUMN_DESCRIPTION(_("Start Time")) COLUMN_DESCRIPTION(_("Start Time"))
bool Centered() const override { return true; }
wxString Value(const AssDialogue *d, const agi::Context *c) const override { wxString Value(const AssDialogue *d, const agi::Context *c) const override {
if (c) if (by_frame)
return std::to_wstring(c->videoController->FrameAtTime(d->Start, agi::vfr::START)); return std::to_wstring(c->videoController->FrameAtTime(d->Start, agi::vfr::START));
return to_wx(d->Start.GetAssFormated()); return to_wx(d->Start.GetAssFormated());
} }
int Width(const agi::Context *c, WidthHelper &helper, bool by_frame) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
if (!by_frame) if (!by_frame)
return helper(wxS("0:00:00.00")); return helper(wxS("0:00:00.00"));
int frame = c->videoController->FrameAtTime(max_value(&AssDialogue::Start, c->ass->Events), agi::vfr::START); int frame = c->videoController->FrameAtTime(max_value(&AssDialogue::Start, c->ass->Events), agi::vfr::START);
@ -110,18 +116,17 @@ struct GridColumnStartTime final : GridColumn {
} }
}; };
struct GridColumnEndTime final : GridColumn { struct GridColumnEndTime final : GridColumnTime {
COLUMN_HEADER(_("End")) COLUMN_HEADER(_("End"))
COLUMN_DESCRIPTION(_("End Time")) COLUMN_DESCRIPTION(_("End Time"))
bool Centered() const override { return true; }
wxString Value(const AssDialogue *d, const agi::Context *c) const override { wxString Value(const AssDialogue *d, const agi::Context *c) const override {
if (c) if (by_frame)
return std::to_wstring(c->videoController->FrameAtTime(d->End, agi::vfr::END)); return std::to_wstring(c->videoController->FrameAtTime(d->End, agi::vfr::END));
return to_wx(d->End.GetAssFormated()); return to_wx(d->End.GetAssFormated());
} }
int Width(const agi::Context *c, WidthHelper &helper, bool by_frame) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
if (!by_frame) if (!by_frame)
return helper(wxS("0:00:00.00")); return helper(wxS("0:00:00.00"));
int frame = c->videoController->FrameAtTime(max_value(&AssDialogue::End, c->ass->Events), agi::vfr::END); int frame = c->videoController->FrameAtTime(max_value(&AssDialogue::End, c->ass->Events), agi::vfr::END);
@ -151,7 +156,7 @@ struct GridColumnStyle final : GridColumn {
return to_wx(d->Style); return to_wx(d->Style);
} }
int Width(const agi::Context *c, WidthHelper &helper, bool) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
return max_width(&AssDialogue::Style, c->ass->Events, helper); return max_width(&AssDialogue::Style, c->ass->Events, helper);
} }
}; };
@ -165,7 +170,7 @@ struct GridColumnEffect final : GridColumn {
return to_wx(d->Effect); return to_wx(d->Effect);
} }
int Width(const agi::Context *c, WidthHelper &helper, bool) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
return max_width(&AssDialogue::Effect, c->ass->Events, helper); return max_width(&AssDialogue::Effect, c->ass->Events, helper);
} }
}; };
@ -179,7 +184,7 @@ struct GridColumnActor final : GridColumn {
return to_wx(d->Actor); return to_wx(d->Actor);
} }
int Width(const agi::Context *c, WidthHelper &helper, bool) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
return max_width(&AssDialogue::Actor, c->ass->Events, helper); return max_width(&AssDialogue::Actor, c->ass->Events, helper);
} }
}; };
@ -192,7 +197,7 @@ struct GridColumnMargin : GridColumn {
return d->Margin[Index] ? wxString(std::to_wstring(d->Margin[Index])) : wxString(); return d->Margin[Index] ? wxString(std::to_wstring(d->Margin[Index])) : wxString();
} }
int Width(const agi::Context *c, WidthHelper &helper, bool) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
int max = 0; int max = 0;
for (AssDialogue const& line : c->ass->Events) { for (AssDialogue const& line : c->ass->Events) {
if (line.Margin[Index] > max) if (line.Margin[Index] > max)
@ -244,7 +249,7 @@ public:
return std::to_wstring(agi::CharacterCount(text, ignore) * 1000 / duration); return std::to_wstring(agi::CharacterCount(text, ignore) * 1000 / duration);
} }
int Width(const agi::Context *c, WidthHelper &helper, bool) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
return helper(wxS("999")); return helper(wxS("999"));
} }
}; };
@ -300,7 +305,7 @@ public:
return str; return str;
} }
int Width(const agi::Context *c, WidthHelper &helper, bool) const override { int Width(const agi::Context *c, WidthHelper &helper) const override {
return 5000; return 5000;
} }
}; };

View File

@ -54,7 +54,9 @@ struct GridColumn {
virtual wxString const& Description() const = 0; virtual wxString const& Description() const = 0;
virtual wxString Value(const AssDialogue *d, const agi::Context * = nullptr) const = 0; virtual wxString Value(const AssDialogue *d, const agi::Context * = nullptr) const = 0;
virtual int Width(const agi::Context *c, WidthHelper &helper, bool by_frame) const = 0; virtual int Width(const agi::Context *c, WidthHelper &helper) const = 0;
virtual void SetByFrame(bool /* by_frame */) { }
}; };
std::vector<std::unique_ptr<GridColumn>> GetGridColumns(); std::vector<std::unique_ptr<GridColumn>> GetGridColumns();