GTK 函数 gtk_tree_view_scroll_to_cell() 的不可靠行为

问题描述 投票:0回答:1

我需要一些帮助来理解为什么使用 GtkTreeView 的某些代码中会出现错误,以及如何修复它。

在程序中,用户打开一个图像并运行一个函数来检测图像中的星星。这一切都是可靠的并且工作正常。每个星星的数据都填充到 GtkTreeView 中。

然后用户点击触发回调的显示中的星星:

gboolean on_drawingarea_button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data)

依次调用如下所示的函数:

void set_iter_of_clicked_psf(double x, double y) {
    GtkTreeSelection *selection = GTK_TREE_SELECTION(gtk_builder_get_object(gui.builder, "treeview-selection"));
    GtkTreeView *treeview = GTK_TREE_VIEW(lookup_widget("Stars_stored"));
    GtkTreeModel *model = gtk_tree_view_get_model(treeview);
    GtkTreeIter iter;
    gboolean valid;
    gboolean is_as;
    const double radian_conversion = ((3600.0 * 180.0) / M_PI) / 1.0E3;
    double invpixscalex = 1.0;
    double bin_X = gfit.unbinned ? (double) gfit.binning_x : 1.0;
    if (com.stars && com.stars[0]) {// If the first star has units of arcsec, all should have
        is_as = (strcmp(com.stars[0]->units,"px"));
    } else {
        return; // If com.stars is empty there is no point carrying on
    }
    if (is_as) {
        invpixscalex = 1.0 / (radian_conversion * (double) gfit.pixel_size_x / gfit.focal_length) * bin_X;
    }
    valid = gtk_tree_model_get_iter_first(model, &iter);
    while (valid) {
        gdouble xpos, ypos, fwhmx;
        gtk_tree_model_get(model, &iter, COLUMN_X0, &xpos, -1);
        gtk_tree_model_get(model, &iter, COLUMN_Y0, &ypos, -1);
        gtk_tree_model_get(model, &iter, COLUMN_FWHMX, &fwhmx, -1);
        fwhmx *= invpixscalex;
        gdouble distsq = (xpos - x) * (xpos - x) + (ypos - y) * (ypos - y);
        gdouble psflimsq = 6. * fwhmx * fwhmx;
        if (distsq < psflimsq) {
            GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
            if (!path) return;
            gtk_tree_selection_select_path(selection, path);
            gtk_tree_view_scroll_to_cell(treeview, path, NULL, TRUE, 0.5, 0.0);
            gtk_tree_path_free(path);
            gui.selected_star = get_index_of_selected_star(xpos, ypos);
            display_status();
            redraw(REDRAW_OVERLAY);
            return;
        }
        valid = gtk_tree_model_iter_next(model, &iter);
    }
    siril_debug_print("Point clicked does not correspond to a known star\n");
    return;
}

代码遍历 GtkTreeView 中的每个迭代器,并检查单击的位置是否足够靠近星形的中心:代码的关键位然后在条件函数内跟随到函数的末尾。如果该位置匹配一颗星,则根据 iter 声明并初始化 GtkTreePath,将选择更改为该路径并调用 gtk_tree_view_scroll_to_cell(),它应该滚动 GtkTreeView 以便显示所选星。

对于一些用户来说,代码每次都有效,并导致树视图滚动到所选的星星。对于其他用户,有时有效,有时无效。当它不起作用时,我可以告诉您遵循正确的代码路径,因为 gui.selected_star 已正确更新(它会在随后的重绘(REDRAW_OVERLAY)调用中触发绘图事件。只有 gtk_tree_view_scroll_to_cell() 似乎功能不正常。

我和我的一位开发人员都不明白为什么它有时但不总是有效,我们也不知道为什么有些用户根本看不到这个错误。因此,如果有任何 GTK 大师可以启发我,我将不胜感激!

user-interface gtk
1个回答
0
投票

你并不孤单。 我遇到了同样的问题。 我还没有找到原因或修复。

© www.soinside.com 2019 - 2024. All rights reserved.