void CloudsVisualSystemMemory::selfUpdate()
{
//    unSelectAll();
    
    if (bSort){
        applySort();
    }
    
    if (bBiDirectionalSort){
        applyBiDirectionalSort();
    }
    
    if (noiseLerp > 0.0){
        int index = 0;
        for(int x = 0; x < xBlocks; x++){
            for(int y = 0; y < yBlocks; y++){
                if ( index < blocks.size() ){
                    blocks[index].color = ofFloatColor( ofLerp( blocks[index].color.getBrightness(), ofNoise(x,y,ofGetElapsedTimef()*0.1), noiseLerp) );
                    blocks[index].value = blocks[index].color.getBrightness()*255;

                    index++;
                } else {
                    break;
                }
            }
        }
    }
    
    for(int i = 0; i < randomSort; i++){
        applyRandomSort();
    }
    
    for(int i = 0; i < randomMix; i++){
        applyRandomMix();
    }
    
    for(int i = 0; i < randomDown; i++){
        applyRandomDown();
    }
    
    for(int i = 0; i < randomUp; i++){
        applyRandomUp();
    }
    
    if (bDeFrag){
        applyDeFrag();
    }
	
    for (int i = 0; i < blocks.size(); i++) {
        blocks[i].update();
    }
    
    // sound
    mainGain.value(fMainGain);

}
ColumnActionsWidget::ColumnActionsWidget(DataTable *table, Information *info, int columnnum)
{
    information = info;
    calculator = new ExprCalculator(false, info->getFuncsList());
    dataTable = table;
    columnCount = columnnum;

    selectorPos.index = 2;
    selectorPos.inbetween = false;

    QColor color;
    color.setNamedColor(VALID_COLOR);
    validPalette.setColor(QPalette::Base, color);
    validPalette.setColor(QPalette::Text, Qt::black);


    color.setNamedColor(INVALID_COLOR);
    invalidPalette.setColor(QPalette::Base, color);
    invalidPalette.setColor(QPalette::Text, Qt::black);

    signalMapper = new QSignalMapper(this);
    connect(signalMapper, SIGNAL(mapped(QWidget*)), this, SLOT(showNextWidget(QWidget*)));   

    startingActions = new QWidget();
    startingActionsUi = new Ui::StartingActions;
    startingActionsUi->setupUi(startingActions);
    startingActionsUi->remove->hide();

    startingActions->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

    shownWidgets << startingActions;

    fillOptions = new QWidget();
    fillOptionsUi = new Ui::FillOptions;
    fillOptionsUi->setupUi(fillOptions);

    connect(fillOptionsUi->previous, SIGNAL(released()), this, SLOT(showPreviousWidget()));


    connect(fillOptionsUi->start, SIGNAL(returnPressed()), this, SLOT(applyFill()));
    connect(fillOptionsUi->step, SIGNAL(returnPressed()), this, SLOT(applyFill()));
    connect(fillOptionsUi->end, SIGNAL(returnPressed()), this, SLOT(applyFill()));
    connect(fillOptionsUi->expression, SIGNAL(returnPressed()), this, SLOT(applyFill()));
    connect(fillOptionsUi->apply, SIGNAL(released()), this, SLOT(applyFill()));

    fillOptions->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

    lineEditsMapper = new QSignalMapper(this);
    connect(lineEditsMapper, SIGNAL(mapped(QWidget*)), this, SLOT(resetPalette(QWidget*)));

    connect(fillOptionsUi->start, SIGNAL(textChanged(QString)), lineEditsMapper, SLOT(map()));
    lineEditsMapper->setMapping(fillOptionsUi->start, fillOptionsUi->start);

    connect(fillOptionsUi->end, SIGNAL(textChanged(QString)), lineEditsMapper, SLOT(map()));
    lineEditsMapper->setMapping(fillOptionsUi->end, fillOptionsUi->end);

    connect(fillOptionsUi->step, SIGNAL(textChanged(QString)), lineEditsMapper, SLOT(map()));
    lineEditsMapper->setMapping(fillOptionsUi->step, fillOptionsUi->step);

    connect(fillOptionsUi->expression, SIGNAL(textChanged(QString)), lineEditsMapper, SLOT(map()));
    lineEditsMapper->setMapping(fillOptionsUi->expression, fillOptionsUi->expression);

    sortOptions = new QWidget();
    sortOptionsUi = new Ui::SortOptions;
    sortOptionsUi->setupUi(sortOptions);
    connect(sortOptionsUi->previous, SIGNAL(released()), this, SLOT(showPreviousWidget()));
    connect(sortOptionsUi->apply, SIGNAL(released()), this, SLOT(applySort()));

    confirmDelete = new QWidget();
    confirmDeleteUi = new Ui::ConfirmDelete;
    confirmDeleteUi->setupUi(confirmDelete);
    confirmDeleteUi->textPromptLabel->setText(tr("Confirm column deletion?"));
    connect(confirmDeleteUi->no, SIGNAL(released()), this, SLOT(showPreviousWidget()));
    connect(confirmDeleteUi->yes, SIGNAL(released()), this, SLOT(emitRemoveColumnSignal()));

    insertColumn = new QWidget();
    QHBoxLayout *insertColumnLayout = new QHBoxLayout();
    QPushButton *insertButton = new QPushButton(tr("Insert column"));

    insertColumnLayout->addWidget(insertButton);

    connect(insertButton, SIGNAL(released()), this, SLOT(emitInsertColumnSignal()));
    insertColumn->setLayout(insertColumnLayout);


    connect(startingActionsUi->fill, SIGNAL(released()), signalMapper, SLOT(map()));
    signalMapper->setMapping(startingActionsUi->fill, fillOptions);

    connect(startingActionsUi->sort, SIGNAL(released()), signalMapper, SLOT(map()));
    signalMapper->setMapping(startingActionsUi->sort, sortOptions);

    connect(startingActionsUi->remove, SIGNAL(released()), signalMapper, SLOT(map()));
    signalMapper->setMapping(startingActionsUi->remove, confirmDelete);

    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->setMargin(3);
    mainLayout->addWidget(startingActions);
    mainLayout->addWidget(fillOptions);
    mainLayout->addWidget(sortOptions);
    mainLayout->addWidget(confirmDelete);
    mainLayout->addWidget(insertColumn);

    setLayout(mainLayout);

    fillOptions->hide();
    sortOptions->hide();
    confirmDelete->hide();
    insertColumn->hide();
}