Как правильно позиционировать вещи в conrod

Я пытаюсь написать код, используя шатун с бэкэндом winit / glium. Conrod - это библиотека графического пользовательского интерфейса промежуточного режима для Rust, в то время как wininit предоставляет модель событий и связывает OpenGL.

Мой код рисует сетку значений на экране с помощью (row, col), то есть «text1» в (0,0), «text2», (1,0), «text3» в (0,1) и т. д. где (row, col) переводится в абсолютную координату (x, y).

Основной поток таков:

  1. Для каждого значения, которое я хочу отобразить как текст
  2. Вычислить столбец / строку значения, т.е. (idx% num_cols, idx / num_cols)
  3. Вычислите x и y по столбцу и строке. то есть (столбец * ШИРИНА, СТРОКА * ВЫСОТА).
  4. Создайте виджет :: Text at (x, y), содержащий значение

Код, который это делает, показан ниже в несколько упрощенном виде. Весь файл находится в сети здесь.

Это должен быть простой код для реализации, но когда я его запускаю, текстовые поля рисуются не из x = 0, y = 0, а вместо этого где-то, но не с точным смещением от центра представления по обеим осям.

Насколько я могу судить, этого не должно происходить, потому что я явно устанавливаю абсолютное положение и подтверждаю, что координаты верны. Поэтому я ожидал, что они будут отображаться в верхнем левом углу экрана. Я не понимаю, что вызывает смещение.

Любые идеи?

Код, который вычисляет позицию, таков:

fn draw_ui(ui: &mut Ui, model: &mut UiModel) {
    let ui = &mut ui.set_widgets();

    // Canvas is the backdrop to the view
    widget::Canvas::new()
        .color(BACKGROUND_COLOUR)
        .set(model.static_ids.canvas, ui);

    // Create text widgets for each value
    let state = model.session_state.read().unwrap();

    // Create / update the widgets
    if state.values.is_empty() {
        // ... removed
    } else {
        let num_cols: usize = 2;

        state.values.iter().enumerate().for_each(|(i, v)| {
            // Create / update the cell and its state
            let (node_id, value) = v;
            if let Some(id) = model.value_ids.get(node_id) {
                let (col, row) = (i % num_cols, i / num_cols);
                let valid = value.is_valid();
                let value = if let Some(ref value) = value.value {
                    value.to_string()
                } else {
                    "None".to_string()
                };
                // Turn the value into a string to render it
                let (x, y) = (col as f64 * (CELL_WIDTH + PADDING), row as f64 * (CELL_HEIGHT + PADDING));
                value_widget(&value, valid, x, y, CELL_WIDTH, CELL_HEIGHT, model.static_ids.canvas)
                    .set(*id, ui);
            }
        });
    }
}

fn value_widget(value: &str, valid: bool, x: f64, y: f64, w: f64, h: f64, canvas_id: conrod::widget::Id) -> widget::Text {
    let color = if valid { GOOD_COLOUR } else { BAD_COLOUR };
    widget::Text::new(value)
        .x_y(x, y)
        .w(w).h(h)
        .color(color)
}

Что такое шатун?

hellow 14.09.2018 07:48

Отредактирую, чтобы поставить краткое описание

locka 14.09.2018 10:25
0
2
159
1

Ответы 1

Думаю, позиция 0,0 находится в центре окна. Небольшое смещение, которое вы видите, происходит от положения текстового поля, определяющего угол текстового поля. Чтобы получить что-то в верхнем левом углу окна, вам нужно сделать что-то вроде x_position - 0.5 * window_width + x_margin (аналогично y).

Другие вопросы по теме