2005-06-06 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ * lily/ledger-line-engraver.cc (acknowledge_grob): create new
+ LedgerLineSpanner if new StaffSymbol is found.
+
+ * lily/staff-symbol-engraver.cc (acknowledge_grob): also set
+ staff-symbol for finishing staff.
+
* lily/GNUmakefile (OUT_DIST_FILES): don't dist Flex output
* scm/output-svg.scm (setcolor): implement (re)setcolor with <g>
#include "group-interface.hh"
#include "spanner.hh"
#include "engraver.hh"
+#include "staff-symbol.hh"
-/*
- TODO: should sync with Staff_symbol_engraver.
-*/
class Ledger_line_engraver : public Engraver
{
Spanner *span_;
virtual void finalize ();
virtual void process_music ();
virtual void acknowledge_grob (Grob_info);
+
+ void start_spanner ();
+ void stop_spanner ();
};
Ledger_line_engraver::Ledger_line_engraver ()
span_ = 0;
}
+void
+Ledger_line_engraver::start_spanner ()
+{
+ assert (!span_);
+ span_ = make_spanner ("LedgerLineSpanner", SCM_EOL);
+
+ span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
+}
+
void
Ledger_line_engraver::process_music ()
{
if (!span_)
- {
- span_ = make_spanner ("LedgerLineSpanner", SCM_EOL);
-
- span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
- }
+ start_spanner ();
}
void
Ledger_line_engraver::finalize ()
+{
+ stop_spanner();
+}
+
+void
+Ledger_line_engraver::stop_spanner ()
{
if (span_)
- span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
+ {
+ span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
+ span_ = 0;
+ }
}
void
Ledger_line_engraver::acknowledge_grob (Grob_info s)
{
- if (!to_boolean (s.grob ()->get_property ("no-ledgers")))
- Pointer_group_interface::add_grob (span_, ly_symbol2scm ("note-heads"),
- s.grob ());
+ if (Staff_symbol::has_interface (s.grob ()))
+ {
+ Spanner *sym = dynamic_cast<Spanner*> (s.grob ());
+
+ if (!span_
+ || span_->get_bound (LEFT) != sym->get_bound (LEFT))
+ {
+ stop_spanner ();
+ start_spanner ();
+ }
+ }
+ else if (span_)
+ {
+ if (!to_boolean (s.grob ()->get_property ("no-ledgers")))
+ Pointer_group_interface::add_grob (span_, ly_symbol2scm ("note-heads"),
+ s.grob ());
+ }
}
+
ADD_TRANSLATOR (Ledger_line_engraver,
"Creates the spanner to draw ledger lines, and notices objects that need ledger lines",
/* creats*/ "LedgerLineSpanner",
/* accepts */ "",
- /* acks */ "ledgered-interface", // ledgered-interface?
+ /* acks */ "staff-symbol-interface ledgered-interface", // ledgered-interface?
/* reads */ "",
/* write */ "")
Perhaps should try to take SeparationItem as bound of the staff
symbol?
*/
- if (span_)
- s.grob ()->set_property ("staff-symbol", span_->self_scm ());
+ if (span_ || finished_span_ )
+ {
+ Spanner *my = span_ ? span_ : finished_span_;
+ s.grob ()->set_property ("staff-symbol", my->self_scm ());
+ }
}
ADD_TRANSLATOR (Staff_symbol_engraver,