/* * This is a gui for the cellular automaton library * * Copyright (C) 2016-2017 Antoine BARTUCCIO, Jean POREE DE RIDDER * * Licensed under the MIT License,(the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * hhttps://opensource.org/licenses/MIT * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #include #include #include #include #include #include #include #include void SetPixel(SDL_Renderer *renderer, int x, int y, bool value){ if (value){ SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); } else { SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); } SDL_RenderDrawPoint(renderer, x, y); } void DisplayMatrixSDL(SCREEN *screen, Matrix m){ int i; int j; SDL_SetRenderDrawColor(screen->renderer, 0, 0, 0, 0); SDL_RenderClear(screen->renderer); for (i=0;irenderer, i, j, GetCellValue(m, j, i)); } } SDL_RenderPresent(screen->renderer); } void WaitUntilEnter(SCREEN * screen){ int keypress = 0; while (!keypress){ while(SDL_PollEvent(&screen->event)){ switch (screen->event.type){ case SDL_QUIT: keypress = 1; break; case SDL_KEYDOWN: switch(screen->event.key.keysym.sym){ case SDLK_RETURN: keypress = 1; break; } } } } } int NewWindowFromMatrix(Matrix m){ SCREEN screen; screen.WIDTH = m.colCount; screen.HEIGHT = m.rowCount; if (SDL_Init(SDL_INIT_VIDEO) < 0){ SDL_Quit(); return 1; } SDL_CreateWindowAndRenderer(screen.WIDTH, screen.HEIGHT, SDL_WINDOW_RESIZABLE | SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_SHOWN, &(screen.window), &(screen.renderer)); if (screen.window == NULL || screen.renderer == NULL){ SDL_Quit(); return 1; } DisplayMatrixSDL(&screen, m); WaitUntilEnter(&screen); SDL_DestroyRenderer(screen.renderer); SDL_DestroyWindow(screen.window); SDL_Quit(); return 0; } bool YesOrNo(char message[]){ char response; printf("%s (Y/n)\n", message); response = getchar(); ClearBuffer(); if (response == 'n'){ return false; } else { return true; } } void ClearBuffer(){ char c; while ((c = getchar()) != '\n' && c != EOF) { } } void DisplayMatrixGUI(Matrix m, bool useSDL){ if (useSDL){ printf("Press ENTER or the red cross to exit the window and continue.\n"); NewWindowFromMatrix(m); } else { printMatrix(m); } } int SafeNumberInput(int min, int max){ char str[30]; int input; fgets(str, 29, stdin); ClearBuffer(); input = atoi(str); while (input < min || input > max){ printf("The number should be between %d and %d\n", min, max); fgets(str, 29, stdin); ClearBuffer(); input = atoi(str); } return input; }