SedimentLayerList.py 2.40 KiB
# -*- coding: utf-8 -*-

from tools import trace, timer

from Model.DB import SQLSubModel
from Model.Except import NotImplementedMethodeError
from Model.SedimentLayer.SedimentLayer import SedimentLayer

class SedimentLayerList(SQLSubModel):
    _sub_classes = [SedimentLayer]

    def __init__(self, status = None):
        super(SedimentLayerList, self).__init__()

        self._status = status
        self._sl = []

    def __len__(self):
        return len(self._sl)

    @classmethod
    def _sql_create(cls, execute):
        return cls._create_submodel(execute)

    @classmethod
    def _sql_update(cls, execute, version):
        return cls._update_submodel(execute, version)

    @classmethod
    def _sql_load(cls, execute, data = None):
        new = cls(status = data["status"])

        new._sl = SedimentLayer._sql_load(execute, data)

        return new

    def _sql_save(self, execute, data = None):
        ok = True

        # Delete previous data
        execute("DELETE FROM sedimentary_layer")
        execute("DELETE FROM sedimentary_layer_layer")

        for sl in self._sl:
            ok &= sl._sql_save(execute, data)

        return ok

    @property
    def sediment_layers(self):
        return self._sl.copy()

    def get(self, index):
        return self._sl[index]

    def set(self, index, new):
        self._sl[index] = new
        self._status.modified()

    def insert(self, index, new):
        self._sl.insert(index, new)
        self._status.modified()

    def new(self, index):
        n = SedimentLayer(status = self._status)
        self.insert(index, n)
        self._status.modified()
        return n

    def delete(self, els):
        for el in els:
            self._sl.remove(el)
        self._status.modified()

    def delete_i(self, indexes):
        els = list(
            map(
                lambda x: x[1],
                filter(
                    lambda x: x[0] in indexes,
                    enumerate(self._sl)
                )
            )
        )
        self.delete(els)

    def move_up(self, index):
        if index < len(self._sl):
            next = index - 1

            l = self._sl
            l[index], l[next] = l[next], l[index]
            self._status.modified()

    def move_down(self, index):
        if index >= 0:
            prev = index + 1

            l = self._sl
            l[index], l[prev] = l[prev], l[index]
            self._status.modified()