|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | +""" |
| 3 | +Migrate QFileDialog methods from PyQt4 to PyQt5 |
| 4 | +""" |
| 5 | +# Author: Médéric Ribreux <mederic.ribreux@medspx.fr> |
| 6 | +# Adapted from fix_pyqt |
| 7 | +# and http://python3porting.com/fixers.html |
| 8 | + |
| 9 | +# Local imports |
| 10 | +from lib2to3.fixer_base import BaseFix |
| 11 | +from lib2to3.fixer_util import Name, Call |
| 12 | + |
| 13 | +class FixQfiledialog(BaseFix): |
| 14 | + |
| 15 | + PATTERN = """ |
| 16 | + power< 'QFileDialog' trailer< '.' filter=('getOpenFileNameAndFilter'|'getOpenFileNamesAndFilter'|'getSaveFileNameAndFilter') > any > |
| 17 | + | |
| 18 | + expr_stmt< filename=any '=' power< any trailer< '(' power< 'QFileDialog' trailer< '.' method=('getOpenFileName'|'getOpenFileNames'|'getSaveFileName') > any > ')' > > > |
| 19 | + | |
| 20 | + expr_stmt< filename=any '=' power< 'QFileDialog' trailer< '.' method=('getOpenFileName'|'getOpenFileNames'|'getSaveFileName') > any > > |
| 21 | + """ |
| 22 | + |
| 23 | + def transform(self, node, results): |
| 24 | + # First case: getOpen/SaveFileName |
| 25 | + # We need to add __ variable because in PyQt5 |
| 26 | + # getOpen/SaveFileName returns a tuple |
| 27 | + if 'filename' in results: |
| 28 | + node = results['filename'] |
| 29 | + |
| 30 | + # count number of leaves (result variables) |
| 31 | + nbLeaves = sum(1 for i in node.leaves()) |
| 32 | + |
| 33 | + # If we have less than two args, |
| 34 | + # we add __ special variable |
| 35 | + if nbLeaves < 3: |
| 36 | + fileName = node.value |
| 37 | + node.value = u'{}, __'.format(fileName) |
| 38 | + node.changed() |
| 39 | + |
| 40 | + # Rename *AndFilter methods |
| 41 | + if 'filter' in results: |
| 42 | + method = results['filter'][0] |
| 43 | + method.value = method.value.replace(u'AndFilter', u'') |
| 44 | + method.changed() |
| 45 | + |
| 46 | + |
0 commit comments