public ParserState(SongLineParser parser) { Token = parser.m_token; Position = parser.m_index; Data = parser.m_data; }
// resi odradkovani, muze se odradkovat jen pri Space private IEnumerable<string> GetLines(Graphics gfx) { List<string> lines = new List<string>(); float tpos = m_x0, apos = m_x0; SongLineParser par = new SongLineParser(m_text); SongLineParser.ParserState lastflushed = par.InitState; SongLineParser.ParserState lastspace = par.InitState; while (true) { if (par.Current == SongLineParser.Token.Word) { float wordwi = (float)gfx.MeasureString(par.Data, Options.TextFont).Width; tpos += wordwi; par.Read(); } else if (par.Current == SongLineParser.Token.Space || par.Current == SongLineParser.Token.End) { if ((apos > Options.PageWidth || tpos > Options.PageWidth) && (lastspace.Position > lastflushed.Position)) { yield return par.Original.Substring(lastflushed.Position, lastspace.Position - lastflushed.Position); lastflushed = lastspace; par.State = lastspace; apos = tpos = m_x0; } else { if (par.Current == SongLineParser.Token.End) break; tpos += Options.HTextSpace; lastspace = par.State; par.Read(); } if (par.Current == SongLineParser.Token.End) break; } else if (par.Current == SongLineParser.Token.Chord) { if (tpos < apos) tpos = apos; // aby nebyly 2 akordy pres sebe apos = tpos; float chordwi = (float)gfx.MeasureString(par.Data, Options.ChordFont).Width; apos += chordwi + Options.HChordSpace; par.Read(); } } yield return par.Original.Substring(lastflushed.Position); }
public override float Draw(Graphics gfx, PointF pt, bool dorender) { float acty = 0; foreach (string line in GetLines(gfx)) { float tpos = m_x0, apos = m_x0; SongLineParser par = new SongLineParser(line); while (par.Current != SongLineParser.Token.End) { if (par.Current == SongLineParser.Token.Word) { float wordwi = (float)gfx.MeasureString(par.Data, Options.TextFont).Width; if (dorender) gfx.DrawString(par.Data, Options.TextFont, Options.TextColor, pt.X + tpos, acty + pt.Y + Options.ChordHeight); tpos += wordwi; } if (par.Current == SongLineParser.Token.Space) { tpos += Options.HTextSpace; } if (par.Current == SongLineParser.Token.Chord) { if (tpos < apos) tpos = apos; // aby nebyly 2 akordy pres sebe apos = tpos; float chordwi = (float)gfx.MeasureString(par.Data, Options.ChordFont).Width; if (dorender) gfx.DrawString(par.Data, Options.ChordFont, Options.ChordColor, pt.X + apos, acty + pt.Y); apos += chordwi + Options.HChordSpace; } par.Read(); } acty += Options.ChordHeight + Options.TextHeight; } DrawLabel(gfx, pt, Options.ChordHeight + Options.TextHeight); return acty; }
public override float Draw(Graphics gfx, PointF pt, bool dorender) { float actx = m_x0; float acty = 0; SongLineParser par = new SongLineParser(m_text); bool wasword = false; while (par.Current != SongLineParser.Token.End) { if (par.Current == SongLineParser.Token.Word) { if (wasword) actx += Options.HTextSpace; float wordwi = (float)gfx.MeasureString(par.Data, Options.TextFont).Width; if (actx + wordwi > Options.PageWidth && actx > m_x0) // slovo se nevejde na radku { // odradkujeme actx = m_x0; acty += Options.TextHeight; } if (dorender) gfx.DrawString(par.Data, Options.TextFont, Options.TextColor, pt.X + actx, pt.Y + acty); actx += wordwi; wasword = true; } par.Read(); } if (actx > 0) acty += Options.TextHeight; if (dorender) DrawLabel(gfx, pt, Options.TextHeight); return acty; }