mirror of
				https://gitlab.com/klmp200/LO27.git
				synced 2025-10-30 01:33:53 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			141 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| * @Author: klmp200
 | |
| * @Date:   2016-12-27 19:59:21
 | |
| * @Last Modified by:   klmp200
 | |
| * @Last Modified time: 2016-12-29 02:51:25
 | |
| */
 | |
| 
 | |
| #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 {
 | |
| 		BasicPrintMatrix(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;
 | |
| }
 |