Hello, I would like to set text colors for individual items in an FXTable. FXTable has a textColor accessor, but it applies to every item, not to individual items. So I subclassed FXTable and overrode createItem to return a subclass of FXTableItem in which I override drawContent. One of drawContent''s parameters is the device context dc, but when I call dc.drawText in my customized drawContent, nothing is drawn on the screen. I know the method is being called. What might be wrong? Has anyone else managed to set text colors for individual table items? Thanks for any help, Tim -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/fxruby-users/attachments/20080225/e7a3e383/attachment.html
Thomas, Jason M (Software)
2008-Feb-25 23:06 UTC
[fxruby-users] Text color for individual items in FXTable
You can use the FXTable''s setCellColor to acheive a nice alternating look as shown in the screenshot on the FXRuby website. However, it sounds like you''re trying to set individual cells which I haven''t tried. # Table @table = FXTable.new(frame, :opts => TABLE_COL_SIZABLE|TABLE_ROW_SIZABLE|LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 2) @table.visibleRows = 20 @table.visibleColumns = 8 @table.setTableSize(50, 14) @table.setBackColor(FXRGB(255, 255, 255)) @table.setCellColor(0, 0, FXRGB(255, 255, 255)) @table.setCellColor(0, 1, FXRGB(255, 240, 240)) @table.setCellColor(1, 0, FXRGB(240, 255, 240)) @table.setCellColor(1, 1, FXRGB(240, 240, 255)) ________________________________ From: fxruby-users-bounces at rubyforge.org [mailto:fxruby-users-bounces at rubyforge.org] On Behalf Of Tim Smith Sent: Monday, February 25, 2008 3:58 PM To: fxruby-users at rubyforge.org Subject: [fxruby-users] Text color for individual items in FXTable Hello, I would like to set text colors for individual items in an FXTable. FXTable has a textColor accessor, but it applies to every item, not to individual items. So I subclassed FXTable and overrode createItem to return a subclass of FXTableItem in which I override drawContent. One of drawContent''s parameters is the device context dc, but when I call dc.drawText in my customized drawContent, nothing is drawn on the screen. I know the method is being called. What might be wrong? Has anyone else managed to set text colors for individual table items? Thanks for any help, Tim This message and any enclosures are intended only for the addressee. Please notify the sender by email if you are not the intended recipient. If you are not the intended recipient, you may not use, copy, disclose, or distribute this message or its contents or enclosures to any other person and any such actions may be unlawful. Ball reserves the right to monitor and review all messages and enclosures sent to or from this email address.
Right - I''m trying to set text colors for individual cells, not background colors for alternating rows and columns. In the code below, I don''t even try to set colors, but just override drawContent with a Ruby translation of FXTableItem::drawContent from FXTable.cpp in the FOX distribution. But no text appears in the cells. Am I missing something? Thanks, Tim require ''fox16''; include Fox class CustomTableItem < FXTableItem def drawContent table, dc, x, y, w, h # adapted from FXTableItem::drawContent in FXTable.cpp hg=table.isHorzGridShown(); vg=table.isVertGridShown(); ml=table.getMarginLeft()+(vg ? 1 : 0); mt=table.getMarginTop()+(hg ? 1 : 0); mr=table.getMarginRight(); mb=table.getMarginBottom(); font=dc.getFont(); lbl=getText(); icn=getIcon(); # Text width and height beg=tw=th=0; begin _end=beg; _end+=1 while(_end<lbl.length() && lbl[_end].chr!=''\n'') t=font.getTextWidth(lbl[beg..._end]) tw=t if t>tw th+=font.getFontHeight(); beg=_end+1; end while(_end<lbl.length()); # Icon size iw=ih=0; if(icn) iw=icn.getWidth(); ih=icn.getHeight(); end # Icon-text spacing s=0; s=4 if(iw && tw) # Fix x coordinate if(justify&LEFT == 1) if(iconPosition == BEFORE) then ix=x+ml; tx=ix+iw+s; elsif(iconPosition == AFTER) then tx=x+ml; ix=tx+tw+s; else ix=x+ml; tx=x+ml; end elsif(justify&RIGHT == 1) if(iconPosition == BEFORE) then tx=x+w-mr-tw; ix=tx-iw-s; elsif(iconPosition == AFTER) then ix=x+w-mr-iw; tx=ix-tw-s; else ix=x+w-mr-iw; tx=x+w-mr-tw; end else if(iconPosition == BEFORE) then ix=x+(ml+w-mr)/2-(tw+iw+s)/2; tx=ix+iw+s; elsif(iconPosition == AFTER) then tx=x+(ml+w-mr)/2-(tw+iw+s)/2; ix=tx+tw+s; else ix=x+(ml+w-mr)/2-iw/2; tx=x+(ml+w-mr)/2-tw/2; end end # Fix y coordinate if(justify&TOP == 1) if(iconPosition == ABOVE) then iy=y+mt; ty=iy+ih; elsif(iconPosition == BELOW) then ty=y+mt; iy=ty+th; else iy=y+mt; ty=y+mt; end elsif(justify&BOTTOM == 1) if(iconPosition == ABOVE) then ty=y+h-mb-th; iy=ty-ih; elsif(iconPosition == BELOW) then iy=y+h-mb-ih; ty=iy-th; else iy=y+h-mb-ih; ty=y+h-mb-th; end else if(iconPosition == ABOVE) then iy=y+(mt+h-mb)/2-(th+ih)/2; ty=iy+ih; elsif(iconPosition == BELOW) then ty=y+(mt+h-mb)/2-(th+ih)/2; iy=ty+th; else iy=y+(mt+h-mb)/2-ih/2; ty=y+(mt+h-mb)/2-th/2; end end # Paint icon dc.drawIcon(icn,ix,iy) if(icn) # Text color if(selected?) dc.setForeground(table.getSelTextColor()); else dc.setForeground(table.getTextColor()); end # Draw text yy=ty+font.getFontAscent(); beg=0; begin _end=beg; _end+=1 while(_end<lbl.length() && lbl[_end].chr !=''\n'') if(justify&LEFT == 1) then xx=tx; elsif(justify&RIGHT == 1) then xx=tx+tw-font.getTextWidth(lbl[beg..._end]); else xx=tx+(tw-font.getTextWidth(lbl[beg..._end]))/2; end dc.drawText(xx,yy,lbl[beg..._end]); yy+=font.getFontHeight(); beg=_end+1; end while(_end<lbl.length()); end end class CustomTable < FXTable def createItem *parameters CustomTableItem.new *parameters end end app = FXApp.new main = FXMainWindow.new app, ''Test'' table = CustomTable.new main table.setTableSize 2, 2 table.visibleRows = 2 table.visibleColumns = 2 table.setItemText 0, 0, ''one'' table.setItemText 0, 1, ''two'' table.setItemText 1, 0, ''three'' table.setItemText 1, 1, ''four'' app.create main.show PLACEMENT_SCREEN app.run -----Original Message----- From: fxruby-users-bounces at rubyforge.org [mailto:fxruby-users-bounces at rubyforge.org] On Behalf Of Thomas, Jason M (Software) Sent: Monday, February 25, 2008 6:07 PM To: fxruby-users at rubyforge.org Subject: Re: [fxruby-users] Text color for individual items in FXTable You can use the FXTable''s setCellColor to acheive a nice alternating look as shown in the screenshot on the FXRuby website. However, it sounds like you''re trying to set individual cells which I haven''t tried. # Table @table = FXTable.new(frame, :opts => TABLE_COL_SIZABLE|TABLE_ROW_SIZABLE|LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 2) @table.visibleRows = 20 @table.visibleColumns = 8 @table.setTableSize(50, 14) @table.setBackColor(FXRGB(255, 255, 255)) @table.setCellColor(0, 0, FXRGB(255, 255, 255)) @table.setCellColor(0, 1, FXRGB(255, 240, 240)) @table.setCellColor(1, 0, FXRGB(240, 255, 240)) @table.setCellColor(1, 1, FXRGB(240, 240, 255)) ________________________________ From: fxruby-users-bounces at rubyforge.org [mailto:fxruby-users-bounces at rubyforge.org] On Behalf Of Tim Smith Sent: Monday, February 25, 2008 3:58 PM To: fxruby-users at rubyforge.org Subject: [fxruby-users] Text color for individual items in FXTable Hello, I would like to set text colors for individual items in an FXTable. FXTable has a textColor accessor, but it applies to every item, not to individual items. So I subclassed FXTable and overrode createItem to return a subclass of FXTableItem in which I override drawContent. One of drawContent''s parameters is the device context dc, but when I call dc.drawText in my customized drawContent, nothing is drawn on the screen. I know the method is being called. What might be wrong? Has anyone else managed to set text colors for individual table items? Thanks for any help, Tim This message and any enclosures are intended only for the addressee. Please notify the sender by email if you are not the intended recipient. If you are not the intended recipient, you may not use, copy, disclose, or distribute this message or its contents or enclosures to any other person and any such actions may be unlawful. Ball reserves the right to monitor and review all messages and enclosures sent to or from this email address. _______________________________________________ fxruby-users mailing list fxruby-users at rubyforge.org http://rubyforge.org/mailman/listinfo/fxruby-users
Sorry for the mangled code formatting in my last post. Trying again: require ''fox16''; include Fox class CustomTableItem < FXTableItem def drawContent table, dc, x, y, w, h # adapted from FXTableItem::drawContent in FXTable.cpp hg=table.isHorzGridShown(); vg=table.isVertGridShown(); ml=table.getMarginLeft()+(vg ? 1 : 0); mt=table.getMarginTop()+(hg ? 1 : 0); mr=table.getMarginRight(); mb=table.getMarginBottom(); font=dc.getFont(); lbl=getText(); icn=getIcon(); # Text width and height beg=tw=th=0; begin _end=beg; _end+=1 while(_end<lbl.length() && lbl[_end].chr!=''\n'') t=font.getTextWidth(lbl[beg..._end]) tw=t if t>tw th+=font.getFontHeight(); beg=_end+1; end while(_end<lbl.length()); # Icon size iw=ih=0; if(icn) iw=icn.getWidth(); ih=icn.getHeight(); end # Icon-text spacing s=0; s=4 if(iw && tw) # Fix x coordinate if(justify&LEFT == 1) if(iconPosition == BEFORE) then ix=x+ml; tx=ix+iw+s; elsif(iconPosition == AFTER) then tx=x+ml; ix=tx+tw+s; else ix=x+ml; tx=x+ml; end elsif(justify&RIGHT == 1) if(iconPosition == BEFORE) then tx=x+w-mr-tw; ix=tx-iw-s; elsif(iconPosition == AFTER) then ix=x+w-mr-iw; tx=ix-tw-s; else ix=x+w-mr-iw; tx=x+w-mr-tw; end else if(iconPosition == BEFORE) then ix=x+(ml+w-mr)/2-(tw+iw+s)/2; tx=ix+iw+s; elsif(iconPosition == AFTER) then tx=x+(ml+w-mr)/2-(tw+iw+s)/2; ix=tx+tw+s; else ix=x+(ml+w-mr)/2-iw/2; tx=x+(ml+w-mr)/2-tw/2; end end # Fix y coordinate if(justify&TOP == 1) if(iconPosition == ABOVE) then iy=y+mt; ty=iy+ih; elsif(iconPosition == BELOW) then ty=y+mt; iy=ty+th; else iy=y+mt; ty=y+mt; end elsif(justify&BOTTOM == 1) if(iconPosition == ABOVE) then ty=y+h-mb-th; iy=ty-ih; elsif(iconPosition == BELOW) then iy=y+h-mb-ih; ty=iy-th; else iy=y+h-mb-ih; ty=y+h-mb-th; end else if(iconPosition == ABOVE) then iy=y+(mt+h-mb)/2-(th+ih)/2; ty=iy+ih; elsif(iconPosition == BELOW) then ty=y+(mt+h-mb)/2-(th+ih)/2; iy=ty+th; else iy=y+(mt+h-mb)/2-ih/2; ty=y+(mt+h-mb)/2-th/2; end end # Paint icon dc.drawIcon(icn,ix,iy) if(icn) # Text color if(selected?) dc.setForeground(table.getSelTextColor()); else dc.setForeground(table.getTextColor()); end # Draw text yy=ty+font.getFontAscent(); beg=0; begin _end=beg; _end+=1 while(_end<lbl.length() && lbl[_end].chr !=''\n'') if(justify&LEFT == 1) then xx=tx; elsif(justify&RIGHT == 1) then xx=tx+tw-font.getTextWidth(lbl[beg..._end]); else xx=tx+(tw-font.getTextWidth(lbl[beg..._end]))/2; end dc.drawText(xx,yy,lbl[beg..._end]); yy+=font.getFontHeight(); beg=_end+1; end while(_end<lbl.length()); end end class CustomTable < FXTable def createItem *parameters CustomTableItem.new *parameters end end app = FXApp.new main = FXMainWindow.new app, ''Test'' table = CustomTable.new main table.setTableSize 2, 2 table.visibleRows = 2 table.visibleColumns = 2 table.setItemText 0, 0, ''one'' table.setItemText 0, 1, ''two'' table.setItemText 1, 0, ''three'' table.setItemText 1, 1, ''four'' app.create main.show PLACEMENT_SCREEN app.run
Good news, everybody! I found a thread on comp.lang.ruby about a similar problem setting fonts for individual table items: http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/b568f 66fe08a69a5/625209163eb11dd8?#625209163eb11dd8 Like me, he found drawContent''s dc parameter unusable. His solution was to create a new one with FXDCWindow.new. That worked for me and I can now set individual text colors; code below. If no one objects, I''ll file a bug report about the unusable dc parameter. Regards, Tim require ''fox16''; include Fox class CustomTableItem < FXTableItem attr_accessor :color def drawContent table, unusable_dc, x, y, w, h FXDCWindow.new(table) {|dc| if @color and not selected? dc.setForeground @color def dc.setForeground color # stop super from setting color back end end dc.setFont unusable_dc.getFont super table, dc, x, y, w, h } end end class CustomTable < FXTable def createItem *parameters CustomTableItem.new *parameters end def setItemTextColor row, column, color getItem(row, column).color = color updateItem row, column end end app = FXApp.new main = FXMainWindow.new app, ''Test'' table = CustomTable.new main table.setTableSize 2, 2 table.visibleRows = 2 table.visibleColumns = 2 table.setItemText 0, 0, ''one'' table.setItemTextColor 0, 0, FXRGB(255, 0, 0) # red table.setItemText 0, 1, ''two'' table.setItemTextColor 0, 1, FXRGB(0, 255, 0) # green table.setItemText 1, 0, ''three'' table.setItemTextColor 1, 0, FXRGB(0, 0, 255) # blue table.setItemText 1, 1, ''four'' app.create main.show PLACEMENT_SCREEN app.run
Lyle Johnson
2008-Feb-27 16:31 UTC
[fxruby-users] Text color for individual items in FXTable
On Feb 27, 2008, at 10:23 AM, Tim Smith wrote:> Like me, he found drawContent''s dc parameter unusable. His solution > was > to create a new one with FXDCWindow.new. That worked for me and I can > now set individual text colors; code below. If no one objects, I''ll > file a bug report about the unusable dc parameter.No, please do file a bug report about it. I''m sorry I haven''t had time to follow up on your question, things are just very busy here right now.