From 42895950e564e837c445896b5bac263370bdf37b Mon Sep 17 00:00:00 2001
From: "pascale.noyret"
Date: Mon, 7 Mar 2016 11:58:17 +0100
Subject: [PATCH] mse a jour du 07/03/2016 pour sauvegarde
---
CarmelCND/qtEficas_CarmelCND.py | 1 -
Extensions/localisation.py | 19 +-
Extensions/translation.py | 302 +-
Extensions/translationQT4.py | 295 +
Extensions/translationQT5.py | 324 ++
InterfaceQT4/browser.py | 54 +-
InterfaceQT4/compobloc.py | 3 +-
InterfaceQT4/compocomm.py | 12 +-
InterfaceQT4/compofact.py | 3 -
InterfaceQT4/compomacro.py | 15 +-
InterfaceQT4/compooper.py | 15 +-
InterfaceQT4/configuration.py | 6 +-
InterfaceQT4/determine.py | 23 +
InterfaceQT4/editor.py | 85 +-
InterfaceQT4/eficas_go.py | 9 +-
InterfaceQT4/feuille.py | 13 +-
InterfaceQT4/gereIcones.py | 43 +-
InterfaceQT4/gereListe.py | 26 +-
InterfaceQT4/gereRegles.py | 6 +-
InterfaceQT4/gereTraduction.py | 17 +-
InterfaceQT4/groupe.py | 21 +-
InterfaceQT4/monBoutonValide.py | 8 +-
InterfaceQT4/monChoixCata.py | 10 +-
InterfaceQT4/monChoixCode.py | 17 +-
InterfaceQT4/monChoixCommande.py | 65 +-
InterfaceQT4/monFonctionPanel.py | 25 +-
InterfaceQT4/monLabelClic.py | 12 +-
InterfaceQT4/monRecherche.py | 23 +-
InterfaceQT4/monSelectVal.py | 20 +-
InterfaceQT4/monViewRegles.py | 9 +-
InterfaceQT4/monViewTexte.py | 31 +-
InterfaceQT4/monVisu.py | 10 +-
InterfaceQT4/monWidget4a6RadioButton.py | 2 -
InterfaceQT4/monWidget4a6RadioButtonSD.py | 2 -
InterfaceQT4/monWidgetBloc.py | 2 -
InterfaceQT4/monWidgetCB.py | 4 +-
InterfaceQT4/monWidgetCBSD.py | 4 +-
InterfaceQT4/monWidgetCommande.py | 54 +-
InterfaceQT4/monWidgetCommentaire.py | 15 +-
InterfaceQT4/monWidgetCreeParam.py | 17 +-
InterfaceQT4/monWidgetDate.py | 2 -
InterfaceQT4/monWidgetFact.py | 13 +-
InterfaceQT4/monWidgetFactPlie.py | 2 -
InterfaceQT4/monWidgetHeure.py | 2 -
InterfaceQT4/monWidgetInactif.py | 20 +-
InterfaceQT4/monWidgetInfo.py | 8 +-
InterfaceQT4/monWidgetMatrice.py | 12 +-
InterfaceQT4/monWidgetOptionnel.py | 11 +-
InterfaceQT4/monWidgetParam.py | 32 +-
.../monWidgetPlusieursASSDIntoOrdonne.py | 4 -
InterfaceQT4/monWidgetPlusieursBase.py | 16 +-
InterfaceQT4/monWidgetPlusieursInto.py | 12 +-
InterfaceQT4/monWidgetPlusieursIntoOrdonne.py | 17 +-
InterfaceQT4/monWidgetPlusieursPlie.py | 15 +-
InterfaceQT4/monWidgetPlusieursTuple.py | 21 +-
InterfaceQT4/monWidgetPlusieursTuple2.py | 3 -
InterfaceQT4/monWidgetPlusieursTuple3.py | 3 -
InterfaceQT4/monWidgetRadioButton.py | 14 +-
InterfaceQT4/monWidgetSimpTxt.py | 2 -
InterfaceQT4/qtEficas.py | 119 +-
InterfaceQT4/qtSaisie.py | 14 +-
InterfaceQT4/readercata.py | 9 +-
InterfaceQT4/typeNode.py | 88 +-
InterfaceQT4/viewManager.py | 20 +-
Telemac/qtEficas_Telemac.py | 1 -
UiQT4/desWidgetOptionnelMC.ui | 127 +
UiQT4/makefile | 2 +-
UiQT5/CMakeLists.txt | 107 +
UiQT5/Newdoc.tgz | Bin 0 -> 6885287 bytes
UiQT5/Tuple2.py | 85 +
UiQT5/Tuple2.ui | 149 +
UiQT5/Tuple3.py | 96 +
UiQT5/Tuple3.ui | 164 +
UiQT5/desBaseWidget.py | 73 +
UiQT5/desBaseWidget.ui | 92 +
UiQT5/desChoixCata.py | 99 +
UiQT5/desChoixCata.ui | 201 +
UiQT5/desChoixCode.py | 92 +
UiQT5/desChoixCode.ui | 155 +
UiQT5/desChoixCommandes.py | 202 +
UiQT5/desChoixCommandes.ui | 371 ++
UiQT5/desRecherche.py | 58 +
UiQT5/desRecherche.ui | 75 +
UiQT5/desSelectVal.py | 133 +
UiQT5/desSelectVal.ui | 252 +
UiQT5/desViewRegles.py | 50 +
UiQT5/desViewRegles.ui | 52 +
UiQT5/desViewTexte.py | 50 +
UiQT5/desViewTexte.ui | 53 +
UiQT5/desVisu.py | 41 +
UiQT5/desVisu.ui | 39 +
UiQT5/desWidget4a6RadioButton.py | 170 +
UiQT5/desWidget4a6RadioButton.ui | 376 ++
UiQT5/desWidgetBloc.py | 49 +
UiQT5/desWidgetBloc.ui | 45 +
UiQT5/desWidgetCB.py | 142 +
UiQT5/desWidgetCB.ui | 314 ++
UiQT5/desWidgetCommande.py | 286 +
UiQT5/desWidgetCommande.ui | 629 +++
UiQT5/desWidgetCommentaire.py | 214 +
UiQT5/desWidgetCommentaire.ui | 452 ++
UiQT5/desWidgetCreeParam.py | 124 +
UiQT5/desWidgetCreeParam.ui | 236 +
UiQT5/desWidgetDate.py | 120 +
UiQT5/desWidgetDate.ui | 283 +
UiQT5/desWidgetFact.py | 164 +
UiQT5/desWidgetFact.ui | 390 ++
UiQT5/desWidgetFactPlie.py | 119 +
UiQT5/desWidgetFactPlie.ui | 221 +
UiQT5/desWidgetHeure.py | 110 +
UiQT5/desWidgetHeure.ui | 256 +
UiQT5/desWidgetInactif.py | 206 +
UiQT5/desWidgetInactif.ui | 471 ++
UiQT5/desWidgetInformation.py | 58 +
UiQT5/desWidgetInformation.ui | 106 +
UiQT5/desWidgetMatrice.py | 92 +
UiQT5/desWidgetMatrice.ui | 191 +
UiQT5/desWidgetOptionnel.py | 111 +
UiQT5/desWidgetOptionnel.ui | 166 +
UiQT5/desWidgetOptionnelMC.py | 85 +
UiQT5/desWidgetOptionnelMC.ui | 127 +
UiQT5/desWidgetParam.py | 257 +
UiQT5/desWidgetParam.ui | 530 ++
UiQT5/desWidgetPlusieursBase.py | 341 ++
UiQT5/desWidgetPlusieursBase.ui | 842 +++
UiQT5/desWidgetPlusieursInto.py | 187 +
UiQT5/desWidgetPlusieursInto.ui | 415 ++
UiQT5/desWidgetPlusieursIntoOrdonne.py | 302 ++
UiQT5/desWidgetPlusieursIntoOrdonne.ui | 733 +++
UiQT5/desWidgetPlusieursPlie.py | 145 +
UiQT5/desWidgetPlusieursPlie.ui | 330 ++
UiQT5/desWidgetPlusieursTuple.py | 277 +
UiQT5/desWidgetPlusieursTuple.ui | 668 +++
UiQT5/desWidgetRadioButton.py | 141 +
UiQT5/desWidgetRadioButton.ui | 336 ++
UiQT5/desWidgetSDCOInto.py | 163 +
UiQT5/desWidgetSDCOInto.ui | 360 ++
UiQT5/desWidgetSimpBase.py | 123 +
UiQT5/desWidgetSimpBase.ui | 304 ++
UiQT5/desWidgetSimpBool.py | 127 +
UiQT5/desWidgetSimpBool.ui | 297 ++
UiQT5/desWidgetSimpComplexe.py | 171 +
UiQT5/desWidgetSimpComplexe.ui | 390 ++
UiQT5/desWidgetSimpFichier.py | 157 +
UiQT5/desWidgetSimpFichier.ui | 374 ++
UiQT5/desWidgetSimpSalome.py | 158 +
UiQT5/desWidgetSimpSalome.ui | 373 ++
UiQT5/desWidgetSimpTxt.py | 123 +
UiQT5/desWidgetSimpTxt.ui | 304 ++
UiQT5/desWidgetTuple2.py | 152 +
UiQT5/desWidgetTuple2.ui | 345 ++
UiQT5/desWidgetTuple3.py | 161 +
UiQT5/desWidgetTuple3.ui | 362 ++
UiQT5/desWidgetUniqueSDCO.py | 119 +
UiQT5/desWidgetUniqueSDCO.ui | 277 +
UiQT5/desWidgetVide.py | 140 +
UiQT5/desWidgetVide.ui | 330 ++
UiQT5/eficas_en.qm | Bin 0 -> 79389 bytes
UiQT5/eficas_en.ts | 3948 ++++++++++++++
UiQT5/eficas_fr.qm | Bin 0 -> 854 bytes
UiQT5/eficas_fr.ts | 4745 +++++++++++++++++
UiQT5/makefile | 33 +
UiQT5/myMain.py | 294 +
UiQT5/myMain.ui | 474 ++
164 files changed, 30879 insertions(+), 642 deletions(-)
create mode 100644 Extensions/translationQT4.py
create mode 100644 Extensions/translationQT5.py
create mode 100644 InterfaceQT4/determine.py
create mode 100644 UiQT4/desWidgetOptionnelMC.ui
create mode 100644 UiQT5/CMakeLists.txt
create mode 100644 UiQT5/Newdoc.tgz
create mode 100644 UiQT5/Tuple2.py
create mode 100644 UiQT5/Tuple2.ui
create mode 100644 UiQT5/Tuple3.py
create mode 100644 UiQT5/Tuple3.ui
create mode 100644 UiQT5/desBaseWidget.py
create mode 100644 UiQT5/desBaseWidget.ui
create mode 100644 UiQT5/desChoixCata.py
create mode 100644 UiQT5/desChoixCata.ui
create mode 100644 UiQT5/desChoixCode.py
create mode 100644 UiQT5/desChoixCode.ui
create mode 100644 UiQT5/desChoixCommandes.py
create mode 100644 UiQT5/desChoixCommandes.ui
create mode 100644 UiQT5/desRecherche.py
create mode 100644 UiQT5/desRecherche.ui
create mode 100644 UiQT5/desSelectVal.py
create mode 100644 UiQT5/desSelectVal.ui
create mode 100644 UiQT5/desViewRegles.py
create mode 100644 UiQT5/desViewRegles.ui
create mode 100644 UiQT5/desViewTexte.py
create mode 100644 UiQT5/desViewTexte.ui
create mode 100644 UiQT5/desVisu.py
create mode 100644 UiQT5/desVisu.ui
create mode 100644 UiQT5/desWidget4a6RadioButton.py
create mode 100644 UiQT5/desWidget4a6RadioButton.ui
create mode 100644 UiQT5/desWidgetBloc.py
create mode 100644 UiQT5/desWidgetBloc.ui
create mode 100644 UiQT5/desWidgetCB.py
create mode 100644 UiQT5/desWidgetCB.ui
create mode 100644 UiQT5/desWidgetCommande.py
create mode 100644 UiQT5/desWidgetCommande.ui
create mode 100644 UiQT5/desWidgetCommentaire.py
create mode 100644 UiQT5/desWidgetCommentaire.ui
create mode 100644 UiQT5/desWidgetCreeParam.py
create mode 100644 UiQT5/desWidgetCreeParam.ui
create mode 100644 UiQT5/desWidgetDate.py
create mode 100644 UiQT5/desWidgetDate.ui
create mode 100644 UiQT5/desWidgetFact.py
create mode 100644 UiQT5/desWidgetFact.ui
create mode 100644 UiQT5/desWidgetFactPlie.py
create mode 100644 UiQT5/desWidgetFactPlie.ui
create mode 100644 UiQT5/desWidgetHeure.py
create mode 100644 UiQT5/desWidgetHeure.ui
create mode 100644 UiQT5/desWidgetInactif.py
create mode 100644 UiQT5/desWidgetInactif.ui
create mode 100644 UiQT5/desWidgetInformation.py
create mode 100644 UiQT5/desWidgetInformation.ui
create mode 100644 UiQT5/desWidgetMatrice.py
create mode 100644 UiQT5/desWidgetMatrice.ui
create mode 100644 UiQT5/desWidgetOptionnel.py
create mode 100644 UiQT5/desWidgetOptionnel.ui
create mode 100644 UiQT5/desWidgetOptionnelMC.py
create mode 100644 UiQT5/desWidgetOptionnelMC.ui
create mode 100644 UiQT5/desWidgetParam.py
create mode 100644 UiQT5/desWidgetParam.ui
create mode 100644 UiQT5/desWidgetPlusieursBase.py
create mode 100644 UiQT5/desWidgetPlusieursBase.ui
create mode 100644 UiQT5/desWidgetPlusieursInto.py
create mode 100644 UiQT5/desWidgetPlusieursInto.ui
create mode 100644 UiQT5/desWidgetPlusieursIntoOrdonne.py
create mode 100644 UiQT5/desWidgetPlusieursIntoOrdonne.ui
create mode 100644 UiQT5/desWidgetPlusieursPlie.py
create mode 100644 UiQT5/desWidgetPlusieursPlie.ui
create mode 100644 UiQT5/desWidgetPlusieursTuple.py
create mode 100644 UiQT5/desWidgetPlusieursTuple.ui
create mode 100644 UiQT5/desWidgetRadioButton.py
create mode 100644 UiQT5/desWidgetRadioButton.ui
create mode 100644 UiQT5/desWidgetSDCOInto.py
create mode 100644 UiQT5/desWidgetSDCOInto.ui
create mode 100644 UiQT5/desWidgetSimpBase.py
create mode 100644 UiQT5/desWidgetSimpBase.ui
create mode 100644 UiQT5/desWidgetSimpBool.py
create mode 100644 UiQT5/desWidgetSimpBool.ui
create mode 100644 UiQT5/desWidgetSimpComplexe.py
create mode 100644 UiQT5/desWidgetSimpComplexe.ui
create mode 100644 UiQT5/desWidgetSimpFichier.py
create mode 100644 UiQT5/desWidgetSimpFichier.ui
create mode 100644 UiQT5/desWidgetSimpSalome.py
create mode 100644 UiQT5/desWidgetSimpSalome.ui
create mode 100644 UiQT5/desWidgetSimpTxt.py
create mode 100644 UiQT5/desWidgetSimpTxt.ui
create mode 100644 UiQT5/desWidgetTuple2.py
create mode 100644 UiQT5/desWidgetTuple2.ui
create mode 100644 UiQT5/desWidgetTuple3.py
create mode 100644 UiQT5/desWidgetTuple3.ui
create mode 100644 UiQT5/desWidgetUniqueSDCO.py
create mode 100644 UiQT5/desWidgetUniqueSDCO.ui
create mode 100644 UiQT5/desWidgetVide.py
create mode 100644 UiQT5/desWidgetVide.ui
create mode 100644 UiQT5/eficas_en.qm
create mode 100644 UiQT5/eficas_en.ts
create mode 100644 UiQT5/eficas_fr.qm
create mode 100644 UiQT5/eficas_fr.ts
create mode 100644 UiQT5/makefile
create mode 100644 UiQT5/myMain.py
create mode 100644 UiQT5/myMain.ui
diff --git a/CarmelCND/qtEficas_CarmelCND.py b/CarmelCND/qtEficas_CarmelCND.py
index b1254f2c..f49b9bcb 100755
--- a/CarmelCND/qtEficas_CarmelCND.py
+++ b/CarmelCND/qtEficas_CarmelCND.py
@@ -27,7 +27,6 @@
import sys,os
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'..'))
-from PyQt4.QtCore import *
import prefs
from InterfaceQT4 import eficas_go
eficas_go.lance_eficas(code=prefs.code)
diff --git a/Extensions/localisation.py b/Extensions/localisation.py
index f9d0e6d4..25e1e2e6 100644
--- a/Extensions/localisation.py
+++ b/Extensions/localisation.py
@@ -18,10 +18,13 @@
Creates and loads two ``QTranslator`` objects, one for pure Qt, one for Eficas,
and installs them to a ``QApplication``.
-``PyQt4`` is currently supported.
"""
-from PyQt4.QtCore import QTranslator
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtCore import QTranslator
+else :
+ from PyQt4.QtCore import QTranslator
qt_translator = QTranslator()
eficas_translator = QTranslator()
@@ -40,9 +43,15 @@ def localise(application, locale=None ):
If no locale is specified by the user, the system locale
is used instead, for both Qt base and Eficas translators.
"""
- from PyQt4.QtCore import QLibraryInfo
- from PyQt4.QtCore import QLocale
- from PyQt4.QtGui import QApplication
+ if monEnvQT5 :
+ from PyQt5.QtCore import QLibraryInfo
+ from PyQt5.QtCore import QLocale
+ from PyQt5.QtWidgets import QApplication
+ else :
+ from PyQt4.QtCore import QLibraryInfo
+ from PyQt4.QtCore import QLocale
+ from PyQt4.QtGui import QApplication
+
sys_locale = QLocale.system().name()
if locale is None:
diff --git a/Extensions/translation.py b/Extensions/translation.py
index ba4940f4..75cd3302 100644
--- a/Extensions/translation.py
+++ b/Extensions/translation.py
@@ -1,295 +1,7 @@
-# -*- coding: utf-8 -*-
-# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
-# contact http://www.logilab.fr -- mailto:contact@logilab.fr
-#
-# This program is free software: you can redistribute it and/or modify it under
-# the terms of the GNU Lesser General Public License as published by the Free
-# Software Foundation, either version 2.1 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 Lesser General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Lesser General Public License along
-# with this program. If not, see .
-"""
-Main module of the ``i18n`` package, for internationalizing strings via the Qt
-mechanism, in the ``Eficas`` application of EDF. Handles unformatted and
-formatted strings, according to all formatting schemes: via dictionaries,
-tuples, or atoms.
-
-``PyQt4`` is currently supported.
-"""
-from Extensions.eficas_exception import EficasException
-def _reformat_qstring_from_tuple(qstring, params):
- """
- _reformat_qstring_from_tuple(QString, tuple) -> QString
-
- Module-internal method.
- Returns a formatted QString from an unformatted QString
- and a tuple specifying the parameters of the QString.
- """
- from PyQt4.QtCore import QRegExp, QString
- reg = QRegExp("\%\.[1-9]{1,2}f")
- for p, j in zip(params, range(len(params))):
- try:
- i += 1 + qstring[i + 1:].indexOf("%")
- except NameError:
- i = qstring.indexOf("%")
- if i == reg.indexIn(qstring):
- precision = reg.cap(0).split('.')[1].split('f')[0]
- qstring = qstring[:i + 2 + len(precision)].\
- replace("%." + precision, "%" + unicode(1 + j)) + \
- qstring[i + 3 + len(precision):]
- qstring = qstring.arg(QString.number(float(params[j]), 'f',\
- int(precision)))
- else:
- qstring = qstring[:i + 1].replace("%", "%" + unicode(1 + j)) + \
- qstring[i + 2:]
- if isinstance(params[j], unicode):
- qstring = qstring.arg(params[j])
- elif isinstance(params[j], float):
- qstring = qstring.arg(QString.number(params[j], 'f',\
- len(unicode(params[j]).\
- split('.')[1])))
- elif isinstance(params[j], int):
- qstring = qstring.arg(QString.number(params[j], 10))
- elif isinstance(params[j], list):
- qstring = qstring.arg(repr(params[j]))
- else:
- raise EficasException("TypeError: i18n.translation: \
- Unicode, list or number expected!")
- return qstring
-
-def _reformat_qstring_from_dict(qstring, params):
- """
- _reformat_qstring_from_dict(QString, dict) -> QString
-
- Module-internal method.
- Returns a formatted QString from an unformatted QString
- and a dictionary specifying the parameters of the QString.
- """
- from PyQt4.QtCore import QRegExp, QString
- for p, j in zip(params, range(len(params))):
- p_reg = QRegExp("\%\("+ p + "\)\.[1-9]{1,2}f")
- p_index = p_reg.indexIn(qstring)
- if p_index != -1:
- precision = p_reg.cap(0).split('.')[1].split('f')[0]
- qstring = qstring.replace("%(" + p + ")." + precision + "f",\
- "%" + unicode(1 + j)).\
- arg(QString.number(float(params[p]), \
- 'f', \
- int(precision)))
- else:
- qstring.remove(QRegExp("\\)[sdf]{1}"))
- qstring = qstring.replace("%(" + p, "%" + unicode(1 + j))
- if isinstance(params[p], unicode):
- qstring = qstring.arg(params[p])
- elif isinstance(params[p], float):
- qstring = qstring.arg(QString.number(params[p], 'f', \
- len(unicode(params[p]).split('.')[1])))
- elif isinstance(params[p], int):
- qstring = qstring.arg(QString.number(params[p], 10))
- elif isinstance(params[p], list):
- qstring = qstring.arg(repr(params[p]))
- else:
- raise EficasException("TypeError: i18n.translation: \
- Improper string parameter type.")
- return qstring
-
-def _reformat_qstring_from_atom(qstring, params):
- """
- _reformat_qstring_from_atom(QString, int-or-float) -> QString
-
- Module-internal method.
- Returns a formatted QString from an unformatted QString
- and an integer or a float specifying the parameter of
- the QString.
- """
- from PyQt4.QtCore import QRegExp, QString
- reg = QRegExp("\%\.[1-9]{1,2}f")
- if qstring.count("%") == 0:
- qstring.append("%1")
- try:
- qstring = qstring.arg(unicode(params))
- except AttributeError:
- qstring = qstring.arg(params)
- elif qstring.count("%") == 1:
- i = qstring.indexOf("%")
- if i == reg.indexIn(qstring):
- precision = reg.cap(0).split('.')[1].split('f')[0]
- qstring = qstring[: i + 2 + len(precision)].\
- replace("%." + precision, "%1") + \
- qstring[i + 3 + len(precision):]
- qstring = qstring.arg(QString.number(float(params), 'f',\
- int(precision)))
- else:
- qstring = qstring[:i + 1].replace("%", "%1") + \
- qstring[i + 2:]
- if isinstance(params, (unicode, str)):
- qstring = qstring.arg(_preprocess_atom(params))
- elif isinstance(params, float):
- qstring = qstring.arg(QString.number(params, 'f', \
- len(unicode(params).\
- split('.')[1])))
- elif isinstance(params, int):
- qstring = qstring.arg(QString.number(params, 10))
- else:
- raise EficasException("TypeError: i18n.translation: Unicode, \
- string or number expected!")
- return qstring
-
-def _reformat_qstring_from_list(qstring, params):
- """
- _reformat_qstring_from_list(QString, tuple) -> QString
-
- Module-internal method.
- Returns a formatted QString from an unformatted QString
- and a list whose concatenation specifies the parameter
- of the QString.
- """
- # XXX to add further functionality, e.g. list processing
- # when ``%`` not at the end.
- if qstring.count("%") == 1 and \
- unicode(qstring).strip()[:-1].endswith("%"):
- qstring = qstring[:qstring.indexOf("%") + 1].append("1")
- qstring = qstring.arg(u' '.join(map(unicode, params)))
- elif qstring.count("%") == 0:
- qstring.append("%1")
- qstring = qstring.arg(u' '.join(map(unicode, params)))
- else:
- raise EficasException("ValueError: i18n.translation: \
- At most one '%' expected!")
- return qstring
-
-def _preprocess_atom(string):
- """
- _preprocess_atom(string-or-number-or-unicode) -> unicode
- Test if input is a Unicode object or a number; if so, then return it;
- otherwise, test if the input is a string; if so, then try to create
- a Unicode object out of it. To this end, assume the string is encoded
- in utf-8; if this fails, then assume the string is encoded in Latin-9.
- """
- if isinstance(string, (unicode, int, float, complex)):
- return string
- elif isinstance(string, str):
- return _str_to_unicode(string)
- else:
- raise EficasException("TypeError: Expected number, string or\
- Unicode object!")
-
-def _str_to_unicode(string):
- """
- _str_to_unicode(string) -> unicode
- Tries to create a Unicode object out of the input string; assumes
- the string is UTF-8 encoded; if not, then assume the string is
- Latin-9 encoded.
- """
- try:
- string = unicode(string, "utf-8")
- except UnicodeDecodeError:
- try:
- string = unicode(string, "iso-8859-15")
- except UnicodeDecodeError:
- raise EficasException("UnicodeDecodeError: UTF-8, Latin-1 \
- or Latin-9 expected")
- return string
-
-def tr(string, *args):
- """tr(string-or-unicode, iterable-or-float-or-int) -> unicode
- tr(string-or-unicode) -> unicode
-
- Returns a formatted Unicode object from an unformatted
- string or Unicode object with formatting specifications, and,
- optionally, an iterable or an int or float.
- Lets Python do the string formatting."""
- from PyQt4.QtGui import QApplication
- string = _preprocess_atom(string)
- if len(args) == 0:
- r = unicode(QApplication.translate("@default", string))
- elif len(args) == 1:
- if isinstance(args[0], (dict, tuple)):
- if string.count("%") == len(args[0]):
- r = unicode(QApplication.translate("@default", string)) % args[0]
- elif string.count("%") == 1 and string.count("%(") == 0:
- r = unicode(QApplication.translate("@default", string))\
- % _preprocess_atom(repr(args[0]))
- elif string.count("%") == 0:
- r = (unicode(QApplication.translate("@default", string)), args[0])
- else:
- raise EficasException("ValueError: i18n.translate.tr: \
- Improper input string formatting")
- elif isinstance(args[0], (unicode, str, int, float, complex)):
- if string.count("%") == 1:
- r = unicode(QApplication.translate("@default", string))\
- % _preprocess_atom(args[0])
- else:
- r = unicode(QApplication.translate("@default", string)) +\
- unicode(_preprocess_atom(args[0]))
- elif isinstance(args[0], list) or args[0] is None:
- if string.count("%") == 1:
- r = unicode(QApplication.translate("@default", string))\
- % _preprocess_atom(repr(args[0]))
- else:
- r = (unicode(QApplication.translate("@default", string)), args[0])
-
- else:
- raise EficasException("ValueError: i18n.translation.tr: \
- Wrong type for formatted string \
- arguments: %s" % type(args[0]))
- else:
- raise EficasException("ValueError: i18n.translation.tr: \
- Wrong formatted string arguments")
- return r
-
-
-def tr_qt(string, *args):
- """tr_qt(string, iterable-or-float-or-int) -> unicode
- t_qtr(string) -> unicode
-
- Returns a formatted string from an unformatted
- Unicode string with formatting specifications, and,
- optionally, an iterable or an int or float.
- Lets PyQt4 do the string formatting. To this end,
- a conversion from Python to Qt string formatting
- syntax is performed."""
- string = _preprocess_atom(string)
- from PyQt4.QtGui import QApplication
- if len(args) == 0:
- r = QApplication.translate("@default", string)
- elif len(args) == 1:
- r = QApplication.translate("@default", string)
- if isinstance(args[0], (dict, tuple)):
- if r.count("%") == len(args[0]):
- if isinstance(args[0], dict):
- r = _reformat_qstring_from_dict(r, args[0])
- elif isinstance(args[0], tuple):
- r = _reformat_qstring_from_tuple(r, args[0])
- # XXX Pay attention to this: distinguish between tuple,
- # dict and dict with key given in string.
- elif r.count("%") in range(2) and r.count("%(") == 0:
- r = _reformat_qstring_from_atom(r, _preproces_atom(repr(args[0])))
- else:
- raise EficasException("ValueError: i18n.translation.tr_qt: \
- Improper formatting string parameters")
- elif isinstance(args[0], (unicode, str, int, float, complex)):
- r = _reformat_qstring_from_atom(r, args[0])
- elif isinstance(args[0], list):
- r = _reformat_qstring_from_list(r, args[0])
- elif args[0] is None:
- r = _reformat_qstring_from_atom(r, _preprocess_string_from_atom(repr(args[0])))
- else:
- raise EficasException("ValueError: i18n.translation.tr_qt: \
- Wrong string formatting parameter types")
- else:
- raise EficasException("ValueError: i18n.translation.tr_qt: \
- Improper formatted string parameter set")
- return unicode(r)
-
-
-if __name__ == "__main__":
- import sys
- tr(sys.argv[1], *args)
- tr_qt(sys.argv[1], *args)
+from determine import monEnvQT5
+if monEnvQT5 :
+ from translationQT5 import tr
+ from translationQT5 import tr_qt
+else :
+ from translationQT4 import tr
+ from translationQT4 import tr_qt
diff --git a/Extensions/translationQT4.py b/Extensions/translationQT4.py
new file mode 100644
index 00000000..ba4940f4
--- /dev/null
+++ b/Extensions/translationQT4.py
@@ -0,0 +1,295 @@
+# -*- coding: utf-8 -*-
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 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 Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see .
+"""
+Main module of the ``i18n`` package, for internationalizing strings via the Qt
+mechanism, in the ``Eficas`` application of EDF. Handles unformatted and
+formatted strings, according to all formatting schemes: via dictionaries,
+tuples, or atoms.
+
+``PyQt4`` is currently supported.
+"""
+from Extensions.eficas_exception import EficasException
+def _reformat_qstring_from_tuple(qstring, params):
+ """
+ _reformat_qstring_from_tuple(QString, tuple) -> QString
+
+ Module-internal method.
+ Returns a formatted QString from an unformatted QString
+ and a tuple specifying the parameters of the QString.
+ """
+ from PyQt4.QtCore import QRegExp, QString
+ reg = QRegExp("\%\.[1-9]{1,2}f")
+ for p, j in zip(params, range(len(params))):
+ try:
+ i += 1 + qstring[i + 1:].indexOf("%")
+ except NameError:
+ i = qstring.indexOf("%")
+ if i == reg.indexIn(qstring):
+ precision = reg.cap(0).split('.')[1].split('f')[0]
+ qstring = qstring[:i + 2 + len(precision)].\
+ replace("%." + precision, "%" + unicode(1 + j)) + \
+ qstring[i + 3 + len(precision):]
+ qstring = qstring.arg(QString.number(float(params[j]), 'f',\
+ int(precision)))
+ else:
+ qstring = qstring[:i + 1].replace("%", "%" + unicode(1 + j)) + \
+ qstring[i + 2:]
+ if isinstance(params[j], unicode):
+ qstring = qstring.arg(params[j])
+ elif isinstance(params[j], float):
+ qstring = qstring.arg(QString.number(params[j], 'f',\
+ len(unicode(params[j]).\
+ split('.')[1])))
+ elif isinstance(params[j], int):
+ qstring = qstring.arg(QString.number(params[j], 10))
+ elif isinstance(params[j], list):
+ qstring = qstring.arg(repr(params[j]))
+ else:
+ raise EficasException("TypeError: i18n.translation: \
+ Unicode, list or number expected!")
+ return qstring
+
+def _reformat_qstring_from_dict(qstring, params):
+ """
+ _reformat_qstring_from_dict(QString, dict) -> QString
+
+ Module-internal method.
+ Returns a formatted QString from an unformatted QString
+ and a dictionary specifying the parameters of the QString.
+ """
+ from PyQt4.QtCore import QRegExp, QString
+ for p, j in zip(params, range(len(params))):
+ p_reg = QRegExp("\%\("+ p + "\)\.[1-9]{1,2}f")
+ p_index = p_reg.indexIn(qstring)
+ if p_index != -1:
+ precision = p_reg.cap(0).split('.')[1].split('f')[0]
+ qstring = qstring.replace("%(" + p + ")." + precision + "f",\
+ "%" + unicode(1 + j)).\
+ arg(QString.number(float(params[p]), \
+ 'f', \
+ int(precision)))
+ else:
+ qstring.remove(QRegExp("\\)[sdf]{1}"))
+ qstring = qstring.replace("%(" + p, "%" + unicode(1 + j))
+ if isinstance(params[p], unicode):
+ qstring = qstring.arg(params[p])
+ elif isinstance(params[p], float):
+ qstring = qstring.arg(QString.number(params[p], 'f', \
+ len(unicode(params[p]).split('.')[1])))
+ elif isinstance(params[p], int):
+ qstring = qstring.arg(QString.number(params[p], 10))
+ elif isinstance(params[p], list):
+ qstring = qstring.arg(repr(params[p]))
+ else:
+ raise EficasException("TypeError: i18n.translation: \
+ Improper string parameter type.")
+ return qstring
+
+def _reformat_qstring_from_atom(qstring, params):
+ """
+ _reformat_qstring_from_atom(QString, int-or-float) -> QString
+
+ Module-internal method.
+ Returns a formatted QString from an unformatted QString
+ and an integer or a float specifying the parameter of
+ the QString.
+ """
+ from PyQt4.QtCore import QRegExp, QString
+ reg = QRegExp("\%\.[1-9]{1,2}f")
+ if qstring.count("%") == 0:
+ qstring.append("%1")
+ try:
+ qstring = qstring.arg(unicode(params))
+ except AttributeError:
+ qstring = qstring.arg(params)
+ elif qstring.count("%") == 1:
+ i = qstring.indexOf("%")
+ if i == reg.indexIn(qstring):
+ precision = reg.cap(0).split('.')[1].split('f')[0]
+ qstring = qstring[: i + 2 + len(precision)].\
+ replace("%." + precision, "%1") + \
+ qstring[i + 3 + len(precision):]
+ qstring = qstring.arg(QString.number(float(params), 'f',\
+ int(precision)))
+ else:
+ qstring = qstring[:i + 1].replace("%", "%1") + \
+ qstring[i + 2:]
+ if isinstance(params, (unicode, str)):
+ qstring = qstring.arg(_preprocess_atom(params))
+ elif isinstance(params, float):
+ qstring = qstring.arg(QString.number(params, 'f', \
+ len(unicode(params).\
+ split('.')[1])))
+ elif isinstance(params, int):
+ qstring = qstring.arg(QString.number(params, 10))
+ else:
+ raise EficasException("TypeError: i18n.translation: Unicode, \
+ string or number expected!")
+ return qstring
+
+def _reformat_qstring_from_list(qstring, params):
+ """
+ _reformat_qstring_from_list(QString, tuple) -> QString
+
+ Module-internal method.
+ Returns a formatted QString from an unformatted QString
+ and a list whose concatenation specifies the parameter
+ of the QString.
+ """
+ # XXX to add further functionality, e.g. list processing
+ # when ``%`` not at the end.
+ if qstring.count("%") == 1 and \
+ unicode(qstring).strip()[:-1].endswith("%"):
+ qstring = qstring[:qstring.indexOf("%") + 1].append("1")
+ qstring = qstring.arg(u' '.join(map(unicode, params)))
+ elif qstring.count("%") == 0:
+ qstring.append("%1")
+ qstring = qstring.arg(u' '.join(map(unicode, params)))
+ else:
+ raise EficasException("ValueError: i18n.translation: \
+ At most one '%' expected!")
+ return qstring
+
+def _preprocess_atom(string):
+ """
+ _preprocess_atom(string-or-number-or-unicode) -> unicode
+ Test if input is a Unicode object or a number; if so, then return it;
+ otherwise, test if the input is a string; if so, then try to create
+ a Unicode object out of it. To this end, assume the string is encoded
+ in utf-8; if this fails, then assume the string is encoded in Latin-9.
+ """
+ if isinstance(string, (unicode, int, float, complex)):
+ return string
+ elif isinstance(string, str):
+ return _str_to_unicode(string)
+ else:
+ raise EficasException("TypeError: Expected number, string or\
+ Unicode object!")
+
+def _str_to_unicode(string):
+ """
+ _str_to_unicode(string) -> unicode
+ Tries to create a Unicode object out of the input string; assumes
+ the string is UTF-8 encoded; if not, then assume the string is
+ Latin-9 encoded.
+ """
+ try:
+ string = unicode(string, "utf-8")
+ except UnicodeDecodeError:
+ try:
+ string = unicode(string, "iso-8859-15")
+ except UnicodeDecodeError:
+ raise EficasException("UnicodeDecodeError: UTF-8, Latin-1 \
+ or Latin-9 expected")
+ return string
+
+def tr(string, *args):
+ """tr(string-or-unicode, iterable-or-float-or-int) -> unicode
+ tr(string-or-unicode) -> unicode
+
+ Returns a formatted Unicode object from an unformatted
+ string or Unicode object with formatting specifications, and,
+ optionally, an iterable or an int or float.
+ Lets Python do the string formatting."""
+ from PyQt4.QtGui import QApplication
+ string = _preprocess_atom(string)
+ if len(args) == 0:
+ r = unicode(QApplication.translate("@default", string))
+ elif len(args) == 1:
+ if isinstance(args[0], (dict, tuple)):
+ if string.count("%") == len(args[0]):
+ r = unicode(QApplication.translate("@default", string)) % args[0]
+ elif string.count("%") == 1 and string.count("%(") == 0:
+ r = unicode(QApplication.translate("@default", string))\
+ % _preprocess_atom(repr(args[0]))
+ elif string.count("%") == 0:
+ r = (unicode(QApplication.translate("@default", string)), args[0])
+ else:
+ raise EficasException("ValueError: i18n.translate.tr: \
+ Improper input string formatting")
+ elif isinstance(args[0], (unicode, str, int, float, complex)):
+ if string.count("%") == 1:
+ r = unicode(QApplication.translate("@default", string))\
+ % _preprocess_atom(args[0])
+ else:
+ r = unicode(QApplication.translate("@default", string)) +\
+ unicode(_preprocess_atom(args[0]))
+ elif isinstance(args[0], list) or args[0] is None:
+ if string.count("%") == 1:
+ r = unicode(QApplication.translate("@default", string))\
+ % _preprocess_atom(repr(args[0]))
+ else:
+ r = (unicode(QApplication.translate("@default", string)), args[0])
+
+ else:
+ raise EficasException("ValueError: i18n.translation.tr: \
+ Wrong type for formatted string \
+ arguments: %s" % type(args[0]))
+ else:
+ raise EficasException("ValueError: i18n.translation.tr: \
+ Wrong formatted string arguments")
+ return r
+
+
+def tr_qt(string, *args):
+ """tr_qt(string, iterable-or-float-or-int) -> unicode
+ t_qtr(string) -> unicode
+
+ Returns a formatted string from an unformatted
+ Unicode string with formatting specifications, and,
+ optionally, an iterable or an int or float.
+ Lets PyQt4 do the string formatting. To this end,
+ a conversion from Python to Qt string formatting
+ syntax is performed."""
+ string = _preprocess_atom(string)
+ from PyQt4.QtGui import QApplication
+ if len(args) == 0:
+ r = QApplication.translate("@default", string)
+ elif len(args) == 1:
+ r = QApplication.translate("@default", string)
+ if isinstance(args[0], (dict, tuple)):
+ if r.count("%") == len(args[0]):
+ if isinstance(args[0], dict):
+ r = _reformat_qstring_from_dict(r, args[0])
+ elif isinstance(args[0], tuple):
+ r = _reformat_qstring_from_tuple(r, args[0])
+ # XXX Pay attention to this: distinguish between tuple,
+ # dict and dict with key given in string.
+ elif r.count("%") in range(2) and r.count("%(") == 0:
+ r = _reformat_qstring_from_atom(r, _preproces_atom(repr(args[0])))
+ else:
+ raise EficasException("ValueError: i18n.translation.tr_qt: \
+ Improper formatting string parameters")
+ elif isinstance(args[0], (unicode, str, int, float, complex)):
+ r = _reformat_qstring_from_atom(r, args[0])
+ elif isinstance(args[0], list):
+ r = _reformat_qstring_from_list(r, args[0])
+ elif args[0] is None:
+ r = _reformat_qstring_from_atom(r, _preprocess_string_from_atom(repr(args[0])))
+ else:
+ raise EficasException("ValueError: i18n.translation.tr_qt: \
+ Wrong string formatting parameter types")
+ else:
+ raise EficasException("ValueError: i18n.translation.tr_qt: \
+ Improper formatted string parameter set")
+ return unicode(r)
+
+
+if __name__ == "__main__":
+ import sys
+ tr(sys.argv[1], *args)
+ tr_qt(sys.argv[1], *args)
diff --git a/Extensions/translationQT5.py b/Extensions/translationQT5.py
new file mode 100644
index 00000000..565cec79
--- /dev/null
+++ b/Extensions/translationQT5.py
@@ -0,0 +1,324 @@
+# -*- coding: utf-8 -*-
+# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr -- mailto:contact@logilab.fr
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 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 Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with this program. If not, see .
+"""
+Main module of the ``i18n`` package, for internationalizing strings via the Qt
+mechanism, in the ``Eficas`` application of EDF. Handles unformatted and
+formatted strings, according to all formatting schemes: via dictionaries,
+tuples, or atoms.
+
+``PyQt4`` is currently supported.
+"""
+from Extensions.eficas_exception import EficasException
+import re
+regex=re.compile(r"% *[0-9]+")
+
+
+
+
+def _reformat_qstring_from_tuple(qstring, params):
+ """
+ _reformat_qstring_from_tuple(string, tuple) -> string
+
+ Module-internal method.
+ Returns a formatted string from an unformatted string
+ and a tuple specifying the parameters of the string.
+ """
+ from PyQt5.QtCore import QRegExp
+ reg = QRegExp("\%\.[1-9]{1,2}f")
+ for p, j in zip(params, range(len(params))):
+ try:
+ i += 1 + qstring[i + 1:].indexOf("%")
+ except NameError:
+ i = qstring.indexOf("%")
+ if i == reg.indexIn(qstring):
+ precision = reg.cap(0).split('.')[1].split('f')[0]
+ qstring = qstring[:i + 2 + len(precision)].\
+ replace("%." + precision, "%" + unicode(1 + j)) + \
+ qstring[i + 3 + len(precision):]
+ qstring=regex.sub("{}",qstring)
+ #qstring = qstring.format(QString.number(float(params[j]), 'f', int(precision)))
+ qstring = qstring.format(float(params[j]))
+ else:
+ qstring = qstring[:i + 1].replace("%", "%" + unicode(1 + j)) + \
+ qstring[i + 2:]
+ if isinstance(params[j], unicode):
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(params[j])
+ elif isinstance(params[j], float):
+ qstring=regex.sub("{}",qstring)
+ #qstring = qstring.format(QString.number(params[j], 'f',\ len(unicode(params[j]).\
+ # split('.')[1])))
+ qstring = qstring.format(params[j])
+ elif isinstance(params[j], int):
+ qstring=regex.sub("{}",qstring)
+ #qstring = qstring.format(QString.number(params[j], 10))
+ qstring = qstring.format(params[j])
+ elif isinstance(params[j], list):
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(repr(params[j]))
+ else:
+ raise EficasException("TypeError: i18n.translation: \
+ Unicode, list or number expected!")
+ return qstring
+
+def _reformat_qstring_from_dict(qstring, params):
+ """
+ _reformat_qstring_from_dict(string, dict) -> string
+
+ Module-internal method.
+ Returns a formatted string from an unformatted string
+ and a dictionary specifying the parameters of the string.
+ """
+ from PyQt5.QtCore import QRegExp
+ for p, j in zip(params, range(len(params))):
+ p_reg = QRegExp("\%\("+ p + "\)\.[1-9]{1,2}f")
+ p_index = p_reg.indexIn(qstring)
+ if p_index != -1:
+ precision = p_reg.cap(0).split('.')[1].split('f')[0]
+ #qstring = qstring.replace("%(" + p + ")." + precision + "f",\
+ # "%" + unicode(1 + j)).\
+ # arg(QString.number(float(params[p]), \
+ # 'f', \
+ # int(precision)))
+ qstring = qstring.replace("%(" + p + ")." + precision + "f","%" + unicode(1 + j))
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(float(params[p]))
+ else:
+ qstring.remove(QRegExp("\\)[sdf]{1}"))
+ qstring = qstring.replace("%(" + p, "%" + unicode(1 + j))
+ if isinstance(params[p], unicode):
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(params[p])
+ elif isinstance(params[p], float):
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(params[p])
+ #qstring = qstring.format(QString.number(params[p], 'f', \
+ # len(unicode(params[p]).split('.')[1])))
+ elif isinstance(params[p], int):
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(params[p])
+ elif isinstance(params[p], list):
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(repr(params[p]))
+ else:
+ raise EficasException("TypeError: i18n.translation: \
+ Improper string parameter type.")
+ return qstring
+
+def _reformat_qstring_from_atom(qstring, params):
+ """
+ _reformat_qstring_from_atom(string, int-or-float) -> string
+
+ Module-internal method.
+ Returns a formatted string from an unformatted string
+ and an integer or a float specifying the parameter of
+ the string.
+ """
+ from PyQt5.QtCore import QRegExp
+ reg = QRegExp("\%\.[1-9]{1,2}f")
+ if qstring.count("%") == 0:
+ qstring.append("%1")
+ try:
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(unicode(params))
+ except AttributeError:
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(params)
+ elif qstring.count("%") == 1:
+ i = qstring.indexOf("%")
+ if i == reg.indexIn(qstring):
+ precision = reg.cap(0).split('.')[1].split('f')[0]
+ qstring = qstring[: i + 2 + len(precision)].\
+ replace("%." + precision, "%1") + \
+ qstring[i + 3 + len(precision):]
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format((params))
+ #qstring = qstring.format(QString.number(float(params), 'f',\
+ # int(precision)))
+ else:
+ qstring = qstring[:i + 1].replace("%", "%1") + \
+ qstring[i + 2:]
+ if isinstance(params, (unicode, str)):
+ qstring = qstring.format(_preprocess_atom(params))
+ elif isinstance(params, float):
+ #qstring = qstring.format(QString.number(params, 'f', \
+ # len(unicode(params).\
+ # split('.')[1])))
+ qstring = qstring.format(params)
+ elif isinstance(params, int):
+ qstring=regex.sub("{}",qstring)
+ #qstring = qstring.format(QString.number(params, 10))
+ qstring = qstring.format(params)
+ else:
+ raise EficasException("TypeError: i18n.translation: Unicode, \
+ string or number expected!")
+ return qstring
+
+def _reformat_qstring_from_list(qstring, params):
+ """
+ _reformat_qstring_from_list(string, tuple) -> string
+
+ Module-internal method.
+ Returns a formatted string from an unformatted string
+ and a list whose concatenation specifies the parameter
+ of the string.
+ """
+ # XXX to add further functionality, e.g. list processing
+ # when ``%`` not at the end.
+ if qstring.count("%") == 1 and \
+ unicode(qstring).strip()[:-1].endswith("%"):
+ qstring = qstring[:qstring.indexOf("%") + 1].append("1")
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(u' '.join(map(unicode, params)))
+ elif qstring.count("%") == 0:
+ qstring.append("%1")
+ qstring=regex.sub("{}",qstring)
+ qstring = qstring.format(u' '.join(map(unicode, params)))
+ else:
+ raise EficasException("ValueError: i18n.translation: \
+ At most one '%' expected!")
+ return qstring
+
+def _preprocess_atom(string):
+ """
+ _preprocess_atom(string-or-number-or-unicode) -> unicode
+ Test if input is a Unicode object or a number; if so, then return it;
+ otherwise, test if the input is a string; if so, then try to create
+ a Unicode object out of it. To this end, assume the string is encoded
+ in utf-8; if this fails, then assume the string is encoded in Latin-9.
+ """
+ if isinstance(string, (unicode, int, float, complex)):
+ return string
+ elif isinstance(string, str):
+ return _str_to_unicode(string)
+ else:
+ raise EficasException("TypeError: Expected number, string or\
+ Unicode object!")
+
+def _str_to_unicode(string):
+ """
+ _str_to_unicode(string) -> unicode
+ Tries to create a Unicode object out of the input string; assumes
+ the string is UTF-8 encoded; if not, then assume the string is
+ Latin-9 encoded.
+ """
+ try:
+ string = unicode(string, "utf-8")
+ except UnicodeDecodeError:
+ try:
+ string = unicode(string, "iso-8859-15")
+ except UnicodeDecodeError:
+ raise EficasException("UnicodeDecodeError: UTF-8, Latin-1 \
+ or Latin-9 expected")
+ return string
+
+def tr(string, *args):
+ """tr(string-or-unicode, iterable-or-float-or-int) -> unicode
+ tr(string-or-unicode) -> unicode
+
+ Returns a formatted Unicode object from an unformatted
+ string or Unicode object with formatting specifications, and,
+ optionally, an iterable or an int or float.
+ Lets Python do the string formatting."""
+ from PyQt5.QtWidgets import QApplication
+ string = _preprocess_atom(string)
+ if len(args) == 0:
+ r = unicode(QApplication.translate("@default", string))
+ elif len(args) == 1:
+ if isinstance(args[0], (dict, tuple)):
+ if string.count("%") == len(args[0]):
+ r = unicode(QApplication.translate("@default", string)) % args[0]
+ elif string.count("%") == 1 and string.count("%(") == 0:
+ r = unicode(QApplication.translate("@default", string))\
+ % _preprocess_atom(repr(args[0]))
+ elif string.count("%") == 0:
+ r = (unicode(QApplication.translate("@default", string)), args[0])
+ else:
+ raise EficasException("ValueError: i18n.translate.tr: \
+ Improper input string formatting")
+ elif isinstance(args[0], (unicode, str, int, float, complex)):
+ if string.count("%") == 1:
+ r = unicode(QApplication.translate("@default", string))\
+ % _preprocess_atom(args[0])
+ else:
+ r = unicode(QApplication.translate("@default", string)) +\
+ unicode(_preprocess_atom(args[0]))
+ elif isinstance(args[0], list) or args[0] is None:
+ if string.count("%") == 1:
+ r = unicode(QApplication.translate("@default", string))\
+ % _preprocess_atom(repr(args[0]))
+ else:
+ r = (unicode(QApplication.translate("@default", string)), args[0])
+
+ else:
+ raise EficasException("ValueError: i18n.translation.tr: \
+ Wrong type for formatted string \
+ arguments: %s" % type(args[0]))
+ else:
+ raise EficasException("ValueError: i18n.translation.tr: \
+ Wrong formatted string arguments")
+ return r
+
+
+def tr_qt(string, *args):
+ """tr_qt(string, iterable-or-float-or-int) -> unicode
+ t_qtr(string) -> unicode
+
+ Returns a formatted string from an unformatted
+ Unicode string with formatting specifications, and,
+ optionally, an iterable or an int or float.
+ Lets PyQt4 do the string formatting. To this end,
+ a conversion from Python to Qt string formatting
+ syntax is performed."""
+ string = _preprocess_atom(string)
+ from PyQt5.QtWidgets import QApplication
+ if len(args) == 0:
+ r = QApplication.translate("@default", string)
+ elif len(args) == 1:
+ r = QApplication.translate("@default", string)
+ if isinstance(args[0], (dict, tuple)):
+ if r.count("%") == len(args[0]):
+ if isinstance(args[0], dict):
+ r = _reformat_qstring_from_dict(r, args[0])
+ elif isinstance(args[0], tuple):
+ r = _reformat_qstring_from_tuple(r, args[0])
+ # XXX Pay attention to this: distinguish between tuple,
+ # dict and dict with key given in string.
+ elif r.count("%") in range(2) and r.count("%(") == 0:
+ r = _reformat_qstring_from_atom(r, _preproces_atom(repr(args[0])))
+ else:
+ raise EficasException("ValueError: i18n.translation.tr_qt: \
+ Improper formatting string parameters")
+ elif isinstance(args[0], (unicode, str, int, float, complex)):
+ r = _reformat_qstring_from_atom(r, args[0])
+ elif isinstance(args[0], list):
+ r = _reformat_qstring_from_list(r, args[0])
+ elif args[0] is None:
+ r = _reformat_qstring_from_atom(r, _preprocess_string_from_atom(repr(args[0])))
+ else:
+ raise EficasException("ValueError: i18n.translation.tr_qt: \
+ Wrong string formatting parameter types")
+ else:
+ raise EficasException("ValueError: i18n.translation.tr_qt: \
+ Improper formatted string parameter set")
+ return unicode(r)
+
+
+if __name__ == "__main__":
+ import sys
+ tr(sys.argv[1], *args)
+ tr_qt(sys.argv[1], *args)
diff --git a/InterfaceQT4/browser.py b/InterfaceQT4/browser.py
index 2745b6b1..ca143810 100644
--- a/InterfaceQT4/browser.py
+++ b/InterfaceQT4/browser.py
@@ -22,10 +22,15 @@ import string,re
import types,sys,os
import traceback
import typeNode
-import pdb
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+#import pdb
+
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QTreeWidget , QTreeWidgetItem
+ from PyQt5.QtGui import QIcon
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
from Extensions.i18n import tr
from gereRegles import GereRegles
from monChoixCommande import MonChoixCommande
@@ -56,9 +61,14 @@ class JDCTree( QTreeWidget,GereRegles ):
self.itemCourrant=None
- self.connect(self, SIGNAL("itemClicked ( QTreeWidgetItem * ,int) "), self.handleOnItem)
- self.connect(self, SIGNAL("itemCollapsed ( QTreeWidgetItem *) "), self.handleCollapsedItem)
- self.connect(self, SIGNAL("itemExpanded ( QTreeWidgetItem *) "), self.handleExpandedItem)
+ if monEnvQT5 :
+ self.itemClicked.connect(self.handleOnItem)
+ self.itemCollapsed.connect(self.handleCollapsedItem)
+ self.itemExpanded.connect(self.handleExpandedItem)
+ else :
+ self.connect(self, SIGNAL("itemClicked ( QTreeWidgetItem * ,int) "), self.handleOnItem)
+ self.connect(self, SIGNAL("itemCollapsed ( QTreeWidgetItem *) "), self.handleCollapsedItem)
+ self.connect(self, SIGNAL("itemExpanded ( QTreeWidgetItem *) "), self.handleExpandedItem)
#PNPNPN verifier dans quel cas on se trouve : affiche l arbre ou la commande
self.node_selected=self.racine
@@ -199,14 +209,18 @@ class JDCNode(QTreeWidgetItem,GereRegles):
from InterfaceQT4 import compoparam
from InterfaceQT4 import composimp
if (isinstance(self.item,compocomm.COMMTreeItem)) : name=tr("Commentaire")
- elif (isinstance(self.item,compoparam.PARAMTreeItem)) : name=self.appliEficas.trUtf8(str(item.GetLabelText()[0]))
- else: name = self.appliEficas.trUtf8(str(tr( item.nom))+" :")
- value = self.appliEficas.trUtf8(str( item.GetText() ) )
+ elif (isinstance(self.item,compoparam.PARAMTreeItem)) : name=tr(str(item.GetLabelText()[0]))
+ else: name = tr(str(tr( item.nom))+" :")
+ value = tr(str( item.GetText() ) )
- mesColonnes=QStringList()
- if self.editor.enteteQTree=='complet': mesColonnes << name << value
- else : mesColonnes << name
+ if monEnvQT5:
+ if self.editor.enteteQTree=='complet':mesColonnes=(name,value)
+ else : mesColonnes=(name,)
+ else :
+ mesColonnes=QStringList()
+ if self.editor.enteteQTree=='complet': mesColonnes << name << value
+ else : mesColonnes << name
if self.treeParent.plie==True :
self.plie = True
@@ -233,10 +247,15 @@ class JDCNode(QTreeWidgetItem,GereRegles):
else :
QTreeWidgetItem.__init__(self,self.treeParent,mesColonnes)
- self.setToolTip(0,QString(self.item.get_fr()))
- self.setToolTip(1,QString(self.item.get_fr()))
+ if monEnvQT5 :
+ self.setToolTip(0,self.item.get_fr())
+ self.setToolTip(1,self.item.get_fr())
+ repIcon=self.appliEficas.repIcon
+ else :
+ self.setToolTip(0,QString(self.item.get_fr()))
+ self.setToolTip(1,QString(self.item.get_fr()))
+ repIcon=QString(self.appliEficas.repIcon)
- repIcon=QString(self.appliEficas.repIcon)
monIcone = QIcon(repIcon+"/" +self.item.GetIconName() + ".png")
self.setIcon(0,monIcone)
@@ -624,7 +643,8 @@ class JDCNode(QTreeWidgetItem,GereRegles):
"""Cette methode remet a jour la validite du noeud (icone)
Elle appelle isvalid
"""
- repIcon=QString(self.appliEficas.repIcon)
+ if monEnvQT5 : repIcon=self.appliEficas.repIcon
+ else : repIcon=QString(self.appliEficas.repIcon)
monIcone = QIcon(repIcon+"/" +self.item.GetIconName() + ".png")
self.setIcon(0,monIcone)
diff --git a/InterfaceQT4/compobloc.py b/InterfaceQT4/compobloc.py
index cd1c1e29..bed58457 100644
--- a/InterfaceQT4/compobloc.py
+++ b/InterfaceQT4/compobloc.py
@@ -18,8 +18,7 @@
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-from PyQt4 import *
-from PyQt4.QtGui import *
+
from Editeur import Objecttreeitem
import compofact
diff --git a/InterfaceQT4/compocomm.py b/InterfaceQT4/compocomm.py
index e87cb443..424baf7c 100644
--- a/InterfaceQT4/compocomm.py
+++ b/InterfaceQT4/compocomm.py
@@ -18,10 +18,15 @@
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
import string
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QAction
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
from Editeur import Objecttreeitem
import browser
import typeNode
@@ -39,7 +44,8 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
def createPopUpMenu(self):
typeNode.PopUpMenuNodePartiel.createPopUpMenu(self)
self.Decommente = QAction(tr("Decommenter"),self.tree)
- self.tree.connect(self.Decommente,SIGNAL("triggered()"),self.Decommenter)
+ if monEnvQT5 : self.tree.connect(self.Decommente,SIGNAL("triggered()"),self.Decommenter)
+ else : self.Decommente.triggered(self.Decommenter)
self.Decommente.setStatusTip(tr("Decommente la commande "))
if hasattr(self.item,'uncomment'):
diff --git a/InterfaceQT4/compofact.py b/InterfaceQT4/compofact.py
index c5ee1cdd..ab893a6b 100644
--- a/InterfaceQT4/compofact.py
+++ b/InterfaceQT4/compofact.py
@@ -18,9 +18,6 @@
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
import browser
import typeNode
from Extensions.i18n import tr
diff --git a/InterfaceQT4/compomacro.py b/InterfaceQT4/compomacro.py
index 2bba03e8..e5e6162e 100644
--- a/InterfaceQT4/compomacro.py
+++ b/InterfaceQT4/compomacro.py
@@ -29,8 +29,14 @@ from Extensions.i18n import tr
import compooper
import browser
import typeNode
-from PyQt4.QtGui import QAction
-from PyQt4.QtCore import Qt, SIGNAL, QVariant
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QAction
+ from PyQt5.QtCore import Qt
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
class MACRONode(browser.JDCNode,typeNode.PopUpMenuNode):
@@ -44,7 +50,10 @@ class MACRONode(browser.JDCNode,typeNode.PopUpMenuNode):
typeNode.PopUpMenuNode.createPopUpMenu(self)
if ("AFFE_CARA_ELEM" in self.item.get_genealogie()) and self.editor.salome:
self.ViewElt = QAction(tr('View3D'),self.tree)
- self.tree.connect(self.ViewElt,SIGNAL("triggered()"),self.view3D)
+ if monEnvQT5:
+ self.ViewElt.triggered.connect(self.View3D)
+ else :
+ self.tree.connect(self.ViewElt,SIGNAL("triggered()"),self.view3D)
self.ViewElt.setStatusTip(tr("affiche dans Geom les elements de structure"))
self.menu.addAction(self.ViewElt)
if self.item.isvalid() :
diff --git a/InterfaceQT4/compooper.py b/InterfaceQT4/compooper.py
index fb3020de..9978be11 100644
--- a/InterfaceQT4/compooper.py
+++ b/InterfaceQT4/compooper.py
@@ -19,9 +19,15 @@
#
import os
import tempfile
-from PyQt4.QtGui import QMessageBox, QAction, QApplication, QCursor
-from PyQt4.QtGui import *
-from PyQt4.QtCore import Qt, SIGNAL, QVariant
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QMessageBox, QAction, QApplication
+ from PyQt5.QtGui import QCursor
+ from PyQt5.QtCore import Qt
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
from Extensions.i18n import tr
from Extensions.eficas_exception import EficasException
@@ -74,7 +80,8 @@ class Node(browser.JDCNode, typeNode.PopUpMenuNode):
self.ViewElt.setEnabled(0)
if self.item.get_nom() == "DISTRIBUTION" :
self.Graphe = QAction(tr('Graphique'),self.tree)
- self.tree.connect(self.Graphe,SIGNAL("triggered()"),self.viewPng)
+ if monEnvQT5 : self.Graphe.triggered.connect(self.viewPng)
+ else : self.tree.connect(self.Graphe,SIGNAL("triggered()"),self.viewPng)
self.Graphe.setStatusTip(tr("affiche la distribution "))
self.menu.addAction(self.Graphe)
if self.item.isvalid() :
diff --git a/InterfaceQT4/configuration.py b/InterfaceQT4/configuration.py
index db417830..97b46c0d 100644
--- a/InterfaceQT4/configuration.py
+++ b/InterfaceQT4/configuration.py
@@ -23,7 +23,11 @@
# Modules Python
import os, sys, string, types, re
import traceback
-from PyQt4.QtGui import QMessageBox
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QMessageBox
+else :
+ from PyQt4.QtGui import QMessageBox
from Editeur.utils import read_file
from Extensions.i18n import tr
diff --git a/InterfaceQT4/determine.py b/InterfaceQT4/determine.py
new file mode 100644
index 00000000..f115eae5
--- /dev/null
+++ b/InterfaceQT4/determine.py
@@ -0,0 +1,23 @@
+import os
+
+class envQT(object):
+ _instance = None
+ def __new__(cls, *args, **kwargs):
+ if not cls._instance:
+ cls._instance = super(envQT, cls).__new__(
+ cls, *args, **kwargs)
+
+ return cls._instance
+
+ def __init__(self):
+ if hasattr(self,'inQt5') : return
+ if 'PYQT_ROOT_DIR' in os.environ.keys(): qt=os.environ['PYQT_ROOT_DIR']
+ else : qt="Pyqt4"
+ if 'Pyqt-5' in qt : self.inQt5=True
+ else : self.inQt5=False
+
+
+monEnvQT5=envQT().inQt5
+if __name__=='__main__':
+ inQt5_1=envQT().inQt5
+ inQt5_2=envQT().inQt5
diff --git a/InterfaceQT4/editor.py b/InterfaceQT4/editor.py
index 6562ba77..076c60a2 100755
--- a/InterfaceQT4/editor.py
+++ b/InterfaceQT4/editor.py
@@ -20,9 +20,15 @@
import types,sys,os, re
import subprocess
import traceback
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication
+ from PyQt5.QtGui import QPalette
+ from PyQt5.QtCore import QProcess, QFileInfo, QTimer, Qt
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
import time
import pdb
from datetime import date
@@ -37,7 +43,6 @@ from Editeur import comploader
from Editeur import Objecttreeitem
from desBaseWidget import Ui_baseWidget
from monViewTexte import ViewText
-from monViewTexte import ViewText2
from monWidgetCreeParam import MonWidgetCreeParam
import browser
import readercata
@@ -46,7 +51,7 @@ DictExtensions= {"MAP" : ".map"}
-class JDCEditor(Ui_baseWidget,QtGui.QWidget):
+class JDCEditor(Ui_baseWidget,QWidget):
# ----------------------------------------- #
"""
Editeur de jdc
@@ -55,7 +60,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
#----------------------------------------------------------------------------------------------------------#
- QtGui.QWidget.__init__(self,None)
+ QWidget.__init__(self,None)
self.setupUi(self)
self.widgetOptionnel=None
self.fenetreCentraleAffichee=None
@@ -194,7 +199,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
txt_exception = self.jdc.cr.get_mess_exception()
if txt_exception:
self.jdc = None
- qApp.restoreOverrideCursor()
+ QApplication.restoreOverrideCursor()
self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
else:
@@ -397,8 +402,12 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
f=open(nomFichier,'w')
f.write(txt)
f.close()
- self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
- self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
+ if monEnvQT5 :
+ self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
+ self.monExe.readyReadStandardError.connect( self.readFromStdErr)
+ else :
+ self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOutQT4 )
+ self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErrQT4 )
exe='sh ' + nomFichier
self.monExe.start(exe)
self.monExe.closeWriteChannel()
@@ -409,12 +418,19 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
except :
pass
-
def readFromStdErr(self):
+ a=self.monExe.readAllStandardError()
+ self.w.view.append(str(a.data(),len(a)))
+
+ def readFromStdErr(self) :
+ a=self.monExe.readAllStandardOutput()
+ self.w.view.append(str(a.data(),len(a)))
+
+ def readFromStdErrQT4(self):
a=self.monExe.readAllStandardError()
self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
- def readFromStdOut(self) :
+ def readFromStdOutQT4(self) :
a=self.monExe.readAllStandardOutput()
self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
@@ -469,10 +485,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
#----------------------------------------------#
if self.sb:
mapalette=self.sb.palette()
- from PyQt4.QtGui import QPalette
mapalette.setColor( QPalette.WindowText, couleur )
self.sb.setPalette( mapalette );
- self.sb.showMessage(QString.fromUtf8(message),4000)
+ self.sb.showMessage(message,4000)
self.couleur=couleur
#------------------------------#
@@ -753,7 +768,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
fichier = QFileDialog.getOpenFileName(self.appliEficas,
tr('Ouvrir Fichier'),
self.appliEficas.CONFIGURATION.savedir,
- self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
+ tr('Wrapper Files (*.xml);;''All Files (*)'))
return fichier
#--------------------------------------------------#
@@ -762,7 +777,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
"""
Public slot to write the text to a file.
- @param fn filename to write to (string or QString)
+ @param fn filename to write to string
@return flag indicating success
"""
@@ -785,9 +800,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
f.close()
return 1
except IOError, why:
- QMessageBox.critical(self, self.trUtf8('Save File'),
- self.trUtf8('The file %1 could not be saved.
Reason: %2')
- .arg(unicode(fn)).arg(str(why)))
+ QMessageBox.critical(self, tr('Sauvegarde du Fichier'),
+ tr('Le fichier')+str(fn) + tr('n a pas pu etre sauvegarde : ') + str(why))
return 0
#-----------------------------------------------------------#
@@ -928,9 +942,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
#-----------------------------------------------------#
if DictExtensions.has_key(self.appli.code) :
chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
- extensions= self.trUtf8(chaine1+ "All Files (*)")
+ extensions= tr(chaine1+ "All Files (*)")
else :
- extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
+ extensions= tr("JDC (*.comm);;" "All Files (*)")
if self.appli.code == "MAP" :
extensions = extensions + ";; Run (*.input);;"
@@ -940,6 +954,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
extensions,None,
QFileDialog.DontConfirmOverwrite)
if fn.isNull(): return (0, None)
+ if fn == None : return (0, None)
+ if monEnvQT5 : fn=fn[0]
+
ext = QFileInfo(fn).suffix()
if ext.isEmpty(): fn.append(extension)
@@ -948,7 +965,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
tr("Sauvegarde du Fichier"),
tr("Le fichier %s existe deja.",str(fn)),
tr("&Ecraser"),
- self.trUtf8("&Abandonner"))
+ tr("&Abandonner"))
if abort == 1 : return (0, "")
return (1,fn)
@@ -989,15 +1006,19 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
for b in c.children():
if isinstance(b,QPushButton):
avant=b.text()
- if avant.toLatin1()=="&Open":
- b.setText("Save")
- mesFiltres=QStringList()
- mesFiltres << "input Map (*.input)" << "All Files (*)"
+ if (not monEnvQT5) and avant.toLatin1()=="&Open": b.setText("Save")
+ if monEnvQT5 and avant=="&Open": b.setText("Save")
+ if monEnvQT5 :
+ mesFiltres= "input Map (*.input);;All Files (*)"
+ else :
+ mesFiltres=QStringList()
+ mesFiltres << "input Map (*.input)" << "All Files (*)"
monDialog.setNameFilters(mesFiltres)
if monNomFichier!="" : monDialog.selectFile(monNomFichier)
BOk=monDialog.exec_()
if BOk==0: return
- fn=str(monDialog.selectedFiles()[0].toLatin1())
+ if monEnvQT5 : fn=str(monDialog.selectedFiles()[0])
+ else : fn=str(monDialog.selectedFiles()[0].toLatin1())
if fn == "" or fn == None : return
if not fn.endswith(".input"):
fn += ".input"
@@ -1185,14 +1206,15 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
- QMessageBox.information( self, titre,QString.fromUtf8(texte))
+ QMessageBox.information( self, titre,texte)
fn = QFileDialog.getOpenFileName(self.appliEficas,
titre,
self.appliEficas.CONFIGURATION.savedir)
- if fn.isNull():
# ce retour est impose par le get_file d'I_JDC
- return None," "
+ if fn.isNull(): return None," "
+ if not fn : return (0, " ")
+ if monEnvQT5 : fn=fn[0]
ulfile = os.path.abspath(unicode(fn))
self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
@@ -1320,7 +1342,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
caption='Fichier Med',
filter=extensions)
- self.fichierMED=str(QSfichier.toLatin1())
+ if monEnvQT5 : QSfichier=QSfichier[0]
+ self.fichierMED=QSfichier
from acquiertGroupes import getGroupes
erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
if erreur != "" : print "a traiter"
@@ -1349,7 +1372,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
#---------------------------#
QSfichier=self.openfile.selectedFiles()[0]
- self.fichierMED=str(QSfichier.toLatin1())
+ self.fichierMED=str(QSfichier)
from acquiertGroupes import getGroupes
erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
if erreur != "" : print "a traiter"
diff --git a/InterfaceQT4/eficas_go.py b/InterfaceQT4/eficas_go.py
index a4a05b35..3416834e 100644
--- a/InterfaceQT4/eficas_go.py
+++ b/InterfaceQT4/eficas_go.py
@@ -22,14 +22,19 @@
# Modules Python
import sys,os
repIni=os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),".."))
-ihmQTDir=os.path.join(repIni,"UiQT4")
+from determine import monEnvQT5
+if monEnvQT5 :
+ ihmQTDir=os.path.join(repIni,"UiQT5")
+ from PyQt5.QtWidgets import QApplication
+else :
+ ihmQTDir=os.path.join(repIni,"UiQT4")
+ from PyQt4.QtGui import QApplication
editeurDir=os.path.join(repIni,"Editeur")
ihmDir=os.path.join(repIni,"InterfaceQT4")
if ihmDir not in sys.path : sys.path.append(ihmDir)
if ihmQTDir not in sys.path : sys.path.append(ihmQTDir)
if editeurDir not in sys.path :sys.path.append(editeurDir)
-from PyQt4.QtGui import *
def lance_eficas(code=None,fichier=None,ssCode=None,multi=False,langue='en'):
"""
diff --git a/InterfaceQT4/feuille.py b/InterfaceQT4/feuille.py
index 53e928e1..d314472a 100644
--- a/InterfaceQT4/feuille.py
+++ b/InterfaceQT4/feuille.py
@@ -21,11 +21,16 @@
import string,types,os
import traceback
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QToolButton ,QWidget
+ from PyQt5.QtGui import QFont, QFontMetrics
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
from Extensions.i18n import tr
+
from gereIcones import ContientIcones
from gereIcones import FacultatifOuOptionnel
from qtSaisie import SaisieValeur
@@ -123,7 +128,7 @@ class Feuille(QWidget,ContientIcones,SaisieValeur,FacultatifOuOptionnel):
else :
commentaire=tr("Entrez entre ")+str(mc.min)+(" et ")+str(mc.max) +" " +tr(d_aides[type])+'\n'
aideval=self.node.item.aide()
- commentaire=commentaire + QString.toUtf8(QString(aideval))
+ commentaire=commentaire + tr(aideval)
self.monCommentaireLabel.setText(str(commentaire))
return str(commentaire)
diff --git a/InterfaceQT4/gereIcones.py b/InterfaceQT4/gereIcones.py
index 590763b6..0d1b912a 100644
--- a/InterfaceQT4/gereIcones.py
+++ b/InterfaceQT4/gereIcones.py
@@ -20,10 +20,17 @@
# Modules Python
import string,types,os,re,sys
import traceback
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QMessageBox, QFileDialog
+ from PyQt5.QtGui import QIcon
+ from PyQt5.QtCore import QFileInfo, Qt
+
+else:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
listeSuffixe=('bmp','png','jpg' ,'txt','med')
@@ -41,7 +48,8 @@ class FacultatifOuOptionnel:
else :
icon3=QIcon(self.repIcon+"/lettreRblanc30.png")
self.RBRegle.setIcon(icon3)
- self.connect( self.RBRegle,SIGNAL("clicked()"),self.viewRegles)
+ if monEnvQT5 :self.RBRegle.clicked.connect(self.viewRegles)
+ else : self.connect( self.RBRegle,SIGNAL("clicked()"),self.viewRegles)
cle_doc=None
if not hasattr(self,"RBInfo"):return
@@ -54,6 +62,7 @@ class FacultatifOuOptionnel:
else :
self.cle_doc = self.node.item.get_docu()
if self.cle_doc == None : self.RBInfo.close()
+ elif monEnvQT5 : self.RBInfo.clicked.connect (self.viewDoc)
else : self.connect (self.RBInfo,SIGNAL("clicked()"),self.viewDoc)
@@ -90,7 +99,8 @@ class FacultatifOuOptionnel:
return
icon=QIcon(self.repIcon+"/deleteRond.png")
self.RBPoubelle.setIcon(icon)
- self.connect(self.RBPoubelle,SIGNAL("clicked()"),self.aDetruire)
+ if monEnvQT5 : self.RBPoubelle.clicked.connect(self.aDetruire)
+ else : self.connect(self.RBPoubelle,SIGNAL("clicked()"),self.aDetruire)
def setIconesSalome(self):
if not (hasattr(self,"RBSalome")): return
@@ -104,7 +114,8 @@ class FacultatifOuOptionnel:
if enable_salome_selection:
icon=QIcon(self.repIcon+"/flecheSalome.png")
self.RBSalome.setIcon(icon)
- self.connect(self.RBSalome,SIGNAL("pressed()"),self.BSalomePressed)
+ if monEnvQT5 : self.RBSalome.pressed.connect(self.BSalomePressed)
+ else : self.connect(self.RBSalome,SIGNAL("pressed()"),self.BSalomePressed)
#PNPN --> Telemac A revoir surement
# cela ou le catalogue grpma ou salomeEntry
@@ -113,7 +124,8 @@ class FacultatifOuOptionnel:
else :
icon1=QIcon(self.repIcon+"/eye.png")
self.RBSalomeVue.setIcon(icon1)
- self.connect(self.RBSalomeVue,SIGNAL("clicked()"),self.BView2DPressed)
+ if monEnvQT5 : self.RBSalomeVue.clicked.connect(self.BView2DPressed)
+ else : self.connect(self.RBSalomeVue,SIGNAL("clicked()"),self.BView2DPressed)
else:
self.RBSalome.close()
self.RBSalomeVue.close()
@@ -125,11 +137,14 @@ class FacultatifOuOptionnel:
mctype = mc.type[0]
if mctype == "Repertoire":
self.BRepertoire=self.BFichier
- self.connect(self.BRepertoire,SIGNAL("clicked()"),self.BRepertoirePressed)
+ if monEnvQT5 : self.BRepertoire.clicked.connect(self.BRepertoirePressed)
+ else : self.connect(self.BRepertoire,SIGNAL("clicked()"),self.BRepertoirePressed)
self.BVisuFichier.close()
else :
- self.connect(self.BFichier,SIGNAL("clicked()"),self.BFichierPressed)
- self.connect(self.BVisuFichier,SIGNAL("clicked()"),self.BFichierVisu)
+ if monEnvQT5 : self.BFichier.clicked.connect(self.BFichierPressed)
+ else : self.connect(self.BFichier,SIGNAL("clicked()"),self.BFichierPressed)
+ if monEnvQT5 : self.BVisuFichier.clicked.connect(self.BFichierVisu)
+ else : self.connect(self.BVisuFichier,SIGNAL("clicked()"),self.BFichierVisu)
@@ -219,7 +234,7 @@ class ContientIcones:
elif hasattr(mctype[0], "filters"):
filters = mctype[0].filters
else:
- filters = QString()
+ filters = None
if len(mctype) > 2 and mctype[2] == "Sauvegarde":
fichier = QFileDialog.getSaveFileName(self.appliEficas,
tr('Sauvegarder Fichier'),
@@ -232,6 +247,7 @@ class ContientIcones:
filters)
if not(fichier.isNull()):
+ if monEnvQT5 : fichier=fichier[0]
ulfile = os.path.abspath(unicode(fichier))
self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
self.lineEditVal.setText(fichier)
@@ -245,7 +261,8 @@ class ContientIcones:
self.BSelectInFile.setObjectName("BSelectInFile")
self.gridLayout.addWidget(self.BSelectInFile,1,1,1,1)
self.BSelectInFile.setText(tr("Selection"))
- self.connect(self.BSelectInFile,SIGNAL("clicked()"),self.BSelectInFilePressed)
+ if monEnvQT5 : self.BSelectInFile.clicked.connect(self.BSelectInFilePressed)
+ else : self.connect(self.BSelectInFile,SIGNAL("clicked()"),self.BSelectInFilePressed)
else :
self.BSelectInFile.setVisible(1)
elif hasattr(self, "BSelectInFile"):
@@ -314,8 +331,8 @@ class ContientIcones:
def BView2DPressed(self):
valeur=self.lineEditVal.text()
- if valeur == QString("") : return
valeur = str(valeur)
+ if valeur == str("") : return
if valeur :
ok, msgError = self.appliEficas.displayShape(valeur)
if not ok:
diff --git a/InterfaceQT4/gereListe.py b/InterfaceQT4/gereListe.py
index d8309912..a0426de0 100644
--- a/InterfaceQT4/gereListe.py
+++ b/InterfaceQT4/gereListe.py
@@ -21,9 +21,14 @@
import string,types,os
import traceback
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QLineEdit, QLabel, QIcon
+ from PyQt5.QtCore import QEvent
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
from Extensions.i18n import tr
from monViewTexte import ViewText
@@ -93,15 +98,23 @@ class GereListe:
# ------------- #
def __init__(self):
- self.connecterSignaux()
+ if monEnvQT5 :self.connecterSignaux()
+ else : self.connecterSignauxQT4()
- def connecterSignaux(self):
+ def connecterSignauxQT4(self):
self.connect(self.RBHaut,SIGNAL("clicked()"),self.hautPushed)
self.connect(self.RBBas,SIGNAL("clicked()"),self.basPushed)
self.connect(self.RBMoins,SIGNAL("clicked()"),self.moinsPushed)
self.connect(self.RBPlus,SIGNAL("clicked()"),self.plusPushed)
self.connect(self.RBVoisListe,SIGNAL("clicked()"),self.voisListePushed)
+ def connecterSignaux(self):
+ self.RBHaut.clicked.connect(self.hautPushed)
+ self.RBBas.clicked.connect(self.basPushed)
+ self.RBMoins.clicked.connect(self.moinsPushed)
+ self.RBPlus.clicked.connect(self.plusPushed)
+ self.RBVoisListe.clicked.connect(self.voisListePushed)
+
def hautPushed(self):
if self.NumLineEditEnCours == 1 : return
else : numEchange=self.NumLineEditEnCours-1
@@ -218,7 +231,8 @@ class GerePlie:
fichier=os.path.join(repIcon, 'minusnode.png')
icon = QIcon(fichier)
self.BFermeListe.setIcon(icon)
- self.connect(self.BFermeListe,SIGNAL("clicked()"), self.selectWidgetPlie)
+ if monEnvQT5 : self.BFermeListe.clicked.connect( self.selectWidgetPlie)
+ else : self.connect(self.BFermeListe,SIGNAL("clicked()"), self.selectWidgetPlie)
def selectWidgetPlie(self):
self.editor.listeDesListesOuvertes.remove(self.node.item)
diff --git a/InterfaceQT4/gereRegles.py b/InterfaceQT4/gereRegles.py
index c2923535..0ef22692 100644
--- a/InterfaceQT4/gereRegles.py
+++ b/InterfaceQT4/gereRegles.py
@@ -18,7 +18,11 @@
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtCore import Qt
+else:
+ from PyQt4.QtCore import *
from monViewRegles import ViewRegles
class GereRegles :
diff --git a/InterfaceQT4/gereTraduction.py b/InterfaceQT4/gereTraduction.py
index fce86785..34011519 100644
--- a/InterfaceQT4/gereTraduction.py
+++ b/InterfaceQT4/gereTraduction.py
@@ -16,9 +16,13 @@
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QFileDialog, QApplication
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
import os
from Extensions.i18n import tr
@@ -37,10 +41,11 @@ def traduction(directPath,editor,version):
fn = QFileDialog.getOpenFileName(
editor.appliEficas,
tr('Traduire Fichier'),
- QString(directPath) ,
+ directPath ,
tr('Fichiers JDC (*.comm);;''Tous les Fichiers (*)'))
+ if monEnvQT5 : fn=fn[0]
FichieraTraduire=str(fn)
if (FichieraTraduire == "" or FichieraTraduire == () ) : return
i=FichieraTraduire.rfind(".")
@@ -53,11 +58,11 @@ def traduction(directPath,editor,version):
os.system("rm -rf "+log)
os.system("rm -rf "+FichierTraduit)
- qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
+ QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
if version == "V9V10" : traduitV9V10.traduc(FichieraTraduire,FichierTraduit,log)
if version == "V10V11" : traduitV10V11.traduc(FichieraTraduire,FichierTraduit,log)
if version == "V11V12" : traduitV11V12.traduc(FichieraTraduire,FichierTraduit,log)
- qApp.setOverrideCursor(QCursor(Qt.ArrowCursor))
+ QApplication.setOverrideCursor(QCursor(Qt.ArrowCursor))
Entete=tr("Fichier Traduit : %s\n\n",str(FichierTraduit))
if os.stat(log)[6] != 0L :
diff --git a/InterfaceQT4/groupe.py b/InterfaceQT4/groupe.py
index c1eb58ca..86b304ec 100644
--- a/InterfaceQT4/groupe.py
+++ b/InterfaceQT4/groupe.py
@@ -19,9 +19,14 @@
# Modules Python
# Modules Eficas
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QWidget
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+from Extensions.i18n import tr
+
from Extensions.i18n import tr
from gereIcones import FacultatifOuOptionnel
import Accas
@@ -29,11 +34,11 @@ import Accas
# Import des panels
-class Groupe(QtGui.QWidget,FacultatifOuOptionnel):
+class Groupe(QWidget,FacultatifOuOptionnel):
"""
"""
def __init__(self,node,editor,parentQt,definition,obj,niveau,commande=None):
- QtGui.QWidget.__init__(self,None)
+ QWidget.__init__(self,None)
self.node=node
self.node.fenetre=self
#print "groupe : ",self.node.item.nom," ",self.node.fenetre
@@ -57,8 +62,10 @@ class Groupe(QtGui.QWidget,FacultatifOuOptionnel):
self.afficheMots()
self.listeMCAAjouter=[]
self.dictMCVenantDesBlocs={}
- if hasattr(self,'RBDeplie') : self.connect(self.RBDeplie,SIGNAL("clicked()"), self.Deplie)
- if hasattr(self,'RBPlie') : self.connect(self.RBPlie,SIGNAL("clicked()"), self.Plie)
+ if hasattr(self,'RBDeplie') and not monEnvQT5 : self.connect(self.RBDeplie,SIGNAL("clicked()"), self.Deplie)
+ if hasattr(self,'RBPlie') and not monEnvQT5: self.connect(self.RBPlie,SIGNAL("clicked()"), self.Plie)
+ if hasattr(self,'RBDeplie') and monEnvQT5: self.RBDeplie.clicked.connect(self.Deplie)
+ if hasattr(self,'RBPlie') and monEnvQT5: self.RBPlie.clicked.connect( self.Plie)
self.setAcceptDrops(True)
#self.donneFocus()
diff --git a/InterfaceQT4/monBoutonValide.py b/InterfaceQT4/monBoutonValide.py
index 7ae919ff..0027be39 100644
--- a/InterfaceQT4/monBoutonValide.py
+++ b/InterfaceQT4/monBoutonValide.py
@@ -20,8 +20,12 @@
#
import re
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QToolButton
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
from Extensions.i18n import tr
class MonBoutonValide(QToolButton) :
diff --git a/InterfaceQT4/monChoixCata.py b/InterfaceQT4/monChoixCata.py
index 1a4199a2..7527606f 100644
--- a/InterfaceQT4/monChoixCata.py
+++ b/InterfaceQT4/monChoixCata.py
@@ -21,14 +21,16 @@
# Modules Eficas
from desChoixCata import Ui_DChoixCata
-from PyQt4 import *
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QDialog
+else:
+ from PyQt4.QtGui import *
from Extensions.i18n import tr
# Import des panels
-class MonChoixCata(Ui_DChoixCata,QtGui.QDialog):
+class MonChoixCata(Ui_DChoixCata,QDialog):
"""
Classe définissant le panel associé aux mots-clés qui demandent
à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
diff --git a/InterfaceQT4/monChoixCode.py b/InterfaceQT4/monChoixCode.py
index fcd19856..e362e581 100644
--- a/InterfaceQT4/monChoixCode.py
+++ b/InterfaceQT4/monChoixCode.py
@@ -22,8 +22,13 @@
import os,sys,re
from desChoixCode import Ui_ChoixCode
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+f monEnvQT5:
+ from PyQt5.QtWidgets import QDialog, QRadioButton
+ from PyQt5.QtGui import QPalette
+ from PyQt5.QtCore import QProcess, QFileInfo, Qt
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
# Import des panels
@@ -41,8 +46,12 @@ class MonChoixCode(Ui_ChoixCode,QDialog):
self.parentAppli=parentAppli
self.verifieInstall()
self.code=None
- self.connect(self.pB_OK,SIGNAL("clicked()"),self.choisitCode)
- self.connect(self.pB_cancel,SIGNAL("clicked()"),self.sortie)
+ if monEnvQT5:
+ self.pB_OK.clicked.connect(self.choisitCode)
+ self.pB_cancel.clicked.connect(self.sortie)
+ else :
+ self.connect(self.pB_OK,SIGNAL("clicked()"),self.choisitCode)
+ self.connect(self.pB_cancel,SIGNAL("clicked()"),self.sortie)
def sortie(self):
QDialog.reject(self)
diff --git a/InterfaceQT4/monChoixCommande.py b/InterfaceQT4/monChoixCommande.py
index aa84ce67..a8cc984e 100644
--- a/InterfaceQT4/monChoixCommande.py
+++ b/InterfaceQT4/monChoixCommande.py
@@ -20,28 +20,33 @@
# Modules Eficas
from desChoixCommandes import Ui_ChoixCommandes
-from PyQt4 import *
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QWidget, QAction ,QButtonGroup, QRadioButton, QLabel
+ from PyQt5.QtGui import QIcon
+ from PyQt5.QtCore import QSize
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
from Extensions.i18n import tr
import os
# Import des panels
-class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
+class MonChoixCommande(Ui_ChoixCommandes,QWidget):
"""
"""
def __init__(self,node, jdc_item, editor):
- QtGui.QWidget.__init__(self,None)
+ QWidget.__init__(self,None)
self.setupUi(self)
self.repIcon=os.path.join( os.path.dirname(os.path.abspath(__file__)),'..','Editeur','icons')
iconeFile=os.path.join(self.repIcon,'lettreRblanc30.png')
icon = QIcon(iconeFile)
self.RBRegle.setIcon(icon)
- self.RBRegle.setIconSize(QtCore.QSize(21, 31))
+ self.RBRegle.setIconSize(QSize(21, 31))
self.item = jdc_item
self.node = node
@@ -58,15 +63,26 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
#print self.node.tree
- self.connect(self.RBalpha,SIGNAL("clicked()"),self.afficheAlpha)
- self.connect(self.RBGroupe,SIGNAL("clicked()"),self.afficheGroupe)
- self.connect(self.RBOrdre,SIGNAL("clicked()"),self.afficheOrdre)
- self.connect(self.RBClear,SIGNAL("clicked()"),self.clearFiltre)
- self.connect(self.RBCasse,SIGNAL("toggled(bool)"),self.ajouteRadioButtons)
+ if monEnvQT5 :
+ self.RBalpha.clicked.connect(self.afficheAlpha)
+ self.RBGroupe.clicked.connect(self.afficheGroupe)
+ self.RBOrdre.clicked.connect(self.afficheOrdre)
+ self.RBClear.clicked.connect(self.clearFiltre)
+ self.RBCasse.toggled.connect(self.ajouteRadioButtons)
+ self.LEFiltre.returnPressed.connect(self.ajouteRadioButtons)
+ else :
+ self.connect(self.RBalpha,SIGNAL("clicked()"),self.afficheAlpha)
+ self.connect(self.RBGroupe,SIGNAL("clicked()"),self.afficheGroupe)
+ self.connect(self.RBOrdre,SIGNAL("clicked()"),self.afficheOrdre)
+ self.connect(self.RBClear,SIGNAL("clicked()"),self.clearFiltre)
+ self.connect(self.RBCasse,SIGNAL("toggled(bool)"),self.ajouteRadioButtons)
+ self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.ajouteRadioButtons)
if self.node.tree.item.get_regles() == () :
self.RBRegle.close()
self.labelRegle.close()
- else : self.connect(self.RBRegle,SIGNAL("clicked()"),self.afficheRegle)
+ else :
+ if monEnvQT5 : self.RBRegle.clicked.connect(self.afficheRegle)
+ else : self.connect(self.RBRegle,SIGNAL("clicked()"),self.afficheRegle)
if self.editor.Ordre_Des_Commandes == None : self.RBOrdre.close()
@@ -76,7 +92,6 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
self.editor.widgetOptionnel.close()
self.editor.widgetOptionnel=None
self.name=None
- self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.ajouteRadioButtons)
self.affiche_alpha=0
self.affiche_groupe=0
@@ -176,13 +191,19 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
self.buttonGroup.addButton(rbcmd)
self.commandesLayout.addWidget(rbcmd)
rbcmd.mouseDoubleClickEvent=self.mouseDoubleClickEvent
- self.connect(self.buttonGroup, SIGNAL("buttonClicked(QAbstractButton*)"),self.rbClique)
+ if monEnvQT5:
+ self.buttonGroup.buttonClicked.connect(self.rbClique)
+ else :
+ self.connect(self.buttonGroup, SIGNAL("buttonClicked(QAbstractButton*)"),self.rbClique)
elif self.affiche_groupe==1 :
listeGroupes,dictGroupes=self.jdc.get_groups()
for grp in listeGroupes:
if grp == "CACHE" : continue
label=QLabel(self)
- text=QString.fromUtf8('
Groupe : '+tr(grp)+'
')
+ if monEnvQT5 :
+ text=tr('Groupe : '+tr(grp)+'
')
+ else :
+ text=QString.fromUtf8('Groupe : '+tr(grp)+'
')
label.setText(text)
self.listeWidget.append(label)
aAjouter=1
@@ -198,7 +219,10 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
self.buttonGroup.addButton(rbcmd)
self.commandesLayout.addWidget(rbcmd)
rbcmd.mouseDoubleClickEvent=self.mouseDoubleClickEvent
- self.connect(self.buttonGroup, SIGNAL("buttonClicked(QAbstractButton*)"),self.rbClique)
+ if monEnvQT5:
+ self.buttonGroup.buttonClicked.connect(self.rbClique)
+ else :
+ self.connect(self.buttonGroup, SIGNAL("buttonClicked(QAbstractButton*)"),self.rbClique)
label2=QLabel(self)
label2.setText(" ")
self.listeWidget.append(label2)
@@ -217,7 +241,10 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
self.buttonGroup.addButton(rbcmd)
self.commandesLayout.addWidget(rbcmd)
rbcmd.mouseDoubleClickEvent=self.mouseDoubleClickEvent
- self.connect(self.buttonGroup, SIGNAL("buttonClicked(QAbstractButton*)"),self.rbClique)
+ if monEnvQT5:
+ self.buttonGroup.buttonClicked.connect(self.rbClique)
+ else :
+ self.connect(self.buttonGroup, SIGNAL("buttonClicked(QAbstractButton*)"),self.rbClique)
@@ -226,7 +253,7 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
self.ajouteRadioButtons()
def rbClique(self,id):
- self.name=self.dicoCmd[str(id.text().toLatin1())]
+ self.name=self.dicoCmd[str(id.text())]
definitionEtape=getattr(self.jdc.cata[0],self.name)
commentaire=getattr(definitionEtape,self.jdc.lang)
try :
diff --git a/InterfaceQT4/monFonctionPanel.py b/InterfaceQT4/monFonctionPanel.py
index 85ab25db..92364818 100644
--- a/InterfaceQT4/monFonctionPanel.py
+++ b/InterfaceQT4/monFonctionPanel.py
@@ -19,13 +19,17 @@
#
# Modules Python
import string,types,os
+if monEnvQT5:
+ from PyQt5.QtCore import Qt
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
# Modules Eficas
from qtSaisie import SaisieValeur
from monPlusieursBasePanel import MonPlusieursBasePanel
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
# Import des panels
@@ -60,7 +64,6 @@ class MonFonctionPanel(MonPlusieursBasePanel):
l_valeurs=[]
if ((len(liste)% self.nbValeursASaisir != 0 and (len(liste)% self.nbValeurs))):
message=tr("La cardinalite n'est pas correcte, la derniere valeur est ignoree")
- #self.Commentaire.setText(QString(commentaire))
self.editor.affiche_infos(message,Qt.red)
i=0
while ( i < len(liste) ) :
@@ -90,7 +93,7 @@ class MonFonctionPanel(MonPlusieursBasePanel):
TupleEnTexte = TupleEnTexte[0:-2] +")"
self.LBValeurs.addItem(TupleEnTexte)
else :
- self.LBValeurs.addItem(QString(str(valeur)))
+ self.LBValeurs.addItem(str(valeur))
def ajout1Valeur(self,liste=[]):
@@ -106,11 +109,11 @@ class MonFonctionPanel(MonPlusieursBasePanel):
if liste ==[] : return
if (self.node.item.wait_tuple()== 1 and len(liste) != self.nbValeurs):
- commentaire = QString(str(liste))
- commentaire += QString(tr(" n est pas un tuple de "))
- commentaire += QString(str(self.nbValeursASaisir))
- commentaire += QString(tr(" valeurs"))
- self.LEValeur.setText(QString(str(liste)))
+ commentaire = str(liste)
+ commentaire += tr(" n est pas un tuple de ")
+ commentaire += str(self.nbValeursASaisir)
+ commentaire += tr(" valeurs")
+ self.LEValeur.setText(str(liste))
self.editor.affiche_infos(commentaire,Qt.red)
return
@@ -134,11 +137,11 @@ class MonFonctionPanel(MonPlusieursBasePanel):
validite,comm,comm2,listeRetour=self.politique.AjoutTuple(liste,index,listeVal)
else :
validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,index,listeVal)
- self.Commentaire.setText(QString.fromUtf8(QString(comm2)))
+ self.Commentaire.setText(tr(comm2))
if not validite :
self.editor.affiche_infos(comm,Qt.red)
else:
- self.LEValeur.setText(QString(""))
+ self.LEValeur.setText("")
l1=self.listeValeursCourantes[:indexListe]
l3=self.listeValeursCourantes[indexListe:]
if self.node.item.wait_tuple()== 1 :
diff --git a/InterfaceQT4/monLabelClic.py b/InterfaceQT4/monLabelClic.py
index a9d3604c..e1dea24d 100644
--- a/InterfaceQT4/monLabelClic.py
+++ b/InterfaceQT4/monLabelClic.py
@@ -19,9 +19,15 @@
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-import re
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QLabel, QFrame
+ from PyQt5.QtCore import QEvent
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+from Extensions.i18n import tr
+
#from Extensions.i18n import tr
class MonLabelClic(QLabel) :
diff --git a/InterfaceQT4/monRecherche.py b/InterfaceQT4/monRecherche.py
index 10595c99..a0f6a664 100644
--- a/InterfaceQT4/monRecherche.py
+++ b/InterfaceQT4/monRecherche.py
@@ -21,28 +21,37 @@
# Modules Eficas
from desRecherche import Ui_desRecherche
-from PyQt4 import *
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QDialog
+ from PyQt4.QtCore import Qt
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
# Import des panels
-class DRecherche(Ui_desRecherche ,QtGui.QDialog):
+class DRecherche(Ui_desRecherche ,QDialog):
"""
Classe définissant le panel associé aux mots-clés qui demandent
à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
discrètes
"""
def __init__(self,parent = None , name = None,fl = 0):
- QtGui.QDialog.__init__(self,parent)
+ QDialog.__init__(self,parent)
self.parentQT=parent
self.tree=self.parentQT.tree
self.setModal(True)
self.setupUi(self)
self.PBSuivant.setDefault(True)
self.PBSuivant.setAutoDefault(False)
- self.connect(self.PBSuivant,SIGNAL("clicked()"), self.suivantClicked)
- self.connect(self.LERecherche,SIGNAL("returnPressed()"),self.recherche)
+ if monEnvQT5 :
+ self.PBSuivant.clicked.connect( self.suivantClicked)
+ self.LERecherche.returnPressed.connect(self.recherche)
+ else :
+ self.connect(self.PBSuivant,SIGNAL("clicked()"), self.suivantClicked)
+ self.connect(self.LERecherche,SIGNAL("returnPressed()"),self.recherche)
self.surLigne=0
self.listeTrouvee=()
self.nodeSurligne=None
diff --git a/InterfaceQT4/monSelectVal.py b/InterfaceQT4/monSelectVal.py
index 94fff672..b4a32be6 100644
--- a/InterfaceQT4/monSelectVal.py
+++ b/InterfaceQT4/monSelectVal.py
@@ -21,8 +21,14 @@
# Modules Eficas
from desSelectVal import Ui_DSelVal
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+
+fromm determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QDialog
+ from PyQt5.QtCore import QTimer
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
class DSelVal(Ui_DSelVal,QDialog):
def __init__(self,parent ,modal ) :
@@ -48,6 +54,14 @@ class MonSelectVal(DSelVal):
self.connecterSignaux()
def connecterSignaux(self) :
+ self.Bespace.clicked.connect(self.SelectEsp)
+ self.BpointVirgule.clicked.connect(self.SelectPoint)
+ self.Bvirgule.clicked.connect(self.SelectVir)
+ self.BImportSel.clicked.connect(self.BImportSelPressed)
+ self.BImportTout.clicked.connect(self.BImportToutPressed)
+ self.parent.editor.sb.messageChanged(self.messageAChanger)
+
+ def connecterSignauxQT4(self) :
self.connect(self.Bespace,SIGNAL("clicked()"),self.SelectEsp)
self.connect(self.BpointVirgule,SIGNAL("clicked()"),self.SelectPoint)
self.connect(self.Bvirgule,SIGNAL("clicked()"),self.SelectVir)
@@ -61,7 +75,7 @@ class MonSelectVal(DSelVal):
from PyQt4.QtGui import QPalette
mapalette.setColor( QPalette.WindowText, self.parent.editor.couleur )
self.sb.setPalette( mapalette );
- self.sb.setText(QString.fromUtf8(message))
+ self.sb.setText(tr(message))
QTimer.singleShot(3000, self.efface)
def efface(self):
diff --git a/InterfaceQT4/monViewRegles.py b/InterfaceQT4/monViewRegles.py
index d180e671..ca178b3a 100644
--- a/InterfaceQT4/monViewRegles.py
+++ b/InterfaceQT4/monViewRegles.py
@@ -22,8 +22,13 @@ import string,types,os
import traceback
from Extensions.i18n import tr
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtCore import Qt
+ from PyQt5.QtWidgets import QDialog
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
from desViewRegles import Ui_viewRegles
# ------------------------------------ #
diff --git a/InterfaceQT4/monViewTexte.py b/InterfaceQT4/monViewTexte.py
index 8aeddc7c..690d8403 100644
--- a/InterfaceQT4/monViewTexte.py
+++ b/InterfaceQT4/monViewTexte.py
@@ -22,8 +22,13 @@ import string,types,os
import traceback
from Extensions.i18n import tr
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QDialog, QMessageBox
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
from desViewTexte import Ui_dView
# ------------------------------- #
@@ -38,8 +43,12 @@ class ViewText(Ui_dView,QDialog):
self.setupUi(self)
self.resize( QSize(largeur,hauteur).expandedTo(self.minimumSizeHint()) )
- self.connect( self.bclose,SIGNAL("clicked()"), self, SLOT("close()") )
- self.connect( self.bsave,SIGNAL("clicked()"), self.saveFile )
+ if monEnvQT5 :
+ self.bclose.clicked.connect(self.close)
+ self.bsave.clicked.connect(self.saveFile )
+ else :
+ self.connect( self.bclose,SIGNAL("clicked()"), self, SLOT("close()") )
+ self.connect( self.bsave,SIGNAL("clicked()"), self.saveFile )
if entete != None : self.setWindowTitle (entete)
if entete != None : self.setText (texte)
@@ -57,6 +66,9 @@ class ViewText(Ui_dView,QDialog):
tr("Sauvegarder le fichier"),
dir)
if fn.isNull() : return
+ if fn == None : return (0, None)
+ if monEnvQT5 : fn=fn[0]
+
ulfile = os.path.abspath(unicode(fn))
if self.editor != None :
self.editor.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
@@ -67,17 +79,8 @@ class ViewText(Ui_dView,QDialog):
return 1
except IOError, why:
QMessageBox.critical(self, tr("Sauvegarder le fichier"),
- tr("Le fichier %(v_1)s n'a pu etre sauvegarde.
Raison : %(v_2)s", {'v_1': unicode(fn), 'v_2': unicode(why)}))
+ tr('Le fichier')+str(fn) + tr('n a pas pu etre sauvegarde : ') + str(why))
return
-class ViewText2(ViewText):
- def __init__(self,parent,cmd,editor=None,entete=None,texte=None,largeur=600,hauteur=600):
- ViewText.__init__(self,parent,editor,entete,texte,largeur,hauteur)
- import subprocess
- p = subprocess.Popen(cmd,stdout=subprocess.PIPE)
- (output, err) = p.communicate()
- if output != None : self.view.append(QString.fromUtf8(output,len(output))) ;
- if err != None : self.view.append(QString.fromUtf8(err,len(err))) ;
-
diff --git a/InterfaceQT4/monVisu.py b/InterfaceQT4/monVisu.py
index 79cb99f1..7d5a4945 100644
--- a/InterfaceQT4/monVisu.py
+++ b/InterfaceQT4/monVisu.py
@@ -21,9 +21,13 @@
# Modules Eficas
from desVisu import Ui_DVisu
-from PyQt4 import *
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QDialog
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
# Import des panels
diff --git a/InterfaceQT4/monWidget4a6RadioButton.py b/InterfaceQT4/monWidget4a6RadioButton.py
index 9fcba5d0..e7e28c3d 100644
--- a/InterfaceQT4/monWidget4a6RadioButton.py
+++ b/InterfaceQT4/monWidget4a6RadioButton.py
@@ -21,8 +21,6 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
from monWidgetRadioButton import MonWidgetRadioButtonCommun
diff --git a/InterfaceQT4/monWidget4a6RadioButtonSD.py b/InterfaceQT4/monWidget4a6RadioButtonSD.py
index 3d34403b..6b74f109 100644
--- a/InterfaceQT4/monWidget4a6RadioButtonSD.py
+++ b/InterfaceQT4/monWidget4a6RadioButtonSD.py
@@ -21,8 +21,6 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
from monWidgetRadioButton import MonWidgetRadioButtonCommun
diff --git a/InterfaceQT4/monWidgetBloc.py b/InterfaceQT4/monWidgetBloc.py
index b4fa2344..0b1ef79e 100644
--- a/InterfaceQT4/monWidgetBloc.py
+++ b/InterfaceQT4/monWidgetBloc.py
@@ -21,8 +21,6 @@
from desWidgetBloc import Ui_WidgetBloc
from groupe import Groupe
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
# Import des panels
diff --git a/InterfaceQT4/monWidgetCB.py b/InterfaceQT4/monWidgetCB.py
index 19bebd47..1468c3a6 100644
--- a/InterfaceQT4/monWidgetCB.py
+++ b/InterfaceQT4/monWidgetCB.py
@@ -21,8 +21,6 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
from feuille import Feuille
@@ -71,7 +69,7 @@ class MonWidgetCBCommun (Ui_WidgetCB,Feuille):
" font : italic ;\n"
" background: rgb(235,235,235);\n"
" }"))
- valeur=str(self.CBChoix.currentText().toLatin1())
+ valeur=str(self.CBChoix.currentText())
SaisieValeur.LEValeurPressed(self,valeur)
self.reaffiche()
diff --git a/InterfaceQT4/monWidgetCBSD.py b/InterfaceQT4/monWidgetCBSD.py
index 3fb8f86e..61553b9f 100644
--- a/InterfaceQT4/monWidgetCBSD.py
+++ b/InterfaceQT4/monWidgetCBSD.py
@@ -21,8 +21,6 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
from feuille import Feuille
@@ -64,6 +62,6 @@ class MonWidgetCB (Ui_WidgetCB,Feuille):
self.CBChoix.setCompleter(monCompleteur)
def ChoixSaisi(self):
- valeur=str(self.CBChoix.currentText().toLatin1())
+ valeur=str(self.CBChoix.currentText())
SaisieValeur.LEValeurPressed(self,valeur)
self.reaffiche()
diff --git a/InterfaceQT4/monWidgetCommande.py b/InterfaceQT4/monWidgetCommande.py
index feb1eadb..83b94672 100644
--- a/InterfaceQT4/monWidgetCommande.py
+++ b/InterfaceQT4/monWidgetCommande.py
@@ -22,8 +22,17 @@
from desWidgetCommande import Ui_WidgetCommande
from groupe import Groupe
from gereIcones import FacultatifOuOptionnel
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+
+if monEnvQT5:
+ from PyQt5.QtWidgets import QApplication, QWidget
+ from PyQt5.QtGui import QFont, QIcon
+ from PyQt5.QtCore import QTimer
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+
from Extensions.i18n import tr
import Accas
import os
@@ -57,18 +66,29 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
self.commandesLayout.focusInEvent=self.focusInEvent
self.scrollAreaCommandes.focusInEvent=self.focusInEvent
- if self.editor.code in ['MAP','CARMELCND'] : self.bCatalogue.close()
- else : self.connect(self.bCatalogue,SIGNAL("clicked()"), self.afficheCatalogue)
- if self.editor.code in ['Adao','MAP'] :
- self.bAvant.close()
- self.bApres.close()
+
+ if monEnvQT5 :
+ if self.editor.code in ['MAP','CARMELCND'] : self.bCatalogue.close()
+ else : self.bCatalogue.clicked.connect(self.afficheCatalogue)
+ if self.editor.code in ['Adao','MAP'] :
+ self.bAvant.close()
+ self.bApres.close()
+ else :
+ self.bAvant.clicked.connect(self.afficheAvant)
+ self.bApres.clicked.connect(self.afficheApres)
+ self.LENom.returnPressed.connect(self.nomChange)
else :
- self.connect(self.bAvant,SIGNAL("clicked()"), self.afficheAvant)
- self.connect(self.bApres,SIGNAL("clicked()"), self.afficheApres)
-
-
- self.connect(self.LENom,SIGNAL("returnPressed()"),self.nomChange)
- self.racine=self.node.tree.racine
+ if self.editor.code in ['MAP','CARMELCND'] : self.bCatalogue.close()
+ else : self.connect(self.bCatalogue,SIGNAL("clicked()"), self.afficheCatalogue)
+ if self.editor.code in ['Adao','MAP'] :
+ self.bAvant.close()
+ self.bApres.close()
+ else :
+ self.connect(self.bAvant,SIGNAL("clicked()"), self.afficheAvant)
+ self.connect(self.bApres,SIGNAL("clicked()"), self.afficheApres)
+ self.connect(self.LENom,SIGNAL("returnPressed()"),self.nomChange)
+
+ self.racine=self.node.tree.racine
if self.node.item.GetIconName() == "ast-red-square" : self.LENom.setDisabled(True)
self.setAcceptDrops(True)
@@ -92,10 +112,10 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
def donnePremier(self):
#print "dans donnePremier"
- qApp.processEvents()
+ QApplication.processEvents()
if self.listeAffichageWidget != [] :
self.listeAffichageWidget[0].setFocus(7)
- qApp.processEvents()
+ QApplication.processEvents()
#print self.focusWidget()
@@ -213,7 +233,7 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
def recentre(self):
- qApp.processEvents()
+ QApplication.processEvents()
s=self.editor.fenetreCentraleAffichee.scrollAreaCommandes
s.horizontalScrollBar().setSliderPosition(self.avantH)
s.verticalScrollBar().setSliderPosition(self.avantV)
@@ -224,7 +244,7 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
QTimer.singleShot(1, self.rendVisible)
def rendVisible(self):
- qApp.processEvents()
+ QApplication.processEvents()
self.f.setFocus(7)
self.editor.fenetreCentraleAffichee.scrollAreaCommandes.ensureWidgetVisible(self.f)
diff --git a/InterfaceQT4/monWidgetCommentaire.py b/InterfaceQT4/monWidgetCommentaire.py
index 1738fc5b..1d422a77 100644
--- a/InterfaceQT4/monWidgetCommentaire.py
+++ b/InterfaceQT4/monWidgetCommentaire.py
@@ -19,10 +19,15 @@
# Modules Python
# Modules Eficas
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QWidget
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import
+
from desWidgetCommentaire import Ui_WidgetCommentaire
from gereIcones import FacultatifOuOptionnel
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
import Accas
import os
@@ -45,8 +50,10 @@ class MonWidgetCommentaire(QWidget,Ui_WidgetCommentaire,FacultatifOuOptionnel):
self.setIconePoubelle()
self.remplitTexte()
if self.editor.code in ['MAP','CARMELCND'] : self.bCatalogue.close()
+ elif monEnvQT5 : self.bCatalogue.clicked.connect(self.afficheCatalogue)
else : self.connect(self.bCatalogue,SIGNAL("clicked()"), self.afficheCatalogue)
- self.connect(self.commentaireLE,SIGNAL("returnPressed()"),self.TexteCommentaireEntre)
+ if monEnvQT5 : self.commentaireLE.returnPressed(TexteCommentaireEntre)
+ else : self.connect(self.commentaireLE,SIGNAL("returnPressed()"),self.TexteCommentaireEntre)
def afficheCatalogue(self):
if self.editor.code != "CARMELCND" : self.monOptionnel.hide()
@@ -59,7 +66,7 @@ class MonWidgetCommentaire(QWidget,Ui_WidgetCommentaire,FacultatifOuOptionnel):
self.commentaireLE.setText(texte)
if self.editor.code == "CARMELCND" and texte[0:16]=="Cree - fichier :" :
self.commentaireLE.setDisabled(True)
- self.commentaireLE.setStyleSheet(QString.fromUtf8("background:rgb(244,244,244);\n" "border:0px;\n"))
+ self.commentaireLE.setStyleSheet("background:rgb(244,244,244);\n" "border:0px;\n")
self.commentaireLE.setToolTip(tr("Valeur non modifiable"))
def donnePremier(self):
diff --git a/InterfaceQT4/monWidgetCreeParam.py b/InterfaceQT4/monWidgetCreeParam.py
index a1c90593..34feff33 100644
--- a/InterfaceQT4/monWidgetCreeParam.py
+++ b/InterfaceQT4/monWidgetCreeParam.py
@@ -23,9 +23,12 @@ pattern_name = re.compile(r'^[^\d\W]\w*\Z')
# Modules Eficas
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QDialog
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
from Extensions.i18n import tr
from desWidgetCreeParam import Ui_desWidgetCreeParam
@@ -38,16 +41,20 @@ class MonWidgetCreeParam(Ui_desWidgetCreeParam,QDialog):
self.editor.affiche_infos("")
QDialog.__init__(self,editor)
self.setupUi(self)
- self.connecterSignaux()
+ if monEnvQT5 : self.connecterSignaux()
+ else : self.connecterSignauxQT4()
self.dejaExistant=0
self.listeTousParam=self.editor.jdc.params
self.dictListe={}
self.initToutesVal()
- def connecterSignaux(self) :
+ def connecterSignauxQT4(self) :
self.connect(self.lineEditVal,SIGNAL("returnPressed()"),self.lineEditValReturnPressed)
self.connect(self.lineEditNom,SIGNAL("returnPressed()"),self.lineEditNomReturnPressed)
+ def connecterSignaux(self) :
+ self.lineEditVal.returnPressed(self.lineEditValReturnPressed)
+ self.lineEditNom.returnPressed(self.lineEditNomReturnPressed)
def CreeParametre(self):
nom=str(self.lineEditNom.text())
diff --git a/InterfaceQT4/monWidgetDate.py b/InterfaceQT4/monWidgetDate.py
index 05f6897f..845661d2 100644
--- a/InterfaceQT4/monWidgetDate.py
+++ b/InterfaceQT4/monWidgetDate.py
@@ -21,8 +21,6 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
from feuille import Feuille
diff --git a/InterfaceQT4/monWidgetFact.py b/InterfaceQT4/monWidgetFact.py
index 77756ad4..7b60cf8f 100644
--- a/InterfaceQT4/monWidgetFact.py
+++ b/InterfaceQT4/monWidgetFact.py
@@ -17,12 +17,19 @@
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
# Modules Python
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtCore import Qt
+ from PyQt5.QtWidgets import QWidget
+else :
+ from PyQt4.QtCore import *
+ from PyQt4.QtGui import *
+
+
# Modules Eficas
-from desWidgetFact import Ui_WidgetFact
from groupe import Groupe
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from desWidgetFact import Ui_WidgetFact
from Extensions.i18n import tr
# Import des panels
diff --git a/InterfaceQT4/monWidgetFactPlie.py b/InterfaceQT4/monWidgetFactPlie.py
index 5804200a..ea31461e 100644
--- a/InterfaceQT4/monWidgetFactPlie.py
+++ b/InterfaceQT4/monWidgetFactPlie.py
@@ -21,8 +21,6 @@
from desWidgetFactPlie import Ui_WidgetFactPlie
from groupe import Groupe
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
# Import des panels
diff --git a/InterfaceQT4/monWidgetHeure.py b/InterfaceQT4/monWidgetHeure.py
index b576b589..a2f1bc03 100644
--- a/InterfaceQT4/monWidgetHeure.py
+++ b/InterfaceQT4/monWidgetHeure.py
@@ -21,8 +21,6 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
from feuille import Feuille
diff --git a/InterfaceQT4/monWidgetInactif.py b/InterfaceQT4/monWidgetInactif.py
index de91d898..c3929af5 100644
--- a/InterfaceQT4/monWidgetInactif.py
+++ b/InterfaceQT4/monWidgetInactif.py
@@ -19,8 +19,13 @@
# Modules Python
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QWidget
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
from Extensions.i18n import tr
from desWidgetInactif import Ui_WidgetInactif
import Accas
@@ -47,9 +52,14 @@ class MonWidgetInactif(QWidget,Ui_WidgetInactif):
self.editor.splitter.addWidget(self.monOptionnel)
self.editor.restoreSplitterSizes()
self.afficheOptionnel()
- self.connect(self.bAvant,SIGNAL("clicked()"), self.afficheAvant)
- self.connect(self.bApres,SIGNAL("clicked()"), self.afficheApres)
- self.connect(self.bCatalogue,SIGNAL("clicked()"), self.afficheCatalogue)
+ if monEnvQT5 :
+ self.bAvant.clicked.connect(self.afficheAvant)
+ self.bApres.clicked.connect(self.afficheApres)
+ self.bCatalogue.clicked.connect(self.afficheCatalogue)
+ else :
+ self.connect(self.bAvant,SIGNAL("clicked()"), self.afficheAvant)
+ self.connect(self.bApres,SIGNAL("clicked()"), self.afficheApres)
+ self.connect(self.bCatalogue,SIGNAL("clicked()"), self.afficheCatalogue)
self.labelNomCommande.setText(tr(self.node.item.nom))
self.labelNomCommande.setEnabled(False)
diff --git a/InterfaceQT4/monWidgetInfo.py b/InterfaceQT4/monWidgetInfo.py
index 402171d5..f359d298 100644
--- a/InterfaceQT4/monWidgetInfo.py
+++ b/InterfaceQT4/monWidgetInfo.py
@@ -21,8 +21,12 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QWidget
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
from Extensions.i18n import tr
from desWidgetInformation import Ui_WidgetInformative
diff --git a/InterfaceQT4/monWidgetMatrice.py b/InterfaceQT4/monWidgetMatrice.py
index 10bda4ea..7e3cca49 100644
--- a/InterfaceQT4/monWidgetMatrice.py
+++ b/InterfaceQT4/monWidgetMatrice.py
@@ -21,14 +21,13 @@
import string,types,os,sys
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
from feuille import Feuille
from desWidgetMatrice import Ui_desWidgetMatrice
+from determine import monEnvQT5
class MonWidgetMatrice (Ui_desWidgetMatrice,Feuille):
# c est juste la taille des differents widgets de base qui change
@@ -41,7 +40,8 @@ class MonWidgetMatrice (Ui_desWidgetMatrice,Feuille):
self.nbCols=0
self.nomVariables={}
self.creeColonnes()
- self.connecterSignaux()
+ if monEnvQT5 : self.connecterSignaux()
+ else : self.connecterSignauxQT4()
if self.node.item.get_valeur()== None: self.initialSsValeur()
else :
try : self.initialValeur()
@@ -55,10 +55,14 @@ class MonWidgetMatrice (Ui_desWidgetMatrice,Feuille):
- def connecterSignaux(self) :
+ def connecterSignauxQT4(self) :
self.connect(self.TBMatrice,SIGNAL("itemChanged(QTableWidgetItem *)"),self.itemChanged)
self.connect(self.PBrefresh,SIGNAL("clicked()"), self.afficheEntete)
+ def connecterSignaux(self) :
+ self.TBMatrice.itemChanged.connect(self.itemChanged)
+ self.PBrefresh.clicked.connect( self.afficheEntete)
+
def afficheEntete(self):
self.objSimp.changeEnteteMatrice()
self.TBMatrice.clear()
diff --git a/InterfaceQT4/monWidgetOptionnel.py b/InterfaceQT4/monWidgetOptionnel.py
index f8fe210b..b63c469e 100644
--- a/InterfaceQT4/monWidgetOptionnel.py
+++ b/InterfaceQT4/monWidgetOptionnel.py
@@ -19,8 +19,13 @@
# Modules Python
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QCheckBox, QWidget
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
from Extensions.i18n import tr
from desWidgetOptionnel import Ui_WidgetOptionnel
@@ -30,7 +35,7 @@ from desWidgetOptionnel import Ui_WidgetOptionnel
class monButtonCustom(QCheckBox):
def __init__(self,texte,monOptionnel,parent=None):
- QCheckBox.__init__(self,QString(tr(texte)),parent)
+ QCheckBox.__init__(self,tr(texte),parent)
self.texte=texte
self.monOptionnel=monOptionnel
diff --git a/InterfaceQT4/monWidgetParam.py b/InterfaceQT4/monWidgetParam.py
index af61dd5c..b9c02483 100644
--- a/InterfaceQT4/monWidgetParam.py
+++ b/InterfaceQT4/monWidgetParam.py
@@ -21,8 +21,13 @@
from desWidgetParam import Ui_WidgetParam
from gereIcones import FacultatifOuOptionnel
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QWidget
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
from Extensions.i18n import tr
from Extensions.eficas_exception import EficasException
import Accas
@@ -50,13 +55,24 @@ class MonWidgetParam(QWidget,Ui_WidgetParam,FacultatifOuOptionnel):
self.setIconePoubelle()
self.remplit()
if self.editor.code in ['MAP','CARMELCND'] : self.bCatalogue.close()
+ elif monEnvQt5 : self.bCatalogue.clicked.connect(self.afficheCatalogue)
else : self.connect(self.bCatalogue,SIGNAL("clicked()"), self.afficheCatalogue)
- self.connect(self.lineEditVal,SIGNAL("returnPressed()"),self.LEValeurPressed)
- self.connect(self.lineEditNom,SIGNAL("returnPressed()"),self.LENomPressed)
- self.connect(self.bAvant,SIGNAL("clicked()"), self.afficheAvant)
- self.connect(self.bApres,SIGNAL("clicked()"), self.afficheApres)
- self.connect(self.bVerifie,SIGNAL("clicked()"), self.verifiePressed)
- self.editor.affiche_infos("")
+
+ if monEnvQt5 :
+ self.lineEditVal.returnPressed.connect.(self.LEValeurPressed)
+ self.lineEditNom.returnPressed.connect.(self.LENomPressed)
+ self.bAvant.clicked.connect.(self.afficheAvant)
+ self.bApres.clicked.connect.(self.afficheApres)
+ self.bVerifie.clicked.connect.(self.verifiePressed)
+ else :
+ self.connect(self.lineEditVal,SIGNAL("returnPressed()"),self.LEValeurPressed)
+ self.connect(self.lineEditNom,SIGNAL("returnPressed()"),self.LENomPressed)
+ self.connect(self.bAvant,SIGNAL("clicked()"), self.afficheAvant)
+ self.connect(self.bApres,SIGNAL("clicked()"), self.afficheApres)
+ self.connect(self.bVerifie,SIGNAL("clicked()"), self.verifiePressed)
+ self.editor.affiche_infos("")
+
+
if self.editor.widgetOptionnel!= None :
self.editor.widgetOptionnel.close()
self.editor.widgetOptionnel=None
diff --git a/InterfaceQT4/monWidgetPlusieursASSDIntoOrdonne.py b/InterfaceQT4/monWidgetPlusieursASSDIntoOrdonne.py
index f60a713c..6b9a6a22 100644
--- a/InterfaceQT4/monWidgetPlusieursASSDIntoOrdonne.py
+++ b/InterfaceQT4/monWidgetPlusieursASSDIntoOrdonne.py
@@ -21,16 +21,12 @@
import string,types,os,sys
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
-
from monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
from politiquesValidation import PolitiquePlusieurs
-
class MonWidgetPlusieursASSDIntoOrdonne (MonWidgetPlusieursIntoOrdonne):
def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
diff --git a/InterfaceQT4/monWidgetPlusieursBase.py b/InterfaceQT4/monWidgetPlusieursBase.py
index 55b8dcc4..cb1b427a 100644
--- a/InterfaceQT4/monWidgetPlusieursBase.py
+++ b/InterfaceQT4/monWidgetPlusieursBase.py
@@ -20,9 +20,15 @@
# Modules Python
import string,types,os,sys
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtGui import Qicon, QApplication
+ from PyQt5.QtCore import QTimer, QSize, QT
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
from feuille import Feuille
@@ -88,7 +94,7 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie)
else : aConstruire=self.monSimpDef.max
for i in range(1,aConstruire):
self.ajoutLineEdit()
- qApp.processEvents()
+ QApplication.processEvents()
self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
self.listeValeursCourantes=self.node.item.GetListeValeurs()
index=1
@@ -139,7 +145,7 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie)
def rendVisibleLigne(self):
- qApp.processEvents()
+ QApplication.processEvents()
self.estVisible.setFocus()
self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
@@ -177,7 +183,7 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie)
nomLineEdit="lineEditVal"+str(i)
courant=getattr(self,nomLineEdit)
valeur=courant.text()
- if valeur == None or valeur == QString("") :
+ if valeur == None or valeur == "" :
ajoute=True
courant.setText(str(val))
commentaire=self.ajout1Valeur(val)
diff --git a/InterfaceQT4/monWidgetPlusieursInto.py b/InterfaceQT4/monWidgetPlusieursInto.py
index 85b61bf0..efb01914 100644
--- a/InterfaceQT4/monWidgetPlusieursInto.py
+++ b/InterfaceQT4/monWidgetPlusieursInto.py
@@ -21,8 +21,14 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QCheckBox, QScrollbar, QFrame, QApplication
+ from PyQt5.QtCore import QT
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import
+
from Extensions.i18n import tr
from feuille import Feuille
@@ -118,7 +124,7 @@ class MonWidgetPlusieursInto (Ui_WidgetPlusieursInto,Feuille,GerePlie):
if hasattr(self,nomCB) : return
nouveauCB = QCheckBox(self.scrollArea)
self.CBLayout.addWidget(nouveauCB)
- qApp.processEvents()
+ QApplication.processEvents()
nouveauCB.setText("")
if index % 2 == 1 : nouveauCB.setStyleSheet("background:rgb(210,210,210)")
else : nouveauCB.setStyleSheet("background:rgb(240,240,240)")
diff --git a/InterfaceQT4/monWidgetPlusieursIntoOrdonne.py b/InterfaceQT4/monWidgetPlusieursIntoOrdonne.py
index 7bd475a6..878fa2be 100644
--- a/InterfaceQT4/monWidgetPlusieursIntoOrdonne.py
+++ b/InterfaceQT4/monWidgetPlusieursIntoOrdonne.py
@@ -21,10 +21,6 @@
import string,types,os,sys
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
-from Extensions.i18n import tr
-
from feuille import Feuille
from desWidgetPlusieursIntoOrdonne import Ui_WidgetPlusieursIntoOrdonne
from politiquesValidation import PolitiquePlusieurs
@@ -34,6 +30,13 @@ from gereListe import GerePlie
from gereListe import LECustom
from gereListe import MonLabelListeClic
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import Qicon, QScrollbar, QFrame, QApplication
+ from PyQt5.QtCore import QTimer, QSize, Qt
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import
class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,GereListe,GerePlie):
@@ -44,7 +47,7 @@ class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,Gere
self.listeLE=[]
self.ouAjouter=0
self.NumLineEditEnCours=0
- Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
+ Feuille.__init__(self,node,monSimpDef,nom,objSimp,parent,commanme)
GereListe.__init__(self)
self.finCommentaireListe()
self.gereIconePlier()
@@ -148,7 +151,7 @@ class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,Gere
self.CBLayout.insertWidget(index -1,nouveauLE)
self.listeLE.append(nouveauLE)
nouveauLE.setFrameShape(QFrame.NoFrame)
- qApp.processEvents()
+ QApplication.processEvents()
nouveauLE.setText("")
if index % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
else : nouveauLE.setStyleSheet("background:rgb(240,240,240)")
@@ -226,7 +229,7 @@ class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,Gere
self.setValide()
#
def rendVisibleLigneRE(self):
- qApp.processEvents()
+ QApplication.processEvents()
self.estVisibleRE.setFocus()
self.scrollArea.ensureWidgetVisible(self.estVisibleRE,0,0)
#
diff --git a/InterfaceQT4/monWidgetPlusieursPlie.py b/InterfaceQT4/monWidgetPlusieursPlie.py
index ed9d2a06..a12875fc 100644
--- a/InterfaceQT4/monWidgetPlusieursPlie.py
+++ b/InterfaceQT4/monWidgetPlusieursPlie.py
@@ -21,8 +21,14 @@
import string,types,os,sys
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+#if monEnvQT5:
+# from PyQt5.QtWidgets import Qicon, QScrollbar, QFrame
+# from PyQt5.QtCore import QTimer, QSize, QT
+#else :
+# from PyQt4.QtGui import *
+# from PyQt4.QtCore import
+
from Extensions.i18n import tr
from feuille import Feuille
@@ -38,7 +44,10 @@ class MonWidgetPlusieursPlie (Ui_WidgetPlusieursPlie,Feuille):
self.AAfficher=self.lineEditVal
self.maCommande.listeAffichageWidget.append(self.lineEditVal)
- self.connect(self.BVisuListe,SIGNAL("clicked()"), self.selectWidgetDeplie)
+ if monEnvQT5 :
+ self.BVisuListe.clicked(self.selectWidgetDeplie)
+ else :
+ self.connect(self.BVisuListe,SIGNAL("clicked()"), self.selectWidgetDeplie)
def setValeurs(self):
diff --git a/InterfaceQT4/monWidgetPlusieursTuple.py b/InterfaceQT4/monWidgetPlusieursTuple.py
index 30ad88e4..93a20088 100644
--- a/InterfaceQT4/monWidgetPlusieursTuple.py
+++ b/InterfaceQT4/monWidgetPlusieursTuple.py
@@ -21,8 +21,13 @@
import string,types,os,sys
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QIcon, QSize, QFrame,QApplication
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import
+
from Extensions.i18n import tr
@@ -52,7 +57,8 @@ class TupleCustom :
courant=getattr(self,nomLE)
courant.num=index
courant.dansUnTuple=True
- self.connect(courant,SIGNAL("returnPressed()"),self.valueChange)
+ if monEnvQt5 : courant.returnPressed.connect(self.valueChange)
+ else : self.connect(courant,SIGNAL("returnPressed()"),self.valueChange)
def valueChange(self):
@@ -161,7 +167,10 @@ class MonWidgetPlusieursTuple(Feuille,GereListe):
icon3 = QIcon(fichier3)
self.BSelectFichier.setIcon(icon3)
self.BSelectFichier.setIconSize(QSize(32, 32))
- self.connect(self.BSelectFichier,SIGNAL("clicked()"), self.selectInFile)
+ if monEnvQt5 :
+ self.BSelectFichier.clicked.connect(self.selectInFile)
+ else :
+ self.connect(self.BSelectFichier,SIGNAL("clicked()"), self.selectInFile)
@@ -214,7 +223,7 @@ class MonWidgetPlusieursTuple(Feuille,GereListe):
for i in range(len(valeurs),aCreer) : self.ajoutLineEdit(inInit=True)
def rendVisibleLigne(self):
- qApp.processEvents()
+ QApplication.processEvents()
self.estVisible.setFocus(True)
self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
@@ -249,7 +258,7 @@ class MonWidgetPlusieursTuple(Feuille,GereListe):
self.listeAffichageWidget[-2].setFocus(True)
else :
try :
- qApp.processEvents()
+ QApplication.processEvents()
w=self.listeAffichageWidget[self.listeAffichageWidget.index(aLeFocus)+1]
w.setFocus(True)
self.scrollArea.ensureWidgetVisible(w,0,0)
diff --git a/InterfaceQT4/monWidgetPlusieursTuple2.py b/InterfaceQT4/monWidgetPlusieursTuple2.py
index 0acaae01..a446a06f 100644
--- a/InterfaceQT4/monWidgetPlusieursTuple2.py
+++ b/InterfaceQT4/monWidgetPlusieursTuple2.py
@@ -21,9 +21,6 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
-from Extensions.i18n import tr
from feuille import Feuille
from monWidgetPlusieursTuple import MonWidgetPlusieursTuple
diff --git a/InterfaceQT4/monWidgetPlusieursTuple3.py b/InterfaceQT4/monWidgetPlusieursTuple3.py
index 83a911a4..e7239b85 100644
--- a/InterfaceQT4/monWidgetPlusieursTuple3.py
+++ b/InterfaceQT4/monWidgetPlusieursTuple3.py
@@ -21,9 +21,6 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
-from Extensions.i18n import tr
from feuille import Feuille
from monWidgetPlusieursTuple import MonWidgetPlusieursTuple
diff --git a/InterfaceQT4/monWidgetRadioButton.py b/InterfaceQT4/monWidgetRadioButton.py
index 176dbee0..a0016171 100644
--- a/InterfaceQT4/monWidgetRadioButton.py
+++ b/InterfaceQT4/monWidgetRadioButton.py
@@ -20,9 +20,16 @@
# Modules Python
import string,types,os
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtCore import Qt
+ from PyQt5.QtWidgets import QWidget
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+
from Extensions.i18n import tr
from feuille import Feuille
@@ -68,7 +75,8 @@ class MonWidgetRadioButtonCommun (Feuille):
if not(type(valeur) in types.StringTypes) : valeur=str(valeur)
bouton.setText(tr(valeur))
self.dict_bouton[valeur]=bouton
- self.connect(bouton,SIGNAL("clicked()"),self.boutonclic)
+ if monEnvQT5 : bouton.clicked.connect(self.boutonclic)
+ else : self.connect(bouton,SIGNAL("clicked()"),self.boutonclic)
bouton.keyPressEvent=self.keyPressEvent
setattr(self,nomBouton,bouton)
i=i+1
diff --git a/InterfaceQT4/monWidgetSimpTxt.py b/InterfaceQT4/monWidgetSimpTxt.py
index 40231104..41a5226e 100644
--- a/InterfaceQT4/monWidgetSimpTxt.py
+++ b/InterfaceQT4/monWidgetSimpTxt.py
@@ -21,8 +21,6 @@
import string,types,os
# Modules Eficas
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
from desWidgetSimpTxt import Ui_WidgetSimpTxt
diff --git a/InterfaceQT4/qtEficas.py b/InterfaceQT4/qtEficas.py
index 31f94df5..c5b6bc99 100755
--- a/InterfaceQT4/qtEficas.py
+++ b/InterfaceQT4/qtEficas.py
@@ -19,16 +19,21 @@
#
import os, sys
-
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
-from myMain import Ui_Eficas
-from viewManager import MyTabview
-from getVersion import getEficasVersion
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QApplication, QMainWindow, QBoxLayout, QMenu, QAction
+ from PyQt5.QtGui import QIcon
+ from PyQt5.QtCore import Qt
+else:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
from Extensions.i18n import tr
from Extensions.eficas_exception import EficasException
+from myMain import Ui_Eficas
+from viewManager import MyTabview
+from getVersion import getEficasVersion
from Editeur import session
@@ -53,7 +58,8 @@ class Appli(Ui_Eficas,QMainWindow):
self.code=code
self.indice=0
self.dict_reels={}
- self.recent = QStringList()
+ if monEnvQT5 : self.recent = []
+ else : self.recent = QStringList()
self.ficRecents={}
self.listeAEnlever=[]
self.ListeCode=['Aster','Carmel3D','Cuve2dg','Openturns_Study','Openturns_Wrapper','MAP','ZCracks', 'CarmelCND','MT']
@@ -92,13 +98,13 @@ class Appli(Ui_Eficas,QMainWindow):
eficas_root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
self.viewmanager = MyTabview(self)
- #self.recentMenu=self.menuFichier.addMenu(tr('&Recents'))
self.recentMenu=QMenu(tr('&Recents'))
#self.menuFichier.insertMenu(self.actionOuvrir,self.recentMenu)
# actionARemplacer ne sert que pour l insert Menu
self.menuFichier.insertMenu(self.actionARemplacer ,self.recentMenu)
self.menuFichier.removeAction(self.actionARemplacer)
- self.connecterSignaux()
+ if monEnvQT5 : self.connecterSignaux()
+ else : self.connecterSignauxQT4()
self.toolBar.addSeparator()
if self.code != None : self.construitMenu()
@@ -189,7 +195,8 @@ class Appli(Ui_Eficas,QMainWindow):
if not(self.actionExecution in self.toolBar.actions()):
self.toolBar.addAction(self.actionExecution)
self.actionExecution.setText(QApplication.translate("Eficas", "Execution ", None, QApplication.UnicodeUTF8))
- self.connect(self.actionExecution,SIGNAL("triggered()"),self.run)
+ if monEnvQT5 : self.actionExecution.triggered.connect(self.run)
+ else : self.connect(self.actionExecution,SIGNAL("triggered()"),self.run)
def ajoutSauveExecution(self):
self.actionSaveRun = QAction(self)
@@ -200,7 +207,8 @@ class Appli(Ui_Eficas,QMainWindow):
if not(self.actionSaveRun in self.toolBar.actions()):
self.toolBar.addAction(self.actionSaveRun)
self.actionSaveRun.setText(QApplication.translate("Eficas", "Save Run", None, QApplication.UnicodeUTF8))
- self.connect(self.actionSaveRun,SIGNAL("triggered()"),self.saveRun)
+ if monEnvQT5 : self.actionSaveRun.triggered.connect(self.saveRun)
+ else : self.connect(self.actionSaveRun,SIGNAL("triggered()"),self.saveRun)
def griserActionsStructures(self):
self.actionCouper.setEnabled(False)
@@ -297,7 +305,8 @@ class Appli(Ui_Eficas,QMainWindow):
self.actionParametres_Eficas.setText('Help PSEN')
#
#Oself.disconnect(self.actionParametres_Eficas)
- self.connect(self.actionParametres_Eficas,SIGNAL("triggered()"),self.aidePSEN)
+ if monEnvQT5 : self.actionParametres_Eficas.triggered.connect(self.aidePSEN)
+ else : self.connect(self.actionParametres_Eficas,SIGNAL("triggered()"),self.aidePSEN)
@@ -345,7 +354,8 @@ class Appli(Ui_Eficas,QMainWindow):
- def connecterSignaux(self) :
+
+ def connecterSignauxQT4(self) :
self.connect(self.recentMenu,SIGNAL('aboutToShow()'),self.handleShowRecentMenu)
self.connect(self.action_Nouveau,SIGNAL("triggered()"),self.fileNew)
@@ -374,8 +384,6 @@ class Appli(Ui_Eficas,QMainWindow):
self.connect(self.actionFichier_Resultat,SIGNAL("triggered()"),self.visuJdcPy)
- #self.connect(self.helpIndexAction,SIGNAL("triggered()"),self.helpIndex)
- #self.connect(self.helpContentsAction,SIGNAL("triggered()"),self.helpContents)
# Pour Aster
self.actionTraduitV9V10 = QAction(self)
@@ -413,6 +421,68 @@ class Appli(Ui_Eficas,QMainWindow):
self.actionCode.setText(tr("Specificites Maille"))
self.connect(self.actionCode,SIGNAL("triggered()"),self.aideCode)
+ def connecterSignaux(self) :
+ self.recentMenu.aboutToShow.connect(self.handleShowRecentMenu)
+ self.action_Nouveau.triggered.connect(self.fileNew)
+ self.actionNouvel_Include.triggered.connect(self.NewInclude)
+ self.actionOuvrir.triggered.connect(self.fileOpen)
+ self.actionEnregistrer.triggered.connect(self.fileSave)
+ self.actionEnregistrer_sous.triggered.connect(self.fileSaveAs)
+ self.actionFermer.triggered.connect(self.fileClose)
+ self.actionFermer_tout.triggered.connect(self.fileCloseAll)
+ self.actionQuitter.triggered.connect(self.fileExit)
+
+ self.actionEficas.triggered.connect(self.aidePPal)
+ self.actionVersion.triggered.connect(self.version)
+ self.actionParametres.triggered.connect(self.gestionParam)
+
+ self.actionCouper.triggered.connect(self.editCut)
+ self.actionCopier.triggered.connect(self.editCopy)
+ self.actionColler.triggered.connect(self.editPaste)
+ self.actionSupprimer.triggered.connect(self.supprimer)
+ self.actionRechercher.triggered.connect(self.rechercher)
+ self.actionDeplier_replier.triggered.connect(self.Deplier)
+
+ self.actionRapport_de_Validation.triggered.connect(self.jdcRapport)
+ self.actionRegles_du_JdC.triggered.connect(self.jdcRegles)
+ self.actionFichier_Source.triggered.connect(self.jdcFichierSource)
+ self.actionFichier_Resultat.triggered.connect(self.visuJdcPy)
+
+
+ # Pour Aster
+ self.actionTraduitV9V10 = QAction(self)
+ self.actionTraduitV9V10.setObjectName("actionTraduitV9V10")
+ self.actionTraduitV9V10.setText(tr("TraduitV9V10"))
+ self.actionTraduitV10V11 = QAction(self)
+ self.actionTraduitV10V11.setObjectName("actionTraduitV10V11")
+ self.actionTraduitV10V11.setText(tr("TraduitV10V11"))
+ self.actionTraduitV11V12 = QAction(self)
+ self.actionTraduitV11V12.setObjectName("actionTraduitV11V12")
+ self.actionTraduitV11V12.setText(tr("TraduitV11V12"))
+ self.actionSauveLigne = QAction(self)
+ self.actionSauveLigne.setText(tr("Sauve Format Ligne"))
+
+ #self.actionParametres_Eficas.triggered.connect(self.optionEditeur)
+ self.actionTraduitV9V10.triggered.connect(self.traductionV9V10)
+ self.actionTraduitV10V11.triggered.connect(self.traductionV10V11)
+ self.actionTraduitV11V12.triggered.connect(self.traductionV11V12)
+ self.actionSauveLigne.triggered.connect(self.sauveLigne)
+
+ # Pour Carmel
+ self.actionChercheGrpMaille = QAction(self)
+ self.actionChercheGrpMaille.setText(tr("Acquiert Groupe Maille"))
+
+ # Pour CarmelCND
+ self.actionChercheGrp = QAction(self)
+ self.actionChercheGrp.setText(tr("Accquisition Groupe Maille"))
+ self.actionChercheGrp.triggered.connect(self.ChercheGrp)
+
+ # Pour Aide
+ self.actionCode = QAction(self)
+ self.actionCode.setText(tr("Specificites Maille"))
+ self.actionCode.triggered.connect(self.aideCode)
+
+
def Deplier(self):
self.viewmanager.handleDeplier()
@@ -457,14 +527,13 @@ class Appli(Ui_Eficas,QMainWindow):
for fichier in self.listePatrons.liste[nomSsMenu]:
id = ssmenu.addAction(fichier)
self.ficPatrons[id]=fichier
- self.connect(id, SIGNAL('triggered()'),self.handleOpenPatrons)
+ if monEnvQT5 : self.id.triggered.connect(self.handleOpenPatrons)
+ else : self.connect(id, SIGNAL('triggered()'),self.handleOpenPatrons)
# self.Patrons.setItemParameter(id,idx)
idx=idx+1
def initRecents(self):
- self.recent = QStringList()
try :
- #if 1 :
if sys.platform[0:5]=="linux" :
rep=os.path.join(os.environ['HOME'],'.config/Eficas',self.code)
else :
@@ -479,13 +548,21 @@ class Appli(Ui_Eficas,QMainWindow):
self.recent.append(l)
index=index+1
except :
- #else :
pass
try : f.close()
except : pass
def addToRecentList(self, fn):
+ if not monEnvQT5 : addToRecentListQT4(self, fn); return
+
+ while fn in self.recent: self.recent.remove(fn)
+ self.recent.insert(0,fn)
+ if len(self.recent) > 9:
+ self.recent = self.recent[:9]
+
+
+ def addToRecentListQT4(self, fn):
"""
Public slot to add a filename to the list of recently opened files.
@@ -606,7 +683,8 @@ class Appli(Ui_Eficas,QMainWindow):
for rp in self.recent:
id = self.recentMenu.addAction(rp)
self.ficRecents[id]=rp
- self.connect(id, SIGNAL('triggered()'),self.handleOpenRecent)
+ if monEnvQT5 : self.id.triggered.connect(self.handleOpenRecent)
+ else : self.connect(id, SIGNAL('triggered()'),self.handleOpenRecent)
self.recentMenu.addSeparator()
self.recentMenu.addAction(tr('&Effacer'), self.handleClearRecent)
@@ -748,7 +826,6 @@ if __name__=='__main__':
Eficas=Appli()
Eficas.show()
- #app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
#mw.ouvreFichiers()
#mw.show()
diff --git a/InterfaceQT4/qtSaisie.py b/InterfaceQT4/qtSaisie.py
index f70fdce4..0008809f 100644
--- a/InterfaceQT4/qtSaisie.py
+++ b/InterfaceQT4/qtSaisie.py
@@ -19,11 +19,15 @@
#
# Modules Python
import string,types,os
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtCore import Qt
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
# Import des panels
@@ -40,14 +44,14 @@ class SaisieValeur:
if valeur == None :
nouvelleValeur=str(self.lineEditVal.text())
else :
- if hasattr(self,"lineEditVal"):self.lineEditVal.setText(QString(valeur.nom))
+ if hasattr(self,"lineEditVal"):self.lineEditVal.setText(tr(valeur.nom))
nouvelleValeur=valeur
nouvelleValeurFormat=self.politique.GetValeurTexte(nouvelleValeur)
validite,commentaire=self.politique.RecordValeur(nouvelleValeurFormat)
if commentaire != "" :
#PNPNPNP Il faut trouver une solution pour les 2 cas
# self.editor.affiche_infos(commentaire)
- #self.Commentaire.setText(QString(commentaire))
+ #self.Commentaire.setText(tr(commentaire))
if validite :
self.editor.affiche_commentaire(commentaire)
else :
diff --git a/InterfaceQT4/readercata.py b/InterfaceQT4/readercata.py
index 721b1d78..d9440083 100644
--- a/InterfaceQT4/readercata.py
+++ b/InterfaceQT4/readercata.py
@@ -42,9 +42,12 @@ from monChoixCata import MonChoixCata
from Extensions.i18n import tr
from Extensions.eficas_exception import EficasException
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5 :
+ from PyQt5.QtWidgets import QMessageBox
+else :
+ from PyQt4.QtGui import *
+
class READERCATA:
diff --git a/InterfaceQT4/typeNode.py b/InterfaceQT4/typeNode.py
index aab893db..bb2bbb7d 100644
--- a/InterfaceQT4/typeNode.py
+++ b/InterfaceQT4/typeNode.py
@@ -17,9 +17,13 @@
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QAction, QMenu
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
from Extensions.i18n import tr
import types
@@ -33,7 +37,10 @@ class PopUpMenuRacine :
def createPopUpMenu(self):
#print "createPopUpMenu"
self.ParamApres = QAction(tr('Parametre'),self.tree)
- self.tree.connect(self.ParamApres,SIGNAL("triggered()"),self.addParametersApres)
+ if monEnvQT5 :
+ self.ParamApres.triggered.connect(self.addParametersApres)
+ else :
+ self.tree.connect(self.ParamApres,SIGNAL("triggered()"),self.addParametersApres)
self.ParamApres.setStatusTip(tr("Insere un parametre"))
self.menu = QMenu(self.tree)
self.menu.addAction(self.ParamApres)
@@ -51,7 +58,8 @@ class PopUpMenuNodeMinimal :
def createPopUpMenu(self):
#print "createPopUpMenu"
#self.appliEficas.salome=True
- self.createActions()
+ if monEnvQT5 : self.createActions()
+ else : self.createActionsQT4()
self.menu = QMenu(self.tree)
#self.menu.setStyleSheet("background:rgb(235,235,235); QMenu::item:selected { background-color: red; }")
#ne fonctionne pas --> la ligne de commentaire devient rouge
@@ -74,20 +82,36 @@ class PopUpMenuNodeMinimal :
tip=commande[5]
self.action=QAction(label,self.tree)
self.action.setStatusTip(tip)
- if numero==4:
- self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction4)
- if numero==3:
- self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction3)
- numero=4
- if numero==2:
- self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction2)
- numero=3
- if numero==1:
- self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction1)
- numero=2
- if numero==0:
- self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction0)
- numero=1
+ if monEnvQT5 :
+ if numero==4:
+ self.action.triggered.connect(self.AppelleFonction4)
+ if numero==3:
+ self.action.triggered.connect(self.AppelleFonction3)
+ numero=4
+ if numero==2:
+ self.action.triggered.connect(self.AppelleFonction2)
+ numero=3
+ if numero==1:
+ self.action.triggered.connect(self.AppelleFonction1)
+ numero=2
+ if numero==0:
+ self.action.triggered.connect(self.AppelleFonction0)
+ numero=1
+ else:
+ if numero==4:
+ self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction4)
+ if numero==3:
+ self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction3)
+ numero=4
+ if numero==2:
+ self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction2)
+ numero=3
+ if numero==1:
+ self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction1)
+ numero=2
+ if numero==0:
+ self.tree.connect(self.action,SIGNAL("triggered()"),self.AppelleFonction0)
+ numero=1
self.menu.addAction(self.action)
@@ -114,8 +138,7 @@ class PopUpMenuNodeMinimal :
if (self.tree.currentItem().item.isvalid() == 0 and conditionValid == True):
QMessageBox.warning( None,
tr("item invalide"),
- tr("l item doit etre valide"),
- tr("&Ok"))
+ tr("l item doit etre valide"),)
return
fonction=commande[0]
listenomparam=commande[2]
@@ -130,7 +153,7 @@ class PopUpMenuNodeMinimal :
fonction(listeparam)
- def createActions(self):
+ def createActionsQT4(self):
self.CommApres = QAction(tr('apres'),self.tree)
self.tree.connect(self.CommApres,SIGNAL("triggered()"),self.addCommApres)
self.CommApres.setStatusTip(tr("Insere un commentaire apres la commande "))
@@ -150,6 +173,27 @@ class PopUpMenuNodeMinimal :
self.Supprime.setStatusTip(tr("supprime le mot clef "))
self.Documentation = QAction(tr('Documentation'),self.tree)
self.tree.connect(self.Documentation,SIGNAL("triggered()"),self.viewDoc)
+
+ def createActions(self):
+ self.CommApres = QAction(tr('apres'),self.tree)
+ self.CommApres.triggered.connect(self.addCommApres)
+ self.CommApres.setStatusTip(tr("Insere un commentaire apres la commande "))
+ self.CommAvant = QAction(tr('avant'),self.tree)
+ self.CommAvant.triggered.connect(self.addCommAvant)
+ self.CommAvant.setStatusTip(tr("Insere un commentaire avant la commande "))
+
+ self.ParamApres = QAction(tr('apres'),self.tree)
+ self.ParamApres.triggered.connect(self.addParamatersApres)
+ self.ParamApres.setStatusTip(tr("Insere un parametre apres la commande "))
+ self.ParamAvant = QAction(tr('avant'),self.tree)
+ self.ParamAvant.triggered.connect(self.addParamatersAvant)
+ self.ParamAvant.setStatusTip(tr("Insere un parametre avant la commande "))
+
+ self.Supprime = QAction(tr('Supprimer'),self.tree)
+ self.Supprime.triggered.connect(self.supprimeNoeud)
+ self.Supprime.setStatusTip(tr("supprime le mot clef "))
+ self.Documentation = QAction(tr('Documentation'),self.tree)
+ self.Documentation.triggered.connect(self.viewDoc)
self.Documentation.setStatusTip(tr("documentation sur la commande "))
def supprimeNoeud(self):
diff --git a/InterfaceQT4/viewManager.py b/InterfaceQT4/viewManager.py
index 6e5501a5..4d970ad8 100644
--- a/InterfaceQT4/viewManager.py
+++ b/InterfaceQT4/viewManager.py
@@ -19,9 +19,14 @@
#
import os, string
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
from Extensions.i18n import tr
+from determine import monEnvQT5
+if monEnvQT5:
+ from PyQt5.QtWidgets import QFileDialog
+ from PyQt5.QtCore import QFileInfo
+else :
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
DictExtensions= {"MAP" : ".map"}
class MyTabview:
@@ -37,9 +42,14 @@ class MyTabview:
self.doubles = {}
self.myQtab = self.appliEficas.myQtab
- self.myQtab.connect(self.myQtab, SIGNAL('tabCloseRequested(int)'), self.closeTab)
- if self.appliEficas.multi== True:
- self.myQtab.connect(self.myQtab,SIGNAL("currentChanged(int)"),self.indexChanged)
+
+ if monEnvQT5:
+ self.myQtab.currentChanged.connect(self.indexChanged)
+ self.myQtab.tabCloseRequested.connect(self.closeTab)
+ else :
+ self.myQtab.connect(self.myQtab, SIGNAL('tabCloseRequested(int)'), self.closeTab)
+ if self.appliEficas.multi== True:
+ self.myQtab.connect(self.myQtab,SIGNAL("currentChanged(int)"),self.indexChanged)
def indexChanged(self):
index=self.myQtab.currentIndex()
diff --git a/Telemac/qtEficas_Telemac.py b/Telemac/qtEficas_Telemac.py
index b1254f2c..f49b9bcb 100755
--- a/Telemac/qtEficas_Telemac.py
+++ b/Telemac/qtEficas_Telemac.py
@@ -27,7 +27,6 @@
import sys,os
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'..'))
-from PyQt4.QtCore import *
import prefs
from InterfaceQT4 import eficas_go
eficas_go.lance_eficas(code=prefs.code)
diff --git a/UiQT4/desWidgetOptionnelMC.ui b/UiQT4/desWidgetOptionnelMC.ui
new file mode 100644
index 00000000..950792e0
--- /dev/null
+++ b/UiQT4/desWidgetOptionnelMC.ui
@@ -0,0 +1,127 @@
+
+
+ desWidgetOptionnel
+
+
+
+ 0
+ 0
+ 384
+ 218
+
+
+
+ Form
+
+
+
+ 0
+
+ -
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 25
+
+
+
+
+ 12121213
+ 25
+
+
+
+ TextLabel
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ background : rgb(247,247,247)
+
+
+ QFrame::NoFrame
+
+
+ 0
+
+
+ true
+
+
+
+
+ 0
+ 0
+ 384
+ 185
+
+
+
+
+ 0
+ 0
+
+
+
+
-
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 75
+
+
+
+
+
+
+
+
+
+
+
+
+ MonLabelClic
+ QLabel
+
+
+
+
+
+
diff --git a/UiQT4/makefile b/UiQT4/makefile
index 9a3fb8c4..2c0ed33f 100644
--- a/UiQT4/makefile
+++ b/UiQT4/makefile
@@ -6,7 +6,7 @@ QTRELEASE = lrelease-qt4
PY_FILES = myMain.py desBaseWidget.py desChoixCata.py desChoixCode.py desChoixCommandes.py desRecherche.py \
desSelectVal.py desViewTexte.py desViewRegles.py desVisu.py desWidgetCreeParam.py desWidgetCommande.py \
- desWidgetOptionnel.py Tuple2.py Tuple3.py \
+ desWidgetOptionnel.py desWidgetOptionnelMC.py Tuple2.py Tuple3.py \
desWidgetBloc.py desWidgetCB.py desWidgetCommentaire.py desWidgetDate.py \
desWidgetFact.py desWidgetFactPlie.py desWidgetHeure.py desWidgetInformation.py \
desWidgetInactif.py \
diff --git a/UiQT5/CMakeLists.txt b/UiQT5/CMakeLists.txt
new file mode 100644
index 00000000..e5182e8f
--- /dev/null
+++ b/UiQT5/CMakeLists.txt
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002, 2013 EDF R&D WWW.CODE-ASTER.ORG
+# 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 2 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 EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
+set ( _PYFILES )
+macro ( eficas_compile_ui uifile )
+ get_filename_component ( _file_we ${uifile} NAME_WE )
+ set ( _pyfile "${_file_we}.py" )
+ add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_pyfile}
+ COMMAND ${PYUIC4} ARGS -x -o ${CMAKE_CURRENT_BINARY_DIR}/${_pyfile} ${CMAKE_CURRENT_SOURCE_DIR}/${uifile}
+ MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/${uifile}
+ COMMENT "Compiling ${uifile}"
+ )
+ list ( APPEND _PYFILES ${CMAKE_CURRENT_BINARY_DIR}/${_pyfile} )
+endmacro ( eficas_compile_ui )
+
+eficas_compile_ui ( myMain.ui )
+eficas_compile_ui ( desBaseWidget.ui )
+eficas_compile_ui ( desChoixCata.ui )
+eficas_compile_ui ( desChoixCode.ui )
+eficas_compile_ui ( desChoixCommandes.ui )
+eficas_compile_ui ( desRecherche.ui )
+eficas_compile_ui ( desSelectVal.ui )
+eficas_compile_ui ( desViewTexte.ui )
+eficas_compile_ui ( desViewRegles.ui )
+eficas_compile_ui ( desVisu.ui )
+eficas_compile_ui ( desWidgetCreeParam.ui )
+eficas_compile_ui ( desWidgetCommande.ui )
+eficas_compile_ui ( desWidgetOptionnel.ui )
+eficas_compile_ui ( Tuple2.ui )
+eficas_compile_ui ( Tuple3.ui )
+#
+eficas_compile_ui ( desWidgetBloc.ui )
+eficas_compile_ui ( desWidgetCB.ui )
+eficas_compile_ui ( desWidgetCommentaire.ui )
+eficas_compile_ui ( desWidgetDate.ui )
+eficas_compile_ui ( desWidgetFact.ui )
+eficas_compile_ui ( desWidgetFactPlie.ui )
+eficas_compile_ui ( desWidgetHeure.ui )
+eficas_compile_ui ( desWidgetInactif.ui )
+eficas_compile_ui ( desWidgetInformation.ui )
+eficas_compile_ui ( desWidgetMatrice.ui )
+eficas_compile_ui ( desWidgetParam.ui )
+eficas_compile_ui ( desWidgetPlusieursBase.ui )
+eficas_compile_ui ( desWidgetPlusieursInto.ui )
+eficas_compile_ui ( desWidgetPlusieursIntoOrdonne.ui )
+eficas_compile_ui ( desWidgetPlusieursTuple.ui )
+eficas_compile_ui ( desWidgetPlusieursPlie.ui )
+eficas_compile_ui ( desWidgetRadioButton.ui )
+eficas_compile_ui ( desWidget4a6RadioButton.ui )
+eficas_compile_ui ( desWidgetSDCOInto.ui )
+eficas_compile_ui ( desWidgetSimpBase.ui )
+eficas_compile_ui ( desWidgetSimpBool.ui )
+eficas_compile_ui ( desWidgetSimpComplexe.ui )
+eficas_compile_ui ( desWidgetSimpFichier.ui )
+eficas_compile_ui ( desWidgetSimpSalome.ui )
+eficas_compile_ui ( desWidgetSimpTxt.ui )
+eficas_compile_ui ( desWidgetTuple2.ui )
+eficas_compile_ui ( desWidgetTuple3.ui )
+eficas_compile_ui ( desWidgetUniqueSDCO.ui )
+eficas_compile_ui ( desWidgetVide.ui )
+
+add_custom_target ( CompileUI ALL DEPENDS ${_PYFILES}
+ COMMENT "Built UI files"
+ )
+
+install ( FILES ${_PYFILES}
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/UiQT4
+ )
+
+# Rules to compile TS files
+SET(TSFILES eficas_en.ts
+ eficas_fr.ts)
+
+SET(QMFILES)
+FOREACH(input ${TSFILES})
+ GET_FILENAME_COMPONENT(base ${input} NAME_WE)
+ SET(output ${CMAKE_CURRENT_BINARY_DIR}/${base}.qm)
+ SET(QMFILES ${QMFILES} ${output})
+ ADD_CUSTOM_COMMAND(OUTPUT ${output}
+ COMMAND ${QT_LRELEASE_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${input} -qm ${output}
+ MAIN_DEPENDENCY ${input})
+ENDFOREACH(input ${TSFILES})
+
+ADD_CUSTOM_TARGET(CompileTS ALL DEPENDS ${QMFILES})
+INSTALL(FILES ${QMFILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/UiQT4)
+
+### Local Variables:
+### mode: cmake
+### End:
diff --git a/UiQT5/Newdoc.tgz b/UiQT5/Newdoc.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..1ec9456b499a08a137cc03b44e14bb8d713655af
GIT binary patch
literal 6885287
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