def __init__(self, text, x, y, size, flags=NORMAL | COURIER, align=util.ALIGN_LEFT, valign=util.VALIGN_TOP, line=-1, angle=None): self.text = text self.x = x self.y = y self.size = size self.flags = flags self.angle = angle # TOCItem, by default we have none self.toc = None # index of line in Screenplay.lines, or -1 if some other text. # only used when drawing display, pdf output doesn't use this. self.line = line if align != util.ALIGN_LEFT: w = util.getTextWidth(text, flags, size) if align == util.ALIGN_CENTER: self.x -= w / 2.0 elif align == util.ALIGN_RIGHT: self.x -= w if valign != util.VALIGN_TOP: h = util.getTextHeight(size) if valign == util.VALIGN_CENTER: self.y -= h / 2.0 elif valign == util.VALIGN_BOTTOM: self.y -= h
def generatePML(self, page, pageNr, cfg): fl = 0 if self.isBold: fl |= pml.BOLD if self.isItalic: fl |= pml.ITALIC if self.isUnderlined: fl |= pml.UNDERLINED if self.align == util.ALIGN_LEFT: x = cfg.marginLeft elif self.align == util.ALIGN_CENTER: x = (cfg.marginLeft + (cfg.paperWidth - cfg.marginRight)) / 2.0 else: x = cfg.paperWidth - cfg.marginRight fs = cfg.fontSize if self.xoff != 0: x += util.getTextWidth(" ", pml.COURIER, fs) * self.xoff y = cfg.marginTop + (self.line - 1) * util.getTextHeight(fs) text = self.text.replace("${PAGE}", pageNr) page.add(pml.TextOp(text, x, y, fs, fl, self.align))
def __init__(self, text, x, y, size, flags = NORMAL | COURIER, align = util.ALIGN_LEFT, valign = util.VALIGN_TOP, line = -1, angle = None): self.text = text self.x = x self.y = y self.size = size self.flags = flags self.angle = angle # TOCItem, by default we have none self.toc = None # index of line in Screenplay.lines, or -1 if some other text. # only used when drawing display, pdf output doesn't use this. self.line = line if align != util.ALIGN_LEFT: w = util.getTextWidth(text, flags, size) if align == util.ALIGN_CENTER: self.x -= w / 2.0 elif align == util.ALIGN_RIGHT: self.x -= w if valign != util.VALIGN_TOP: h = util.getTextHeight(size) if valign == util.VALIGN_CENTER: self.y -= h / 2.0 elif valign == util.VALIGN_BOTTOM: self.y -= h
def __init__(self, width, height, margin, fontSize): self.doc = Document(width, height) # how much to leave empty on each side (mm) self.margin = margin # font size self.fontSize = fontSize # number of chararacters that fit on a single line self.charsToLine = int((width - margin * 2.0) / util.getTextWidth(" ", COURIER, fontSize)) self.createPage()
def __init__(self, width, height, margin, fontSize): self.doc = Document(width, height) # how much to leave empty on each side (mm) self.margin = margin # font size self.fontSize = fontSize # number of chararacters that fit on a single line self.charsToLine = int( (width - margin * 2.0) / util.getTextWidth(" ", COURIER, fontSize)) self.createPage()
def OnPaint(self, event): dc = wx.BufferedPaintDC(self, self.screenBuf) # widget size ww, wh = self.GetClientSize() dc.SetBrush(wx.Brush(self.GetBackgroundColour())) dc.SetPen(wx.Pen(self.GetBackgroundColour())) dc.DrawRectangle(0, 0, ww, wh) # aspect ratio of paper aspect = self.cfg.paperWidth / self.cfg.paperHeight # calculate which way we can best fit the paper on screen h = wh w = int(aspect * wh) if w > ww: w = ww h = int(ww / aspect) # offset of paper ox = (ww - w) // 2 oy = (wh - h) // 2 dc.SetPen(wx.BLACK_PEN) dc.SetBrush(wx.WHITE_BRUSH) dc.DrawRectangle(ox, oy, w, h) if self.ctrl.pageIndex != -1: page = self.ctrl.titles.pages[self.ctrl.pageIndex] for i in range(len(page)): ts = page[i] # text height in mm textHinMM = util.getTextHeight(ts.size) textH = int((textHinMM / self.cfg.paperHeight) * h) textH = max(1, textH) y = ts.y for line in ts.items: # people may have empty lines in between non-empty # lines to achieve double spaced lines; don't draw a # rectangle for lines consisting of nothing but # whitespace if line.strip(): textW = int( (util.getTextWidth(line, ts.getStyle(), ts.size) / self.cfg.paperWidth) * w) textW = max(1, textW) if ts.isCentered: xp = w // 2 - textW // 2 else: xp = int((ts.x / self.cfg.paperWidth) * w) if ts.isRightJustified: xp -= textW if i == self.ctrl.tsIndex: dc.SetPen(wx.RED_PEN) dc.SetBrush(wx.RED_BRUSH) else: dc.SetPen(wx.BLACK_PEN) dc.SetBrush(wx.BLACK_BRUSH) yp = int((y / self.cfg.paperHeight) * h) dc.DrawRectangle(ox + xp, oy + yp, textW, textH) y += textHinMM
def __init__(self, sp, minLines): self.sp = sp ls = sp.lines # PageInfo's for each page, 0-indexed. self.pages = [] for i in xrange(len(sp.pages) - 1): self.pages.append(PageInfo()) # map of CharInfo objects. key = name, value = CharInfo. tmpCinfo = {} name = "UNKNOWN" for i in xrange(len(ls)): pgNr = sp.line2page(i) - 1 pi = self.pages[pgNr] line = ls[i] pi.addLine(line.lt) if (line.lt == screenplay.CHARACTER) and\ (line.lb == screenplay.LB_LAST): name = util.upper(line.text) elif line.lt == screenplay.DIALOGUE: pi.addLineToSpeaker(name) ci = tmpCinfo.get(name) if ci: ci.addLine(pgNr) else: tmpCinfo[name] = CharInfo(name, pgNr) elif line.lt != screenplay.PAREN: name = "UNKNOWN" # CharInfo's. self.cinfo = [] for v in tmpCinfo.values(): if v.lineCnt >= minLines: self.cinfo.append(v) # start Y of page markers self.pageY = 20.0 # where dialogue density bars start and how tall they are self.barY = 30.0 self.barHeight = 15.0 # chart Y pos self.chartY = 50.0 # how much to leave empty on each side (mm) self.margin = 10.0 # try point sizes 10,9,8,7,6 until all characters fit on the page # (if 6 is still too big, too bad) size = 10 while 1: # character font size in points self.charFs = size # how many mm in Y direction for each character self.charY = util.getTextHeight(self.charFs) # height of chart self.chartHeight = len(self.cinfo) * self.charY if size <= 6: break if (self.chartY + self.chartHeight) <= \ (sp.cfg.paperWidth - self.margin): break size -= 1 # calculate maximum length of character name, and start position # of chart from that maxLen = 0 for ci in self.cinfo: maxLen = max(maxLen, len(ci.name)) maxLen = max(10, maxLen) charX = util.getTextWidth(" ", pml.COURIER, self.charFs) # chart X pos self.chartX = self.margin + maxLen * charX + 3 # width of chart self.chartWidth = sp.cfg.paperHeight - self.chartX - self.margin # page contents bar legends' size and position self.legendWidth = 23.0 self.legendHeight = 23.0 self.legendX = self.margin + 2.0 self.legendY = self.barY + self.barHeight - self.legendHeight # margin from legend border to first item self.legendMargin = 2.0 # spacing from one legend item to next self.legendSpacing = 5.0 # spacing from one legend item to next self.legendSize = 4.0
def OnPaint(self, event): dc = wx.BufferedPaintDC(self, self.screenBuf) # widget size ww, wh = self.GetClientSizeTuple() dc.SetBrush(wx.Brush(self.GetBackgroundColour())) dc.SetPen(wx.Pen(self.GetBackgroundColour())) dc.DrawRectangle(0, 0, ww, wh) # aspect ratio of paper aspect = self.cfg.paperWidth / self.cfg.paperHeight # calculate which way we can best fit the paper on screen h = wh w = int(aspect * wh) if w > ww: w = ww h = int(ww / aspect) # offset of paper ox = (ww - w) // 2 oy = (wh - h) // 2 dc.SetPen(wx.BLACK_PEN) dc.SetBrush(wx.WHITE_BRUSH) dc.DrawRectangle(ox, oy, w, h) if self.ctrl.pageIndex != -1: page = self.ctrl.titles.pages[self.ctrl.pageIndex] for i in range(len(page)): ts = page[i] # text height in mm textHinMM = util.getTextHeight(ts.size) textH = int((textHinMM / self.cfg.paperHeight) * h) textH = max(1, textH) y = ts.y for line in ts.items: # people may have empty lines in between non-empty # lines to achieve double spaced lines; don't draw a # rectangle for lines consisting of nothing but # whitespace if line.strip(): textW = int((util.getTextWidth(line, ts.getStyle(), ts.size) / self.cfg.paperWidth) * w) textW = max(1, textW) if ts.isCentered: xp = w // 2 - textW // 2 else: xp = int((ts.x / self.cfg.paperWidth) * w) if ts.isRightJustified: xp -= textW if i == self.ctrl.tsIndex: dc.SetPen(wx.RED_PEN) dc.SetBrush(wx.RED_BRUSH) else: dc.SetPen(wx.BLACK_PEN) dc.SetBrush(wx.BLACK_BRUSH) yp = int((y / self.cfg.paperHeight) * h) dc.DrawRectangle(ox + xp, oy + yp, textW, textH) y += textHinMM
def OnPaint(self, event): dc = wx.BufferedPaintDC(self, self.screenBuf) # widget size ww, wh = self.GetClientSizeTuple() dc.SetBrush(wx.Brush(self.GetBackgroundColour())) dc.SetPen(wx.Pen(self.GetBackgroundColour())) dc.DrawRectangle(0, 0, ww, wh) # aspect ratio of paper aspect = self.cfg.paperWidth / self.cfg.paperHeight # calculate which way we can best fit the paper on screen h = wh w = int(aspect * wh) if w > ww: w = ww h = int(ww / aspect) # offset of paper ox = (ww - w) // 2 oy = (wh - h) // 2 dc.SetPen(wx.BLACK_PEN) dc.SetBrush(wx.WHITE_BRUSH) dc.DrawRectangle(ox, oy, w, h) if self.ctrl.pageIndex != -1: page = self.ctrl.titles.pages[self.ctrl.pageIndex] for i in range(len(page)): ts = page[i] if len(ts.text) == 0: continue textW = int((util.getTextWidth(ts.text, ts.getStyle(), ts.size) / self.cfg.paperWidth) * w) textW = max(1, textW) textH = int((util.getTextHeight(ts.size) / self.cfg.paperHeight) * h) textH = max(1, textH) if ts.isCentered: xp = w // 2 - textW // 2 else: xp = int((ts.x / self.cfg.paperWidth) * w) yp = int((ts.y / self.cfg.paperHeight) * h) if i == self.ctrl.tsIndex: dc.SetPen(wx.RED_PEN) dc.SetBrush(wx.RED_BRUSH) else: dc.SetPen(wx.BLACK_PEN) dc.SetBrush(wx.BLACK_BRUSH) dc.DrawRectangle(ox + xp, oy + yp, textW, textH)
def __init__(self, sp, minLines): self.sp = sp ls = sp.lines # PageInfo's for each page, 0-indexed. self.pages = [] for i in xrange(len(sp.pages) - 1): self.pages.append(PageInfo()) # map of CharInfo objects. key = name, value = CharInfo. tmpCinfo = {} name = "UNKNOWN" for i in xrange(len(ls)): pgNr = sp.line2page(i) - 1 pi = self.pages[pgNr] line = ls[i] pi.addLine(line.lt) if (line.lt == screenplay.CHARACTER) and (line.lb == screenplay.LB_LAST): name = util.upper(line.text) elif line.lt == screenplay.DIALOGUE: pi.addLineToSpeaker(name) ci = tmpCinfo.get(name) if ci: ci.addLine(pgNr) else: tmpCinfo[name] = CharInfo(name, pgNr) elif line.lt != screenplay.PAREN: name = "UNKNOWN" # CharInfo's. self.cinfo = [] for v in tmpCinfo.values(): if v.lineCnt >= minLines: self.cinfo.append(v) # start Y of page markers self.pageY = 20.0 # where dialogue density bars start and how tall they are self.barY = 30.0 self.barHeight = 15.0 # chart Y pos self.chartY = 50.0 # how much to leave empty on each side (mm) self.margin = 10.0 # try point sizes 10,9,8,7,6 until all characters fit on the page # (if 6 is still too big, too bad) size = 10 while 1: # character font size in points self.charFs = size # how many mm in Y direction for each character self.charY = util.getTextHeight(self.charFs) # height of chart self.chartHeight = len(self.cinfo) * self.charY if size <= 6: break if (self.chartY + self.chartHeight) <= (sp.cfg.paperWidth - self.margin): break size -= 1 # calculate maximum length of character name, and start position # of chart from that maxLen = 0 for ci in self.cinfo: maxLen = max(maxLen, len(ci.name)) maxLen = max(10, maxLen) charX = util.getTextWidth(" ", pml.COURIER, self.charFs) # chart X pos self.chartX = self.margin + maxLen * charX + 3 # width of chart self.chartWidth = sp.cfg.paperHeight - self.chartX - self.margin # page contents bar legends' size and position self.legendWidth = 23.0 self.legendHeight = 23.0 self.legendX = self.margin + 2.0 self.legendY = self.barY + self.barHeight - self.legendHeight # margin from legend border to first item self.legendMargin = 2.0 # spacing from one legend item to next self.legendSpacing = 5.0 # spacing from one legend item to next self.legendSize = 4.0