Advertisement
KeithS

Scrollable tags mock up

Jun 9th, 2012
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.14 KB | None | 0 0
  1. /*
  2. MOCK UP:
  3. Scrollable tags with selectable element
  4. (keyboard driven version)
  5. API: Allegro 5.1
  6. KeithS, June, 2012
  7. Link options...
  8. `pkg-config --libs allegro-5.1 allegro_font-5.1 allegro_ttf-5.1 allegro_primitives-5.1`
  9. */
  10. #include <allegro5/allegro.h>
  11. #include <allegro5/allegro_primitives.h>
  12. #include <allegro5/allegro_font.h>
  13. #include <allegro5/allegro_ttf.h>
  14. #include <cstdio>
  15. //#include <math.h>
  16. #include <vector>
  17. //#include <ctime>
  18. #include <string>
  19.  
  20. //#define _USE_MATH_DEFINES
  21.  
  22. //#define RAD_TO_DEG(x) (x)*(180.0/M_PI)
  23. //#define DEG_TO_RAD(x) (x)*(M_PI/180.0)
  24. //#define KT_TO_MS(x) (x) * 0.51444
  25. //#define MS_TO_KT(x) (x) * 1.94386
  26. //------------------------------------------------------------------
  27.  
  28. using namespace std;
  29.  
  30. const double fps = 20.0f;
  31. const int SCREEN_X = 800;
  32. const int SCREEN_Y = 600;
  33. const int LINES = 20;
  34.  
  35. enum keys{KEY_Q, KEY_A, KEY_UP, KEY_DOWN};
  36.  
  37. //------------------FUNCTIONS---------------------------------------
  38. //------------------------------------------------------------------
  39. bool allegro5_setup(        ALLEGRO_DISPLAY **disp,
  40.                             ALLEGRO_EVENT_QUEUE **event_q,
  41.                             ALLEGRO_TIMER **f_timer,
  42.                             ALLEGRO_FONT **font)
  43. {
  44.     if(al_init() == false)
  45.     {
  46.         printf("Allegro 5 did not initialize\n");
  47.         return false;
  48.     }
  49.  
  50.     al_set_new_display_option(ALLEGRO_VSYNC, 1, ALLEGRO_SUGGEST);
  51.     *disp = al_create_display(SCREEN_X, SCREEN_Y);
  52.     if(*disp == NULL)
  53.     {
  54.         printf("Dislplay was not created\n");
  55.         return false;
  56.     }
  57.  
  58.     *event_q = al_create_event_queue();
  59.     if(*event_q == NULL)
  60.     {
  61.         al_destroy_display(*disp);
  62.         printf("Event Queue was not created\n");
  63.         return false;
  64.     }
  65.  
  66.     *f_timer = al_create_timer(1.0f / fps);
  67.     if(*f_timer == NULL)
  68.     {
  69.         al_destroy_display(*disp);
  70.         al_destroy_event_queue(*event_q);
  71.         printf("Timer F was not created\n");
  72.         return false;
  73.     }
  74.  
  75.     if(al_init_primitives_addon() == false)
  76.     {
  77.         al_destroy_display(*disp);
  78.         al_destroy_timer(*f_timer);
  79.         al_destroy_event_queue(*event_q);
  80.         printf("Primitives Addon did not initialize\n");
  81.         return false;
  82.     }
  83.  
  84.     if(al_install_keyboard() == false)
  85.     {
  86.         al_destroy_display(*disp);
  87.         al_destroy_timer(*f_timer);
  88.         al_destroy_event_queue(*event_q);
  89.         printf("Keyboard not installed\n");
  90.         return false;
  91.     }
  92.  
  93.     al_init_font_addon();
  94.  
  95.     if(al_init_ttf_addon() == false)
  96.     {
  97.         al_destroy_display(*disp);
  98.         al_destroy_timer(*f_timer);
  99.         al_destroy_event_queue(*event_q);
  100.         printf("TTF addon did not initialize\n");
  101.         return false;
  102.     }
  103.  
  104.     *font = al_load_ttf_font("./fonts/Verdana.ttf", -22, NULL);
  105.     if(*font == NULL)
  106.     {
  107.         al_destroy_display(*disp);
  108.         al_destroy_timer(*f_timer);
  109.         al_destroy_event_queue(*event_q);
  110.         printf("TTF font did not load. Check that it exists in /Release/font/ dir?\n");
  111.         return false;
  112.     }
  113.  
  114.     al_register_event_source(*event_q, al_get_display_event_source(*disp));
  115.     al_register_event_source(*event_q, al_get_keyboard_event_source());
  116.     al_register_event_source(*event_q, al_get_timer_event_source(*f_timer));
  117.     return true;
  118. }
  119.  
  120. //------------------------------------------------------------------
  121. void allegro5_terminate(    ALLEGRO_DISPLAY **disp,
  122.                             ALLEGRO_EVENT_QUEUE **event_q,
  123.                             ALLEGRO_TIMER **f_timer)
  124. {
  125.     al_destroy_event_queue(*event_q);
  126.     al_uninstall_keyboard();
  127.     al_destroy_timer(*f_timer);
  128.     al_destroy_display(*disp);
  129. }
  130.  
  131. //------------------------------------------------------------------
  132. void key_down_handler(bool *keys, ALLEGRO_EVENT ev)
  133. {
  134.         switch(ev.keyboard.keycode)
  135.         {
  136.             case ALLEGRO_KEY_Q:
  137.                 keys[KEY_Q] = true;
  138.                 break;
  139.             case ALLEGRO_KEY_A:
  140.                 keys[KEY_A] = true;
  141.                 break;
  142.             case ALLEGRO_KEY_UP:
  143.                 keys[KEY_UP] = true;
  144.                 break;
  145.             case ALLEGRO_KEY_DOWN:
  146.                 keys[KEY_DOWN] = true;
  147.                 break;
  148.             default:
  149.                 break;
  150.         }
  151. }
  152.  
  153. //------------------------------------------------------------------
  154. void key_up_handler(bool *keys, ALLEGRO_EVENT ev)
  155. {
  156.         switch(ev.keyboard.keycode)
  157.         {
  158.             case ALLEGRO_KEY_Q:
  159.                 keys[KEY_Q] = false;
  160.                 break;
  161.             case ALLEGRO_KEY_A:
  162.                 keys[KEY_A] = false;
  163.                 break;
  164.             case ALLEGRO_KEY_UP:
  165.                 keys[KEY_UP] = false;
  166.                 break;
  167.             case ALLEGRO_KEY_DOWN:
  168.                 keys[KEY_DOWN] = false;
  169.                 break;
  170.             default:
  171.                 break;
  172.         }
  173. }
  174.  
  175. //------------------------------------------------------------------
  176. void key_event_handler(bool *keys, int *sel_tag, int vec_size, int *start, int max)
  177. {
  178.     if(keys[KEY_Q] == true)
  179.     {
  180.         if(*start > 0)
  181.             *start -= 1;
  182.         return;
  183.     }
  184.  
  185.     if(keys[KEY_A] == true)
  186.     {
  187.         if(*start < max)
  188.             *start += 1;
  189.         return;
  190.     }
  191.  
  192.     if(keys[KEY_UP] == true)
  193.     {
  194.         if(*sel_tag > 0)
  195.             *sel_tag -= 1;
  196.         return;
  197.     }
  198.  
  199.     if(keys[KEY_DOWN] == true)
  200.     {
  201.         if(*sel_tag < (vec_size - 1))
  202.             *sel_tag += 1;
  203.         return;
  204.     }
  205. }
  206.  
  207. //------------------------------------------------------------------
  208.  
  209. void assign_vector_tags(vector<string> &tags, int vec_size, char *buffer)
  210. {
  211.     int i;
  212.     for(i = 0; i < vec_size; i++) // for(i = 0; i < (int)tags.size(); i++)  ... would be just as good here.
  213.     {
  214.         sprintf(buffer, "This is tag number %i", i);
  215.         tags.push_back(buffer);
  216.     }
  217. }
  218. //------------------------------------------------------------------
  219.  
  220. void display_tags(vector<string> tags, int vec_size, ALLEGRO_FONT *font, int sel_tag, int *start)
  221. {
  222.     ALLEGRO_COLOR selected = al_map_rgb(250, 50, 50);
  223.     ALLEGRO_COLOR deselected = al_map_rgb(150, 150, 150);
  224.     ALLEGRO_COLOR color = deselected;
  225.     float v_offset = SCREEN_Y * 0.075f;
  226.  
  227.     al_clear_to_color(al_map_rgb(0,0,30));
  228.  
  229.     string tag_display[LINES];
  230.  
  231.     int LINES_LIMIT;
  232.     if(LINES > vec_size)
  233.     {
  234.         // If there are less elements in the vector than lines to print it...
  235.         LINES_LIMIT = vec_size;
  236.         *start = 0; // Just in case that variable came as some other value. It would cause some mayhem if it did.
  237.     }
  238.     else
  239.         LINES_LIMIT = LINES;
  240.  
  241.     int i;
  242.     for(i = 0; i < LINES_LIMIT; i++)
  243.     {
  244.         tag_display[i].assign(tags.at(i + (size_t)*start)); // I am uncomfortable with typecasting the pointer.
  245.     }
  246.  
  247.     for(i = 0; i < LINES_LIMIT; i++)
  248.     {
  249.         if(sel_tag == (i + *start))
  250.             color = selected;
  251.         else
  252.             color = deselected;
  253.  
  254.         al_draw_text(font, color, float(SCREEN_X) * 0.05f, (i * 25.0f) + v_offset, ALLEGRO_ALIGN_LEFT, tag_display[i].c_str());
  255.     }
  256. }
  257. //------------------MAIN--------------------------------------------
  258. //------------------------------------------------------------------
  259. int main(int argc, char *argv[])
  260. {
  261.     ALLEGRO_DISPLAY *display = NULL;
  262.     ALLEGRO_EVENT_QUEUE *event_queue = NULL;
  263.     ALLEGRO_TIMER *fps_timer = NULL;
  264.     ALLEGRO_FONT *font_1 = NULL;
  265.  
  266.     bool keys[4] = {false, false, false, false};
  267.     bool draw = false;
  268.     bool loop = true;
  269.     char text_buffer[256];
  270.     vector<string> vec_tags;
  271.     int VEC_SIZE = 70;//35; //12;
  272.     vec_tags.reserve(VEC_SIZE);
  273.     int selected_tag = 7; // This needs some error trapping somewhere...
  274.     int start_at_line = 4;
  275.     int max_start_at = VEC_SIZE - LINES; // To avoid running off the end of the vector.
  276.  
  277.  
  278.     if(allegro5_setup(&display, &event_queue, &fps_timer, &font_1) == false)
  279.         return -1;
  280.  
  281.     al_set_window_title(display, *argv);
  282.     al_start_timer(fps_timer);
  283.     assign_vector_tags(vec_tags, VEC_SIZE, text_buffer);
  284.  
  285.     while(true == loop)
  286.     {
  287.         ALLEGRO_EVENT event;
  288.         al_wait_for_event(event_queue, &event);
  289.  
  290.         switch(event.type)
  291.         {
  292.             case ALLEGRO_EVENT_TIMER:
  293.                 draw = true;
  294.                 key_event_handler(keys, &selected_tag, VEC_SIZE, &start_at_line, max_start_at);
  295.                 break;
  296.             case ALLEGRO_EVENT_DISPLAY_CLOSE:
  297.                 loop = false;
  298.                 break;
  299.             case ALLEGRO_EVENT_KEY_DOWN:
  300.                 key_down_handler(keys, event);
  301.                 break;
  302.             case ALLEGRO_EVENT_KEY_UP:
  303.                     key_up_handler(keys, event);
  304.                 break;
  305.             default:
  306.                 break;
  307.         }
  308.         if(al_event_queue_is_empty(event_queue) && true == draw)
  309.         {
  310.             display_tags(vec_tags, VEC_SIZE, font_1, selected_tag, &start_at_line);
  311.             al_flip_display();
  312.             draw = false;
  313.         }
  314.      }
  315.  
  316.     al_stop_timer(fps_timer);
  317.     allegro5_terminate(&display, &event_queue, &fps_timer);
  318.  
  319.     return 0;
  320. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement