# HG changeset patch # User Jari-Matti M?kel? # Date 1194547814 -7200 # Node ID e91b224c223b07acc5ab2222d7c72057d2b7ca3f # Parent 381044a3feacf0d776f43f31da96ba15a2c4f7aa# Parent 30925590f392f9a29e803e95ec3ed28360d1119a Merged changes. diff -r 381044a3feac -r e91b224c223b trunk/i18n/dil.tproj --- a/trunk/i18n/dil.tproj Thu Nov 08 17:44:25 2007 +0200 +++ b/trunk/i18n/dil.tproj Thu Nov 08 20:50:14 2007 +0200 @@ -1,6 +1,6 @@ BuildScript: build.py CreationDate: '2007-10-12 09:41:17.868084' -LangFiles: [en.cat, de.cat, tr.cat, fi.cat] +LangFiles: [de.cat, tr.cat, fi.cat] MsgIDs: - {ID: 0, Name: IllegalCharacter, Order: 0} - {ID: 1, Name: InvalidUnicodeCharacter, Order: 1} @@ -51,4 +51,4 @@ - {ID: 46, Name: HelpGenerate, Order: 46} - {ID: 47, Name: HelpImportGraph, Order: 47} Name: dil -SourceLangFile: '' +SourceLangFile: en.cat diff -r 381044a3feac -r e91b224c223b trunk/src/translator/langfile.py --- a/trunk/src/translator/langfile.py Thu Nov 08 17:44:25 2007 +0200 +++ b/trunk/src/translator/langfile.py Thu Nov 08 20:50:14 2007 +0200 @@ -15,6 +15,8 @@ class LangFile: def __init__(self, filePath): self.filePath = filePath + self.isSource = False + self.source = None # Load language file and check data integrity. doc = yaml.load(open(filePath, "r")) self.doc = doc @@ -39,7 +41,7 @@ authors += [unicode(author[0]), unicode(author[1])] self.authors = authors - messages = [] + self.msgDict = {} # {ID : msg, ...} for msg in self.messages: self.checkType(msg, dict, "LangFile: messages must be of type dict.") try: @@ -49,12 +51,30 @@ msg["LastEd"] = unicode(msg["LastEd"]) except KeyError, e: raise LoadingError("LangFile: a message is missing the '%s' key." % str(e)) - messages += [msg] - self.messages = messages + self.msgDict[msg["ID"]] = msg def checkType(self, var, type_, msg=""): if not isinstance(var, type_): raise LoadingError(msg) + def setSource(self, sourceLangFile): + self.source = sourceLangFile + + def getMsg(self, ID): + for msg in self.messages: + if msg["ID"] == ID: + return msg + return None + + def createMissingMessages(self, IDs): + for ID in IDs: + if not self.msgDict.has_key(ID): + msg = self.createEmptyMsg(ID) + self.msgDict[ID] = msg + self.messages += [msg] + + def createEmptyMsg(self, ID): + return {"ID":ID,"Text":"","Annot":"","LastEd":""} + def save(self): pass diff -r 381044a3feac -r e91b224c223b trunk/src/translator/msg_form.ui --- a/trunk/src/translator/msg_form.ui Thu Nov 08 17:44:25 2007 +0200 +++ b/trunk/src/translator/msg_form.ui Thu Nov 08 20:50:14 2007 +0200 @@ -15,6 +15,9 @@ + + QFrame::StyledPanel + Qt::Vertical @@ -28,11 +31,17 @@ - + + + + 1 + + + - + @@ -72,7 +81,7 @@ - + @@ -86,7 +95,7 @@ - + diff -r 381044a3feac -r e91b224c223b trunk/src/translator/project.py --- a/trunk/src/translator/project.py Thu Nov 08 17:44:25 2007 +0200 +++ b/trunk/src/translator/project.py Thu Nov 08 20:50:14 2007 +0200 @@ -33,7 +33,7 @@ self.checkType(doc, dict) try: self.name = str(doc["Name"]) - self.source = str(doc["SourceLangFile"]) + self.srcLangFilePath = str(doc["SourceLangFile"]) self.langFilePaths = list(doc["LangFiles"]) self.msgIDs = list(doc["MsgIDs"]) self.creationDate = str(doc["CreationDate"]) @@ -58,19 +58,32 @@ # Load language files. self.langFiles = [] + IDList = [msg["ID"] for msgID in self.msgIDs] for filePath in self.langFilePaths: - if not os.path.exists(filePath): - # Look in project directory. - projectDir = os.path.dirname(projectPath) - filePath2 = os.path.join(projectDir, filePath) - if not os.path.exists(filePath2): - raise LoadingError("Project: Language file '%s' doesn't exist"%filePath) - filePath = filePath2 - self.langFiles += [langfile.LangFile(filePath)] + langFile = self.loadLangFile(filePath) + langFile.createMissingMessages(IDList) + self.langFiles += [langFile] + self.srcLangFile = self.loadLangFile(self.srcLangFilePath) + self.srcLangFile.createMissingMessages(IDList) + self.srcLangFile.isSource = True + self.langFiles += [self.srcLangFile] + + for langFile in self.langFiles: + langFile.setSource(self.srcLangFile) def checkType(self, var, type_): if not isinstance(var, type_): raise LoadingException("%s is not of type %s" % (str(var), str(type_))) + def loadLangFile(self, filePath): + if not os.path.exists(filePath): + # Look in project directory. + projectDir = os.path.dirname(self.projectPath) + filePath2 = os.path.join(projectDir, filePath) + if not os.path.exists(filePath2): + raise LoadingError("Project: Language file '%s' doesn't exist"%filePath) + filePath = filePath2 + return langfile.LangFile(filePath) + def save(self): pass diff -r 381044a3feac -r e91b224c223b trunk/src/translator/translator.py --- a/trunk/src/translator/translator.py Thu Nov 08 17:44:25 2007 +0200 +++ b/trunk/src/translator/translator.py Thu Nov 08 20:50:14 2007 +0200 @@ -29,6 +29,8 @@ self.project = None # Modifications + self.pages = QtGui.QStackedWidget() + self.setCentralWidget(self.pages) self.disableMenuItems() self.projectDock = QtGui.QDockWidget("Project", self) self.projectTree = ProjectTree(self) @@ -116,12 +118,15 @@ self.action_Close_Project.setEnabled(False) self.menubar.removeAction(self.menu_Project.menuAction()) - def projectTreeItemChanged(self, item, column): - if item == None: + def projectTreeItemChanged(self, current, previous): + if current == None: return - # TODO: set centralwidget to the form corresponding to the item. - if isinstance(item, LangFileItem): - print "LangFileItem" + + if isinstance(current, LangFileItem): + index = self.pages.indexOf(current.msgForm) + if index == -1: + index = self.pages.addWidget(current.msgForm) + self.pages.setCurrentIndex(index) def closeEvent(self, event): if self.closeProject() == False: @@ -166,17 +171,64 @@ yaml.dump(g_settings, open(g_settingsFile, "w")) #default_flow_style=False class MsgForm(QtGui.QWidget, Ui_MsgForm): - def __init__(self): + def __init__(self, langFile): QtGui.QWidget.__init__(self) self.setupUi(self) + self.langFile = langFile + self.treeWidget.setColumnCount(2) + self.treeWidget.setHeaderLabels(["ID", "Text"]) + for msg in self.langFile.messages: + item = QtGui.QTreeWidgetItem([str(msg["ID"]), msg["Text"]]) + self.treeWidget.addTopLevelItem(item) + + QtCore.QObject.connect(self.treeWidget, QtCore.SIGNAL("currentItemChanged (QTreeWidgetItem *,QTreeWidgetItem *)"), self.treeItemChanged) + + def treeItemChanged(self, current, previous): + if current == None: + return + ID = int(current.text(0)) + self.setTranslMsg(self.langFile.getMsg(ID)) + self.setSourceMsg(self.langFile.source.getMsg(ID)) + + def setTranslMsg(self, msg): + self.translEdit.setText(msg["Text"]) + self.translAnnotEdit.setText(msg["Annot"]) + + def setSourceMsg(self, msg): + self.sourceEdit.setText(msg["Text"]) + self.sourceAnnotEdit.setText(msg["Annot"]) + +class MsgFormSource(MsgForm): + def __init__(self, langFile): + MsgForm.__init__(self, langFile) + + for x in [self.translEdit, + self.translAnnotEdit, + self.label_4, + self.label_5]: + x.close() + + def treeItemChanged(self, current, previous): + ID = int(current.text(0)) + self.setSourceMsg(self.langFile.getMsg(ID)) + class MsgIDItem(QtGui.QTreeWidgetItem): def __init__(self, parent, text): QtGui.QTreeWidgetItem.__init__(self, parent, [text]) class LangFileItem(QtGui.QTreeWidgetItem): - def __init__(self, parent, text): - QtGui.QTreeWidgetItem.__init__(self, parent, [text]) + def __init__(self, parent, langFile): + QtGui.QTreeWidgetItem.__init__(self, parent, [langFile.langCode]) + self.langFile = langFile + if langFile.isSource: + self.msgForm = MsgFormSource(langFile) + else: + self.msgForm = MsgForm(langFile) + +class ProjectItem(QtGui.QTreeWidgetItem): + def __init__(self, text): + QtGui.QTreeWidgetItem.__init__(self, [text]) class ProjectTree(QtGui.QTreeWidget): def __init__(self, parent): @@ -188,11 +240,11 @@ def setProject(self, project): self.project = project - self.topItem = QtGui.QTreeWidgetItem([self.project.name]) + self.topItem = ProjectItem(self.project.name) self.addTopLevelItem(self.topItem) for langFile in self.project.langFiles: - langFileItem = LangFileItem(self.topItem, langFile.langCode) + langFileItem = LangFileItem(self.topItem, langFile) self.msgIDsItem = QtGui.QTreeWidgetItem(self.topItem, ["Message IDs"]) for msgID in self.project.msgIDs: @@ -201,6 +253,26 @@ for x in [self.topItem, self.msgIDsItem]: x.setExpanded(True) + def contextMenuEvent(self, event): + item = self.itemAt(event.pos()) + func_map = { + None : lambda item: None, + QtGui.QTreeWidgetItem : lambda item: None, + ProjectItem : self.showMenuProjectItem, + LangFileItem : self.showMenuLangFileItem, + MsgIDItem : self.showMenuMsgIDItem + } + func_map[type(item)](item) + + def showMenuProjectItem(self, item): + print "ProjectItem" + + def showMenuLangFileItem(self, item): + print "LangFileItem" + + def showMenuMsgIDItem(self, item): + print "MsgIDItem" + def clear(self): self.topItem = None self.msgIDsItem = None diff -r 381044a3feac -r e91b224c223b trunk/src/translator/ui_msg_form.py --- a/trunk/src/translator/ui_msg_form.py Thu Nov 08 17:44:25 2007 +0200 +++ b/trunk/src/translator/ui_msg_form.py Thu Nov 08 20:50:14 2007 +0200 @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'msg_form.ui' # -# Created: Sun Oct 21 17:33:29 2007 +# Created: Tue Nov 6 12:15:01 2007 # by: PyQt4 UI code generator 4.1 # # WARNING! All changes made in this file will be lost! @@ -19,6 +19,7 @@ self.vboxlayout.setObjectName("vboxlayout") self.splitter = QtGui.QSplitter(MsgForm) + self.splitter.setFrameShape(QtGui.QFrame.StyledPanel) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setObjectName("splitter") @@ -32,24 +33,24 @@ self.label.setObjectName("label") self.vboxlayout1.addWidget(self.label) - self.listWidget = QtGui.QListWidget(self.layoutWidget) - self.listWidget.setObjectName("listWidget") - self.vboxlayout1.addWidget(self.listWidget) + self.treeWidget = QtGui.QTreeWidget(self.layoutWidget) + self.treeWidget.setObjectName("treeWidget") + self.vboxlayout1.addWidget(self.treeWidget) - self.widget = QtGui.QWidget(self.splitter) - self.widget.setObjectName("widget") + self.layoutWidget1 = QtGui.QWidget(self.splitter) + self.layoutWidget1.setObjectName("layoutWidget1") - self.gridlayout = QtGui.QGridLayout(self.widget) + self.gridlayout = QtGui.QGridLayout(self.layoutWidget1) self.gridlayout.setObjectName("gridlayout") self.vboxlayout2 = QtGui.QVBoxLayout() self.vboxlayout2.setObjectName("vboxlayout2") - self.label_2 = QtGui.QLabel(self.widget) + self.label_2 = QtGui.QLabel(self.layoutWidget1) self.label_2.setObjectName("label_2") self.vboxlayout2.addWidget(self.label_2) - self.sourceEdit = QtGui.QTextEdit(self.widget) + self.sourceEdit = QtGui.QTextEdit(self.layoutWidget1) self.sourceEdit.setObjectName("sourceEdit") self.vboxlayout2.addWidget(self.sourceEdit) self.gridlayout.addLayout(self.vboxlayout2,0,0,1,1) @@ -57,11 +58,11 @@ self.vboxlayout3 = QtGui.QVBoxLayout() self.vboxlayout3.setObjectName("vboxlayout3") - self.label_3 = QtGui.QLabel(self.widget) + self.label_3 = QtGui.QLabel(self.layoutWidget1) self.label_3.setObjectName("label_3") self.vboxlayout3.addWidget(self.label_3) - self.sourceAnnotEdit = QtGui.QTextEdit(self.widget) + self.sourceAnnotEdit = QtGui.QTextEdit(self.layoutWidget1) self.sourceAnnotEdit.setObjectName("sourceAnnotEdit") self.vboxlayout3.addWidget(self.sourceAnnotEdit) self.gridlayout.addLayout(self.vboxlayout3,0,1,1,1) @@ -69,25 +70,25 @@ self.vboxlayout4 = QtGui.QVBoxLayout() self.vboxlayout4.setObjectName("vboxlayout4") - self.label_4 = QtGui.QLabel(self.widget) + self.label_4 = QtGui.QLabel(self.layoutWidget1) self.label_4.setObjectName("label_4") self.vboxlayout4.addWidget(self.label_4) - self.destEdit = QtGui.QTextEdit(self.widget) - self.destEdit.setObjectName("destEdit") - self.vboxlayout4.addWidget(self.destEdit) + self.translEdit = QtGui.QTextEdit(self.layoutWidget1) + self.translEdit.setObjectName("translEdit") + self.vboxlayout4.addWidget(self.translEdit) self.gridlayout.addLayout(self.vboxlayout4,1,0,1,1) self.vboxlayout5 = QtGui.QVBoxLayout() self.vboxlayout5.setObjectName("vboxlayout5") - self.label_5 = QtGui.QLabel(self.widget) + self.label_5 = QtGui.QLabel(self.layoutWidget1) self.label_5.setObjectName("label_5") self.vboxlayout5.addWidget(self.label_5) - self.destAnnotEdit = QtGui.QTextEdit(self.widget) - self.destAnnotEdit.setObjectName("destAnnotEdit") - self.vboxlayout5.addWidget(self.destAnnotEdit) + self.translAnnotEdit = QtGui.QTextEdit(self.layoutWidget1) + self.translAnnotEdit.setObjectName("translAnnotEdit") + self.vboxlayout5.addWidget(self.translAnnotEdit) self.gridlayout.addLayout(self.vboxlayout5,1,1,1,1) self.vboxlayout.addWidget(self.splitter) @@ -97,6 +98,7 @@ def retranslateUi(self, MsgForm): MsgForm.setWindowTitle(QtGui.QApplication.translate("MsgForm", "Form", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("MsgForm", "Messages:", None, QtGui.QApplication.UnicodeUTF8)) + self.treeWidget.headerItem().setText(0,QtGui.QApplication.translate("MsgForm", "1", None, QtGui.QApplication.UnicodeUTF8)) self.label_2.setText(QtGui.QApplication.translate("MsgForm", "Source string:", None, QtGui.QApplication.UnicodeUTF8)) self.label_3.setText(QtGui.QApplication.translate("MsgForm", "Source annotation:", None, QtGui.QApplication.UnicodeUTF8)) self.label_4.setText(QtGui.QApplication.translate("MsgForm", "Translation:", None, QtGui.QApplication.UnicodeUTF8))