fixes to get 4x2 landscape layout working

- made it properly pick landscape if can cram more cards in that way
- tabs are on alternating sides as long as horz number of tabs is even (not just 2)
- set labels are printed on side (vertically) if not enough space at bottom
- ...and not at all if not enough room on side OR bottom (with warning)
This commit is contained in:
Paul Molodowitch 2013-12-14 10:15:30 -08:00
parent c2a3799885
commit 0ef68bce99

View File

@ -142,7 +142,7 @@ class DominionTabs:
self.canvas.line(-2*cmw,0,-cmw,0) self.canvas.line(-2*cmw,0,-cmw,0)
self.canvas.line(-2*cmw,self.tabBaseHeight,-cmw,self.tabBaseHeight) self.canvas.line(-2*cmw,self.tabBaseHeight,-cmw,self.tabBaseHeight)
if y > 0: if y > 0:
self.canvas.line(-2*cmw,self.tabTotalHeight,-cmw,self.tabTotalHeight) self.canvas.line(-2*cmw,self.tabHeight,-cmw,self.tabHeight)
if mirror: if mirror:
self.canvas.restoreState() self.canvas.restoreState()
if y == 0: if y == 0:
@ -151,13 +151,13 @@ class DominionTabs:
if x == 0: if x == 0:
self.canvas.line(0,-2*cmw,0,-cmw) self.canvas.line(0,-2*cmw,0,-cmw)
elif y == self.numTabsVertical-1: elif y == self.numTabsVertical-1:
self.canvas.line(self.tabWidth,self.tabTotalHeight+cmw,self.tabWidth,self.tabTotalHeight+2*cmw) self.canvas.line(self.tabWidth,self.tabHeight+cmw,self.tabWidth,self.tabHeight+2*cmw)
self.canvas.line(self.tabWidth-self.tabLabelWidth, self.canvas.line(self.tabWidth-self.tabLabelWidth,
self.tabTotalHeight+cmw, self.tabHeight+cmw,
self.tabWidth-self.tabLabelWidth, self.tabWidth-self.tabLabelWidth,
self.tabTotalHeight+2*cmw) self.tabHeight+2*cmw)
if x == 0: if x == 0:
self.canvas.line(0,self.tabTotalHeight+cmw,0,self.tabTotalHeight+2*cmw) self.canvas.line(0,self.tabHeight+cmw,0,self.tabHeight+2*cmw)
self.canvas.restoreState() self.canvas.restoreState()
@ -166,9 +166,9 @@ class DominionTabs:
self.canvas.saveState() self.canvas.saveState()
if not rightSide or self.options.sameside: if not rightSide or self.options.sameside:
self.canvas.translate(self.tabWidth-self.tabLabelWidth, self.canvas.translate(self.tabWidth-self.tabLabelWidth,
self.tabTotalHeight-self.tabLabelHeight) self.tabHeight-self.tabLabelHeight)
else: else:
self.canvas.translate(0,self.tabTotalHeight-self.tabLabelHeight) self.canvas.translate(0,self.tabHeight-self.tabLabelHeight)
textWidth = 85 textWidth = 85
textHeight = self.tabLabelHeight/2-7+card.getType().getTabTextHeightOffset() textHeight = self.tabLabelHeight/2-7+card.getType().getTabTextHeightOffset()
@ -270,7 +270,7 @@ class DominionTabs:
s.fontName = "Times-Roman" s.fontName = "Times-Roman"
dmod = self.add_inline_images(d,s.fontSize) dmod = self.add_inline_images(d,s.fontSize)
p = Paragraph(dmod,s) p = Paragraph(dmod,s)
textHeight = self.tabTotalHeight - self.tabLabelHeight + 0.2*cm textHeight = self.tabHeight - self.tabLabelHeight + 0.2*cm
textWidth = self.tabWidth - cm textWidth = self.tabWidth - cm
w,h = p.wrap(textWidth,textHeight) w,h = p.wrap(textWidth,textHeight)
@ -286,7 +286,7 @@ class DominionTabs:
def drawDivider(self,card,x,y,useExtra=False): def drawDivider(self,card,x,y,useExtra=False):
#figure out whether the tab should go on the right side or not #figure out whether the tab should go on the right side or not
if self.numTabsHorizontal == 2: if self.numTabsHorizontal % 2 == 0:
rightSide = x%2 == 1 rightSide = x%2 == 1
else: else:
rightSide = useExtra rightSide = useExtra
@ -295,7 +295,7 @@ class DominionTabs:
self.canvas.translate(self.horizontalMargin,self.verticalMargin) self.canvas.translate(self.horizontalMargin,self.verticalMargin)
if useExtra: if useExtra:
self.canvas.translate(self.options.back_offset,0) self.canvas.translate(self.options.back_offset,0)
self.canvas.translate(x*(self.tabWidth+self.horizontalBorderSpace),y*(self.tabTotalHeight+self.verticalBorderSpace)) self.canvas.translate(x*self.totalTabWidth,y*self.totalTabHeight)
#actual drawing #actual drawing
if not self.options.tabs_only: if not self.options.tabs_only:
@ -384,13 +384,56 @@ class DominionTabs:
def drawSetNames(self, pageCards): def drawSetNames(self, pageCards):
#print sets for this page #print sets for this page
self.canvas.saveState() self.canvas.saveState()
self.canvas.setFont('MinionPro-Regular',12)
try:
# calculate the text height, font size, and orientation
maxFontsize = 12
minFontsize = 6
fontname = 'MinionPro-Regular'
font = pdfmetrics.getFont(fontname)
fontHeightRelative = (font.face.ascent + font.face.descent) / 1000
canFit = False
layouts = [{'rotation': 0,
'minMarginHeight': self.minVerticalMargin,
'totalMarginHeight': self.verticalMargin,
'width': self.paperwidth},
{'rotation': 90,
'minMarginHeight': self.minHorizontalMargin,
'totalMarginHeight': self.horizontalMargin,
'width': self.paperheight}]
for layout in layouts:
availableMargin = layout['totalMarginHeight'] - layout['minMarginHeight']
fontsize = availableMargin / fontHeightRelative
fontsize = min(maxFontsize, fontsize)
if fontsize >= minFontsize:
canFit = True
break
if not canFit:
import warnings
warnings.warn("Not enough space to display set names")
return
self.canvas.setFont(fontname,fontsize)
sets = [] sets = []
for c in pageCards: for c in pageCards:
setTitle = c.cardset.title() setTitle = c.cardset.title()
if setTitle not in sets: if setTitle not in sets:
sets.append(setTitle) sets.append(setTitle)
self.canvas.drawCentredString(self.paperwidth/2,20,'/'.join(sets))
xPos = layout['width'] / 2
yPos = layout['minMarginHeight'] + availableMargin / 2
if layout['rotation']:
self.canvas.rotate(layout['rotation'])
yPos = -yPos
self.canvas.drawCentredString(xPos,yPos,'/'.join(sets))
finally:
self.canvas.restoreState() self.canvas.restoreState()
def drawDividers(self,cards): def drawDividers(self,cards):
@ -512,25 +555,35 @@ class DominionTabs:
self.horizontalBorderSpace = 0*cm self.horizontalBorderSpace = 0*cm
self.verticalBorderSpace = 0*cm self.verticalBorderSpace = 0*cm
self.tabTotalHeight = self.tabBaseHeight + self.tabLabelHeight self.tabHeight = self.tabBaseHeight + self.tabLabelHeight
numTabsVerticalP = int ((self.paperheight - 2*minmarginheight) / self.tabTotalHeight) self.totalTabWidth = self.tabWidth + self.horizontalBorderSpace
numTabsHorizontalP = int ((self.paperwidth - 2*minmarginwidth) / self.tabWidth) self.totalTabHeight = self.tabHeight + self.verticalBorderSpace
numTabsVerticalL = int ((self.paperwidth - 2*minmarginwidth) / self.tabWidth)
numTabsHorizontalL = int ((self.paperheight - 2*minmarginheight) / self.tabTotalHeight)
if numTabsVerticalL * numTabsHorizontalL > numTabsVerticalP * numTabsHorizontalP: print "Paper dimensions: %fcm (w) x %fcm (h)" % (self.paperwidth / cm, self.paperheight / cm)
print "Tab dimensions: %fcm (w) x %fcm (h)" % (self.totalTabWidth / cm, self.totalTabHeight / cm)
numTabsVerticalP = int ((self.paperheight - 2*minmarginheight) / self.totalTabHeight)
numTabsHorizontalP = int ((self.paperwidth - 2*minmarginwidth) / self.totalTabWidth)
numTabsVerticalL = int ((self.paperwidth - 2*minmarginwidth) / self.totalTabHeight)
numTabsHorizontalL = int ((self.paperheight - 2*minmarginheight) / self.totalTabWidth)
if numTabsVerticalL * numTabsHorizontalL > numTabsVerticalP * numTabsHorizontalP and not fixedMargins:
self.numTabsVertical, self.numTabsHorizontal\ self.numTabsVertical, self.numTabsHorizontal\
= numTabsVerticalL, numTabsHorizontalL = numTabsVerticalL, numTabsHorizontalL
self.paperheight, self.paperwidth = self.paperwidth, self.paperheight self.paperheight, self.paperwidth = self.paperwidth, self.paperheight
self.minHorizontalMargin = minmarginheight
self.minVerticalMargin = minmarginwidth
else: else:
self.numTabsVertical, self.numTabsHorizontal\ self.numTabsVertical, self.numTabsHorizontal\
= numTabsVerticalP, numTabsHorizontalP = numTabsVerticalP, numTabsHorizontalP
self.minHorizontalMargin = minmarginwidth
self.minVerticalMargin = minmarginheight
if not fixedMargins: if not fixedMargins:
#dynamically max margins #dynamically max margins
self.horizontalMargin = (self.paperwidth-self.numTabsHorizontal*self.tabWidth)/2 self.horizontalMargin = (self.paperwidth-self.numTabsHorizontal*self.totalTabWidth)/2
self.verticalMargin = (self.paperheight-self.numTabsVertical*self.tabTotalHeight)/2 self.verticalMargin = (self.paperheight-self.numTabsVertical*self.totalTabHeight)/2
else: else:
self.horizontalMargin = minmarginwidth self.horizontalMargin = minmarginwidth
self.verticalMargin = minmarginheight self.verticalMargin = minmarginheight
@ -539,11 +592,11 @@ class DominionTabs:
self.verticalMargin / cm) self.verticalMargin / cm)
self.tabOutline = [(0,0,self.tabWidth,0), self.tabOutline = [(0,0,self.tabWidth,0),
(self.tabWidth,0,self.tabWidth,self.tabTotalHeight), (self.tabWidth,0,self.tabWidth,self.tabHeight),
(self.tabWidth,self.tabTotalHeight, (self.tabWidth,self.tabHeight,
self.tabWidth-self.tabLabelWidth,self.tabTotalHeight), self.tabWidth-self.tabLabelWidth,self.tabHeight),
(self.tabWidth-self.tabLabelWidth, (self.tabWidth-self.tabLabelWidth,
self.tabTotalHeight,self.tabWidth-self.tabLabelWidth, self.tabHeight,self.tabWidth-self.tabLabelWidth,
self.tabBaseHeight), self.tabBaseHeight),
(self.tabWidth-self.tabLabelWidth, (self.tabWidth-self.tabLabelWidth,
self.tabBaseHeight,0,self.tabBaseHeight), self.tabBaseHeight,0,self.tabBaseHeight),