Pushbutton and switch case
I would do it as a simple state without the blocking while
define two bools

bool buttonPress = false;
bool inMenu = false;


and add it to the loop.To differentiate between different press lengths you need to define them. There is nothing like an "automatic" short press recognition. Also use variables which are "speaking" making it easier to read code for others. 

const unsigned long buttonPressLong = 2000;  // 2 seconds
const unsigned long buttonPressShort = 250;  // 0.25 secondis feasable
const unsigned long buttonPressDebounce = 50;  
// debouncing for too short presse Thanks Edgar Bonet
unsigned long buttonPressStart = 0;


The program below does what you want (tested on my uno test lab). As Edgar Bonet commented before you should also debounce the button (look it up in WiKi) to exclude unwanted effects The times I use are practical on my hardware, so you could play around by looking at the serial monitor. 

const int btn = 2;
const int ledPin =  13;
int selector = 0;
const unsigned long buttonPressLong = 2000;  // 2 seconds
const unsigned long buttonPressShort = 250;  // 0.25 secondis feasable
const unsigned long buttonPressDebounce = 50;  // debouncing for too short presse Thanks Edgar Bonet
unsigned long buttonPressStart = 0;

bool buttonPress = false;
bool inMenu = false;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(btn, INPUT);
  }

void loop() {
  if (digitalRead(btn) == LOW &amp;&amp; !buttonPress ) {
    buttonPressStart = millis();
    buttonPress = true;
  }
  // The routine is only triggered if a previous pressing took place, otherwise it's ignored
  else if (digitalRead(btn) == HIGH &amp;&amp; buttonPress) {
    if (millis() - buttonPressStart &gt; buttonPressLong &amp;&amp; millis() - buttonPressStart &gt; buttonPressDebounce &amp;&amp; inMenu) {
      Serial.print("Long press: ");
      Serial.println(millis() - buttonPressStart);
      buttonPress = false;
      inMenu = false;
    }
    if (millis() - buttonPressStart &lt; buttonPressShort &amp;&amp; millis() - buttonPressStart &gt; buttonPressDebounce &amp;&amp; !inMenu) {
      Serial.print("First short press ");
      inMenu = true;
    }
    if (millis() - buttonPressStart &lt; buttonPressShort &amp;&amp; millis() - buttonPressStart &gt; buttonPressDebounce &amp;&amp; inMenu) {
      Serial.print("Short press: ");
      Serial.println(millis() - buttonPressStart);
      doSwitchStatement();
      selector++;
      if (selector &gt; 6) {
        selector = 0;
        delay(500);
      }
      buttonPress = false;
    }
  }
  // Here you could do other stuff as it is non blocking
}
doSwitchStatement(){...}// Stays the same as yours


Look at the code used as it is non blocking (of course there is room for improvement) but as a starter for your further experiments ...