#! /usr/bin/env python3

# HB Tester -- a simple GUI to test HB's rendering of a particular string/font combination
# (C) Shriramana Sharma, 2013
# Licence: GPLv3

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MainWindow(QWidget) :
	
	def __init__(self) :
		
		QWidget.__init__(self)
		
		self.setObjectName("mainWindow")
		self.setWindowTitle("HarfBuzz Tester")
		
		self.inputLabel = QLabel("&Input text")
		self.inputTextBox = QPlainTextEdit()
		self.inputLabel.setBuddy(self.inputTextBox)
		
		self.fontFileLabel = QLabel("Font fi&le")
		self.fontFileTextBox = QLineEdit()
		self.fontFileLabel.setBuddy(self.fontFileTextBox)
		
		self.fontFileButton = QPushButton("&Find...")
		
		self.fontSizeLabel = QLabel("&Size")
		self.fontSizeSpin = QSpinBox()
		self.fontSizeSpin.setMinimum(8)
		self.fontSizeSpin.setValue(16)
		self.fontSizeLabel.setBuddy(self.fontSizeSpin)
		
		self.renderButton = QPushButton("&Render")
		self.outputLabel = QLabel()
		self.outputLabel.setAlignment(Qt.AlignCenter)
		
		self.inputLayout = QHBoxLayout()
		self.inputLayout.addWidget(self.inputLabel)
		self.inputLayout.addWidget(self.inputTextBox)
		
		self.fontFileLayout = QHBoxLayout()
		self.fontFileLayout.addWidget(self.fontFileLabel)
		self.fontFileLayout.addWidget(self.fontFileTextBox)
		self.fontFileLayout.addWidget(self.fontFileButton)
		self.fontFileLayout.addWidget(self.fontSizeLabel)
		self.fontFileLayout.addWidget(self.fontSizeSpin)
		
		self.layout = QVBoxLayout()
		self.layout.addLayout(self.inputLayout)
		self.layout.addLayout(self.fontFileLayout)
		self.layout.addWidget(self.renderButton)
		self.layout.addWidget(self.outputLabel)
		self.setLayout(self.layout)
		
		QObject.connect ( self.renderButton, SIGNAL("clicked()"), self.renderText )
		QObject.connect ( self.fontFileButton, SIGNAL("clicked()"), self.selectFontFile )
		
	def renderText(self) :
		
		if self.inputTextBox.toPlainText() == "" :
			self.outputLabel.clear() ; return
		
		fontFileName = self.fontFileTextBox.text()
		
		if fontFileName == "" :
			QMessageBox.critical ( self, "HarfBuzz Tester - Error", "No font file is specified" )
			self.outputLabel.clear() ; return
		
		if not QFile.exists(fontFileName) :
			QMessageBox.critical ( self, "HarfBuzz Tester - Error", "The specified font file does not exist" )
			self.outputLabel.clear() ; return
		
		if fontFileName[-4:] not in ( ".ttf", ".otf" ) :
			QMessageBox.critical ( self, "HarfBuzz Tester - Error", "The specified font file does not seem to be a font file (only .ttf or .otf allowed)" )
			self.outputLabel.clear() ; return
		
		tmpFile = QTemporaryFile()
		tmpFile.open()
		import os
		os.system ( "hb-view --background=#00000000 --output-format=png --output-file=" + tmpFile.fileName().replace(" ","\ ") + " " + "--font-file=" + fontFileName.replace(" ","\ ") + " --font-size=" + str(self.fontSizeSpin.value()) + " " + self.inputTextBox.toPlainText().replace(" ","\ ").replace("\n","\ ") )
		self.outputLabel.setPixmap( QPixmap ( tmpFile.fileName(), "png" ))
	
	def selectFontFile(self) :
		fontFileName = self.fontFileTextBox.text()
		path = fontFileName if QFile.exists(fontFileName) else QDir.homePath()
		newFontFileName = QFileDialog.getOpenFileName ( self, "HarfBuzz Tester - Select Font", path, "Fonts (*.ttf *.otf)" )
		if newFontFileName != "" : self.fontFileTextBox.setText(newFontFileName)

app = QApplication([])
mainWindow = MainWindow()
mainWindow.show()
app.exec_()
