LO27/LibGui/gui.c

154 lines
3.2 KiB
C

/*
* 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 <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <gui.h>
#include <matrix.h>
#include <CellElement.h>
#include <termios.h>
#include <unistd.h>
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;i<m.rowCount;i++){
for (j=0;j<m.colCount;j++){
SetPixel(screen->renderer, 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;
}