Example #1
0
File: demo.c Project: serge-rgb/gui
static int
upload_tree(struct test_tree *base, struct gui_tree *tree, struct tree_node *node)
{
    int i = 0, n = 0;
    enum gui_tree_node_operation op;
    if (node->count) {
        i = 0;
        op = gui_panel_tree_begin_node(tree, node->name, &node->state);
        while (i < node->count)
            i += upload_tree(base, tree, node->children[i]);
        gui_panel_tree_end_node(tree);
    }
    else op = gui_panel_tree_leaf(tree, node->name, &node->state);

    switch (op) {
    case GUI_NODE_NOP: break;
    case GUI_NODE_CUT:
        tree_remove_node(node->parent, node);
        tree_push_node(base, node);
        return 0;
    case GUI_NODE_DELETE:
        tree_remove_node(node->parent, node); break;
        return 0;
    case GUI_NODE_PASTE:
        i = 0; n = base->count;
        while (i++ < n)
            tree_add_node(node, tree_pop_node(base));
    case GUI_NODE_CLONE:
    default:break;
    }
    return 1;
}
void reach_client::build_c9_tree(vertex_id root_id)
{
    tree_.clear();
    const vertex &root = pgraph_->get_vertex(root_id);
    const coord<int> root_cell = pgrid_->getCell(root.data.c);

    DWORD time = timeGetTime();
    
    reach_dijkstra d (*pgraph_, root_id, tree_, [&](vertex_id id) -> bool 
    {
        const vertex &v = pgraph_->get_vertex(id);
        const coord<int> d = pgrid_->getCell(v.data.c) - root_cell;
        return std::max(std::abs(d.x), std::abs(d.y)) <= 4;
    });

    size_t count = 0;
    while (!d.done())
    {
        d.iterate();
        ++count;
    }

    time = timeGetTime() - time;

    cout << "c9 time " << time << ": " << count << " verts" << endl;

    tree_desc desc;
    desc.ib = g_desc.ib;
    desc.ib_size = g_desc.ib_size;
    lit1_.reset(upload_tree(tree_, desc));
}
void reach_client::run_astar(vertex_id id1, vertex_id id2)
{
    const int C9_RADIUS = 4;
    
    const vertex &v1 = pgraph_->get_vertex(id1);
    const vertex &v2 = pgraph_->get_vertex(id2);
    const coord<int> v1_cell = pgrid_->getCell(v1.data.c);
    const coord<int> v2_cell = pgrid_->getCell(v2.data.c);
    
    const coord<int> d = v2_cell - v1_cell;
    const int dist = std::max(std::abs(d.x), std::abs(d.y));
    if (dist > 4)
    {
        cout << "Too far for c9 astar!" << endl;
        return;
    }

    tree_.clear();
    c9_astar astar (*pgraph_, id1, id2, tree_, *pgrid_, reaches_);
    /*{
        const vertex &v = pgraph_->get_vertex(id);

        

        const coord<int> cell_d = pgrid_->getCell(v.data.c) - v1_cell;
        return std::max(std::abs(cell_d.x), std::abs(cell_d.y)) <= C9_RADIUS;
    });*/
    while (!astar.done())
        astar.iterate();

    if (!tree_.empty())
    {
        tree_desc desc;
        desc.ib = g_desc.ib;
        desc.ib_size = g_desc.ib_size;
        lit1_.reset(upload_tree(tree_, desc));
    }
}
Example #4
0
File: demo.c Project: serge-rgb/gui
/* -----------------------------------------------------------------
 *  RUN
 * ----------------------------------------------------------------- */
