# -*- coding: utf-8 -*-
#  This software and supporting documentation are distributed by
#      Institut Federatif de Recherche 49
#      CEA/NeuroSpin, Batiment 145,
#      91191 Gif-sur-Yvette cedex
#      France
#
# This software is governed by the CeCILL license version 2 under
# French law and abiding by the rules of distribution of free software.
# You can  use, modify and/or redistribute the software under the
# terms of the CeCILL license version 2 as circulated by CEA, CNRS
# and INRIA at the following URL "http://www.cecill.info".
#
# As a counterpart to the access to the source code and  rights to copy,
# modify and redistribute granted by the license, users are provided only
# with a limited warranty  and the software's author,  the holder of the
# economic rights,  and the successive licensors  have only  limited
# liability.
#
# In this respect, the user's attention is drawn to the risks associated
# with loading,  using,  modifying and/or developing or reproducing the
# software by the user in light of its specific status of free software,
# that may mean  that it is complicated to manipulate,  and  that  also
# therefore means  that it is reserved for developers  and  experienced
# professionals having in-depth computer knowledge. Users are therefore
# encouraged to load and test the software's suitability as regards their
# requirements in conditions enabling the security of their systems and/or
# data to be ensured and,  more generally, to use and operate it in the
# same conditions as regards security.
#
# The fact that you are presently reading this means that you have had
# knowledge of the CeCILL license version 2 and that you accept its terms.
'''
@author: Dominique Geffroy
@organization: U{NeuroSpin<http://www.neurospin.org>} and U{IFR 49<http://www.ifr49.org>}
@license: U{CeCILL version 2<http://www.cecill.info/licences/Licence_CeCILL_V2-en.html>}
'''
from __future__ import print_function
from __future__ import absolute_import
from soma.qt_gui.qt_backend.QtGui import QWidget, QHBoxLayout, QPushButton
from soma.qt_gui.qt_backend.QtCore import QSize
from soma.qt_gui.qt_backend import Qt
from brainvisa.data.qtgui.neuroDataGUI import DataEditor
from brainvisa.data.qtgui.readdiskitemGUI import DiskItemEditor
from brainvisa.configuration import neuroConfig
import threading
import soma.subprocess
import sys
import six
#----------------------------------------------------------------------------
[docs]class LabelSelectionEditor(QWidget, DataEditor):
    noDefault = Qt.Signal(six.text_type)
    newValidValue = Qt.Signal(six.text_type, object)
    def __init__(self, parameter, parent, name):
        DataEditor.__init__(self)
        QWidget.__init__(self, parent)
        self.setObjectName(name)
        layout = QHBoxLayout()
        self.setLayout(layout)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(4)
        self.value = parameter
        self._disk = DiskItemEditor(self.value.fileDI, self, 'diskitem', 1)
        layout.addWidget(self._disk)
        self._edit = QPushButton('...', self)
        self._edit.setObjectName('edit')
        layout.addWidget(self._edit)
        self._edit.clicked.connect(self.run)
        self._labelsel = 0
        self._disk.newValidValue.connect(self.diskItemChanged)
    def setValue(self, value, default=0):
        if value is not None and value != self.value:
            self.value = value
            if not default:
                self.noDefault.emit(six.text_type(self.objectName()))
            self.newValidValue.emit(six.text_type(self.objectName()), self.value)
    def getValue(self):
        return self.value
    def run(self):
        if self._labelsel == 0:
            self._labelsel = 1
            model = self.value.value.get('model')
            nom = self.value.value.get('nomenclature')
            fsel = self.value.file
            psel = self.value.value.get('selection')
            cmd = ['AimsLabelSelector']
            if model:
                cmd += ['-m', model]
            if nom:
                cmd += ['-n', nom]
            if psel:
                cmd += ['-p', '-']
            elif fsel:
                cmd += ['-p', fsel.fullPath()]
            sys.stdout.flush()
            if neuroConfig.platform == 'windows':
                pipe = soma.subprocess.Popen(cmd, stdin=soma.subprocess.PIPE,
                                        stdout=soma.subprocess.PIPE)
            else:
                pipe = soma.subprocess.Popen(cmd, stdin=soma.subprocess.PIPE,
                                        stdout=soma.subprocess.PIPE, close_fds=True)
            self._stdout, self._stdin = pipe.stdout, pipe.stdin
            if(psel):
                # print('writing selection:', psel)
                self._stdin.write(psel)
                self._stdin.flush()
            self._thread = threading.Thread(target=self.read)
            self._thread.start()
    def read(self):
        val = self._stdout.read()
        sys.stdout.flush()
        del self._stdout
        del self._stdin
        if val:
            self.value.value['selection'] = val
            self.newValue()
        self._labelsel = 0
        del self._thread
    def newValue(self):
        self.newValidValue.emit(six.text_type(self.objectName()), self.value)
        # self.emit( PYSIGNAL('noDefault'), ( self.name(),) )
    def diskItemChanged(self, name, val):
        print('Selector: file changed:', val)
        self.value.file = val
        if val is None:
            print('temp')
        else:
            file = val.fullPath()
            print(file)
            if self.value.value.get('selection'):
                del self.value.value['selection']