class StatisticsSelectionWidget(GroupBoxWidget):
    #this value is set up in __createModel__ method
    VALUE_COLUMN = 0
    """
    widget which gives ability to select statistics
    """
    @temporarySettingsDecorator()
    def __init__(self, parent, **params):
        get_or_put(params, 'layout', QVBoxLayout())
        get_or_put(params, 'i18n_def', 'Statistics')
        super(StatisticsSelectionWidget, self).__init__(parent, **params)

        self.params = Params(**params)
        if self.params.statistics_base_classes == None:
            self.params.statistics_base_classes = [Asymmetry]

        if self.params.data_accessor:
            self.params.data_accessor.addListener(
                self, __StatisticsSelectionVectorListener__(self))

        self.__createButtons__()
        self.__createTable__()
        self.__createModel__()
        self.__fillStatistics__(self.params.statistics_base_classes)

    def __createTable__(self):
        self.__table__ = TableViewWidget(
            self,
            change_check_count_handler=self.params.
            change_selection_count_handler,  # @IgnorePep8
            check_handler=self.__check_handler__)
        self.__table__.setSelectionMode(QAbstractItemView.MultiSelection)
        self.__table__.setSelectionBehavior(QAbstractItemView.SelectRows)

    def __createModel__(self):
        model = __StatisticsSelectionModel__(self)
        labels = QStringList(["Statistic", "Description", "Value"])
        StatisticsSelectionWidget.VALUE_COLUMN = labels.indexOf("Value")
        model.setNumValueColumn(StatisticsSelectionWidget.VALUE_COLUMN)
        model.setHorizontalHeaderLabels(labels)
        self.__table__.setModel(model)
        self.__table__.setColumnHidden(StatisticsSelectionWidget.VALUE_COLUMN,
                                       True)

    def __createButtons__(self):
        buttons_composite = CompositeWidget(self, layout=QHBoxLayout())
        PushButtonWidget(buttons_composite,
                         i18n_def="Select all",
                         clicked_handler=self.__select_all_handler__)

        PushButtonWidget(buttons_composite,
                         i18n_def="Unselect all",
                         clicked_handler=self.__unselect_all_handler__)

    def __select_all_handler__(self):
        self.__table__.changeCheckStatForAll(True)

    def __unselect_all_handler__(self):
        self.__table__.changeCheckStatForAll(False)

    def __fillStatistics__(self, _statistics_base_classes):
        model = self.__table__.model()
        model.removeRows(0, model.rowCount())

        self.__statistics_classes__ = []

        for base_class in _statistics_base_classes:
            for subclass in get_subclasses(base_class):
                self.__statistics_classes__.append(subclass)

        #sort alphabetically
        cmp_stat = lambda x, y: cmp(x.__name__, y.__name__)
        self.__statistics_classes__ = sorted(self.__statistics_classes__,
                                             cmp_stat)

        for statistic_class in self.__statistics_classes__:
            check_column = QStandardItem('%s' % statistic_class.__name__)
            check_column.setCheckState(Qt.Unchecked)
            check_column.setCheckable(True)

            description_column = QStandardItem(
                str(statistic_class().description))  # @IgnorePep8

            value_column = QStandardItem('')

            model.appendRow([check_column, description_column, value_column])

    @property
    def statistics_classes(self):
        return self.__statistics_classes__

    def getSelectedStatisticsClasses(self):
        selected_classes = []
        model = self.__table__.model()
        for idx in range(model.rowCount()):
            item = model.item(idx)
            if item.isCheckable() and item.checkState() == Qt.Checked:
                selected_classes.append(self.__statistics_classes__[idx])
        return selected_classes

    def setStatisticsValues(self, values_map):
        """
        method to set up statistics values
        """
        if values_map == None:
            return
        #show value column
        self.__table__.setColumnHidden(StatisticsSelectionWidget.VALUE_COLUMN,
                                       False)
        for statistic_class in values_map:
            row = self.__statistics_classes__.index(statistic_class)
            self.__table__.model().setItem(
                row, StatisticsSelectionWidget.VALUE_COLUMN,
                QStandardItem(str(values_map[statistic_class])))

    def __check_handler__(self, item):
        """
        handler invoked when a user check selected row in statistics
        table view, the parameter is an model's item
        """
        if self.params.check_handler:
            if item.isCheckable():
                statistic_class = self.__statistics_classes__[item.row()]
                #parameters of outer handler check_handler are
                #statistics object and whether is checked or unchecked
                self.params.check_handler(statistic_class(),
                                          item.checkState() == Qt.Checked)

    def checkStatistic(self, _statistic):
        """
        method checks statistic identified by a parameter - statistic class
        """
        row = self.__statistics_classes__.index(_statistic)
        if row >= 0:
            item = self.__table__.model().item(row)
            if item.isCheckable():
                item.setCheckState(Qt.Checked)

    def __getSelectedStatisticsClassesNames__(self):
        return [
            statistic_class.__name__
            for statistic_class in self.getSelectedStatisticsClasses()
        ]

    @temporarySetterDecorator(
        name='selected_statistics',
        _conv=QVariant.toPyObject,
        _getter_handler=__getSelectedStatisticsClassesNames__)
    def __setSelectedStatistics__(self, _statistics_class_names):
        if not _statistics_class_names == None:
            model = self.__table__.model()
            for idx in range(model.rowCount()):
                item = model.item(idx)
                if item.isCheckable() and item.checkState() == Qt.Unchecked \
                    and self.__statistics_classes__[idx].__name__ in _statistics_class_names: # @IgnorePep8
                    item.setCheckState(Qt.Checked)
