Codebase list ruby-fxruby / run/8a909198-7fff-4596-a78d-571f487fdb51/upstream examples / custom_table_item.rb
run/8a909198-7fff-4596-a78d-571f487fdb51/upstream

Tree @run/8a909198-7fff-4596-a78d-571f487fdb51/upstream (Download .tar.gz)

custom_table_item.rb @run/8a909198-7fff-4596-a78d-571f487fdb51/upstreamraw · history · blame

require 'fox16'

include Fox

class CustomTableItem < FXTableItem
	def drawContent(table, dc, x, y, w, h)
	  puts "in drawContent()"
		hg = table.horizontalGridShown?
		vg = table.verticalGridShown?
		ml = table.marginLeft + (vg ? 1 : 0)
		mt = table.marginTop + (hg ? 1 : 0)
		mr = table.marginRight
		mb = table.marginBottom
		font = dc.font
		lbl = text
		icn = icon

		# Text width and height
		beg, tw, th = 0, 0, 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.fontHeight
			beg = _end + 1
		end while _end < lbl.length

		# Icon size
		iw, ih = 0, 0
		unless icn.nil?
			iw = icn.width
			ih = icn.height
		end

		# Icon-text spacing
		s = 0
		s = 4 if (iw > 0 && tw > 0)

		# Fix x coordinate
		if justify & LEFT == 1
		  case iconPosition
			when BEFORE
			  ix = x + ml
        tx = ix + iw + s
			when AFTER
			  tx = x + ml
        ix = tx + tw + s
			else
			  ix = x + ml
			  tx = x + ml
			end
		elsif justify & RIGHT == 1
			case iconPosition
		  when BEFORE
				tx = x + w - mr - tw
				ix = tx - iw - s
			when AFTER
				ix = x + w - mr - iw
				tx = ix - tw - s
			else
			  ix = x + w - mr - iw
			  tx = x + w - mr - tw
			end
		else
		  case iconPosition
			when BEFORE
				ix = x + (ml + w - mr)/2 - (tw + iw + s)/2
        tx = ix + iw + s
			when AFTER
				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
		  case iconPosition
			when ABOVE
			  iy = y + mt
        ty = iy + ih
			when BELOW
			  ty = y + mt
        iy = ty + th
			else
			  iy = y + mt
			  ty = y + mt
			end
		elsif justify & BOTTOM == 1
		  case iconPosition
			when ABOVE
			  ty = y + h - mb - th
        iy = ty - ih
			when BELOW
			  iy = y + h - mb - ih
        ty = iy - th
			else
			  iy = y + h - mb - ih
			  ty = y + h - mb - th
			end
		else
		  case iconPosition
			when ABOVE
				iy = y + (mt + h - mb)/2 - (th + ih)/2
				ty = iy + ih
			when BELOW
				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) unless icn.nil?

		# Text color
		if selected?
			dc.foreground = table.selTextColor
		else
			dc.foreground = table.textColor
		end
		puts "dc.foreground = (#{FXREDVAL(dc.foreground)}, #{FXGREENVAL(dc.foreground)}, #{FXBLUEVAL(dc.foreground)})"

		# Draw text
		yy = ty + font.fontAscent
		beg = 0
		begin
			_end = beg
			_end += 1 while _end < lbl.length && lbl[_end].chr != '\n'
			if justify & LEFT == 1
			  xx = tx
			elsif justify & RIGHT == 1
        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.fontHeight
			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