]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/paper-column-engraver.cc
Doc-de: small updates
[lilypond.git] / lily / paper-column-engraver.cc
index 31b8023bef734caac6f4c4bfb3ee8281091b922a..de550aeb73738779a9ef64285e26ac903f1ee41c 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2005--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 2005--2012 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
@@ -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 ();