⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nodelist_view.c

📁 MANTIS是由科罗拉多大学开发的传感器网络嵌入式操作系统。 这是mantis的0.9.5版本的源码。
💻 C
字号:
//  This file is part of MANTIS OS, Operating System//  See http://mantis.cs.colorado.edu/////  Copyright (C) 2003-2005 University of Colorado, Boulder////  This program is free software; you can redistribute it and/or//  modify it under the terms of the mos license (see file LICENSE)#include <stdbool.h>#include <string.h>#include <glib.h>#include "gui_gtk.h" //provides gtk headers and get_widget#include "bionet.h"#include "model_gtk.h"#include "nodelist_view.h"#include "cortex.h"// all the hab and node data is manipulated with these gtk tree storesGtkTreeStore *nodelist_model;GtkWidget *nodelist_treeview;// these 'gumballs' are the status display images... they follow stoplight// coloring for out of range valuesGdkPixbuf *red_gumball;GdkPixbuf *green_gumball;GdkPixbuf *yellow_gumball;static gchar selected_hab [256];static void nodelist_update_resource(bionet_resource_t *resource);static void nodelist_setup_treeview();static void nodelist_add_node(bionet_node_t *node);static void nodelist_remove_node(bionet_node_t *node);static void nodelist_select_hab(bionet_hab_t *hab);void nodelist_view_init(void){   nodelist_treeview = get_widget(xml, "treeview_nodelist");   nodelist_setup_treeview();   model_add_node_register_func(nodelist_add_node);   model_update_resource_register_func(nodelist_update_resource);   model_select_hab_register_func(nodelist_select_hab);   model_remove_node_register_func(nodelist_remove_node);}void nodelist_setup_treeview(void){   GtkTreeViewColumn *column;   GtkCellRenderer *renderer;   GtkTreeViewColumn *pixbuf_column;   GtkCellRenderer *pixbuf_renderer;      red_gumball = gdk_pixbuf_new_from_file("glade/red_gumball.png", NULL);   green_gumball = gdk_pixbuf_new_from_file("glade/green_gumball.png", NULL);   yellow_gumball = gdk_pixbuf_new_from_file("glade/yellow_gumball.png", NULL);         nodelist_model = gtk_tree_store_new(MAX_NODE_INDEX, G_TYPE_STRING, GDK_TYPE_PIXBUF,				   G_TYPE_STRING);      gtk_tree_view_set_model(GTK_TREE_VIEW(nodelist_treeview),			   GTK_TREE_MODEL(nodelist_model));   g_object_unref(nodelist_model);      renderer = gtk_cell_renderer_text_new();   column = gtk_tree_view_column_new_with_attributes("Node Name", renderer,						     "text", NODE_NAME, NULL);   gtk_tree_view_append_column(GTK_TREE_VIEW(nodelist_treeview), column);   renderer = gtk_cell_renderer_text_new();   column = gtk_tree_view_column_new_with_attributes("Value", renderer,						     "text", NODE_VALUE, NULL);   gtk_tree_view_append_column(GTK_TREE_VIEW(nodelist_treeview), column);   pixbuf_renderer = gtk_cell_renderer_pixbuf_new();   pixbuf_column = gtk_tree_view_column_new_with_attributes("Gumball",							    pixbuf_renderer,							    "pixbuf",							    NODE_GUMBALL, NULL);   gtk_tree_view_append_column(GTK_TREE_VIEW(nodelist_treeview), pixbuf_column);   }static void nodelist_select_hab(bionet_hab_t *hab){      //check to see if it's already selected   gchar new_hab [256];   g_sprintf(new_hab, "%s.%s", hab->type, hab->id);   if(strcmp(new_hab, selected_hab) == 0)      return;      g_sprintf(selected_hab, "%s.%s", hab->type, hab->id);      gtk_tree_store_clear(nodelist_model);   //works   GSList *node_list = NULL;   gchar hab_buf [256];   g_sprintf(hab_buf, "%s.%s.*", hab->type, hab->id);      bionet_list_nodes_by_name_pattern(&node_list, hab_buf);   for(; node_list != NULL; node_list = node_list -> next) {      bionet_node_t *node = node_list->data;      nodelist_add_node(node);   }   g_slist_free(node_list);   //should work   /*     GSList *node_list = hab->nodes;          for(; node_list != NULL; node_list = node_list -> next) {     printf("found a node\n");     bionet_node_t *node = node_list->data;     nodelist_add_node(node);     }   */}static void nodelist_remove_node(bionet_node_t *node){   gchar hab_buf [256];   g_sprintf(hab_buf, "%s.%s", node->hab_type, node->hab_id);   if(strcmp(hab_buf, selected_hab) != 0)      return;   //get the string version   gchar node_id [256];   g_sprintf(node_id, "%s.%s.%s",	     node->hab_type,	     node->hab_id,	     node->id);   GtkTreeIter iter;   if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(nodelist_model), &iter, "0")) {      gchar *node_name;      do {	 gtk_tree_model_get(GTK_TREE_MODEL(nodelist_model), &iter,			    NODE_NAME, &node_name, -1);	 if(strcmp(node_id, node_name) == 0)	 {	    gtk_tree_store_remove(nodelist_model, &iter);	    return;	 }	 g_free(node_name);	       } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(nodelist_model), &iter));   }   }static void nodelist_update_resource(bionet_resource_t *resource){   gchar hab_buf [256];   g_sprintf(hab_buf, "%s.%s", resource->hab_type, resource->hab_id);   if(strcmp(hab_buf, selected_hab) != 0)      return;      gchar node_id [256];   gchar this_resource [256];   g_sprintf(node_id, "%s.%s.%s", resource->hab_type,	     resource->hab_id,	     resource->node_id);   g_sprintf(this_resource, "%s %s %s", 	     bionet_resource_data_type_to_string(resource->data_type),	     bionet_resource_flavor_to_string(resource->flavor),	     resource->id);      GtkTreeIter iter;   GtkTreeIter child;   gchar *item;   gchar *resource_id;   gboolean resource_found = false;   gboolean node_found = false;      //update node model   if(!gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(nodelist_model), &iter, "0"))      return;   do {      gtk_tree_model_get(GTK_TREE_MODEL(nodelist_model), &iter, NODE_NAME, &item, -1);      //FIXME: why does this need to be set here??? (it's a gumball until mouseover      //otherwise)      gtk_tree_store_set(nodelist_model, &iter, NODE_VALUE, "", -1);            if(strcmp(node_id, item) == 0) {	 node_found = true;	 if (gtk_tree_model_iter_children(GTK_TREE_MODEL(nodelist_model), &child, &iter)) {	    do {	       gtk_tree_model_get(GTK_TREE_MODEL(nodelist_model), &child, NODE_NAME,				  &resource_id, -1);	       	       if(strcmp(resource_id, this_resource) == 0){		  gtk_tree_store_set(nodelist_model, &child, NODE_VALUE,				     bionet_resource_value_to_string(resource), -1);		  resource_found = true;		  g_free(resource_id);		  break;	       }	       	       g_free(resource_id);	    } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(nodelist_model), &child));	 }	 g_free(item);	 break;      }	      g_free(item);   } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(nodelist_model), &iter));   if(node_found == false) {      debug("ERROR: couldn't find a node to add a resource to");      return;   }      if(resource_found == false && node_found == true) {      gtk_tree_store_append (nodelist_model, &child, &iter);      gtk_tree_store_set(nodelist_model, &child,			 NODE_NAME, this_resource,			 NODE_VALUE, bionet_resource_value_to_string(resource),			 NODE_GUMBALL, yellow_gumball,			 -1);   }}static void nodelist_add_node(bionet_node_t *node){   gchar hab_buf [256];   g_sprintf(hab_buf, "%s.%s", node->hab_type, node->hab_id);   if(strcmp(hab_buf, selected_hab) != 0)      return;      GtkTreeIter iter;   gchar node_id [256];      g_sprintf(node_id, "%s.%s.%s", node->hab_type, node->hab_id, node->id);   gboolean node_found = false;   if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(nodelist_model), &iter, "0")) {      gchar *node_name;      do {	 gtk_tree_model_get(GTK_TREE_MODEL(nodelist_model), &iter,			    NODE_NAME, &node_name, -1);	 if(strcmp(node_id, node_name) == 0)	 {	    node_found = true;	    break;	 }	 g_free(node_name);	       } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(nodelist_model), &iter));   }   if(!node_found)   {      gtk_tree_store_append(nodelist_model, &iter, NULL);      gtk_tree_store_set(nodelist_model, &iter, NODE_NAME, node_id, NODE_GUMBALL,			 green_gumball, NODE_VALUE, "", -1);   }      //update the resources   GSList *curr_resource = node->resources;   for(; curr_resource != NULL; curr_resource = curr_resource -> next)	 nodelist_update_resource((bionet_resource_t *)curr_resource->data);      }//SIGNAL HANDLERSvoid node_selection_handler_helper(GtkTreeModel *model, GtkTreePath *path,				  GtkTreeIter *iter, gpointer data){   bionet_node_t node;   gchar *node_name;      gtk_tree_model_get(model, iter, NODE_NAME, &node_name, -1);   debug("%s", node_name);   GSList *nodes;   bionet_list_nodes_by_name_pattern(&nodes, node_name);   g_free(node_name);   for(; nodes != NULL; nodes = nodes -> next) {      bionet_node_t *node = nodes->data;      model_select_node(node);   }   g_slist_free(nodes);}void node_selection_handler(GtkTreeView *treeview,			   GtkTreePath *arg1,			   GtkTreeViewColumn *arg2,			   gpointer user_data){   GtkTreeSelection *selected_list;   selected_list = gtk_tree_view_get_selection(treeview);      gtk_tree_selection_selected_foreach(selected_list, node_selection_handler_helper,				       NULL);  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -