main.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include <SDL.h>
  2. #include <SDL_mouse.h>
  3. #include <SDL_keyboard.h>
  4. #ifndef MIN
  5. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  6. #endif
  7. #ifndef MAX
  8. #define MAX(a,b) ((a) < (b) ? (b) : (a))
  9. #endif
  10. #define NK_INCLUDE_FIXED_TYPES
  11. #define NK_INCLUDE_STANDARD_IO
  12. #define NK_INCLUDE_STANDARD_VARARGS
  13. #define NK_INCLUDE_DEFAULT_ALLOCATOR
  14. #define NK_IMPLEMENTATION
  15. #define NK_INCLUDE_FONT_BAKING
  16. #define NK_INCLUDE_DEFAULT_FONT
  17. #define NK_INCLUDE_SOFTWARE_FONT
  18. #include "../../nuklear.h"
  19. #define NK_SDLSURFACE_IMPLEMENTATION
  20. #include "sdl2surface_rawfb.h"
  21. /* ===============================================================
  22. *
  23. * EXAMPLE
  24. *
  25. * ===============================================================*/
  26. /* This are some code examples to provide a small overview of what can be
  27. * done with this library. To try out an example uncomment the defines */
  28. /*#define INCLUDE_ALL */
  29. /*#define INCLUDE_STYLE */
  30. /*#define INCLUDE_CALCULATOR */
  31. /*#define INCLUDE_CANVAS */
  32. /*#define INCLUDE_OVERVIEW */
  33. /*#define INCLUDE_NODE_EDITOR */
  34. #ifdef INCLUDE_ALL
  35. #define INCLUDE_STYLE
  36. #define INCLUDE_CALCULATOR
  37. #define INCLUDE_CANVAS
  38. #define INCLUDE_OVERVIEW
  39. #define INCLUDE_NODE_EDITOR
  40. #endif
  41. #ifdef INCLUDE_STYLE
  42. #include "../../demo/common/style.c"
  43. #endif
  44. #ifdef INCLUDE_CALCULATOR
  45. #include "../../demo/common/calculator.c"
  46. #endif
  47. #ifdef INCLUDE_CANVAS
  48. #include "../../demo/common/canvas.c"
  49. #endif
  50. #ifdef INCLUDE_OVERVIEW
  51. #include "../../demo/common/overview.c"
  52. #endif
  53. #ifdef INCLUDE_NODE_EDITOR
  54. #include "../../demo/common/node_editor.c"
  55. #endif
  56. static int translate_sdl_key(struct SDL_Keysym const *k)
  57. {
  58. /*keyboard handling left as an exercise for the reader */
  59. NK_UNUSED(k);
  60. return NK_KEY_NONE;
  61. }
  62. static int sdl_button_to_nk(int button)
  63. {
  64. switch(button)
  65. {
  66. default:
  67. /* ft */
  68. case SDL_BUTTON_LEFT:
  69. return NK_BUTTON_LEFT;
  70. break;
  71. case SDL_BUTTON_MIDDLE:
  72. return NK_BUTTON_MIDDLE;
  73. break;
  74. case SDL_BUTTON_RIGHT:
  75. return NK_BUTTON_RIGHT;
  76. break;
  77. }
  78. }
  79. #if 0
  80. static void
  81. grid_demo(struct nk_context *ctx)
  82. {
  83. static char text[3][64];
  84. static int text_len[3];
  85. static const char *items[] = {"Item 0","item 1","item 2"};
  86. static int selected_item = 0;
  87. static int check = 1;
  88. int i;
  89. if (nk_begin(ctx, "Grid Demo", nk_rect(600, 350, 275, 250),
  90. NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|
  91. NK_WINDOW_NO_SCROLLBAR))
  92. {
  93. nk_layout_row_dynamic(ctx, 30, 2);
  94. nk_label(ctx, "Floating point:", NK_TEXT_RIGHT);
  95. nk_edit_string(ctx, NK_EDIT_FIELD, text[0], &text_len[0], 64, nk_filter_float);
  96. nk_label(ctx, "Hexadecimal:", NK_TEXT_RIGHT);
  97. nk_edit_string(ctx, NK_EDIT_FIELD, text[1], &text_len[1], 64, nk_filter_hex);
  98. nk_label(ctx, "Binary:", NK_TEXT_RIGHT);
  99. nk_edit_string(ctx, NK_EDIT_FIELD, text[2], &text_len[2], 64, nk_filter_binary);
  100. nk_label(ctx, "Checkbox:", NK_TEXT_RIGHT);
  101. nk_checkbox_label(ctx, "Check me", &check);
  102. nk_label(ctx, "Combobox:", NK_TEXT_RIGHT);
  103. if (nk_combo_begin_label(ctx, items[selected_item], nk_vec2(nk_widget_width(ctx), 200))) {
  104. nk_layout_row_dynamic(ctx, 25, 1);
  105. for (i = 0; i < 3; ++i)
  106. if (nk_combo_item_label(ctx, items[i], NK_TEXT_LEFT))
  107. selected_item = i;
  108. nk_combo_end(ctx);
  109. }
  110. }
  111. nk_end(ctx);
  112. }
  113. #endif
  114. int main(int argc, char **argv)
  115. {
  116. struct nk_color clear = {0,100,0,255};
  117. struct nk_vec2 vec;
  118. struct nk_rect bounds = {40,40,0,0};
  119. struct sdlsurface_context *context;
  120. SDL_DisplayMode dm;
  121. SDL_Window *window;
  122. SDL_Renderer *renderer;
  123. SDL_Texture *tex;
  124. SDL_Surface *surface;
  125. NK_UNUSED(argc);
  126. NK_UNUSED(argv);
  127. SDL_Init(SDL_INIT_VIDEO);
  128. printf("sdl init called...\n");
  129. SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
  130. SDL_GetDesktopDisplayMode(0, &dm);
  131. printf("desktop display mode %d %d\n", dm.w, dm.h);
  132. window = SDL_CreateWindow("Puzzle", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, dm.w-200,dm.h-200, SDL_WINDOW_OPENGL);
  133. if (!window)
  134. {
  135. printf("can't open window!\n");
  136. exit(1);
  137. }
  138. renderer = SDL_CreateRenderer(window, -1, 0);
  139. surface = SDL_CreateRGBSurfaceWithFormat(0, dm.w-200, dm.h-200, 32, SDL_PIXELFORMAT_ARGB8888);
  140. context = nk_sdlsurface_init(surface, 13.0f);
  141. while(1)
  142. {
  143. SDL_Event event;
  144. nk_input_begin(&(context->ctx));
  145. while (SDL_PollEvent(&event))
  146. {
  147. switch(event.type)
  148. {
  149. case SDL_QUIT:
  150. exit(0);
  151. break;
  152. case SDL_KEYDOWN:
  153. nk_input_key(&(context->ctx), translate_sdl_key(&event.key.keysym), 1);
  154. break;
  155. case SDL_KEYUP:
  156. nk_input_key(&(context->ctx), translate_sdl_key(&event.key.keysym), 0);
  157. break;
  158. case SDL_MOUSEMOTION:
  159. nk_input_motion(&(context->ctx), event.motion.x, event.motion.y);
  160. break;
  161. case SDL_MOUSEBUTTONDOWN:
  162. nk_input_button(&(context->ctx), sdl_button_to_nk(event.button.button), event.button.x, event.button.y,1);
  163. break;
  164. case SDL_MOUSEBUTTONUP:
  165. nk_input_button(&(context->ctx), sdl_button_to_nk(event.button.button), event.button.x, event.button.y,0);
  166. break;
  167. case SDL_MOUSEWHEEL:
  168. vec.x = event.wheel.x;
  169. vec.y = event.wheel.y;
  170. nk_input_scroll(&(context->ctx), vec );
  171. break;
  172. }
  173. }
  174. nk_input_end(&(context->ctx));
  175. bounds.w = 400;
  176. bounds.h = 400;
  177. if (nk_begin(&(context->ctx), "Test", bounds, NK_WINDOW_MOVABLE | NK_WINDOW_SCALABLE | NK_WINDOW_TITLE))
  178. {
  179. enum {EASY, HARD};
  180. static int op = EASY;
  181. static int property = 20;
  182. nk_layout_row_static(&(context->ctx), 30, 80, 1);
  183. if (nk_button_label(&(context->ctx), "button")){
  184. printf("button pressed\n");
  185. }
  186. nk_layout_row_dynamic(&(context->ctx), 40, 2);
  187. if (nk_option_label(&(context->ctx), "easy", op == EASY)) op = EASY;
  188. if (nk_option_label(&(context->ctx), "hard", op == HARD)) op = HARD;
  189. nk_layout_row_dynamic(&(context->ctx), 45, 1);
  190. nk_property_int(&(context->ctx), "Compression:", 0, &property, 100, 10, 1);
  191. }
  192. nk_end(&(context->ctx));
  193. /* grid_demo(&(context->ctx)); */
  194. /* -------------- EXAMPLES ---------------- */
  195. #ifdef INCLUDE_CALCULATOR
  196. calculator(&(context->ctx));
  197. #endif
  198. #ifdef INCLUDE_CANVAS
  199. canvas(&(context->ctx));
  200. #endif
  201. #ifdef INCLUDE_OVERVIEW
  202. overview(&(context->ctx));
  203. #endif
  204. #ifdef INCLUDE_NODE_EDITOR
  205. node_editor(&(context->ctx));
  206. #endif
  207. /* ----------------------------------------- */
  208. nk_sdlsurface_render(context, clear, 1);
  209. tex = SDL_CreateTextureFromSurface(renderer, surface);
  210. SDL_RenderCopy(renderer, tex, NULL, NULL);
  211. SDL_RenderPresent(renderer);
  212. SDL_DestroyTexture(tex);
  213. }
  214. nk_sdlsurface_shutdown(context);
  215. SDL_FreeSurface(surface);
  216. SDL_DestroyRenderer(renderer);
  217. SDL_DestroyWindow(window);
  218. }