static void
run_demo(struct demo_gui *gui)
{
    struct gui_panel_layout layout;
    struct state *state = &gui->state;
    struct gui_panel_layout tab;
    struct gui_config *config = &gui->config;

    /* first panel */
    gui_panel_begin(&layout, &gui->panel);
    {
        /* header */
        gui->running = !gui_panel_header(&layout, "Demo",
            GUI_CLOSEABLE|GUI_MINIMIZABLE, GUI_CLOSEABLE, GUI_HEADER_RIGHT);

        /* menubar */
        gui_panel_menubar_begin(&layout);
        {
            gui_int sel;
            gui_panel_row_begin(&layout, GUI_STATIC, 25, 2);
            {
                gui_panel_row_push(&layout, config->font.width(config->font.userdata, "__FILE__", 8));
                sel = gui_panel_menu(&layout, "FILE", file_items, LEN(file_items), 25, 100,
                    &state->file_open, gui_vec2(0,0));
                switch (sel) {
                case MENU_FILE_OPEN:
                    fprintf(stdout, "[Menu:File] open clicked!\n"); break;
                case MENU_FILE_CLOSE:
                    fprintf(stdout, "[Menu:File] close clicked!\n"); break;
                case MENU_FILE_QUIT:
                    fprintf(stdout, "[Menu:File] quit clicked!\n"); break;
                case GUI_NONE:
                default: break;
                }

                gui_panel_row_push(&layout, config->font.width(config->font.userdata, "__EDIT__", 8));
                sel = gui_panel_menu(&layout, "EDIT", edit_items, LEN(edit_items), 25, 100,
                    &state->edit_open, gui_vec2(0,0));
                switch (sel) {
                case MENU_EDIT_COPY:
                    fprintf(stdout, "[Menu:Edit] copy clicked!\n"); break;
                case MENU_EDIT_CUT:
                    fprintf(stdout, "[Menu:Edit] cut clicked!\n"); break;
                case MENU_EDIT_DELETE:
                    fprintf(stdout, "[Menu:Edit] delete clicked!\n"); break;
                case MENU_EDIT_PASTE:
                    fprintf(stdout, "[Menu:Edit] paste clicked!\n"); break;
                case GUI_NONE:
                default: break;
                }
            }
            gui_panel_row_end(&layout);
        }
        gui_panel_menubar_end(&layout);

        /* panel style configuration  */
        if (gui_panel_layout_push(&layout, GUI_LAYOUT_TAB, "Style", &state->config_tab))
        {
            if (gui_panel_layout_push(&layout, GUI_LAYOUT_NODE, "Options", &state->flag_tab)) {
                update_flags(&layout);
                gui_panel_layout_pop(&layout);
            }
            if (gui_panel_layout_push(&layout, GUI_LAYOUT_NODE, "Properties", &state->style_tab)) {
                properties_tab(&layout, config);
                gui_panel_layout_pop(&layout);
            }
            if (gui_panel_layout_push(&layout, GUI_LAYOUT_NODE, "Rounding", &state->round_tab)) {
                round_tab(&layout, config);
                gui_panel_layout_pop(&layout);
            }
            if (gui_panel_layout_push(&layout, GUI_LAYOUT_NODE, "Color", &state->color_tab)) {
                color_tab(&layout, state, config);
                gui_panel_layout_pop(&layout);
            }
            gui_panel_layout_pop(&layout);
        }

        /* widgets examples */
        if (gui_panel_layout_push(&layout, GUI_LAYOUT_TAB, "Widgets", &state->widget_tab)) {
            widget_panel(&layout, state);
            gui_panel_layout_pop(&layout);
        }

        /* popup panel */
        if (state->popup) {
            gui_panel_popup_begin(&layout, &tab, GUI_POPUP_STATIC, gui_rect(20, 100, 220, 150), gui_vec2(0,0));
            {
                if (gui_panel_header(&tab, "Popup", GUI_CLOSEABLE, GUI_CLOSEABLE, GUI_HEADER_LEFT)) {
                    gui_panel_popup_close(&tab);
                    state->popup = gui_false;
                }
                gui_panel_row_dynamic(&tab, 30, 1);
                gui_panel_label(&tab, "Are you sure you want to exit?", GUI_TEXT_LEFT);
                gui_panel_row_dynamic(&tab, 30, 4);
                gui_panel_spacing(&tab, 1);
                if (gui_panel_button_text(&tab, "Yes", GUI_BUTTON_DEFAULT)) {
                    gui_panel_popup_close(&tab);
                    state->popup = gui_false;
                }
                if (gui_panel_button_text(&tab, "No", GUI_BUTTON_DEFAULT)) {
                    gui_panel_popup_close(&tab);
                    state->popup = gui_false;
                }
            }
            gui_panel_popup_end(&layout, &tab);
        }

        {
            /* shelf + graphes  */
            static const char *shelfs[] = {"Histogram", "Lines"};
            gui_panel_row_dynamic(&layout, 180, 1);
            state->shelf_selection = gui_panel_shelf_begin(&layout, &tab, shelfs,
                LEN(shelfs), state->shelf_selection, state->shelf);
            graph_panel(&tab, state->shelf_selection);
            state->shelf = gui_panel_shelf_end(&layout, &tab);
        }

        /* tables */
        gui_panel_row_dynamic(&layout, 180, 1);
        gui_panel_group_begin(&layout, &tab, "Table", state->table);
        table_panel(&tab);
        state->table = gui_panel_group_end(&layout, &tab);

        {
            /* tree */
            struct gui_tree tree;
            gui_panel_row_dynamic(&layout, 250, 1);
            gui_panel_tree_begin(&layout, &tree, "Tree", 20, state->tree);
            upload_tree(&state->test, &tree, &state->test.root);
            state->tree = gui_panel_tree_end(&layout, &tree);
        }
    }
    gui_panel_end(&layout, &gui->panel);

    /* second panel */
    gui_panel_begin(&layout, &gui->sub);
    {
        enum {EASY, HARD};
        gui_panel_header(&layout, "Show", GUI_CLOSEABLE, 0, GUI_HEADER_LEFT);
        gui_panel_row_static(&layout, 30, 80, 1);
        if (gui_panel_button_text(&layout, "button", GUI_BUTTON_DEFAULT)) {
            /* event handling */
        }
        gui_panel_row_dynamic(&layout, 30, 2);
        if (gui_panel_option(&layout, "easy", state->op == EASY)) state->op = EASY;
        if (gui_panel_option(&layout, "hard", state->op == HARD)) state->op = HARD;
    }
    gui_panel_end(&layout, &gui->sub);
}