TRUE=1
FALSE=0

class ProgressCanceled (Exception):
    pass

class Progress:
    def __init__ (self):
        self.canceled = FALSE
        self.clear()

    def prepare_block (self, block_size, info=None):
        if self.canceled:
            raise ProgressCanceled
        self.block_start = self.block_start + self.block_size
        self.block_size = block_size
        if self.block_start + self.block_size > 1.0:
            self.block_size =  1.0 - self.block_start

    def clear (self):
        if self.canceled:
            raise ProgressCanceled
        self.total_progress = 0.0
        self.block_start = 0.0
        self.block_size = 0.0
        self.fraction = 0.0

    def update (self, percent):
        if self.canceled:
            raise ProgressCanceled
        if percent > 1.0:
            percent = 1.0
        if percent < 0:
            percent = 0
        self.fraction = self.block_start + percent * self.block_size

    def cancel (self):
        self.canceled = TRUE

    def destroy (self):
        pass
