X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column-engraver.cc;h=de550aeb73738779a9ef64285e26ac903f1ee41c;hb=ad3a9e6531e32c4403f1bdc6d203d3c94c6d411e;hp=31b8023bef734caac6f4c4bfb3ee8281091b922a;hpb=bb8a0a5387af94dd2702877256334b160575a730;p=lilypond.git diff --git a/lily/paper-column-engraver.cc b/lily/paper-column-engraver.cc index 31b8023bef..de550aeb73 100644 --- a/lily/paper-column-engraver.cc +++ b/lily/paper-column-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2011 Han-Wen Nienhuys + Copyright (C) 2005--2012 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -61,8 +61,18 @@ Paper_column_engraver::finalize () 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_); } } @@ -147,13 +157,13 @@ Paper_column_engraver::listen_label (Stream_event *ev) } 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)); + string name = ly_symbol2string (name_sym); size_t end = name.rfind ("-event"); if (end) prefix = name.substr (0, end); @@ -170,7 +180,7 @@ Paper_column_engraver::process_music () 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)); @@ -179,6 +189,12 @@ Paper_column_engraver::process_music () 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++) { @@ -257,7 +273,6 @@ Paper_column_engraver::stop_translation_timestep () context ()->get_score_context ()->unset_property (ly_symbol2scm ("forbidBreak")); first_ = false; - break_events_.clear (); label_events_.clear (); SCM mpos = get_property ("measurePosition"); @@ -276,6 +291,7 @@ Paper_column_engraver::stop_translation_timestep () void Paper_column_engraver::start_translation_timestep () { + break_events_.clear (); if (!first_ && !to_boolean (get_property ("skipTypesetting"))) { make_columns ();