static void _slider_realize(GtkWidget *widget) { g_return_if_fail(widget != NULL); g_return_if_fail(DTGTK_IS_SLIDER(widget)); GdkWindowAttr attributes; guint attributes_mask; GtkWidgetClass* klass = GTK_WIDGET_CLASS (_slider_parent_class); if (klass->realize) klass->realize (widget); gtk_widget_set_realized(widget, TRUE); GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = 100; attributes.height = DTGTK_SLIDER_CONTROL_MIN_HEIGHT; attributes.wclass = GDK_INPUT_OUTPUT; attributes.event_mask = gtk_widget_get_events(widget) | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y; gtk_widget_set_window(widget, gdk_window_new( gtk_widget_get_parent_window (gtk_widget_get_parent(widget)),& attributes, attributes_mask)); gdk_window_set_user_data(gtk_widget_get_window(widget), widget); gtk_widget_set_style(widget, gtk_style_attach(gtk_widget_get_style(widget), gtk_widget_get_window(widget))); gtk_style_set_background(gtk_widget_get_style(widget), gtk_widget_get_window(widget), GTK_STATE_NORMAL); }
static void _slider_size_request(GtkWidget *widget,GtkRequisition *requisition) { g_return_if_fail(widget != NULL); g_return_if_fail(DTGTK_IS_SLIDER(widget)); g_return_if_fail(requisition != NULL); GTK_WIDGET_CLASS(_slider_parent_class)->size_request(widget, requisition); requisition->width = 100; requisition->height = DTGTK_SLIDER_CONTROL_MIN_HEIGHT; }
static void _slider_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { g_return_if_fail(widget != NULL); g_return_if_fail(DTGTK_IS_SLIDER(widget)); g_return_if_fail(allocation != NULL); gtk_widget_set_allocation(widget, allocation); GTK_WIDGET_CLASS(_slider_parent_class)->size_allocate(widget, allocation); if(gtk_widget_get_realized(widget)) { gdk_window_move_resize(gtk_widget_get_window(widget), allocation->x, allocation->y, allocation->width, allocation->height); if(DTGTK_SLIDER(widget)->is_entry_active == FALSE) gtk_widget_hide(DTGTK_SLIDER(widget)->entry); } }
static gboolean _slider_expose(GtkWidget *widget, GdkEventExpose *event) { g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(DTGTK_IS_SLIDER(widget), FALSE); g_return_val_if_fail(event != NULL, FALSE); GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); if (allocation.width<=1) return FALSE; GtkStyle *style=gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL,"GtkButton", GTK_TYPE_BUTTON); if(!style) style = gtk_rc_get_style(widget); GtkDarktableSlider *slider=DTGTK_SLIDER(widget); int state = gtk_widget_get_state(widget); int width = allocation.width; int height = allocation.height; /* get value fill rectangle constraints*/ GdkRectangle vr; _slider_get_value_area(widget,&vr); /* create cairo context */ cairo_t *cr; cr = gdk_cairo_create(gtk_widget_get_window(widget)); /* hardcode state for the rest of control */ state = GTK_STATE_NORMAL; /* fill value rect */ gfloat value = gtk_adjustment_get_value(slider->adjustment); /* convert scale value to range 0.0-1.0*/ gfloat vscale = (value - gtk_adjustment_get_lower(slider->adjustment)) / (gtk_adjustment_get_upper(slider->adjustment) - gtk_adjustment_get_lower(slider->adjustment) ); cairo_set_source_rgba(cr, (style->fg[state].red/65535.0)*1.7, (style->fg[state].green/65535.0)*1.7, (style->fg[state].blue/65535.0)*1.7, 0.2 ); _slider_draw_rounded_rect(cr,vr.x,vr.y,vr.width*vscale,vr.height,3,1); /* setup font using family from style */ const gchar *font_family = pango_font_description_get_family(style->font_desc); cairo_select_font_face (cr, font_family, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_text_extents_t ext; /* Draw label */ cairo_set_source_rgba(cr, (style->text[state].red/65535.0)*1.7, (style->text[state].green/65535.0)*1.7, (style->text[state].blue/65535.0)*1.7, 0.8); gchar *label = (gchar *)g_object_get_data(G_OBJECT(widget),DTGTK_SLIDER_LABEL_KEY); if (label) { cairo_set_font_size(cr,vr.height*0.5); cairo_text_extents(cr, "j`", &ext); cairo_move_to(cr, vr.x+(DTGTK_SLIDER_BORDER_WIDTH*2),vr.y+ext.height); cairo_show_text(cr, label); /* store the size of the label. doing it in dtgtk_slider_set_label doesn't work as the widget isn't created yet. */ if(slider->labelwidth == 0 && slider->labelheight == 0) { cairo_text_extents(cr, label, &ext); slider->labelwidth = vr.x+(DTGTK_SLIDER_BORDER_WIDTH*2)+ext.width+(DTGTK_SLIDER_BORDER_WIDTH*2); slider->labelheight = vr.y+ext.height+(DTGTK_SLIDER_BORDER_WIDTH*2); } } /* Draw value unit */ gchar *unit = (gchar *)g_object_get_data (G_OBJECT(slider),DTGTK_SLIDER_VALUE_UNIT_KEY); cairo_set_font_size(cr,vr.height*0.45); cairo_text_extents(cr, "%%", &ext); int unitwidth = ext.width; if(unit) { cairo_move_to(cr, vr.x+vr.width-ext.width - (DTGTK_SLIDER_BORDER_WIDTH) ,vr.y+vr.height-(DTGTK_SLIDER_BORDER_WIDTH*2)); cairo_show_text(cr, unit); } /* Draw text value */ cairo_select_font_face (cr, font_family, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); char sv[32]= {0}; if (slider->force_sign) sprintf(sv,"%+.*f",slider->digits,value); else sprintf(sv,"%.*f",slider->digits,value); cairo_set_font_size(cr,vr.height*0.5); cairo_text_extents(cr, sv, &ext); cairo_move_to(cr, vr.x+vr.width-ext.width - unitwidth -(DTGTK_SLIDER_BORDER_WIDTH*3) ,vr.y+vr.height-(DTGTK_SLIDER_BORDER_WIDTH*2)); cairo_show_text(cr, sv); /* draw up/down arrows */ dtgtk_cairo_paint_arrow(cr, width-DTGTK_SLIDER_ADJUST_BUTTON_WIDTH-DTGTK_SLIDER_BORDER_WIDTH, DTGTK_SLIDER_BORDER_WIDTH*2, DTGTK_SLIDER_ADJUST_BUTTON_WIDTH, DTGTK_SLIDER_ADJUST_BUTTON_WIDTH-4, CPF_DIRECTION_UP); dtgtk_cairo_paint_arrow(cr, width-DTGTK_SLIDER_ADJUST_BUTTON_WIDTH-DTGTK_SLIDER_BORDER_WIDTH, height-DTGTK_SLIDER_ADJUST_BUTTON_WIDTH+4-DTGTK_SLIDER_BORDER_WIDTH*2, DTGTK_SLIDER_ADJUST_BUTTON_WIDTH, DTGTK_SLIDER_ADJUST_BUTTON_WIDTH-4, CPF_DIRECTION_DOWN); cairo_destroy(cr); return TRUE; }