module Fox # # The FXBitmapView widget displays a scrollable view of a bitmap. # # === Bitmap alignment styles # # +BITMAPVIEW_NORMAL+:: Normal mode is centered # +BITMAPVIEW_CENTER_X+:: Centered horizontally # +BITMAPVIEW_LEFT+:: Left-aligned # +BITMAPVIEW_RIGHT+:: Right-aligned # +BITMAPVIEW_CENTER_Y+:: Centered vertically # +BITMAPVIEW_TOP+:: Top-aligned # +BITMAPVIEW_BOTTOM+:: Bottom-aligned # # === Events # # +SEL_RIGHTBUTTONPRESS+:: sent when the right mouse button goes down; the message data is an FXEvent instance. # +SEL_RIGHTBUTTONRELEASE+:: sent when the right mouse button goes up; the message data is an FXEvent instance. # class FXBitmapView < FXScrollArea # Bitmap alignment styles BITMAPVIEW_NORMAL = 0 # Normal mode is centered BITMAPVIEW_CENTER_X = 0 # Centered horizontally BITMAPVIEW_LEFT = 0x00100000 # Left-aligned BITMAPVIEW_RIGHT = 0x00200000 # Right-aligned BITMAPVIEW_CENTER_Y = 0, # Centered vertically BITMAPVIEW_TOP = 0x00400000 # Top-aligned BITMAPVIEW_BOTTOM = 0x00800000 # Bottom-aligned # # Return an initialized FXBitmapView instance. # def initialize(p, bmp=nil, tgt=nil, sel=0, opts=0, x=0, y=0, w=0, h=0) # :yields: theBitmapView super(p, opts, x, y, w, h) self.flags |= FLAG_ENABLED self.target = tgt self.message = sel @bitmap = bmp @onColor = FXRGB(0, 0, 0) @offColor = backColor @grabx = 0 @graby = 0 end def create super bitmap.create unless bitmap.nil? end def detach super bitmap.detach unless bitmap.nil? end def canFocus true end def getContentWidth bitmap.nil? 1 : bitmap.width end def getContentHeight bitmap.nil? 1 : bitmap.height end def layout super update self.flags &= ~FLAG_DIRTY end # Handle expose (paint) event def onPaint(sender, sel, event) FXDCWindow.new(self, event) do |dc| unless bitmap.nil? ww = bitmap.width hh = bitmap.height xx = pos_x yy = pos_y if ww < viewport_w if (options & BITMAPVIEW_LEFT) != 0 xx = 0 elsif (options & BITMAPVIEW_RIGHT) != 0 xx = viewport_w - ww else xx = (viewport_w - ww)/2 end end if hh < viewport_h if (options & BITMAPVIEW_TOP) != 0 yy = 0 elsif (options & BITMAPVIEW_BOTTOM) != 0 yy = viewport_h - hh else yy = (viewport_h - hh)/2 end end dc.foreground = onColor dc.background = offColor dc.drawBitmap(bitmap, xx, yy) dc.foreground = backColor xl = xx; xr = xx + ww yt = yy; yb = yy + hh xl = 0 if (xl < 0) xr = viewport_w if (xr > viewport_w) yt = 0 if (yt < 0) yb = viewport_h if (yb > viewport_h) dc.fillRectangle(0, 0, xr, yt) dc.fillRectangle(0, yt, xl, viewport_h - yt) dc.fillRectangle(xr, 0, viewport_w - xr, yb) dc.fillRectangle(xl, yb, viewport_w - xl, viewport_h - yb) else dc.foreground = backColor dc.fillRectangle(0, 0, width, height) end end end # Handle right mouse button press def onRightBtnPress(sender, sel, ev) self.flags &= ~FLAG_TIP handle(self, FXSEL(SEL_FOCUS_SELF, 0), ev) if enabled? grab if target && target.handle(self, FXSEL(SEL_RIGHTBUTTONPRESS, message), ev) != 0 return 1 end self.flags &= ~FLAG_UPDATE self.flags |= FLAG_PRESSED|FLAG_SCROLLING @grabx = ev.win_x - pos_x @graby = ev.win_y - pos_y return 1 end return 0 end # Handle right mouse button release def onRightBtnRelease(sender, sel, ev) if enabled? ungrab self.flags &= ~(FLAG_PRESSED|FLAG_SCROLLING) self.flags |= FLAG_UPDATE if target && target.handle(self, FXSEL(SEL_RIGHTBUTTONPRESS, message), ev) != 0 return 1 end return 1 end return 0 end # Handle real or simulated mouse motion def onMotion(sender, sel, ev) if (flags & FLAG_SCROLLING) != 0 setPosition(ev.win_x - @grabx, ev.win_y - @graby) return 1 end return 0 end # # Set the bitmap for this FXBitmapView, where _bmp_ is either +nil+ or # a reference to an FXBitmap instance. # def bitmap=(bmp) @bitmap = bmp recalc update end # # Return a reference to the bitmap (an FXBitmap instance) for this FXBitmapView, # or +nil+ if no bitmap has been set. # def bitmap; @bitmap; end # Set the color used for the "on" bits in the bitmap. def onColor=(clr) if clr != onColor @onColor = clr update end end # Return the color used for the "on" bits in the bitmap. def onColor; @onColor; end # Set the color used for the "off" bits in the bitmap. def offColor=(clr) if clr != offColor @offColor = clr update end end # Return the color used for the "off" bits in the bitmap. def offColor; @offColor; end # # Set the current alignment for the bitmap inside the FXBitmapView, # where _mode_ is some combination of the bitmap alignment flags # listed above. # def alignment=(mode) opts = (options & ~(BITMAPVIEW_LEFT|BITMAPVIEW_RIGHT|BITMAPVIEW_TOP|BITMAPVIEW_BOTTOM)) | (mode & (BITMAPVIEW_LEFT|BITMAPVIEW_RIGHT|BITMAPVIEW_TOP|BITMAPVIEW_BOTTOM)) if options != opts @options = opts update end end # # Return the current alignment for the bitmap inside the # FXBitmapView. # def alignment options & (BITMAPVIEW_LEFT|BITMAPVIEW_RIGHT|BITMAPVIEW_TOP|BITMAPVIEW_BOTTOM) end end end