#include "../Inc/error.h" #include "../Inc/widgets.h" ErrorInfo error_list[ERROR_COUNT] = { {0x01, "Нет данных от эталонного датчика"}, {0x02, "Недостаточное давление компрессора"}, {0x04, "Утечка давления (датчик травит)"}, {0x08, "Нет ответа от испытуемого датчика"} }; void set_error_text_color(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { uint8_t error_code; gtk_tree_model_get(model, iter, 0, &error_code, -1); // Получаем код ошибки из модели const char *status; gtk_tree_model_get(model, iter, 2, &status, -1); // Получаем состояние ошибки ("Произошла" или "Нет") GdkRGBA color; if (g_strcmp0(status, "Произошла") == 0) { gdk_rgba_parse(&color, "red"); } else { gdk_rgba_parse(&color, "black"); } g_object_set(renderer, "foreground-rgba", &color, NULL); // Устанавливаем цвет текста } void initialize_error_table() { // Создаём модель данных с тремя столбцами: Код, Описание, Состояние widgets.ErrorListStore = gtk_list_store_new(3, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING); // Создаём GtkTreeView и связываем его с моделью widgets.ErrorTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(widgets.ErrorListStore)); // Добавляем колонку для кода ошибки GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes("Код ошибки", renderer, "text", 0, NULL); gtk_tree_view_column_set_cell_data_func(column, renderer, set_error_text_color, NULL, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(widgets.ErrorTreeView), column); // Добавляем колонку для описания ошибки renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Описание ошибки", renderer, "text", 1, NULL); gtk_tree_view_column_set_cell_data_func(column, renderer, set_error_text_color, NULL, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(widgets.ErrorTreeView), column); // Добавляем колонку для состояния ошибки renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Состояние", renderer, "text", 2, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(widgets.ErrorTreeView), column); // Устанавливаем функцию для изменения цвета текста gtk_tree_view_column_set_cell_data_func(column, renderer, set_error_text_color, NULL, NULL); // Добавляем GtkTreeView в основной контейнер gtk_box_pack_start(GTK_BOX(widgets.GridBox), widgets.ErrorTreeView, TRUE, TRUE, 0); // Обновляем отображение gtk_widget_show_all(widgets.ErrorTreeView); } void update_error_table(uint8_t error_code) { if (widgets.ErrorListStore == NULL) { g_warning("ErrorListStore не инициализирован. Вызовите initialize_error_table() сначала."); return; } gtk_list_store_clear(widgets.ErrorListStore); GtkTreeIter iter; for (int i = 0; i < ERROR_COUNT; i++) { gtk_list_store_append(widgets.ErrorListStore, &iter); const char *status = (error_code & error_list[i].code) ? "Произошла" : "Нет"; gtk_list_store_set(widgets.ErrorListStore, &iter, 0, error_list[i].code, 1, error_list[i].description, 2, status, -1); } gtk_widget_queue_draw(GTK_WIDGET(widgets.ErrorTreeView)); }