Ive worked up a neat solution, pretty much adding/subtracting a 1/10/100/1000 depending on what "digit" ive selected.
This works just great, lowering 2000 by a 1 gives a 1999, lowering 999 with 1000 returns 0 since i compare the value being modified with the value i want to subtract and return 0 if subtracted value is greater.
I now have a new dilemma tho..
Most of my data variables are uint16_t, one is uint32_t and a few are uint8_t.
But if i were to try to store a larger value than the variable can hold, the result would be troublesome..
So is there a way to check the type of variable in the program?
That is, to be able to return a error if im trying to store a value of 500 into a byte?
Or will i have to hard-code a limit to each variable?
And finally, in case somebody else is interested in this; here´s part of the code im using. 
// SOME of the global variables:
bool selected = false;
bool selectedVal = false;
bool selectedValPart = false;
uint8_t numSelections = 5;
uint8_t currentSel = 0;
uint32_t currentVal = 0;
uint8_t currentValPart = 0;
uint16_t valMod[4] = {
1,10,100,1000
};
void loop() {
NOW = millis();
if (checkElapsed(lastBtnCheck,btnCheckInterval)) {
readInputs();
}
uint8_t thisBtnState = 0;
thisBtnState = getBtnState(0);
if (thisBtnState >= 2) { // "enter"-button clicked
if (!selected) {
if (currentSel) {
currentVal = getConfig(currentSel);
selected = true;
}
}
else {
if (currentVal) {
putConfig(currentSel,currentVal);
selected = false;
}
}
}
thisBtnState = getBtnState(1);
if (thisBtnState == 2) { // "+"-button, shortclicked (increase value)
writeSerial("btn 1 shortclick","");
if (!selected) {
currentSel++;
if (currentSel > numSelections) {
currentSel = 0;
}
}
else {
currentVal = currentVal + valMod[currentValPart];
}
}
if (thisBtnState == 3) { // "+"-button, longclicked (increase valPart)
writeSerial("btn 1 longclick","");
currentValPart++;
if (currentValPart >= 4) {
currentValPart = 0;
}
}
thisBtnState = getBtnState(2);
if (thisBtnState == 2) { // "-"-button, shortclicked (increase value)
writeSerial("btn 2 shortclick","");
if (!selected) {
if (!currentSel) {
currentSel = numSelections;
}
else {
currentSel--;
}
}
else {
if (currentVal <= valMod[currentValPart]) {
currentVal = 0;
}
else {
currentVal = currentVal - valMod[currentValPart];
}
}
}
if (thisBtnState == 3) { // "-"-button, longclicked (decrease valPart)
writeSerial("btn 2 longclick","");
if (!currentValPart) {
currentValPart = 3;
}
else {
currentValPart--;
}
}
// display portion
if(checkElapsed(lastDisplayUpdate,displayUpdateFreq)) {
lastDisplayUpdate = NOW;
lcd.clear();
// printLCD(12,0,currentSel);
// printLCD(14,0,currentValPart);
switch(currentSel) {
case 1: {
printLCD(0,0,"BatteryLimit");
} break;
case 2: {
printLCD(0,0,"BatteryWarn");
} break;
case 3: {
printLCD(0,0,"blinkInterval");
} break;
case 4: {
printLCD(0,0,"SysTimeout");
} break;
case 5: {
printLCD(0,0,"wheelCirq");
} break;
case 0:
default: {
printLCD(0,0,"none");
}
}
if (selected) {
printLCD(7,1,"val: ");
uint8_t base_offset = 11;
uint8_t offset = 0;
if (currentVal > 999) {
offset = base_offset + 1;
}
else if (currentVal > 99) {
offset = base_offset + 2;
}
else if (currentVal > 9) {
offset = base_offset + 3;
}
else {
offset = base_offset + 4;
}
printLCD(offset,1,currentVal);
offset = ((base_offset + 4) - currentValPart);
printLCD(offset,0,"V");
}
}
Im using a function to read all buttons at once, then populate a struct with each button state.
I then use a separate function to poll the button struct to get the clicktype of a specific button.
getBtnState(2) polls button 2 and returns 0 if not clicked, 1 if pressed, 2 if shortclicked and 3 if longclicked.
short/long-clicked gets reset to 0 in the getBtnState function.