# -*- coding: utf-8 -*-
"""
Copyright (c) 2014 Javier Quintano Merino aka jaXvi
This file is part of Coetool.
Coetool is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Coetool is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Coetool. If not, see .
"""
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtPrintSupport import *
import tempfile
from coetoolcore import *
class CoetoolGui(QMainWindow):
def __init__(self):
super(CoetoolGui, self).__init__()
self.printer = QPrinter()
self.scaleFactor = 0.0
self.imageLabel = QLabel()
self.imageLabel.setBackgroundRole(QPalette.Base)
self.imageLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
self.imageLabel.setScaledContents(True)
self.scrollArea = QScrollArea()
self.scrollArea.setBackgroundRole(QPalette.Dark)
self.scrollArea.setWidget(self.imageLabel)
hbox = QHBoxLayout()
self.leftTxt = QTextEdit()
self.leftTxt.setFontFamily('Courier')
self.leftTxt.setReadOnly(1)
self.rightImg = self.scrollArea
splitter = QSplitter(Qt.Horizontal)
splitter.addWidget(self.leftTxt)
splitter.addWidget(self.rightImg)
splitter.setSizes([400, 400])
hbox.addWidget(splitter)
QApplication.setStyle(QStyleFactory.create('Cleanlooks'))
self.setCentralWidget(splitter)
self.setWindowTitle("coetool")
self.statusBar().showMessage('coetool loaded...')
self.resize(800, 500)
self.createActions()
self.createMenus()
def open(self):
fileName, _ = QFileDialog.getOpenFileName(self, "Open file",
QDir.currentPath())
if fileName:
self.setWindowTitle("coetool - "+fileName)
self.statusBar().showMessage(fileName+' loaded')
if QFileInfo(fileName).suffix() == 'coe':
self.conversion = CoeConverter(fileName)
with open(fileName, encoding='utf-8') as coefile:
contents = coefile.read()
self.leftTxt.setPlainText(contents)
self.imageLabel.setPixmap(QPixmap.fromImage(self.conversion.img))
self.scaleFactor = 1.0
self.printAct.setEnabled(True)
self.fitToWindowAct.setEnabled(True)
self.updateActions()
self.saveImgAct.setEnabled(True)
if not self.fitToWindowAct.isChecked():
self.imageLabel.adjustSize()
else:
image = QImage(fileName)
if image.isNull():
QMessageBox.information(self, "coetool",
"Cannot load %s." % fileName)
return
self.statusBar().showMessage(fileName+' loaded')
self.imageLabel.setPixmap(QPixmap.fromImage(image))
self.scaleFactor = 1.0
self.printAct.setEnabled(True)
self.fitToWindowAct.setEnabled(True)
self.updateActions()
self.saveCoeAct.setEnabled(True)
if not self.fitToWindowAct.isChecked():
self.imageLabel.adjustSize()
tmpcoe = tempfile.NamedTemporaryFile(suffix='.coe', delete=False)
tmpcoe.close()
self.conversion = CoeConverter(fileName)
self.conversion.createCoe(tmpcoe.name)
with open(tmpcoe.name, encoding='utf-8') as coefile:
contents = coefile.read()
self.leftTxt.setPlainText(contents)
def print_(self):
dialog = QPrintDialog(self.printer, self)
if dialog.exec_():
painter = QPainter(self.printer)
rect = painter.viewport()
size = self.imageLabel.pixmap().size()
size.scale(rect.size(), Qt.KeepAspectRatio)
painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
painter.setWindow(self.imageLabel.pixmap().rect())
painter.drawPixmap(0, 0, self.imageLabel.pixmap())
def zoomIn(self):
self.scaleImage(1.25)
def zoomOut(self):
self.scaleImage(0.8)
def normalSize(self):
self.imageLabel.adjustSize()
self.scaleFactor = 1.0
def fitToWindow(self):
fitToWindow = self.fitToWindowAct.isChecked()
self.scrollArea.setWidgetResizable(fitToWindow)
if not fitToWindow:
self.normalSize()
self.updateActions()
def saveCoe(self):
coefilename, filter = QFileDialog.getSaveFileName(self, 'Save .coe file',
QDir.currentPath(), 'COE file (*.coe)')
self.conversion.createCoe(coefilename+'.coe')
self.statusBar().showMessage(coefilename+'.coe written to disk')
def saveImg(self):
filters='BMP image (*.bmp);;JPG image (*.jpg);; PNG image (*.png)'
imgfilename, selected_filter = QFileDialog.getSaveFileName(self, 'Save image file',
QDir.currentPath(),filters )
ext = (selected_filter.split()[0].lower())
self.conversion.exportImg(imgfilename+'.'+ext, ext)
self.statusBar().showMessage(imgfilename+'.'+ext+' written to disk')
def about(self):
QMessageBox.about(self, "About coetool",
"
coetool is a cli or gui program to convert "
"from .coe files (VGA memory map) to image files "
"and the other way around, load an image and generate .coe file.
"
"Also it is possible to zoom images, export and view raw bytes.
"
"jaXvi - april 2014
")
def createActions(self):
self.openAct = QAction("&Open...", self, shortcut="Ctrl+O",
triggered=self.open)
self.printAct = QAction("&Print...", self, shortcut="Ctrl+P",
enabled=False, triggered=self.print_)
self.saveCoeAct = QAction("Save .coe...", self, enabled=False, triggered=self.saveCoe)
self.saveImgAct = QAction("Save image...", self, enabled=False, triggered=self.saveImg)
self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q",
triggered=self.close)
self.zoomInAct = QAction("Zoom &In (25%)", self, shortcut="Ctrl++",
enabled=False, triggered=self.zoomIn)
self.zoomOutAct = QAction("Zoom &Out (25%)", self, shortcut="Ctrl+-",
enabled=False, triggered=self.zoomOut)
self.normalSizeAct = QAction("&Normal Size", self, shortcut="Ctrl+S",
enabled=False, triggered=self.normalSize)
self.fitToWindowAct = QAction("&Fit to Window", self, enabled=False,
checkable=True, shortcut="Ctrl+F", triggered=self.fitToWindow)
self.aboutAct = QAction("&About", self, triggered=self.about)
self.aboutQtAct = QAction("About &Qt", self,
triggered=QApplication.instance().aboutQt)
def createMenus(self):
self.fileMenu = QMenu("&File", self)
self.fileMenu.addAction(self.openAct)
self.fileMenu.addAction(self.printAct)
self.fileMenu.addSeparator()
self.fileMenu.addAction(self.saveCoeAct)
self.fileMenu.addAction(self.saveImgAct)
self.fileMenu.addSeparator()
self.fileMenu.addAction(self.exitAct)
self.viewMenu = QMenu("&View", self)
self.viewMenu.addAction(self.zoomInAct)
self.viewMenu.addAction(self.zoomOutAct)
self.viewMenu.addAction(self.normalSizeAct)
self.viewMenu.addSeparator()
self.viewMenu.addAction(self.fitToWindowAct)
self.helpMenu = QMenu("&Help", self)
self.helpMenu.addAction(self.aboutAct)
self.helpMenu.addAction(self.aboutQtAct)
self.menuBar().addMenu(self.fileMenu)
self.menuBar().addMenu(self.viewMenu)
self.menuBar().addMenu(self.helpMenu)
def updateActions(self):
self.zoomInAct.setEnabled(not self.fitToWindowAct.isChecked())
self.zoomOutAct.setEnabled(not self.fitToWindowAct.isChecked())
self.normalSizeAct.setEnabled(not self.fitToWindowAct.isChecked())
def scaleImage(self, factor):
self.scaleFactor *= factor
self.imageLabel.resize(self.scaleFactor * self.imageLabel.pixmap().size())
self.adjustScrollBar(self.scrollArea.horizontalScrollBar(), factor)
self.adjustScrollBar(self.scrollArea.verticalScrollBar(), factor)
self.zoomInAct.setEnabled(self.scaleFactor < 20.0)
self.zoomOutAct.setEnabled(self.scaleFactor > 0.2)
def adjustScrollBar(self, scrollBar, factor):
scrollBar.setValue(int(factor * scrollBar.value()
+ ((factor - 1) * scrollBar.pageStep()/2)))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
coetoolgui = CoetoolGui()
coetoolgui.show()
sys.exit(app.exec_())