class StatisticsSelectionWidget(GroupBoxWidget):
    #this value is set up in __createModel__ method
    VALUE_COLUMN = 0

    """
    widget which gives ability to select statistics
    """
    @temporarySettingsDecorator()
    def __init__(self, parent, **params):
        get_or_put(params, 'layout', QVBoxLayout())
        get_or_put(params, 'i18n_def', 'Statistics')
        super(StatisticsSelectionWidget, self).__init__(parent, **params)

        self.params = Params(**params)
        if self.params.statistics_base_classes == None:
            self.params.statistics_base_classes = [Asymmetry]

        if self.params.data_accessor:
            self.params.data_accessor.addListener(self,
                                __StatisticsSelectionVectorListener__(self))

        self.__createButtons__()
        self.__createTable__()
        self.__createModel__()
        self.__fillStatistics__(self.params.statistics_base_classes)

    def __createTable__(self):
        self.__table__ = TableViewWidget(self,
            change_check_count_handler=self.params.change_selection_count_handler,  # @IgnorePep8
            check_handler=self.__check_handler__)
        self.__table__.setSelectionMode(QAbstractItemView.MultiSelection)
        self.__table__.setSelectionBehavior(QAbstractItemView.SelectRows)

    def __createModel__(self):
        model = __StatisticsSelectionModel__(self)
        labels = QStringList(["Statistic", "Description", "Value"])
        StatisticsSelectionWidget.VALUE_COLUMN = labels.indexOf("Value")
        model.setNumValueColumn(StatisticsSelectionWidget.VALUE_COLUMN)
        model.setHorizontalHeaderLabels(labels)
        self.__table__.setModel(model)
        self.__table__.setColumnHidden(StatisticsSelectionWidget.VALUE_COLUMN,
                                       True)

    def __createButtons__(self):
        buttons_composite = CompositeWidget(self, layout=QHBoxLayout())
        PushButtonWidget(buttons_composite, i18n_def="Select all",
                    clicked_handler=self.__select_all_handler__)

        PushButtonWidget(buttons_composite, i18n_def="Unselect all",
                    clicked_handler=self.__unselect_all_handler__)

    def __select_all_handler__(self):
        self.__table__.changeCheckStatForAll(True)

    def __unselect_all_handler__(self):
        self.__table__.changeCheckStatForAll(False)

    def __fillStatistics__(self, _statistics_base_classes):
        model = self.__table__.model()
        model.removeRows(0, model.rowCount())

        self.__statistics_classes__ = []

        for base_class in _statistics_base_classes:
            for subclass in get_subclasses(base_class):
                self.__statistics_classes__.append(subclass)

        #sort alphabetically
        cmp_stat = lambda x, y: cmp(x.__name__, y.__name__)
        self.__statistics_classes__ = sorted(self.__statistics_classes__,
                                             cmp_stat)

        for statistic_class in self.__statistics_classes__:
            check_column = QStandardItem('%s' % statistic_class.__name__)
            check_column.setCheckState(Qt.Unchecked)
            check_column.setCheckable(True)

            description_column = QStandardItem(str(statistic_class().description)) # @IgnorePep8

            value_column = QStandardItem('')

            model.appendRow([check_column, description_column, value_column])

    @property
    def statistics_classes(self):
        return self.__statistics_classes__

    def getSelectedStatisticsClasses(self):
        selected_classes = []
        model = self.__table__.model()
        for idx in range(model.rowCount()):
            item = model.item(idx)
            if item.isCheckable() and item.checkState() == Qt.Checked:
                selected_classes.append(self.__statistics_classes__[idx])
        return selected_classes

    def setStatisticsValues(self, values_map):
        """
        method to set up statistics values
        """
        if values_map == None:
            return
        #show value column
        self.__table__.setColumnHidden(StatisticsSelectionWidget.VALUE_COLUMN,
                                       False)
        for statistic_class in values_map:
            row = self.__statistics_classes__.index(statistic_class)
            self.__table__.model().setItem(row,
                            StatisticsSelectionWidget.VALUE_COLUMN,
                            QStandardItem(str(values_map[statistic_class])))

    def __check_handler__(self, item):
        """
        handler invoked when a user check selected row in statistics
        table view, the parameter is an model's item
        """
        if self.params.check_handler:
            if item.isCheckable():
                statistic_class = self.__statistics_classes__[item.row()]
                #parameters of outer handler check_handler are
                #statistics object and whether is checked or unchecked
                self.params.check_handler(statistic_class(),
                                          item.checkState() == Qt.Checked)

    def checkStatistic(self, _statistic):
        """
        method checks statistic identified by a parameter - statistic class
        """
        row = self.__statistics_classes__.index(_statistic)
        if row >= 0:
            item = self.__table__.model().item(row)
            if item.isCheckable():
                item.setCheckState(Qt.Checked)

    def __getSelectedStatisticsClassesNames__(self):
        return [statistic_class.__name__
                for statistic_class in self.getSelectedStatisticsClasses()]

    @temporarySetterDecorator(name='selected_statistics',
                    _conv=QVariant.toPyObject,
                    _getter_handler=__getSelectedStatisticsClassesNames__)
    def __setSelectedStatistics__(self, _statistics_class_names):
        if not _statistics_class_names == None:
            model = self.__table__.model()
            for idx in range(model.rowCount()):
                item = model.item(idx)
                if item.isCheckable() and item.checkState() == Qt.Unchecked \
                    and self.__statistics_classes__[idx].__name__ in _statistics_class_names: # @IgnorePep8
                    item.setCheckState(Qt.Checked)
