X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column-engraver.cc;h=0620bafdbd4385a22e400bdeaf165a6a8e58b368;hb=b88d1612f79e1934a26f5d02d538e5fba3b06879;hp=31b8023bef734caac6f4c4bfb3ee8281091b922a;hpb=4bb29573149a0ffa1f881c5e38a0fe68e9e76b67;p=lilypond.git diff --git a/lily/paper-column-engraver.cc b/lily/paper-column-engraver.cc index 31b8023bef..0620bafdbd 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--2014 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 @@ -22,6 +22,7 @@ #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" @@ -49,7 +50,7 @@ void Paper_column_engraver::finalize () { if (! (breaks_ % 8)) - progress_indication ("[" + to_string (breaks_) + "]"); + progress_indication ("[" + ::to_string (breaks_) + "]"); if (!made_columns_) { @@ -61,8 +62,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 +158,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)); + 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); @@ -170,7 +181,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 +190,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++) { @@ -225,7 +242,8 @@ Paper_column_engraver::stop_translation_timestep () if (!unsmob_grob (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); @@ -251,13 +269,12 @@ Paper_column_engraver::stop_translation_timestep () 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"); @@ -276,6 +293,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 ();