summaryrefslogtreecommitdiffstats
path: root/pykuttans/src/kuttans.py
diff options
context:
space:
mode:
Diffstat (limited to 'pykuttans/src/kuttans.py')
-rw-r--r--pykuttans/src/kuttans.py368
1 files changed, 368 insertions, 0 deletions
diff --git a/pykuttans/src/kuttans.py b/pykuttans/src/kuttans.py
new file mode 100644
index 0000000..796515f
--- /dev/null
+++ b/pykuttans/src/kuttans.py
@@ -0,0 +1,368 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2009 Rajeesh K Nambiar <rajeeshknambiar@gmail.com>,
+# Rahul <rahulrs@gmx.com>
+#
+# This program 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.
+#
+# This program 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 this program if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+import sys
+import os
+import codecs
+
+from payyans import Payyans
+
+from PyQt4 import QtCore, QtGui
+from PyQt4.Qt import *
+from kuttans_ui import Ui_Kuttans
+
+QObj = QtCore.QObject # Short name ;-)
+
+_app_name = "Kuttans"
+_app_version = "0.1"
+
+class KuttansApp(QtGui.QMainWindow):
+ def __init__(self, parent=None):
+
+ self.direction = None
+ self.InputFile = None
+ self.MappingFile = None
+ self.OutputFile = None
+
+ QtGui.QWidget.__init__(self, parent)
+ self.ui = Ui_Kuttans()
+ self.ui.setupUi(self)
+ Ui = self.ui # Another short name ;-)
+
+ Ui.actionCut.setEnabled(False)
+ Ui.actionCopy.setEnabled(False)
+ Ui.actionDelete.setEnabled(False)
+ Ui.actionASCIIToUnicodePDF.setEnabled(False)
+ Ui.actionUnicodeToASCIIPDF.setEnabled(False)
+
+ Ui.toolBar.setAllowedAreas(Qt.TopToolBarArea | Qt.BottomToolBarArea)
+ Ui.toolBar.setWindowTitle("Format Actions")
+ Ui.comboFont = QtGui.QFontComboBox(Ui.toolBar)
+ Ui.toolBar.addWidget(Ui.comboFont)
+ self.connect(Ui.comboFont, QtCore.SIGNAL("activated(QString)"), self.textFamily)
+ Ui.comboSize = QtGui.QComboBox(Ui.toolBar)
+ Ui.comboSize.setObjectName("comboSize")
+ Ui.comboSize.setEditable(True)
+ #Ui.comboSize.setCurrentIndex(Ui.comboSize.findText(str(QtGui.QApplication.font().pointSize())))
+ Ui.toolBar.addWidget(Ui.comboSize)
+ fontDb = QtGui.QFontDatabase
+ for size in fontDb.standardSizes():
+ Ui.comboSize.addItem(str(size))
+ self.connect(Ui.comboSize, QtCore.SIGNAL("activated(QString)"), self.textSize)
+
+ self.connect(Ui.textEdit, QtCore.SIGNAL("copyAvailable(bool)"), Ui.actionCut, QtCore.SLOT("setEnabled(bool)")) #ഉപയോക്താവ് ഏതെങ്കിലും പാഠഭാഗം തിരഞ്ഞെടുത്തെങ്കില്‍ മാത്രം...
+ self.connect(Ui.textEdit, QtCore.SIGNAL("copyAvailable(bool)"), Ui.actionCopy, QtCore.SLOT("setEnabled(bool)")) #'cut', 'copy' എന്നിവ സജ്ജീവമാക്കുക
+ self.connect(Ui.actionOpen, QtCore.SIGNAL("triggered()"), self.openFile) #രേഖ തുറക്കാനുള്ള ആജ്ഞ open() എന്ന പ്രവൃത്തിയുമായി ബന്ധിപ്പിക്കുക
+ self.connect(Ui.actionSave, QtCore.SIGNAL("triggered()"), self.saveFile)
+ self.connect(Ui.actionSaveAs, QtCore.SIGNAL("triggered()"), self.saveFileAs)
+ self.connect(Ui.actionAbout, QtCore.SIGNAL("triggered()"), self.About)
+ self.connect(Ui.actionClose, QtCore.SIGNAL("triggered()"), self, QtCore.SLOT("close()"))
+
+ self.connect(Ui.actionNew, QtCore.SIGNAL("triggered()"), self.newFile)
+ self.connect(Ui.actionExportPDF, QtCore.SIGNAL("triggered()"), self.filePrintPDF)
+ self.connect(Ui.actionPrint, QtCore.SIGNAL("triggered()"), self.filePrint)
+ self.connect(Ui.actionPrintPreview, QtCore.SIGNAL("triggered()"), self.filePrintPreview)
+ self.connect(Ui.textEdit.document(), QtCore.SIGNAL("contentsChanged()"), self.documentWasModified)
+
+ self.connect(Ui.actionRevathi_a2u, QtCore.SIGNAL("triggered()"), self.Revathi_a2u)
+ self.connect(Ui.actionIndulekha_a2u, QtCore.SIGNAL("triggered()"), self.Indulekha_a2u)
+ self.connect(Ui.actionKarthika_a2u, QtCore.SIGNAL("triggered()"), self.Karthika_a2u)
+ self.connect(Ui.actionSelectFontMap_a2u, QtCore.SIGNAL("triggered()"), self.customMap_a2u)
+ self.connect(Ui.actionASCIIToUnicodePDF, QtCore.SIGNAL("triggered()"), self.asciiToUnicodePDF)
+
+ self.connect(Ui.actionRevathi_u2a, QtCore.SIGNAL("triggered()"), self.Revathi_u2a)
+ self.connect(Ui.actionIndulekha_u2a, QtCore.SIGNAL("triggered()"), self.Indulekha_u2a)
+ self.connect(Ui.actionKarthika_u2a, QtCore.SIGNAL("triggered()"), self.Karthika_u2a)
+ self.connect(Ui.actionSelectFontMap_u2a, QtCore.SIGNAL("triggered()"), self.customMap_u2a)
+
+ self.readSettings()
+ self.setCurrentFile(self.tr("untitled.txt"))
+ self.x = 1
+
+ def textSize(self, qString):
+ fmt = QtGui.QTextCharFormat()
+ fmt.setFontPointSize(float(qString));
+ self.mergeFormatOnWordOrSelection(fmt)
+
+ def textFamily(self, qString):
+ fmt = QtGui.QTextCharFormat()
+ fmt.setFontFamily(qString);
+ self.mergeFormatOnWordOrSelection(fmt)
+
+ def mergeFormatOnWordOrSelection(self, format):
+ cursor = self.ui.textEdit.textCursor()
+ if not cursor.hasSelection():
+ cursor.select(QtGui.QTextCursor.WordUnderCursor)
+ cursor.mergeCharFormat(format)
+ self.ui.textEdit.mergeCurrentCharFormat(format)
+
+ def directoryName(self, fullname):
+ return QtCore.QFileInfo(fullname).absolutePath()
+
+ def strippedFileName(self, fullname):
+ return QtCore.QFileInfo(fullname).fileName()
+
+ def openFile(self):
+ fName = QtGui.QFileDialog.getOpenFileName(self, self.tr("Select Input file"),"", "*.txt *.pdf")
+ self.curFile = str(fName)
+ path, extn = os.path.splitext(self.curFile)
+ if os.path.isfile(fName):
+ if extn == ".txt":
+ QApplication.setOverrideCursor(Qt.WaitCursor)
+ self.ui.textEdit.setPlainText(codecs.open(fName, 'r', 'utf-8').read())
+ QApplication.restoreOverrideCursor()
+ self.setCurrentFile(fName)
+ self.ui.statusbar.showMessage("File " + self.strippedFileName(fName) + " Opened", 2000) #/൨൦൦൦ മില്ലി സെക്കന്റ് നേരം സ്റ്റാറ്റസ് ബാറില്‍ പ്രദര്‍ശിപ്പിക്കുക
+ self.InputFile = str(fName)
+ self.x = 0
+ if extn == ".pdf":
+ print "Need to implement displaying PDF file, with QtPoppler"
+
+ def save(self):
+ if self.x==1:
+ return self.saveFileAs()
+ if self.curFile.isEmpty():
+ return self.saveFileAs()
+ else:
+ return self.saveFile(self.curFile)
+
+ def saveFile(self,fileName):
+ QApplication.setOverrideCursor(Qt.WaitCursor)
+ s = codecs.open(fileName,'w','utf-8')
+ s.write(unicode(self.ui.textEdit.toPlainText()))
+ s.close()
+ QApplication.restoreOverrideCursor()
+ self.setCurrentFile(fileName)
+ self.ui.statusbar.showMessage(self.tr("File ") + self.strippedFileName(fileName) + self.tr(" Saved"), 2000)
+
+ def saveFileAs(self):
+ fileName = QtGui.QFileDialog.getSaveFileName()
+ if (fileName.isEmpty() != 0):
+ return False
+ else:
+ self.x = 0
+ return self.saveFile(fileName)
+
+ def maybeSave(self):
+ if self.ui.textEdit.document().isModified():
+ ret = QtGui.QMessageBox.warning(self, self.tr("Warning"),
+ self.tr("<h4 align=\"center\">The document has been modified.\n"
+ "<h4 align=\"center\">Do you want to save your changes?"),
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.Default,
+ QtGui.QMessageBox.No,
+ QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Escape)
+ if ret == QtGui.QMessageBox.Yes:
+ return self.save()
+ elif ret == QtGui.QMessageBox.Cancel:
+ return False
+ return True
+
+ def setCurrentFile(self, fileName):
+ self.curFile = fileName
+ self.ui.textEdit.document().setModified(False)
+ self.setWindowModified(False)
+ if self.curFile.isEmpty():
+ shownName = self.tr("untitled.txt")
+ else:
+ shownName = self.strippedFileName(self.curFile)
+ self.setWindowTitle(self.tr("%1[*] - %2").arg(shownName).arg(self.tr("Kuttans")))
+
+ def About(self):
+ QtGui.QMessageBox.about(self, self.tr("About"+ _app_name),
+ self.tr("<h1 align=\"center\">"+_app_name+" "+_app_version+"<p><h4 align=\"center\">A GUI frontend for Payyans<p><h4 align=\"center\"><a href=\"www.smc.org.in\">Swathanthra Malayalam Computing</a>"))
+
+ def newFile(self):
+ if self.maybeSave():
+ self.ui.textEdit.clear()
+ self.setCurrentFile(QtCore.QString())
+
+ def filePrintPDF(self):
+ document = self.ui.textEdit.document()
+ printer = QtGui.QPrinter(QPrinter.HighResolution)
+ fileName = QFileDialog.getSaveFileName()
+ if (fileName.isEmpty()):
+ return
+ else:
+ if (QFileInfo(fileName).suffix().isEmpty()):
+ fileName.append(".pdf")
+ printer.setOutputFormat(QPrinter.PdfFormat)
+ printer.setOutputFileName(fileName)
+ document.print_(printer)
+
+ def filePrint(self):
+ document = self.ui.textEdit.document()
+ printer = QtGui.QPrinter()
+ dialog = QtGui.QPrintDialog(printer, self)
+ dialog.setWindowTitle(self.tr("Print Document"))
+ if dialog.exec_() != QtGui.QDialog.Accepted:
+ return
+ document.print_(printer)
+
+ def filePrintPreview(self):
+ printer = QtGui.QPrinter()
+ preview = QtGui.QPrintPreviewDialog(printer)
+ def render():
+ doc = self.ui.textEdit.document()
+ doc.print_(printer)
+ preview.connect(preview, QtCore.SIGNAL('paintRequested(QPrinter*)'), render)
+ preview.exec_()
+
+ def documentWasModified(self):
+ self.setWindowModified(self.ui.textEdit.document().isModified())
+
+ def Revathi_a2u(self):
+ if self.InputFile == None:
+ QtGui.QMessageBox.about(self, self.tr("Message"),
+ self.tr("<h3 align=\"center\">No file selected<p><h4 align=\"center\">Open or enter the document to convert"))
+ return
+ self.OutputFile = self.directoryName(self.InputFile) + "/unicode-" + self.strippedFileName(self.InputFile)
+ self.ui.statusbar.showMessage(self.tr("Converting... Please wait"))
+ if self.ConvertFiles("revathi.map", "a2u") == 0:
+ self.ui.statusbar.showMessage(self.tr("Converted successfully!"), 2000)
+ else:
+ self.ui.statusbar.showMessage(self.tr("Conversion failed!"), 2000)
+
+ def Revathi_u2a(self):
+ if self.InputFile == None:
+ QtGui.QMessageBox.about(self, self.tr("Message"),
+ self.tr("<h3 align=\"center\">No file selected<p><h4 align=\"center\">Open or enter the document to convert"))
+ return
+ self.OutputFile = self.directoryName(self.InputFile) + "/ascii-" + self.strippedFileName(self.InputFile)
+ self.ui.statusbar.showMessage(self.tr("Converting... Please wait"))
+ if self.ConvertFiles("revathi.map", "u2a") == 0:
+ self.ui.statusbar.showMessage(self.tr("Converted successfully!"), 2000)
+ else:
+ self.ui.statusbar.showMessage(self.tr("Conversion failed!"), 2000)
+
+ def Indulekha_a2u(self):
+ if self.InputFile == None:
+ QtGui.QMessageBox.about(self, self.tr("Message"),
+ self.tr("<h3 align=\"center\">No file selected<p><h4 align=\"center\">Open or enter the document to convert"))
+ return
+ self.OutputFile = self.directoryName(self.InputFile) + "/unicode-" + self.strippedFileName(self.InputFile)
+ self.ui.statusbar.showMessage(self.tr("Converting... Please wait"))
+ if self.ConvertFiles("indulekha.map", "a2u") == 0:
+ self.ui.statusbar.showMessage(self.tr("Converted successfully!"), 2000)
+ else:
+ self.ui.statusbar.showMessage(self.tr("Conversion failed!", 2000))
+
+ def Indulekha_u2a(self):
+ if self.InputFile == None:
+ QtGui.QMessageBox.about(self, self.tr("Message"),
+ self.tr("<h3 align=\"center\">No file selected<p><h4 align=\"center\">Open or enter the document to convert"))
+ return
+ self.OutputFile = self.directoryName(self.InputFile) + "/ascii-" + self.strippedFileName(self.InputFile)
+ self.ui.statusbar.showMessage(self.tr("Converting... Please wait"))
+ if self.ConvertFiles("indulekha.map", "u2a") == 0:
+ self.ui.statusbar.showMessage(self.tr("Converted successfully!"), 2000)
+ else:
+ self.ui.statusbar.showMessage(self.tr("Conversion failed!"), 2000)
+
+ def Karthika_a2u(self):
+ if self.InputFile == None:
+ QtGui.QMessageBox.about(self, self.tr("Message"),
+ self.tr("<h3 align=\"center\">No file selected<p><h4 align=\"center\">Open or enter the document to convert"))
+ return
+ self.OutputFile = self.directoryName(self.InputFile) + "/unicode-" + self.strippedFileName(self.InputFile)
+ self.ui.statusbar.showMessage(self.tr("Converting... Please wait"))
+ if self.ConvertFiles("karthika.map", "a2u") == 0:
+ self.ui.statusbar.showMessage(self.tr("Converted successfully!"), 2000)
+ else:
+ self.ui.statusbar.showMessage(self.tr("Conversion failed!"), 2000)
+
+ def Karthika_u2a(self):
+ if self.InputFile == None:
+ QtGui.QMessageBox.about(self, self.tr("Message"),
+ self.tr("<h3 align=\"center\">No file selected<p><h4 align=\"center\">Open or enter the document to convert"))
+ return
+ self.OutputFile = self.directoryName(self.InputFile) + "/ascii-" + self.strippedFileName(self.InputFile)
+ self.ui.statusbar.showMessage(self.tr("Converting... Please wait"))
+ if self.ConvertFiles("karthika.map", "u2a") == 0:
+ self.ui.statusbar.showMessage(self.tr("Converted successfully!"), 2000)
+ else:
+ self.ui.statusbar.showMessage(self.tr("Conversion failed!"), 2000)
+
+ def customMap_a2u(self):
+ if self.InputFile == None:
+ QtGui.QMessageBox.about(self, self.tr("Message"),
+ self.tr("<h3 align=\"center\">No file selected<p><h4 align=\"center\">Open or enter the document to convert"))
+ return
+ #fileName = QFileDialog.getOpenFileName(, self.tr("Select the fontmap file"), QDir.homePath (), self.tr("Font Maps (*.map);;All Files (*)"))
+ fileName = QFileDialog.getOpenFileName()
+ self.OutputFile = self.directoryName(self.InputFile) + "/unicode-" + self.strippedFileName(self.InputFile)
+ self.ui.statusbar.showMessage(self.tr("Converting... Please wait"))
+ if self.ConvertFilesCustom(fileName, "a2u") == 0:
+ self.ui.statusbar.showMessage(self.tr("Converted successfully!"), 2000)
+ else:
+ self.ui.statusbar.showMessage(self.tr("Conversion failed!"), 2000)
+
+ def customMap_u2a(self):
+ if self.InputFile == None:
+ QtGui.QMessageBox.about(self, self.tr("Message"),
+ self.tr("<h3 align=\"center\">No file selected<p><h4 align=\"center\">Open or enter the document to convert"))
+ return
+ fileName = QFileDialog.getOpenFileName()
+ self.OutputFile = self.directoryName(self.InputFile) + "/ascii-" + self.strippedFileName(self.InputFile)
+ self.ui.statusbar.showMessage(self.tr("Converting... Please wait"))
+ if self.ConvertFiles("karthika.map", "u2a") == 0:
+ self.ui.statusbar.showMessage(self.tr("Converted successfully!"), 2000)
+ else:
+ self.ui.statusbar.showMessage(self.tr("Conversion failed!"), 2000)
+
+ def ConvertFiles(self, map_name, direction):
+ self.MappingFile = sys.prefix + "/share/payyans/maps/" + map_name
+ p = Payyans(self.InputFile, self.OutputFile, self.MappingFile)
+ if direction == "a2u":
+ return p.ascii2unicode()
+ elif direction == "u2a":
+ return p.unicode2ascii()
+
+ def ConvertFilesCustom(self, map_name, direction):
+ self.MappingFile = map_name
+ p = Payyans(self.InputFile, self.OutputFile, self.MappingFile)
+ if direction == "a2u":
+ return p.ascii2unicode()
+ elif direction == "u2a":
+ return p.unicode2ascii()
+
+ def asciiToUnicodePDF(self):
+ # poppler-qt4 can be made use of, to render PDF files
+ pass
+
+ def closeEvent(self, event):
+ if self.maybeSave():
+ self.writeSettings()
+ event.accept()
+ else:
+ event.ignore()
+
+ def writeSettings(self):
+ settings = QtCore.QSettings("SMC", "Kuttans")
+ settings.setValue("pos", QtCore.QVariant(self.pos()))
+ settings.setValue("size", QtCore.QVariant(self.size()))
+
+ def readSettings(self):
+ settings = QtCore.QSettings("SMC", "Kuttans")
+ pos = settings.value("pos", QtCore.QVariant(QtCore.QPoint(200, 200))).toPoint()
+ size = settings.value("size", QtCore.QVariant(QtCore.QSize(400, 400))).toSize()
+ self.resize(size)
+ self.move(pos)
+