Store and load print properties

This commit is contained in:
Matthias Neeracher 2008-01-26 20:56:36 +00:00
parent 07f118ada0
commit 93a34a71f2
3 changed files with 61 additions and 4 deletions

View File

@ -9,7 +9,7 @@
}
\paper {
#(set-paper-size "<{PAPERSIZE}>")
#(set-paper-size <{PAPERSIZE}>)
indent = 0.0\cm
pagenumber = no
page-top-space = #.1

View File

@ -11,6 +11,8 @@
#import "VLLilypondDocument.h"
#import "VLLilypondWriter.h"
#import <algorithm>
@interface NSMutableString (VLLilypond)
- (void) substituteMacro:(NSString *)macro withValue:(NSString *)value;
@ -103,6 +105,14 @@
@end
static NSSize sPaperSizes[] = {
{842.0f, 1191.0f}, {595.0f, 842.0f}, {421.0f, 595.0f}, {298.0f, 421.0f},
{612.0f, 1008.0f}, {612.0f, 792.0f}, {792.0f, 1224.0f}
};
static const char * sPaperNames[] = {
"a3", "a4", "a5", "a6", "letter", "legal", "11x17", 0
};
@implementation VLDocument (Lilypond)
- (NSData *)lilypondDataWithError:(NSError **)outError
@ -116,13 +126,36 @@
NSStringEncoding enc = NSUTF8StringEncoding;
NSMutableString * ly =
[NSMutableString stringWithContentsOfFile:tmpl encoding:enc error:outError];
NSPrintInfo * pi = [self printInfo];
NSSize sz = [pi paperSize];
int bestPaper = -1;
float bestDist = 1e10f;
if ([pi orientation] == NSLandscapeOrientation)
std::swap(sz.width, sz.height);
for (int paper = 0; sPaperNames[paper]; ++paper) {
float dist = hypotf(sz.width - sPaperSizes[paper].width,
sz.height- sPaperSizes[paper].height);
if (dist < bestDist) {
bestPaper = paper;
bestDist = dist;
}
}
NSString * paper = [NSString stringWithFormat:
[pi orientation] == NSLandscapeOrientation ? @"\"%s\" 'landscape" : @"\"%s\"",
sPaperNames[bestPaper]];
float scaling= [[[pi dictionary] objectForKey:NSPrintScalingFactor]
floatValue];
[ly substituteMacro:@"TITLE" withValue:songTitle];
[ly substituteMacro:@"POET" withValue:songLyricist];
[ly substituteMacro:@"COMPOSER" withValue:songComposer];
[ly substituteMacro:@"ARRANGER" withValue:songArranger];
[ly substituteMacro:@"VLVERSION" withValue:
[bndl objectForInfoDictionaryKey:@"CFBundleVersion"]];
[ly substituteMacro:@"PAPERSIZE" withValue:@"letter"];
[ly substituteMacro:@"PAPERSIZE" withValue:paper];
[ly substituteMacro:@"FORMATTING" withValue:@"ragged-last-bottom = ##f"];
[ly substituteMacro:@"VLVERSION" withValue:
[bndl objectForInfoDictionaryKey:@"CFBundleVersion"]];
@ -131,7 +164,7 @@
[ly substituteMacro:@"LYRICSIZE" withValue:
[NSString stringWithFormat:@"%.1f", lyricSize]];
[ly substituteMacro:@"STAFFSIZE" withValue:
[NSString stringWithFormat:@"%.1f", staffSize]];
[NSString stringWithFormat:@"%.1f", staffSize*scaling]];
[ly substituteMacro:@"CHORDS" withValue:
[NSString stringWithUTF8String:writer.Chords().c_str()]];
[ly substituteMacro:@"NOTES" withValue:

View File

@ -15,6 +15,8 @@
- (NSFileWrapper *)XMLFileWrapperWithError:(NSError **)outError flat:(BOOL)flat;
{
static NSArray * sPropertyKeys = nil;
NSFileWrapper * contents = [self fileWrapperWithFilter:@"VLMusicXMLType" error:outError];
if (!contents) {
@ -30,6 +32,17 @@
[wrap addFileWrapper:contents];
if (vcsWrapper)
[wrap addFileWrapper:vcsWrapper];
NSData * pd = [NSArchiver archivedDataWithRootObject:
[self printInfo]];
[wrap addRegularFileWithContents:pd preferredFilename:@"PrintInfo"];
if (!sPropertyKeys)
sPropertyKeys = [[NSArray alloc] initWithObjects:
@"staffSize", @"chordSize", @"lyricSize", nil];
NSData * prop = [NSPropertyListSerialization dataFromPropertyList:
[self dictionaryWithValuesForKeys:sPropertyKeys]
format:NSPropertyListXMLFormat_v1_0
errorDescription:nil];
[wrap addRegularFileWithContents:prop preferredFilename:@"Properties"];
return wrap;
}
@ -44,7 +57,7 @@
)
[vcsWrapper retain];
//
// Read properties dictionary for backward compatibility
// Read properties dictionary
//
NSFileWrapper * prop = [wrappers objectForKey:@"Properties"];
if (prop) {
@ -57,6 +70,17 @@
format:nil errorDescription:nil]];
[undoMgr enableUndoRegistration];
}
//
// Read print info
NSFileWrapper * print = [wrappers objectForKey:@"PrintInfo"];
if (print) {
NSUndoManager * undoMgr = [self undoManager];
[undoMgr disableUndoRegistration];
NSPrintInfo * pi = [NSUnarchiver unarchiveObjectWithData:
[print regularFileContents]];
[self setPrintInfo:pi];
[undoMgr enableUndoRegistration];
}
return [self readFromFileWrapper:[wrappers objectForKey:@"Song"] withFilter:@"VLMusicXMLType"
error:outError];
} else {