void drawbuttons(void *wgt) { widget *data = (widget *)wgt; if (ismouseover(data) == TRUE) { if (data->clicked != FALSE) { data->imgpos.x = data->width; data->imgpos.y = 0; } else { data->imgpos.y = 0; data->imgpos.x = 2 * data->width; } } else { data->imgpos.y = 0; data->imgpos.x = 0; } drawwidget(data); }
void MCNativeTheme::drawSlider(MCDC *dc, const MCWidgetInfo &winfo, const MCRectangle &drect) { if (winfo.datatype != WTHEME_DATA_SCROLLBAR && winfo.type != WTHEME_TYPE_SMALLSCROLLBAR) return; //draw arrows MCWidgetInfo twinfo = winfo; MCRectangle sbincarrowrect, sbdecarrowrect, sbthumbrect, sbinctrackrect, sbdectrackrect; MCRectangle rangerect; getscrollbarrects(winfo, drect, sbincarrowrect, sbdecarrowrect, sbthumbrect, sbinctrackrect, sbdectrackrect); getwidgetrect(winfo, WTHEME_METRIC_DRAWSIZE, drect, rangerect); uint4 sbpartdefaultstate = winfo.state & WTHEME_STATE_DISABLED ? WTHEME_STATE_DISABLED : WTHEME_STATE_CLEAR; memset(&twinfo, 0, sizeof(MCWidgetInfo)); //clear widget info twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL ? WTHEME_TYPE_SLIDER_TRACK_VERTICAL : WTHEME_TYPE_SLIDER_TRACK_HORIZONTAL; twinfo.state = sbpartdefaultstate; if (winfo.part == WTHEME_PART_TRACK_DEC) twinfo.state = winfo.state; drawwidget(dc, twinfo, rangerect); if(sbthumbrect.height && sbthumbrect.width) { //draw thumb twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL ? WTHEME_TYPE_SCROLLBAR_THUMB_VERTICAL : WTHEME_TYPE_SCROLLBAR_THUMB_HORIZONTAL; twinfo.state = sbpartdefaultstate; if (winfo.part == WTHEME_PART_THUMB) twinfo.state = winfo.state; drawwidget(dc, twinfo, sbthumbrect); } }
Boolean MCNativeTheme::drawwidget(MCDC *dc, const MCWidgetInfo & winfo, const MCRectangle & drect) { GC gc ; MCThemeDrawInfo di ; MCDC * t_dc = dc ; Boolean ret = False; static MCRectangle gtkpixrect = {0,0,0,0}; Display *display = MCdpy; GdkRectangle rect; GdkRectangle cliprect; MCRectangle trect = drect; MCRectangle crect = drect; if (winfo.type == WTHEME_TYPE_TAB) crect.height--; //make sure tab doesn't draw over tab pane rect = MCRectangleToGdkRectangle(trect); cliprect = MCRectangleToGdkRectangle(crect); rect.x = cliprect.x = 0; rect.y = cliprect.y = 0; if (rect.width <= 0 || rect.height <= 0) return False; GtkThemeWidgetType moztype; gint flags = 0; GtkWidgetState state = getpartandstate(winfo, moztype, flags); switch(winfo.type) { case WTHEME_TYPE_TABPANE: state.curpos = 0; if(winfo.attributes & WTHEME_ATT_TABPOSBOTTOM || winfo.attributes & WTHEME_ATT_TABPOSTOP) state.maxpos = rect.width; else if(winfo.attributes & WTHEME_ATT_TABPOSLEFT || winfo.attributes & WTHEME_ATT_TABPOSRIGHT) state.maxpos = rect.height; else state.maxpos = rect.width; // XXX therefore default tabpos is top if(winfo.datatype == WTHEME_DATA_TABPANE) { MCWidgetTabPaneInfo *inf = (MCWidgetTabPaneInfo*)winfo.data; state.curpos = inf->gap_start - 1; state.maxpos = inf->gap_length + 2; } make_theme_info ( di, moztype, gtkpix, &rect, &cliprect, state, flags, crect); t_dc -> drawtheme ( THEME_DRAW_TYPE_GTK, &di ) ; ret = True; break; case WTHEME_TYPE_COMBO: { MCWidgetInfo twinfo = winfo; MCRectangle comboentryrect,combobuttonrect; //draw text box twinfo.part = WTHEME_PART_COMBOTEXT; getwidgetrect(twinfo, WTHEME_METRIC_PARTSIZE,drect,comboentryrect); twinfo.part = WTHEME_PART_COMBOBUTTON; getwidgetrect(twinfo, WTHEME_METRIC_PARTSIZE,drect,combobuttonrect); twinfo.type = WTHEME_TYPE_TEXTFIELD_FRAME; drawwidget(dc, twinfo, comboentryrect); twinfo.type = WTHEME_TYPE_COMBOBUTTON; drawwidget(dc, twinfo, combobuttonrect); return True; } #define B_WIDTH 3 case WTHEME_TYPE_TEXTFIELD_FRAME: { GtkWidgetState t_old_state; t_old_state = state; MCRectangle t_old_clip; t_old_clip = dc -> getclip(); // crect is the target rectangle for the whole control // cliprect and rect are essentially the same GdkRectangle t_bounds; MCRectangle t_dst_bounds; MCRectangle t_clip; // First render the top and bottom borders. We render a control 8 pixels // high, but clipped to the border width. t_bounds . x = 0; t_bounds . y = 0; t_bounds . width = rect . width; t_bounds . height = 8; MCU_set_rect(t_dst_bounds, crect . x, crect . y, crect . width, 8); MCU_set_rect(t_clip, crect . x, crect . y, crect . width, B_WIDTH); make_theme_info(di, moztype, gtkpix, &t_bounds, &t_bounds, state, flags, t_dst_bounds); dc -> setclip(t_clip); dc -> drawtheme(THEME_DRAW_TYPE_GTK, &di); MCU_set_rect(t_dst_bounds, crect . x, crect . y + crect . height - 8, crect . width, 8); MCU_set_rect(t_clip, crect . x, crect . y + crect . height - B_WIDTH, crect . width, B_WIDTH); make_theme_info(di, moztype, gtkpix, &t_bounds, &t_bounds, state, flags, t_dst_bounds); dc -> setclip(t_clip); dc -> drawtheme(THEME_DRAW_TYPE_GTK, &di); // Now render the left and right borders. We render a control 8 pixels // wide, but clipped to the border width t_bounds . x = 0; t_bounds . y = 0; t_bounds . width = 8; t_bounds . height = rect . height; MCU_set_rect(t_dst_bounds, crect . x, crect . y, 8, crect . height); MCU_set_rect(t_clip, crect . x, crect . y + B_WIDTH, B_WIDTH, crect . height - 2 * B_WIDTH); make_theme_info(di, moztype, gtkpix, &t_bounds, &t_bounds, state, flags, t_dst_bounds); dc -> setclip(t_clip); dc -> drawtheme(THEME_DRAW_TYPE_GTK, &di); MCU_set_rect(t_dst_bounds, crect . x + crect . width - 8, crect . y, 8, crect . height); MCU_set_rect(t_clip, crect . x + crect . width - B_WIDTH, crect . y + B_WIDTH, B_WIDTH, crect . height - 2 * B_WIDTH); make_theme_info(di, moztype, gtkpix, &t_bounds, &t_bounds, state, flags, t_dst_bounds); dc -> setclip(t_clip); dc -> drawtheme(THEME_DRAW_TYPE_GTK, &di); dc -> setclip(t_old_clip); } break ; case WTHEME_TYPE_SLIDER: drawSlider(dc, winfo, drect); return True; break; case WTHEME_TYPE_SCROLLBAR: drawScrollbar(dc, winfo, drect); return True; break; case WTHEME_TYPE_PROGRESSBAR: ret = drawprogressbar(dc, winfo, drect); return ret; break; case WTHEME_TYPE_GROUP_FRAME: make_theme_info ( di, moztype, gtkpix, &rect, &cliprect, state, flags, crect); t_dc -> drawtheme ( THEME_DRAW_TYPE_GTK, &di ) ; ret = True; break; default: make_theme_info ( di, moztype, gtkpix, &rect, &cliprect, state, flags, crect); t_dc -> drawtheme ( THEME_DRAW_TYPE_GTK, &di ) ; ret = True; } return ret; }
void MCNativeTheme::drawScrollbar(MCDC *dc, const MCWidgetInfo &winfo, const MCRectangle &drect) { if (winfo.datatype != WTHEME_DATA_SCROLLBAR && winfo.type != WTHEME_TYPE_SMALLSCROLLBAR) return; //draw arrows MCWidgetInfo twinfo = winfo; MCRectangle sbincarrowrect, sbdecarrowrect, sbthumbrect, sbinctrackrect, sbdectrackrect; MCRectangle rangerect; int sliderWidth, troughBorder, stepperSize, stepperSpacing, minSliderSize, focusLineWidth, focusPadding; moz_gtk_get_scrollbar_metrics(&sliderWidth, &troughBorder, &stepperSize, &stepperSpacing, &minSliderSize, &focusLineWidth, &focusPadding); getscrollbarrects(winfo, drect, sbincarrowrect, sbdecarrowrect, sbthumbrect, sbinctrackrect, sbdectrackrect); getwidgetrect(winfo, WTHEME_METRIC_DRAWSIZE, drect, rangerect); uint4 sbpartdefaultstate = winfo.state & WTHEME_STATE_DISABLED ? WTHEME_STATE_DISABLED : WTHEME_STATE_CLEAR; memset(&twinfo, 0, sizeof(MCWidgetInfo)); //clear widget info // Crux needs the track to be the same size as the actual scroll bar, so we // paint that first. twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL ? WTHEME_TYPE_SCROLLBAR_TRACK_VERTICAL : WTHEME_TYPE_SCROLLBAR_TRACK_HORIZONTAL; twinfo.state = sbpartdefaultstate; if (winfo.part == WTHEME_PART_TRACK_DEC) twinfo.state = winfo.state; drawwidget(dc, twinfo, rangerect); twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL ? WTHEME_TYPE_SCROLLBAR_BUTTON_UP : WTHEME_TYPE_SCROLLBAR_BUTTON_LEFT; twinfo.state = sbpartdefaultstate; if (winfo.part == WTHEME_PART_ARROW_DEC) twinfo.state = winfo.state; drawwidget(dc, twinfo, sbdecarrowrect); twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL ? WTHEME_TYPE_SCROLLBAR_BUTTON_DOWN : WTHEME_TYPE_SCROLLBAR_BUTTON_RIGHT; twinfo.state = sbpartdefaultstate; if (winfo.part == WTHEME_PART_ARROW_INC) twinfo.state = winfo.state; drawwidget(dc, twinfo, sbincarrowrect); //TS - 2007-10-25 - theme adjustments if ( winfo.attributes & WTHEME_ATT_SBVERTICAL ) sbthumbrect.height ++ ; else sbthumbrect.width ++ ; if (sbthumbrect.height && sbthumbrect.width) { //draw thumb twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL ? WTHEME_TYPE_SCROLLBAR_THUMB_VERTICAL : WTHEME_TYPE_SCROLLBAR_THUMB_HORIZONTAL; twinfo.state = sbpartdefaultstate; if (winfo.part == WTHEME_PART_THUMB) twinfo.state = winfo.state; drawwidget(dc, twinfo, sbthumbrect); } }
Boolean MCNativeTheme::drawprogressbar(MCDC *dc, const MCWidgetInfo &winfo, const MCRectangle &drect) { Boolean vertical = winfo.attributes & WTHEME_ATT_SBVERTICAL ? True : False; if (winfo.datatype != WTHEME_DATA_SCROLLBAR) return False; uint4 pbpartdefaultstate = winfo.state & WTHEME_STATE_DISABLED ? WTHEME_STATE_DISABLED : WTHEME_STATE_CLEAR; MCWidgetScrollBarInfo *sbinfo = (MCWidgetScrollBarInfo *)winfo.data; MCWidgetInfo twinfo = winfo; twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL ? WTHEME_TYPE_PROGRESSBAR_VERTICAL : WTHEME_TYPE_PROGRESSBAR_HORIZONTAL; twinfo.state = pbpartdefaultstate; drawwidget(dc, twinfo, drect); MCRectangle progressbarrect; getwidgetrect(twinfo,WTHEME_METRIC_CONTENTSIZE,drect,progressbarrect); uint1 bordersize = drect.width - progressbarrect.width; if(vertical) { progressbarrect.height = drect.height; } else { progressbarrect.width = drect.width; } if (progressbarrect.width && progressbarrect.height) { int2 endpos = 0; if (winfo.attributes & WTHEME_ATT_SBVERTICAL) { endpos = (int2)(sbinfo->thumbpos / (sbinfo->endvalue - sbinfo->startvalue) * (real8)progressbarrect.height) + progressbarrect.y; uint2 ty = (progressbarrect.y+progressbarrect.height) - (endpos - progressbarrect.y); progressbarrect.height = endpos - progressbarrect.y - bordersize; //TS-2007-08-10 Added to stop underflow if progress bar's current value = 0 if ( (endpos - progressbarrect.y - bordersize) < 0 ) progressbarrect . height = 0 ; progressbarrect.y = ty; } else { endpos = (int2)(sbinfo->thumbpos / (sbinfo->endvalue - sbinfo->startvalue) * (real8)progressbarrect.width) + progressbarrect.x; progressbarrect.width = endpos - progressbarrect.x - bordersize; //TS-2007-08-10 Added to stop underflow if progress bar's current value = 0 if ( ( endpos - progressbarrect.x - bordersize ) < 0 ) progressbarrect . width = 0 ; } twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL ? WTHEME_TYPE_PROGRESSBAR_CHUNK_VERTICAL : WTHEME_TYPE_PROGRESSBAR_CHUNK; twinfo.state = pbpartdefaultstate; drawwidget(dc, twinfo, progressbarrect); } return True; }