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

📄 schedule-widget.c

📁 一个功能全面的电子邮件客户端
💻 C
📖 第 1 页 / 共 3 页
字号:
  ScheduleChild *child = schedule_child_new (schedule);  GtkStyle *style = GTK_WIDGET (schedule)->style;  child->x = 64 + CONFLICT;  child->y =    (schedule_time_to_row (1, schedule, start, stop) * schedule->row_height) + 1;  child->width = schedule->width - 66 - CONFLICT;  child->height =    (schedule_time_to_row (0, schedule, start, stop) * schedule->row_height) - child->y;  child->data = data;  child->start = start;  child->stop = stop;  child->color = style->bg_gc[GTK_STATE_SELECTED];  if (text)    gtk_text_insert (GTK_TEXT (child->widget), NULL, NULL, NULL,		     text, strlen (text));  schedule->child_count++;  schedule_child_show (schedule, child);}static voidschedule_child_show (Schedule * schedule, ScheduleChild * child){  if (!child->window)    schedule_child_realize (schedule, child);  schedule_child_map (schedule, child);  gtk_widget_show (child->widget);  schedule_child_paint (child);}static voidschedule_child_realize (Schedule * schedule, ScheduleChild * child){  GdkWindowAttr attributes;  gint attributes_mask;  GtkWidget *widget = GTK_WIDGET (schedule);  attributes.window_type = GDK_WINDOW_CHILD;  attributes.window_type = GDK_WINDOW_CHILD;  attributes.x = child->x;  attributes.y = child->y;  attributes.width = child->width - child->decor_width;  attributes.height = child->height;  attributes.wclass = GDK_INPUT_OUTPUT;  attributes.visual = gtk_widget_get_visual (widget);  attributes.colormap = gtk_widget_get_colormap (widget);  attributes.cursor = schedule->up_down_cursor;  attributes.event_mask = (GDK_EXPOSURE_MASK			   | GDK_BUTTON_PRESS_MASK			   | GDK_BUTTON_RELEASE_MASK			   | GDK_BUTTON_MOTION_MASK			   | GDK_POINTER_MOTION_HINT_MASK			   | GDK_KEY_PRESS_MASK);  attributes_mask =    GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR;  child->window =    gdk_window_new (widget->window, &attributes, attributes_mask);  gdk_window_set_user_data (child->window, widget);  gtk_style_set_background (widget->style, child->window, GTK_STATE_NORMAL);  gtk_widget_set_parent (child->widget, GTK_WIDGET (schedule));  schedule_child_handle_text (schedule, child);}static voidschedule_child_handle_text (Schedule * schedule, ScheduleChild * child){  GtkAllocation allocation;  int has_focus;  int handle_size;  has_focus = GTK_WIDGET_HAS_FOCUS (child->widget);  handle_size = HANDLE_SIZE;  if (child->width > 400)    child->width = 400;  allocation.x = child->x + HANDLE_SIZE;  allocation.y = child->y + has_focus * HANDLE_SIZE;  allocation.width = child->width - HANDLE_SIZE;  allocation.height = child->height - 2 * (has_focus * HANDLE_SIZE);  gtk_widget_size_request (child->widget, NULL);  gtk_widget_size_allocate (child->widget, &allocation);}static voidschedule_child_map (Schedule * schedule, ScheduleChild * child){  gdk_window_show (child->window);  gtk_widget_show (child->widget);  gtk_widget_draw (child->widget, NULL);}static voidschedule_child_paint (ScheduleChild * child){  GdkRectangle rectangle;  GtkStyle *style = GTK_WIDGET (child->widget)->style;  rectangle.x = 0;  rectangle.y = 0;  rectangle.width = HANDLE_SIZE - 1;  rectangle.height = child->height - 1;#if HANDLEBAR  gtk_draw_handle (GTK_WIDGET (child->schedule)->style,		   child->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,		   rectangle.x, rectangle.y, rectangle.width,		   rectangle.height, GTK_ORIENTATION_VERTICAL);#else  gdk_draw_rectangle (child->window, child->color,		      TRUE, rectangle.x,		      rectangle.y, rectangle.width, rectangle.height);  gdk_draw_rectangle (child->window, style->black_gc, FALSE,		      rectangle.x, rectangle.y, rectangle.width,		      rectangle.height);#endif  if (child->flags & CHILD_HAS_FOCUS)    {      rectangle.x = HANDLE_SIZE;      rectangle.y = 0;      rectangle.width = child->width - HANDLE_SIZE - 1;      rectangle.height = HANDLE_SIZE - 1;#if HANDLEBAR      gtk_draw_handle (GTK_WIDGET (child->schedule)->style,		       child->window, GTK_STATE_NORMAL,		       GTK_SHADOW_OUT, rectangle.x, rectangle.y,		       rectangle.width, rectangle.height,		       GTK_ORIENTATION_VERTICAL);#else      gdk_draw_rectangle (child->window,			  child->color, TRUE, rectangle.x,			  rectangle.y, rectangle.width, rectangle.height);      gdk_draw_rectangle (child->window, style->black_gc, FALSE,			  rectangle.x, rectangle.y, rectangle.width,			  rectangle.height);#endif      rectangle.x = HANDLE_SIZE;      rectangle.y = child->height - HANDLE_SIZE;      rectangle.width = child->width - HANDLE_SIZE - 1;      rectangle.height = HANDLE_SIZE - 1;#if HANDLEBAR      gtk_draw_handle (GTK_WIDGET (child->schedule)->style,		       child->window, GTK_STATE_NORMAL,		       GTK_SHADOW_OUT, rectangle.x, rectangle.y,		       rectangle.width, rectangle.height,		       GTK_ORIENTATION_VERTICAL);#else      gdk_draw_rectangle (child->window,			  child->color, TRUE, rectangle.x,			  rectangle.y, rectangle.width, rectangle.height);      gdk_draw_rectangle (child->window, style->black_gc, FALSE,			  rectangle.x, rectangle.y, rectangle.width,			  rectangle.height);#endif    }}static voidschedule_child_key_press (GtkWidget * widget, GdkEventKey * event,			  gpointer data){  if (event->keyval != GDK_Escape)    return;  gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event");  gtk_widget_grab_focus (widget->parent);}static voidschedule_child_focus_in (GtkWidget * widget, GdkEventFocus * event,			 gpointer data){  ScheduleChild *child = (ScheduleChild *) data;  char *text;  if (child)    {      text = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);      if (child->window)	{	  child->height += HANDLE_SIZE * 2;	  child->y -= HANDLE_SIZE;	  gdk_window_move_resize (child->window, child->x,				  child->y, child->width, child->height);	  child->flags |= CHILD_HAS_FOCUS;	  gtk_signal_emit (GTK_OBJECT (GTK_WIDGET (child->schedule)),			   schedule_signals[CHILD_SELECTED], text,			   child->data, child->start, child->stop);	  schedule_child_paint (child);	}    }}static voidschedule_child_focus_out (GtkWidget * widget, GdkEventFocus * event,			  gpointer data){  ScheduleChild *child = (ScheduleChild *) data;  char *text = gtk_editable_get_chars (GTK_EDITABLE (child->widget),				       0, -1);  if (child->window)    {      child->height -= HANDLE_SIZE * 2;      child->y += HANDLE_SIZE;      gdk_window_move_resize (child->window, child->x,			      child->y, child->width, child->height);      child->flags &= ~CHILD_HAS_FOCUS;      schedule_child_paint (child);      gdk_pointer_ungrab (GDK_CURRENT_TIME);      if (info)	{	  g_free (info);	  info = NULL;	}      gtk_signal_emit (GTK_OBJECT (GTK_WIDGET (child->schedule)),		       schedule_signals[CHILD_CHANGED],		       text, child->data, child->start, child->stop);    }}static voidchild_changed (Schedule * schedule, char *text, gpointer data, time_t start,	       time_t stop){}static voidchild_selected (Schedule * schedule, char *text, gpointer data, time_t start,		time_t stop){}static voidchild_double_clicked (Schedule * schedule, char *text, gpointer data,		      time_t start, time_t stop){}static voidchild_right_clicked (Schedule * schedule, char *text, gpointer data,		     time_t start, time_t stop){  GList *seek = schedule->children;  int count = 0;  ScheduleChild *child;  schedule->depth_count++;  if (schedule->depth_count > schedule->child_count)    schedule->depth_count = 1;  while (seek)  {    count++;    if (count == schedule->depth_count)      {        child = seek->data;        gdk_window_hide (child->window);        gtk_widget_hide (child->widget);        gdk_window_show (child->window);        gtk_widget_show (child->widget);      }    seek = g_list_next (seek);  }}static voidrow_selected (Schedule * schedule, int row, time_t index){}static gintschedule_motion_notify_event (GtkWidget * widget, GdkEventMotion * event){  Schedule *schedule = SCHEDULE (widget);  float gran;  if (info)    {      switch (schedule->granularity)	{	case SCHEDULE_15M:	  gran = 2.0;	  break;	case SCHEDULE_30M:	  gran = 1.0;	  break;	case SCHEDULE_60M:	  gran = 0.5;	  break;	}      if (info->type == DRAG_MOVE)	{	  if (event->y - info->start_y > -HANDLE_SIZE)	    info->child->y = event->y - info->start_y;	  else	    info->child->y = -HANDLE_SIZE;	}      if (info->type == DRAG_SIZEUP)	{	  if (event->y <	      info->child->y + info->child->height - (schedule->row_height +						      HANDLE_SIZE * 2))	    {	      if (event->y > -HANDLE_SIZE)		{		  int tmpy = info->child->y;		  info->child->y = event->y + info->start_y;		  schedule_child_find_best (info->child);		  info->child->height += tmpy - info->child->y;		}	      else		{		  int tmpy = info->child->y;		  if (info->child->y > -HANDLE_SIZE)		    {		      info->child->y = -HANDLE_SIZE;		      schedule_child_find_best (info->child);		      info->child->height += tmpy + HANDLE_SIZE * 2;		    }		}	    }	  else	    {	      int ty = info->child->height + info->child->y;	      info->child->y = ty - (schedule->row_height + HANDLE_SIZE * 2);	      schedule_child_find_best (info->child);	      info->child->height = (schedule->row_height + HANDLE_SIZE * 2);	    }	  schedule_child_find_best (info->child);	  gdk_window_move_resize (info->child->window,				  info->child->x,				  info->child->y,				  info->child->width, info->child->height);	  schedule_child_handle_text (schedule, info->child);	  return TRUE;	}      if (info->type == DRAG_SIZEDOWN)	{	  if (event->y >	      info->child->y + (schedule->row_height + HANDLE_SIZE * 2))	    info->child->height = event->y - info->child->y;	  else	    info->child->height = schedule->row_height + HANDLE_SIZE * 2;	}      schedule_child_find_best (info->child);      gdk_window_move_resize (info->child->window,			      info->child->x,			      info->child->y,			      info->child->width, info->child->height);      schedule_child_handle_text (schedule, info->child);    }  return TRUE;}static voidschedule_child_find_best (ScheduleChild * child){  int tmpy, h = child->schedule->row_height;  Schedule *schedule = child->schedule;  float gran = 0;  g_return_if_fail (child != NULL);  switch (schedule->granularity)    {    case SCHEDULE_15M:      gran = 15;      break;    case SCHEDULE_30M:      gran = 30;      break;    case SCHEDULE_60M:      gran = 60;      break;    }  tmpy = (child->y + HANDLE_SIZE) / h;  child->y = (tmpy * h) - HANDLE_SIZE + 1;  tmpy = (child->y + child->height);  tmpy = tmpy / h;  tmpy = tmpy * h;  child->height = tmpy - child->y + HANDLE_SIZE;  if (child->y > 2)    child->start = ((child->y / h) + 1) * (gran * 60) + schedule->upper;  else    child->start = schedule->upper;  child->stop =    (((child->y + child->height) + 1) / h) * (gran * 60) + schedule->upper;}voidschedule_set_upper (Schedule * schedule, time_t upper){  g_return_if_fail (schedule != NULL);  schedule->upper = upper;}voidschedule_child_get_time (Schedule * schedule, gpointer seek_data,			 time_t * start, time_t * stop){  GList *seek;  ScheduleChild *child;  g_return_if_fail (schedule != NULL);  g_return_if_fail (start != NULL);  g_return_if_fail (stop != NULL);  for (seek = schedule->children; seek; seek = seek->next)    {      child = seek->data;      if (child->data == seek_data)	{	  *start = child->start;	  *stop = child->stop;	}    }}voidschedule_time_set (Schedule * schedule, ScheduleTime format){  schedule->time_style = format;  schedule_paint (GTK_WIDGET (schedule));}voidschedule_time_toggle (Schedule * schedule){  ScheduleTime format = schedule->time_style;  if (format == SCHEDULE_AMPM)    {      schedule->time_style = SCHEDULE_24HR;    }  else    {      schedule->time_style = SCHEDULE_AMPM;    }  schedule_paint (GTK_WIDGET (schedule));}voidschedule_granularity_set (Schedule * schedule,			  ScheduleGranularity granularity){  GtkWidget *widget = GTK_WIDGET (schedule);  schedule->granularity = granularity;  gtk_widget_hide (widget);  gtk_widget_show (widget);}voidschedule_set_work_day (Schedule * schedule, int start, int stop){  schedule->day_start_row = start;  schedule->day_end_row = stop;  schedule_paint (GTK_WIDGET (schedule));}voidschedule_child_set_color (ScheduleChild * child, GdkGC * color){  child->color = color;  schedule_paint (GTK_WIDGET (child->schedule));}voidschedule_set_background_color (Schedule * schedule, GdkGC * dark,			       GdkGC * light){  schedule->dark = dark;  schedule->light = light;  schedule_paint (GTK_WIDGET (schedule));}#endif /* _SCHEDULE_C_ */

⌨️ 快捷键说明

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