RGb controller project, how to change between different lighting effects?

Hi. I have an arduino uno and a custom PCB that I designed to control a normal 4 pin 5050 RGB strip. The circuit works and the code does partially work too. The problem is that I have 3 different lighting effects I've coded, a fading one, a constant one and a rainbow effect. They all work, but I can't figure out how I can change between the modes when the code is inside a fading for loop. I've tried interrupts, but that doesn't work. Here's the code:

const int rPin = 10;
const int bPin = 11;
const int gPin = 9;
const int nappi = 8;
int luku = 0;



void setup() {
  pinMode(rPin, OUTPUT);
  pinMode(bPin, OUTPUT);
  pinMode(gPin, OUTPUT);
  pinMode(nappi, INPUT);
  Serial.begin(9600);
}


//define the different effect modes
void fade(){
  analogWrite(bPin, 0);
  analogWrite(gPin, 0);
  for(int i = 0;i<255;i++){
    analogWrite(rPin, i);
    delay(5);
  }
  for(int i=255;i>0;i--){
    analogWrite(rPin, i);
    delay(5);
  }
}
void red(){
  analogWrite(gPin, 0);
  analogWrite(bPin, 0);
  analogWrite(rPin, 255);
}
void rbow(){
  int viive = 10;
  for (int i=0; i<255;i++){
    analogWrite(rPin, i);
    Serial.println(i);
    analogWrite(rPin, i);
    analogWrite(gPin, 0);
    analogWrite(bPin, 0);
    delay(viive);
  }
  for (int i=0; i<255;i++){
    Serial.println(i);
    analogWrite(gPin, i);
    delay(viive);
  }
  for (int i=255; i>0;i--){
  analogWrite(rPin, i);
  delay(viive);
  }
  for (int i=0; i<255;i++){
    Serial.println(i);
    delay(viive);
    analogWrite(bPin, i);
  }
  for (int i=255; i>0;i--){
    Serial.println(i);
    analogWrite(gPin, i);
    delay(viive);
  }
  for (int i=0; i<255;i++){
    Serial.println(i);
    analogWrite(rPin, i);
    delay(viive);
  }
  for (int i=255; i>0;i--){
    Serial.println(i);
    analogWrite(bPin, i);
    delay(viive);
  }
  for (int i=255; i>0;i--){
    Serial.println(i);
    analogWrite(rPin, i);
    delay(viive);
  }
}



void loop() {
  int nState = digitalRead(nappi);
  //increment when button is pressed, doesn't work because the code is always in the for loop.
  if (nState == HIGH) {
    luku++;
    delay(10);
  }
  if (luku > 2) {
    luku = 0;
  }
  if (luku == 0) {
    fade();
  }
  if (luku == 1) {
    red();
  }
  if (luku == 2) {
    rbow();
  }
  //debugging stuff
  Serial.print("Nappi = "); Serial.println(nState);
  delay(100);
  Serial.print("Mode = ");Serial.println(luku);
  delay(100);
}

If you are using a button to switch patterns you could put this in all of your loops:

       if (digitalRead(ModeButtonPin) == LOW) // Button pressed
          return; // Exit the current function NOW