txt-scrolled demo

gboolean GtkTreeModelForeachFunction(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);

/*
 *   func: do initialization with scroll struct
 *  
 *   Input: scrolled_str: string needed to be displayed fully
 *             orig: the string you wanna to display when leave current row
 *             widget: treeview handle
 *             scrolled_num: max length of string allowed to be displayed

 *   return: void
 */
 void _init_scrolled(gchar* scrolled_str, gchar* orig, GtkWidget* scrolled_widget, int scrolled_num);
/*
 *  func: permit to change scrolled string length
 *   
 *  Input: num: max length of string allower
 *  Return: void
 */

 void _reset_scrolled_num( int scrolled_num);
/*
 *  func: According to the display requirement, return current string need to be displayed
 *   
 *  Input: void
 *  Return: char*, the dest string,
 */
 gchar* get_scrolled_str();
/*
 *  func:  scroll function called by timer
 *   
 *  Input: void
 *  Return: boolean: TRUE:keep scroll, FALSE: stop it
 */
 gboolean _auto_scrolled();
/*
 *  func:  deconstruct, when you wanna to end scroll-operation, call this function to stop it.
 *   
 *  Input: void
 *  Return: void
 */
 void _deinit_scrolled();
/*
 *  func:  check whether all of the param has been set.
 *   
 *  Input: void
 *  Return: boolean: TRUE:yes, FALSE: no can not scrolled
 */
 gboolean _scrolled_valid();
/*
 *  func:  when focus out of the current row, call this function to set orignal string
 *   
 *  Input: void
 *  Return: void
 */
 void  _scrolled_show_fixed_str();
enum{
 COL_PAD1 = 0,
 COL_NAME,
 COL_WEIGHT,
 COL_WEIGHT_SET,
 COL_AGE,
 COL_IS_NAME_BOLD,
 //COL_PIC,
 NUM_COLS,
};

static gchar  _scrolled_str[64];
static gchar _orig_str[64];
static gint      _scrolled_index;
static gint _scrolled_iteration;  // 1: ++,-1: --, 0: do nothing
static GtkWidget* _scrolled_widget;
static gint _scrolled_num;   //the number of characters scrolled
static gint _scrolled_timer;

typedef struct _Widget_Scroll{
 void (*init_scrolled)(gchar* scrolled_str, gchar* orig, GtkWidget* scrolled_widget, int scrolled_num);
 gboolean  (*scrolled_valid)();
 void (*reset_scroll_num) ( int scrolled_num);
 gchar* (*get_scroll_str)();   
 gboolean  (*scroll_auto)();
 void  (*deinit_scrolled)();
 void  (*show_orig_str) ();
} TextScrollStruct;


TextScrollStruct slScrollTreeView = { _init_scrolled, _scrolled_valid, _reset_scrolled_num, get_scrolled_str,_auto_scrolled,

_deinit_scrolled, _scrolled_show_fixed_str};

void  _scrolled_set_txt( gchar* txt)
{
 GtkTreeSelection* select;
 GtkTreeIter iter;
 gchar* scroll_str;

 select = gtk_tree_view_get_selection( GTK_TREE_VIEW(_scrolled_widget));
 if( select && gtk_tree_selection_get_selected( select, NULL,  &iter))
 {
  gtk_list_store_set( GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(_scrolled_widget))), &iter,

COL_NAME, txt, -1 );
 }
}

void  _scrolled_show_fixed_str()
{
 if( FALSE == _scrolled_valid() )
 {
  _deinit_scrolled();
  return;
 }
 _scrolled_set_txt(_orig_str);
 
}

void _init_scrolled(gchar* scrolled_str,  gchar* orig, GtkWidget* widget, int scrolled_num)
{
 
 if(scrolled_str)
 {
  int cl = 0;
  g_print( "src_str=%s/n", scrolled_str);
  //cl = strlen(scrolled_str)>=sizeof(_scrolled_str) ? sizeof(_scrolled_str)-1  : strlen(scrolled_str);
  //strncpy(_scrolled_str, scrolled_str, cl);
  strcpy(_scrolled_str, scrolled_str);
  g_print( "dest_src=%s%d/n", _scrolled_str,cl+1);
 }
 if(orig)
  strncpy(_orig_str, orig, strlen(orig)>=sizeof(_orig_str) ? sizeof(_orig_str)-1  : strlen(orig));
 _scrolled_widget = widget;
 _scrolled_num = scrolled_num > 0 ? scrolled_num : 1;
 _scrolled_iteration = 1;
 _scrolled_index = 0;
 if(_scrolled_timer)
 { 
  g_source_remove(_scrolled_timer);
 }
 _scrolled_timer = g_timeout_add( 500, (GtkFunction) _auto_scrolled, NULL );
}
void _deinit_scrolled()
{
 g_print( "_deinit_scrolled=/n");
 _scrolled_set_txt(_orig_str);
 if(_scrolled_timer)
 { 
  g_source_remove(_scrolled_timer);
  _scrolled_timer = 0;
 }
 _scrolled_str[0] = 0;
 _orig_str[0] = 0;
 _scrolled_index = 0;
 _scrolled_iteration = 0;
 _scrolled_num = 0;
 _scrolled_widget = NULL;
}
void _reset_scrolled_num( int scrolled_num)
{
 _scrolled_num = scrolled_num > 0 ? scrolled_num : 1;
}

gchar* get_scrolled_str()
{
 static gchar return_str[64];
 gint  src_str_len =0;

 if( 0 == _scrolled_str[0] )
  return NULL;
 src_str_len = strlen(_scrolled_str);

 if(src_str_len <= _scrolled_num )
  return _scrolled_str;
 
 if( _scrolled_index >= strlen(_scrolled_str) -_scrolled_num )
  _scrolled_iteration = -1;
 if( _scrolled_index <= 0 )
  _scrolled_iteration = 1;

 _scrolled_index += _scrolled_iteration;
 strncpy(return_str, _scrolled_str+_scrolled_index, _scrolled_num);
 return_str[_scrolled_num] = 0;
 return return_str;
}

gboolean _scrolled_valid()
{
 if( NULL ==_scrolled_widget )
 {
  return FALSE;
 }
 if( 0 == _scrolled_timer )
 {
  return FALSE;
 }
 return TRUE;
}

 

gboolean _auto_scrolled()
{
 if( FALSE == _scrolled_valid() )
 {
  _deinit_scrolled();
  return FALSE;
 }
 _scrolled_set_txt( slScrollTreeView.get_scroll_str());
 return TRUE;
}
 
// call in when select-change-event happened.
slScrollTreeView.init_scrolled(  name, "origa..", user, 5 );

//called when unselected( before focus out)
slScrollTreeView.show_orig_str();
slScrollTreeView.deinit_scrolled();
 

你可能感兴趣的:(timer,String,tree,input,scroll,gtk)