Color table
The choice of arbitrary RGB colors for use in graphic interfaces will not always be consistent with the desktop theme of the target platform. In Colors a series of "system" colors are defined and the possibility of creating alternative versions for light or dark themes. This demo shows this repertoire depending on the platform where the program runs. The source code is in folder /src/howto/colorview
of the SDK distribution.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
/* Color View */ #include <nappgui.h> typedef struct _viewitem_t ViewItem; typedef struct _app_t App; struct _viewitem_t { const char_t *name; color_t color; }; struct _app_t { Window *window; View *view; ArrSt(ViewItem) *items; uint32_t num_cols; Font *font; }; DeclSt(ViewItem); static const real32_t i_ITEM_WIDTH = 64; static const real32_t i_VER_MARGIN = 10; static const real32_t i_HOR_MARGIN = 15; /*---------------------------------------------------------------------------*/ static void i_add(ArrSt(ViewItem) *items, const char_t *name, const color_t color) { ViewItem *item = arrst_new(items, ViewItem); item->name = name; item->color = color; } /*---------------------------------------------------------------------------*/ static ArrSt(ViewItem)* i_colors(void) { ArrSt(ViewItem) *items = arrst_create(ViewItem); i_add(items, "Label", gui_label_color()); i_add(items, "View", gui_view_color()); i_add(items, "Line", gui_line_color()); i_add(items, "Border", gui_border_color()); i_add(items, "Link", gui_link_color()); i_add(items, "Alt1", gui_alt_color(color_rgb(192, 255, 255), color_rgb(48, 112, 112))); i_add(items, "Alt2", gui_alt_color(color_rgb(255, 192, 255), color_rgb(128, 48, 112))); i_add(items, "Alt3", gui_alt_color(color_rgb(255, 255, 192), color_rgb(112, 112, 48))); i_add(items, "Black", kCOLOR_BLACK); i_add(items, "White", kCOLOR_WHITE); i_add(items, "Red", kCOLOR_RED); i_add(items, "Green", kCOLOR_GREEN); i_add(items, "Blue", kCOLOR_BLUE); i_add(items, "Yellow", kCOLOR_YELLOW); i_add(items, "Cyan", kCOLOR_CYAN); i_add(items, "Magenta", kCOLOR_MAGENTA); i_add(items, "Silver", color_rgb(192, 192, 192)); i_add(items, "Gray", color_rgb(128, 128, 128)); i_add(items, "Maroon", color_rgb(128, 0, 0)); i_add(items, "Olive", color_rgb(128, 128, 0)); i_add(items, "DGreen", color_rgb(0, 128, 0)); i_add(items, "Teal", color_rgb(0, 128, 128)); i_add(items, "Navy", color_rgb(0, 0, 128)); i_add(items, "Purple", color_rgb(128, 0, 128)); return items; } /*---------------------------------------------------------------------------*/ static void i_draw(DCtx *ctx, real32_t x, real32_t y, real32_t width, real32_t height, const ViewItem *item) { real32_t cx1 = x + width / 2; real32_t cx2 = x + (width - i_ITEM_WIDTH) / 2; real32_t cy = y + height - i_ITEM_WIDTH; draw_fill_color(ctx, item->color); draw_rect(ctx, ekFILL, cx2, cy, i_ITEM_WIDTH, i_ITEM_WIDTH); draw_text_color(ctx, gui_label_color()); draw_text(ctx, item->name, cx1, cy); } /*---------------------------------------------------------------------------*/ static void i_OnDraw(App *app, Event *e) { const EvDraw *p = event_params(e, EvDraw); real32_t cwidth = (p->width - 2 * i_HOR_MARGIN) / app->num_cols; real32_t cheight = i_ITEM_WIDTH + font_height(app->font); draw_font(p->ctx, app->font); draw_text_align(p->ctx, ekCENTER, ekBOTTOM); arrst_foreach(item, app->items, ViewItem) uint32_t row = item_i / app->num_cols; uint32_t col = item_i % app->num_cols; real32_t x = i_HOR_MARGIN + col * cwidth; real32_t y = row * cheight + (row + 1) * i_VER_MARGIN; i_draw(p->ctx, x, y, cwidth, cheight, item); arrst_end(); } /*---------------------------------------------------------------------------*/ static void i_OnSize(App *app, Event *e) { const EvSize *p = event_params(e, EvSize); View *view = event_sender(e, View); real32_t minwidth = i_ITEM_WIDTH + 2 * i_HOR_MARGIN; real32_t cwidth = 0, cheight = 0; cwidth = p->width; if (cwidth < minwidth) { cwidth = minwidth; app->num_cols = 1; } else { uint32_t n, num_rows; app->num_cols = (uint32_t)((cwidth - i_HOR_MARGIN) / (i_ITEM_WIDTH + i_HOR_MARGIN)); n = arrst_size(app->items, ViewItem); num_rows = (n / app->num_cols); if ((n % app->num_cols) > 0) num_rows += 1; cheight = num_rows * (i_ITEM_WIDTH + font_height(app->font) + i_VER_MARGIN) + i_VER_MARGIN; if (cheight < p->height) cheight = p->height; } view_content_size(view, s2df(cwidth, cheight), s2df(1, 1)); view_update(view); } /*---------------------------------------------------------------------------*/ static Panel *i_panel(App *app) { Panel *panel = panel_create(); Layout *layout = layout_create(1, 1); View *view = view_scroll(); view_size(view, s2df(300, 200)); view_OnDraw(view, listener(app, i_OnDraw, App)); view_OnSize(view, listener(app, i_OnSize, App)); layout_view(layout, view, 0, 0); panel_layout(panel, layout); return panel; } /*---------------------------------------------------------------------------*/ static void i_OnClose(App *app, Event *e) { osapp_finish(); unref(app); unref(e); } /*---------------------------------------------------------------------------*/ static App *i_create(void) { App *app = heap_new0(App); Panel *panel = i_panel(app); app->items = i_colors(); app->font = font_system(font_regular_size(), 0); app->window = window_create(ekWINDOW_STDRES); window_panel(app->window, panel); window_title(app->window, "Color View"); window_origin(app->window, v2df(500, 200)); window_size(app->window, s2df(500, 300)); window_OnClose(app->window, listener(app, i_OnClose, App)); window_show(app->window); return app; } /*---------------------------------------------------------------------------*/ static void i_destroy(App **app) { arrst_destroy(&(*app)->items, NULL, ViewItem); window_destroy(&(*app)->window); font_destroy((&(*app)->font)); heap_delete(app, App); } /*---------------------------------------------------------------------------*/ #include "osmain.h" osmain(i_create, i_destroy, "", App) |