def __init__(self, iface):
     self.iface = iface
     QDialog.__init__(self)
     # Set up the user interface from Designer.
     self.ui = Ui_SelectAttrsForStatsDialog()
     self.ui.setupUi(self)
     self.ok_button = self.ui.buttonBox.button(QDialogButtonBox.Ok)
     self.ui.calc_btn.setEnabled(False)
     self.ui.transform_btn.setEnabled(False)
     self.use_advanced = False
     self.use_transform_dialog = False
     reg = QgsMapLayerRegistry.instance()
     layer_list = [l.name() for l in reg.mapLayers().values()]
     self.ui.layer_cbx.addItems(layer_list)
     # In case one of the available layers is active, preselect it
     if iface.activeLayer():
         active_layer_name = iface.activeLayer().name()
         active_layer_index = self.ui.layer_cbx.findText(active_layer_name)
         self.ui.layer_cbx.setCurrentIndex(active_layer_index)
     else:
         self.ui.layer_cbx.setCurrentIndex(-1)
         self.ui.svi_attr_cbx.clear()
         self.ui.aggr_loss_attr_cbx.clear()
class SelectAttrsForStatsDialog(QDialog):
    """
    Modal dialog giving to the user the possibility to select
    a layer containing SVI and aggregated losses, and to pick
    the attributes containing such data in order to perform some
    common statistics on them
    """
    def __init__(self, iface):
        self.iface = iface
        QDialog.__init__(self)
        # Set up the user interface from Designer.
        self.ui = Ui_SelectAttrsForStatsDialog()
        self.ui.setupUi(self)
        self.ok_button = self.ui.buttonBox.button(QDialogButtonBox.Ok)
        self.ui.calc_btn.setEnabled(False)
        self.ui.transform_btn.setEnabled(False)
        self.use_advanced = False
        self.use_transform_dialog = False
        reg = QgsMapLayerRegistry.instance()
        layer_list = [l.name() for l in reg.mapLayers().values()]
        self.ui.layer_cbx.addItems(layer_list)
        # In case one of the available layers is active, preselect it
        if iface.activeLayer():
            active_layer_name = iface.activeLayer().name()
            active_layer_index = self.ui.layer_cbx.findText(active_layer_name)
            self.ui.layer_cbx.setCurrentIndex(active_layer_index)
        else:
            self.ui.layer_cbx.setCurrentIndex(-1)
            self.ui.svi_attr_cbx.clear()
            self.ui.aggr_loss_attr_cbx.clear()

    @pyqtSlot()
    def on_calc_btn_clicked(self):
        self.close()
        layer = QgsMapLayerRegistry.instance().mapLayers().values()[
            self.ui.layer_cbx.currentIndex()]
        self.iface.setActiveLayer(layer)
        # layer is put in editing mode. If the user clicks on ok, the field
        # calculator will update the layers attributes.
        # if the user clicks cancel, the field calculator does nothing.
        # the layer stays in editing mode with the use_advanced flag set.
        # the calling code should take care of doing layer.commitChanges()
        # if the flag is set to true.
        self.use_advanced = True
        layer.startEditing()
        self.iface.actionOpenFieldCalculator().trigger()

    @pyqtSlot()
    def on_transform_btn_clicked(self):
        self.close()
        self.use_transform_dialog = True

    @pyqtSlot(str)
    def on_layer_cbx_currentIndexChanged(self):
        a_layer_is_selected = self.ui.layer_cbx.currentIndex() != -1
        self.ui.calc_btn.setEnabled(a_layer_is_selected)
        self.ui.transform_btn.setEnabled(a_layer_is_selected)
        self.reload_attribs_cbx()

    def reload_attribs_cbx(self):
        # reset combo boxes
        self.ui.svi_attr_cbx.clear()
        self.ui.aggr_loss_attr_cbx.clear()
        # populate attribute combo boxes with the list of attributes of the
        # layer specified in the layer combo box
        layer = QgsMapLayerRegistry.instance().mapLayers().values()[
            self.ui.layer_cbx.currentIndex()]
        # populate combo boxes with field names taken by layers
        dp = layer.dataProvider()
        fields = list(dp.fields())
        no_numeric_fields = True
        for field in fields:
            # add numeric fields only
            if field.typeName() in NUMERIC_FIELD_TYPES:
                self.ui.svi_attr_cbx.addItem(field.name())
                self.ui.aggr_loss_attr_cbx.addItem(field.name())
                no_numeric_fields = False
        self.ok_button.setDisabled(no_numeric_fields)