Beispiel #3
0
class FilesTrackerWidget(CompositeWidget):
    """
    widget which tracks created files
    """
    def __init__(self, parent, **params):
        get_or_put(params, 'layout', QVBoxLayout())
        get_or_put(params, 'i18n_def', 'Files')
        super(FilesTrackerWidget, self).__init__(parent, **params)

        self.params = Params(**params)

        self.__create_oper_buttons__()
        self.__createTable__()
        self.__createModel__()
        self.__create_misc_buttons__()

    def __createTable__(self):
        self.__table__ = TableViewWidget(self,
                change_check_count_handler=self.__change_check_count_handler__,
                rows_inserted_handler=self.__rows_inserted_handler__)
        self.__table__.setSelectionMode(QAbstractItemView.MultiSelection)
        self.__table__.setSelectionBehavior(QAbstractItemView.SelectRows)

    def __createModel__(self):
        self.__table__.setModel(__FilesTrackerModel__(self))

    def __create_oper_buttons__(self):
        buttons_composite = CompositeWidget(self, layout=QHBoxLayout())
        self.__select_all__ = PushButtonWidget(buttons_composite,
                    i18n_def="Select all",
                    clicked_handler=self.__select_all_handler__,
                    enabled=False)

        self.__unselect_all__ = PushButtonWidget(buttons_composite,
                    i18n_def="Unselect all",
                    clicked_handler=self.__unselect_all_handler__,
                    enabled=False)

        self.__clear__ = PushButtonWidget(buttons_composite, i18n_def="Clear",
                    clicked_handler=self.__clear_handler__,
                    enabled=False)

    def __select_all_handler__(self):
        self.__table__.changeCheckStatForAll(True)

    def __unselect_all_handler__(self):
        self.__table__.changeCheckStatForAll(False)

    def __clear_handler__(self):
        self.__table__.clearRows()
        self.__select_all__.setEnabled(False)
        self.__unselect_all__.setEnabled(False)
        self.__clear__.setEnabled(False)
        self.__plain_view__.setEnabled(False)

    def appendFile(self, _filename):
        self.__table__.model().appendFile(_filename)

    def __create_misc_buttons__(self):
        buttons_composite = CompositeWidget(self, layout=QHBoxLayout())
        self.__plain_view__ = PushButtonWidget(buttons_composite,
                    i18n_def="Plain view",
                    clicked_handler=self.__plain_view_handler__,
                    enabled=False)

    def __plain_view_handler__(self):
        filesnames = self.__table__.model().getSelectedFiles()
        dialog = FilesPreviewDialog(normalize_filenames(filesnames), self)
        dialog.exec_()

    def __change_check_count_handler__(self, count):
        self.__plain_view__.setEnabled(count > 0)

    def __rows_inserted_handler__(self, model_index, start_row, end_row):
        self.__select_all__.setEnabled(True)
        self.__unselect_all__.setEnabled(True)
        self.__clear__.setEnabled(True)