如何在Conrod中正确放置物品

时间:2018-09-13 19:00:31

标签: rust conrod

我正在尝试使用带有Winit / glium后端的conrod编写代码。 Conrod是Rust的一种中间模式图形用户界面库,而wininit提供了一个事件模型并提供了OpenGL绑定。

我的代码将一个值网格绘制到具有(row,col)的屏幕上,即(0,0)处的“ text1”,(0,1)中的“ text2”,(1,0)和“ text3” )等,其中(row,col)转换为绝对(x,y)坐标。

基本流程是这样

  1. 对于每个我要呈现为文本的值
  2. 计算值的列/行,即(idx%num_cols,idx / num_cols)
  3. 根据列和行计算x和y。即(col * WIDTH,ROW * HEIGHT)。
  4. 在(x,y)处创建一个包含值的小部件:::文本

执行此操作的代码在下面以稍微简化的形式显示。整个文件都在线here

这应该是易于实现的代码,但是当我运行它时,文本框不是从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)
}

1 个答案:

答案 0 :(得分:0)

我认为 0,0 位置在窗口的中心。您看到的轻微偏移来自指定文本框角的文本框位置。要在窗口的左上角获取某些内容,您需要执行类似 x_position - 0.5 * window_width + x_margin(类似于 y)的操作。