/* main gui loop function, can be called repeatedly, until returning 0 */ int loopGui() { int c; updateGui(guiProgramData, guiContext); c = getch(); if(c=='q') { return 0; } switch(guiState) { case GUI_STATE_MAIN: switch(c) { case KEY_DOWN: menu_driver(mainMenu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(mainMenu, REQ_UP_ITEM); break; case 10: /* enter */ { switch((int)item_userptr(current_item(mainMenu))) { case MENU_ITEM_EXIT: return 0; case MENU_ITEM_OPMODE: set_menu_fore(mainMenu, A_NORMAL); guiState = GUI_STATE_OPMODE; break; case MENU_ITEM_SPECTRA: set_menu_fore(mainMenu, A_NORMAL); guiState = GUI_STATE_SPECTRA; break; case MENU_ITEM_INVARIANTS: set_menu_fore(mainMenu, A_NORMAL); guiState = GUI_STATE_INVARIANTTYPES; break; default: set_menu_fore(mainMenu, A_NORMAL); guiState = GUI_STATE_TMP; break; } } break; default: break; } break; case GUI_STATE_OPMODE: switch(c) { case KEY_DOWN: menu_driver(opmodeMenu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(opmodeMenu, REQ_UP_ITEM); break; case 10: /* enter */ { switch((int)item_userptr(current_item(opmodeMenu))) { case MENU_ITEM_TRAINING: guiProgramData->opMode = 0; /* TODO: define this */ guiDataChanged = 1; break; case MENU_ITEM_TESTING: guiProgramData->opMode = 1; /* TODO: define this */ guiDataChanged = 1; break; default: break; } set_menu_fore(mainMenu, A_STANDOUT); guiState = GUI_STATE_MAIN; } break; case KEY_BACKSPACE: set_menu_fore(mainMenu, A_STANDOUT); guiState = GUI_STATE_MAIN; break; } break; case GUI_STATE_SPECTRA: switch(c) { case KEY_DOWN: menu_driver(spectraMenu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(spectraMenu, REQ_UP_ITEM); break; case 10: /* enter */ guiSelectedSpectrum = item_index(current_item(spectraMenu)); if(guiSelectedSpectrum >= 0) { guiState = GUI_STATE_SPECTRA_OP; } break; case KEY_BACKSPACE: set_menu_fore(mainMenu, A_STANDOUT); guiState = GUI_STATE_MAIN; break; } break; case GUI_STATE_SPECTRA_OP: switch(c) { case KEY_DOWN: menu_driver(spectraOpMenu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(spectraOpMenu, REQ_UP_ITEM); break; case 10: /* enter */ switch((int)item_userptr(current_item(spectraOpMenu))) { case MENU_ITEM_DATA: guiSelectedSFLResultOffset = 0; guiState = GUI_STATE_SPECTRUM_DATA; break; case MENU_ITEM_SFL: guiState = GUI_STATE_SFL_COEFF; break; default: guiState = GUI_STATE_SPECTRA; break; } break; case KEY_BACKSPACE: guiState = GUI_STATE_SPECTRA; break; } break; case GUI_STATE_SFL_COEFF: switch(c) { case KEY_DOWN: menu_driver(sflCoeffMenu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(sflCoeffMenu, REQ_UP_ITEM); break; case 10: /* enter */ switch((int)item_userptr(current_item(sflCoeffMenu))) { case S_OCHIAI: case S_JACCARD: case S_TARANTULA: guiSelectedSFLCoeff = (int)item_userptr(current_item(sflCoeffMenu)); guiSFL = performSFL(guiProgramData, guiSelectedSpectrum, guiSelectedSFLCoeff); guiSelectedSFLResultOffset = 0; guiState = GUI_STATE_SFL_RESULT; break; default: guiState = GUI_STATE_SPECTRA_OP; break; } break; case KEY_BACKSPACE: guiState = GUI_STATE_SPECTRA_OP; break; } break; case GUI_STATE_SFL_RESULT: switch(c) { case KEY_DOWN: if(guiSelectedSFLResultOffset < (int)getSpectrum(guiProgramData, guiSelectedSpectrum)->nComponents - SFL_VISIBLE_RESULTS) { guiSelectedSFLResultOffset += 1; } break; case KEY_UP: if(guiSelectedSFLResultOffset > 0) { guiSelectedSFLResultOffset -= 1; } break; case KEY_NPAGE: guiSelectedSFLResultOffset += SFL_VISIBLE_RESULTS; if(guiSelectedSFLResultOffset > (int)getSpectrum(guiProgramData, guiSelectedSpectrum)->nComponents - SFL_VISIBLE_RESULTS) { guiSelectedSFLResultOffset = (int)getSpectrum(guiProgramData, guiSelectedSpectrum)->nComponents - SFL_VISIBLE_RESULTS; } if(guiSelectedSFLResultOffset < 0) { guiSelectedSFLResultOffset = 0; } break; case KEY_PPAGE: guiSelectedSFLResultOffset -= SFL_VISIBLE_RESULTS; if(guiSelectedSFLResultOffset < 0) { guiSelectedSFLResultOffset = 0; } break; case KEY_BACKSPACE: guiState = GUI_STATE_SFL_COEFF; break; } break; case GUI_STATE_SPECTRUM_DATA: switch(c) { case KEY_DOWN: if(guiSelectedSFLResultOffset < (int)getSpectrum(guiProgramData, guiSelectedSpectrum)->nComponents - SFL_VISIBLE_RESULTS) { guiSelectedSFLResultOffset += 1; } break; case KEY_UP: if(guiSelectedSFLResultOffset > 0) { guiSelectedSFLResultOffset -= 1; } break; case KEY_NPAGE: guiSelectedSFLResultOffset += SFL_VISIBLE_RESULTS; if(guiSelectedSFLResultOffset > (int)getSpectrum(guiProgramData, guiSelectedSpectrum)->nComponents - SFL_VISIBLE_RESULTS) { guiSelectedSFLResultOffset = (int)getSpectrum(guiProgramData, guiSelectedSpectrum)->nComponents - SFL_VISIBLE_RESULTS; } if(guiSelectedSFLResultOffset < 0) { guiSelectedSFLResultOffset = 0; } break; case KEY_PPAGE: guiSelectedSFLResultOffset -= SFL_VISIBLE_RESULTS; if(guiSelectedSFLResultOffset < 0) { guiSelectedSFLResultOffset = 0; } break; case KEY_BACKSPACE: guiState = GUI_STATE_SPECTRA_OP; break; } break; case GUI_STATE_INVARIANTTYPES: switch(c) { case KEY_DOWN: menu_driver(invariantTypesMenu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(invariantTypesMenu, REQ_UP_ITEM); break; case 10: /* enter */ guiSelectedInvariantType = item_index(current_item(invariantTypesMenu)); if(guiSelectedInvariantType >= 0) { refreshInvariantsList(); guiState = GUI_STATE_INVARIANTS; guiSelectedInvariantMode = INV_MODE_RANGE; } break; case KEY_BACKSPACE: set_menu_fore(mainMenu, A_STANDOUT); guiState = GUI_STATE_MAIN; break; } break; case GUI_STATE_INVARIANTS: switch(c) { case KEY_DOWN: menu_driver(invariantsMenuScr, REQ_DOWN_ITEM); menu_driver(invariantsMenuRng, REQ_DOWN_ITEM); menu_driver(invariantsMenuBmsk, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(invariantsMenuScr, REQ_UP_ITEM); menu_driver(invariantsMenuRng, REQ_UP_ITEM); menu_driver(invariantsMenuBmsk, REQ_UP_ITEM); break; case KEY_RIGHT: guiSelectedInvariantMode = (guiSelectedInvariantMode + 1 + 3)%3; break; case KEY_LEFT: guiSelectedInvariantMode = (guiSelectedInvariantMode - 1 + 3)%3; break; case KEY_NPAGE: { int i; for(i=0; i<10; i++) { menu_driver(invariantsMenuScr, REQ_DOWN_ITEM); menu_driver(invariantsMenuRng, REQ_DOWN_ITEM); menu_driver(invariantsMenuBmsk, REQ_DOWN_ITEM); } } break; case KEY_PPAGE: { int i; for(i=0; i<10; i++) { menu_driver(invariantsMenuScr, REQ_UP_ITEM); menu_driver(invariantsMenuRng, REQ_UP_ITEM); menu_driver(invariantsMenuBmsk, REQ_UP_ITEM); } } break; case 10: /* enter */ guiSelectedInvariant = item_index(current_item(invariantsMenuScr)); if(guiSelectedInvariant >= 0) { guiInv = getInvariantType(guiProgramData, guiSelectedInvariantType)->data[guiSelectedInvariant]; guiState = GUI_STATE_INVARIANT_EDIT; guiEditState = GUI_EDIT_STATE_NONE; guiSelectedEditState = 0; } break; case KEY_BACKSPACE: guiState = GUI_STATE_INVARIANTTYPES; break; } break; case GUI_STATE_INVARIANT_EDIT: if(guiEditState == GUI_EDIT_STATE_NONE) { switch(c) { case KEY_UP: guiSelectedEditState = (guiSelectedEditState - 1 + 4)%4; break; case KEY_DOWN: guiSelectedEditState = (guiSelectedEditState + 1 + 4)%4; break; case 10: /* enter */ guiEditState = guiSelectedEditState+1; guiSelectedInvariant = item_index(current_item(invariantsMenuScr)); break; case KEY_BACKSPACE: refreshInvariantsList(); guiState = GUI_STATE_INVARIANTS; break; } } if(guiEditState != GUI_EDIT_STATE_NONE) { if(guiEditState == GUI_EDIT_STATE_MIN) { switch(guiInv.datatype) { case DATA_TYPE_INT: editValue(textMin, &guiInv.range.i.min, DATA_TYPE_INT); break; case DATA_TYPE_UINT: case DATA_TYPE_UNSET: editValue(textMin, &guiInv.range.u.min, DATA_TYPE_UINT); break; case DATA_TYPE_DOUBLE: editValue(textMin, &guiInv.range.d.min, DATA_TYPE_DOUBLE); break; case DATA_TYPE_PTR: editValue(textMin, &guiInv.range.p.min, DATA_TYPE_PTR); break; } } else if(guiEditState == GUI_EDIT_STATE_MAX) { switch(guiInv.datatype) { case DATA_TYPE_INT: editValue(textMax, &guiInv.range.i.max, DATA_TYPE_INT); break; case DATA_TYPE_UINT: case DATA_TYPE_UNSET: editValue(textMax, &guiInv.range.u.max, DATA_TYPE_UINT); break; case DATA_TYPE_DOUBLE: editValue(textMax, &guiInv.range.d.max, DATA_TYPE_DOUBLE); break; case DATA_TYPE_PTR: editValue(textMax, &guiInv.range.p.max, DATA_TYPE_PTR); break; } } else if(guiEditState == GUI_EDIT_STATE_FIRST) { editValue(textFirst, &guiInv.bitmask.first, DATA_TYPE_PTR); } else if(guiEditState == GUI_EDIT_STATE_MASK) { editValue(textMask, &guiInv.bitmask.mask, DATA_TYPE_PTR); } guiEditState = GUI_EDIT_STATE_NONE; getInvariantType(guiProgramData, guiSelectedInvariantType)->data[guiSelectedInvariant] = guiInv; guiDataChanged = 1; } break; case GUI_STATE_TMP: default: switch(c) { case KEY_BACKSPACE: set_menu_fore(mainMenu, A_STANDOUT); guiState = GUI_STATE_MAIN; break; } break; } return 1; }
// This file is part of dit. // // dit is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // dit is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with dit. If not, see <http://www.gnu.org/licenses/>. #include "Catch/catch.hpp" #include <cstdlib> #include "integration.hpp" TEST_CASE("On failure curent value is returned.", "[integration]") { static char editor_env[] = "EDITOR=wrong-command >>"; putenv(editor_env); boost::optional<std::string> val = editValue("key", "-", "current"); REQUIRE(val); REQUIRE(*val == "current"); }