cadquery-freecad-module/CadQuery/Libs/pyqode/core/dialogs/encodings.py
2015-10-26 16:25:38 -04:00

181 lines
7.2 KiB
Python

"""
This module contains some dialogs to help you manage encodings in
you application.
"""
import locale
from pyqode.core import icons
from pyqode.core.api import encodings
from pyqode.qt import QtCore, QtWidgets
from pyqode.core.cache import Cache
from pyqode.core._forms import dlg_preferred_encodings_editor_ui
class DlgPreferredEncodingsEditor(QtWidgets.QDialog):
"""
This dialog is used to edit the preferred encodings that appears in
the encodings menu/combo box.
"""
def __init__(self, parent=None):
super(DlgPreferredEncodingsEditor, self).__init__(parent)
self.ui = dlg_preferred_encodings_editor_ui.Ui_Dialog()
self.ui.setupUi(self)
self._load_preferred()
self.ui.pushButtonAdd.clicked.connect(self._add)
self.ui.pushButtonAdd.setIcon(icons.icon(
'go-next', ':/pyqode-icons/rc/go-next.png', 'fa.arrow-right'))
self.ui.pushButtonRemove.setIcon(icons.icon(
'go-previous', ':/pyqode-icons/rc/go-previous.png',
'fa.arrow-left'))
self.ui.pushButtonRemove.clicked.connect(self._remove)
def _load_available(self):
self.ui.tableWidgetAvailable.setColumnCount(2)
self.ui.tableWidgetAvailable.setSelectionMode(
self.ui.tableWidgetAvailable.SingleSelection)
self.ui.tableWidgetAvailable.setSelectionBehavior(
self.ui.tableWidgetAvailable.SelectRows)
self.ui.tableWidgetAvailable.setHorizontalHeaderLabels([
'Encoding', 'Language'])
self.ui.tableWidgetAvailable.verticalHeader().hide()
self.ui.tableWidgetAvailable.setSortingEnabled(True)
preferred = Cache().preferred_encodings
for key in sorted(encodings.ENCODINGS_MAP.keys()):
value = encodings.ENCODINGS_MAP[key]
if key not in preferred:
# lang_item.setData(QtCore.Qt.UserRole, key)
row = self.ui.tableWidgetAvailable.rowCount()
self.ui.tableWidgetAvailable.insertRow(row)
for column in range(2):
item = QtWidgets.QTableWidgetItem(value[column].strip())
item.setData(QtCore.Qt.UserRole, key)
# item.setData(QtCore.Qt.UserRole, key)
self.ui.tableWidgetAvailable.setItem(row, column, item)
self.ui.tableWidgetAvailable.sortByColumn(0, QtCore.Qt.AscendingOrder)
def _load_preferred(self):
self._load_available() # setup preferred encodings
self.ui.tableWidgetPreferred.setColumnCount(2)
self.ui.tableWidgetPreferred.setSelectionMode(
self.ui.tableWidgetPreferred.SingleSelection)
self.ui.tableWidgetPreferred.setSelectionBehavior(
self.ui.tableWidgetPreferred.SelectRows)
self.ui.tableWidgetPreferred.setHorizontalHeaderLabels([
'Encoding', 'Language'])
self.ui.tableWidgetPreferred.verticalHeader().hide()
self.ui.tableWidgetPreferred.setSortingEnabled(True)
for i, encoding in enumerate(Cache().preferred_encodings):
encoding = encodings.convert_to_codec_key(encoding)
value = encodings.ENCODINGS_MAP[encoding]
row = self.ui.tableWidgetPreferred.rowCount()
self.ui.tableWidgetPreferred.insertRow(row)
for column in range(2):
item = QtWidgets.QTableWidgetItem(value[column].strip())
item.setData(QtCore.Qt.UserRole, encoding)
self.ui.tableWidgetPreferred.setItem(row, column, item)
self.ui.tableWidgetPreferred.sortByColumn(0, QtCore.Qt.AscendingOrder)
def _transfer_selected_items(self, source, destination):
# keeping sorting enabled cause bug for the second transferred item
destination.setSortingEnabled(False)
row = source.currentRow()
if row != -1:
# take items from source
items = []
encoding = source.item(row, 0).data(QtCore.Qt.UserRole)
is_locale = encoding == encodings.convert_to_codec_key(
locale.getpreferredencoding())
if source == self.ui.tableWidgetPreferred and is_locale:
destination.setSortingEnabled(True)
return
for i in range(2):
items.append(source.takeItem(row, i))
source.removeRow(row)
# insert a new row in the taken items into destination
row = destination.rowCount()
destination.insertRow(row)
for col, item in enumerate(items):
item = QtWidgets.QTableWidgetItem(item)
destination.setItem(row, col, item)
destination.setSortingEnabled(True)
def _add(self):
self._transfer_selected_items(self.ui.tableWidgetAvailable,
self.ui.tableWidgetPreferred)
def _remove(self):
self._transfer_selected_items(self.ui.tableWidgetPreferred,
self.ui.tableWidgetAvailable)
def get_preferred_encodings(self):
"""
Gets the list of preferred encodings.
:return: list
"""
encodings = []
for row in range(self.ui.tableWidgetPreferred.rowCount()):
item = self.ui.tableWidgetPreferred.item(row, 0)
encodings.append(item.data(QtCore.Qt.UserRole))
return encodings
@classmethod
def edit_encoding(cls, parent):
"""
Static helper method that shows the encoding editor dialog
If the dialog was accepted the new encodings are added to the settings.
:param parent: parent widget
:return: True in case of succes, False otherwise
"""
dlg = cls(parent)
if dlg.exec_() == dlg.Accepted:
settings = Cache()
settings.preferred_encodings = dlg.get_preferred_encodings()
return True
return False
class DlgEncodingsChoice(QtWidgets.QDialog):
"""
This dialogs ask the user to choose an encoding from a combo box.
You can use it if you're not using the encoding panel when there is a
decoding error when opening a file.
"""
def __init__(self, parent, path, encoding):
super(DlgEncodingsChoice, self).__init__(parent)
self.setWindowTitle('Choose encoding')
# avoid circular references with CodeEdit
from pyqode.core._forms import dlg_encodings_ui
self.ui = dlg_encodings_ui.Ui_Dialog()
self.ui.setupUi(self)
self.ui.comboBoxEncodings.current_encoding = encoding
self.ui.lblDescription.setText(
self.ui.lblDescription.text() %
('There was a problem opening the file %r with encoding: %s' %
(path, encoding)))
@classmethod
def choose_encoding(cls, parent, path, encoding):
"""
Show the encodings dialog and returns the user choice.
:param parent: parent widget.
:param path: file path
:param encoding: current file encoding
:return: selected encoding
"""
dlg = cls(parent, path, encoding)
dlg.exec_()
return dlg.ui.comboBoxEncodings.current_encoding
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
new_encoding = DlgEncodingsChoice.choose_encoding(None, __file__, 'utf-8')
print(new_encoding)