#include "align-interface.hh"
#include "all-font-metrics.hh"
#include "axis-group-interface.hh"
+#include "break-align-interface.hh"
#include "grob-array.hh"
#include "hara-kiri-group-spanner.hh"
#include "international.hh"
all_elements_ = 0;
pscore_ = 0;
rank_ = 0;
+ checked_footnotes_ = false;
init_elements ();
}
{
all_elements_ = 0;
rank_ = 0;
+ checked_footnotes_ = false;
init_elements ();
}
{
extract_grob_set (this, "all-elements", all_elts);
for (vsize i = 0; i < all_elts.size (); i++)
- {
- if ((all_elts[i]->name () == "Footnote") || (all_elts[i]->name () == "FootnoteSpanner"))
- footnote_grobs_.push_back (all_elts[i]);
- }
- sort (footnote_grobs_.begin (), footnote_grobs_.end (), Grob::less);
+ if (all_elts[i]->internal_has_interface (ly_symbol2scm ("footnote-interface")))
+ footnote_grobs_.push_back (all_elts[i]);
+ sort (footnote_grobs_.begin (), footnote_grobs_.end (), Grob::less);
+ checked_footnotes_ = true;
}
-vector<Stencil *>
-System::get_footnotes_in_range (vsize st, vsize end)
+void
+System::get_footnote_grobs_in_range (vector<Grob *> &out, vsize start, vsize end)
{
- vector<Stencil *> out;
- if (footnote_grobs_.size () == 0)
+ if (!checked_footnotes_)
populate_footnote_grob_vector ();
- for (vsize j = 0; j < footnote_grobs_.size (); j++)
+ for (vsize i = 0; i < footnote_grobs_.size (); i++)
{
- if (footnote_grobs_[j]->spanned_rank_interval ()[LEFT] < (int)st)
+ int pos = footnote_grobs_[i]->spanned_rank_interval ()[LEFT];
+ bool end_of_line_visible = true;
+ if (Spanner *s = dynamic_cast<Spanner *>(footnote_grobs_[i]))
+ {
+ Direction spanner_placement = robust_scm2dir (s->get_property ("spanner-placement"), LEFT);
+ if (spanner_placement == CENTER)
+ spanner_placement = LEFT;
+
+ pos = s->spanned_rank_interval ()[spanner_placement];
+ }
+
+ if (Item *item = dynamic_cast<Item *>(footnote_grobs_[i]))
+ {
+ if (!Item::break_visible (item))
+ continue;
+ // safeguard to bring down the column rank so that end of line footnotes show up on the correct line
+ end_of_line_visible = (LEFT == item->break_status_dir ());
+ }
+
+ if (pos < int (start))
continue;
- if (footnote_grobs_[j]->spanned_rank_interval ()[LEFT] >= (int)end)
+ if (pos > int (end))
break;
- SCM footnote_markup = footnote_grobs_[j]->get_property ("footnote-text");
+ if (pos == int (start) && end_of_line_visible)
+ continue;
+ if (pos == int (end) && !end_of_line_visible)
+ continue;
+ if (!footnote_grobs_[i]->is_live ())
+ continue;
+
+ out.push_back (footnote_grobs_[i]);
+ }
+}
+
+vector<Stencil *>
+System::get_footnotes_in_range (vsize start, vsize end)
+{
+ vector<Grob *> footnote_grobs;
+ get_footnote_grobs_in_range (footnote_grobs, start, end);
+ vector<Stencil *> out;
+
+ for (vsize i = 0; i < footnote_grobs.size (); i++)
+ {
+ SCM footnote_markup = footnote_grobs[i]->get_property ("footnote-text");
if (!Text_interface::is_markup (footnote_markup))
continue;
{
Stencil mol;
- for (vsize i = 0; i < footnotes_.size (); i++)
- mol.add_at_edge (Y_AXIS, DOWN, *footnotes_[i], padding);
+ for (vsize i = 0; i < footnote_grobs_.size (); i++)
+ {
+ SCM footnote_markup = footnote_grobs_[i]->get_property ("footnote-text");
+ if (Spanner *orig = dynamic_cast<Spanner *>(footnote_grobs_[i]))
+ if (orig->is_broken ())
+ footnote_markup = orig->broken_intos_[0]->get_property ("footnote-text");
+
+ if (!Text_interface::is_markup (footnote_markup))
+ continue;
+
+ SCM props = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"),
+ pscore_->layout ()->self_scm ());
+
+ SCM footnote_stl = Text_interface::interpret_markup (pscore_->layout ()->self_scm (),
+ props, footnote_markup);
+
+ mol.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (footnote_stl), padding);
+ }
return mol;
}
Interval iv (pure_height (this, st, end));
system->set_property ("pure-Y-extent", ly_interval2scm (iv));
- system->footnotes_ = get_footnotes_in_range (st, end);
+ get_footnote_grobs_in_range (system->footnote_grobs_, st, end);
system->set_bound (LEFT, c[0]);
system->set_bound (RIGHT, c.back ());