/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2005--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2005--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "international.hh"
#include "accidental-placement.hh"
#include "accidental-interface.hh"
+#include "arpeggio.hh"
#include "axis-group-interface.hh"
#include "context.hh"
#include "note-spacing.hh"
Paper_column_engraver::finalize ()
{
if (! (breaks_ % 8))
- progress_indication ("[" + to_string (breaks_) + "]");
+ progress_indication ("[" + ::to_string (breaks_) + "]");
if (!made_columns_)
{
if (command_column_)
{
+ // At the end of the score, allow page breaks and turns by default, but...
+ command_column_->set_property ("page-break-permission", ly_symbol2scm ("allow"));
+ command_column_->set_property ("page-turn-permission", ly_symbol2scm ("allow"));
+
+ // ...allow the user to override them.
+ handle_manual_breaks (true);
+
+ // On the other hand, line breaks are always allowed at the end of a score,
+ // even if they try to stop us.
if (!scm_is_symbol (command_column_->get_property ("line-break-permission")))
command_column_->set_property ("line-break-permission", ly_symbol2scm ("allow"));
+
system_->set_bound (RIGHT, command_column_);
}
}
void
Paper_column_engraver::initialize ()
{
- system_ = dynamic_cast<System *> (unsmob_grob (get_property ("rootSystem")));
+ system_ = dynamic_cast<System *> (Grob::unsmob (get_property ("rootSystem")));
make_columns ();
system_->set_bound (LEFT, command_column_);
}
void
-Paper_column_engraver::process_music ()
+Paper_column_engraver::handle_manual_breaks (bool only_do_permissions)
{
for (vsize i = 0; i < break_events_.size (); i++)
{
string prefix;
- SCM name_sym = break_events_[i]->get_property ("class");
- string name = ly_scm2string (scm_symbol_to_string (name_sym));
+ SCM name_sym = scm_car (break_events_[i]->get_property ("class"));
+ string name = ly_symbol2string (name_sym);
size_t end = name.rfind ("-event");
if (end)
prefix = name.substr (0, end);
SCM pen = break_events_[i]->get_property ("break-penalty");
SCM perm = break_events_[i]->get_property ("break-permission");
- if (scm_is_number (pen))
+ if (!only_do_permissions && scm_is_number (pen))
{
Real new_pen = robust_scm2double (cur_pen, 0.0) + scm_to_double (pen);
command_column_->set_property (pen_str.c_str (), scm_from_double (new_pen));
else
command_column_->set_property (perm_str.c_str (), perm);
}
+}
+
+void
+Paper_column_engraver::process_music ()
+{
+ handle_manual_breaks (false);
for (vsize i = 0; i < label_events_.size (); i++)
{
if (start_of_measure)
{
Moment mlen = Moment (measure_length (context ()));
- Grob *column = unsmob_grob (get_property ("currentCommandColumn"));
+ Grob *column = Grob::unsmob (get_property ("currentCommandColumn"));
if (column)
column->set_property ("measure-length", mlen.smobbed_copy ());
else
if (!elem->get_parent (X_AXIS))
elem->set_parent (col, X_AXIS);
- if (!unsmob_grob (elem->get_object ("axis-group-parent-X")))
+ if (!Grob::unsmob (elem->get_object ("axis-group-parent-X")))
elem->set_object ("axis-group-parent-X", col->self_scm ());
- if (Accidental_placement::has_interface (elem))
+ if (Accidental_placement::has_interface (elem)
+ || Arpeggio::has_interface (elem))
Separation_item::add_conditional_item (col, elem);
else if (!Accidental_interface::has_interface (elem))
Separation_item::add_item (col, elem);
breaks_++;
if (! (breaks_ % 8))
- progress_indication ("[" + to_string (breaks_) + "]");
+ progress_indication ("[" + ::to_string (breaks_) + "]");
}
context ()->get_score_context ()->unset_property (ly_symbol2scm ("forbidBreak"));
first_ = false;
- break_events_.clear ();
label_events_.clear ();
SCM mpos = get_property ("measurePosition");
SCM barnum = get_property ("internalBarNumber");
- if (unsmob_moment (mpos)
+ if (Moment::unsmob (mpos)
&& scm_is_integer (barnum))
{
SCM where = scm_cons (barnum,
void
Paper_column_engraver::start_translation_timestep ()
{
+ break_events_.clear ();
if (!first_ && !to_boolean (get_property ("skipTypesetting")))
{
make_columns ();