packages feed

gtk-0.13.8: Graphics/UI/Gtk/Misc/Tooltip.chs

{-# LANGUAGE CPP #-}
-- -*-haskell-*-
--  GIMP Toolkit (GTK) Widget Tooltip
--
--  Author : Andy Stewart
--
--  Created: 24 Mar 2010
--
--  Copyright (C) 2010 Andy Stewart
--
--  This library is free software; you can redistribute it and/or
--  modify it under the terms of the GNU Lesser General Public
--  License as published by the Free Software Foundation; either
--  version 2.1 of the License, or (at your option) any later version.
--
--  This library is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
--  Lesser General Public License for more details.
--
-- |
-- Maintainer  : gtk2hs-users@lists.sourceforge.net
-- Stability   : provisional
-- Portability : portable (depends on GHC)
--
-- Add tips to your widgets
--
-- * Module available since Gtk+ version 2.12
--
module Graphics.UI.Gtk.Misc.Tooltip (

-- * Detail
--
-- | 'Tooltip' belongs to the new tooltips API that was introduced in Gtk+
-- 2.12 and which deprecates the old 'Tooltips' API.
--
-- Basic tooltips can be realized simply by using 'widgetTooltipText' or
-- 'widgetTooltipMarkup' without any explicit tooltip object.
--
-- When you need a tooltip with a little more fancy contents, like adding an
-- image, or you want the tooltip to have different contents per 'TreeView' row
-- or cell, you will have to do a little more work:
--
--   * Set the 'hasTooltip' property to 'True', this will make GTK+ monitor the widget for motion and
--     related events which are needed to determine when and where to show a tooltip.
--
--   * Connect to the 'queryTooltip' signal. This signal will be emitted when a tooltip is supposed to
--     be shown. One of the arguments passed to the signal handler is a 'Tooltip' object. This is the
--     object that we are about to display as a tooltip, and can be manipulated in your callback using
--     functions like 'tooltipSetIcon'. There are functions for setting the tooltip's markup,
--     setting an image from a stock icon, or even putting in a custom widget.
--
--   * Return 'True' from your query-tooltip handler. This causes the tooltip to be show. If you return
--    'False', it will not be shown.
--
-- In the probably rare case where you want to have even more control over the tooltip that is about to
-- be shown, you can set your own 'Window' which will be used as tooltip window. This works as
-- follows:
--
--   * Set 'hasTooltip' and connect to 'queryTooltip' as before.
--
--   * Use 'widgetSetTooltipWindow' to set a 'Window' created by you as tooltip window.
--
--   * In the 'queryTooltip' callback you can access your window using 'widgetGetTooltipWindow'
--     and manipulate as you wish. The semantics of the return value are exactly as before, return 'True'
--     to show the window, 'False' to not show it.

-- * Class Hierarchy
--
-- |
-- @
-- |  'GObject'
-- |   +----Tooltip
-- @

#if GTK_CHECK_VERSION(2,12,0)
-- * Types
  Tooltip,
  TooltipClass,
  castToTooltip,
  toTooltip,

-- * Methods
  tooltipSetMarkup,
  tooltipSetText,
  tooltipSetIcon,
  tooltipSetIconFromStock,
#if GTK_CHECK_VERSION(2,14,0)
  tooltipSetIconFromIconName,
#endif
  tooltipSetCustom,
  tooltipTriggerTooltipQuery,
  tooltipSetTipArea,
#ifdef HAVE_GIO
#if GTK_CHECK_VERSION(2,20,0)
  tooltipSetIconFromGIcon,
#endif
#endif
#endif
  ) where

#if GTK_CHECK_VERSION(2,12,0)

import Data.Maybe (fromMaybe)

import System.Glib.FFI
import System.Glib.UTFString
import Graphics.UI.Gtk.General.Structs  (IconSize(..), Rectangle)
{#import Graphics.UI.Gtk.Types#}
#ifdef HAVE_GIO
{#import System.GIO.Types#}
#endif

{# context lib="gtk" prefix="gtk" #}

--------------------
-- Methods

-- | Sets the text of the tooltip to be @markup@, which is marked up with the
-- Pango text markup language. If @markup@ is 'Nothing', the label will be hidden.
--
tooltipSetMarkup :: (TooltipClass self, GlibString markup) => self
 -> Maybe markup -- ^ @markup@ - a markup string (see Pango markup format) or 'Nothing'
 -> IO ()
tooltipSetMarkup self markup =
  maybeWith withUTFString markup $ \markupPtr ->
  {# call gtk_tooltip_set_markup #}
    (toTooltip self)
    markupPtr

-- | Sets the text of the tooltip to be @text@. If @text@ is 'Nothing'
-- the label will be hidden. See also 'tooltipSetMarkup'.
--
tooltipSetText :: (TooltipClass self, GlibString string) => self
 -> Maybe string -- ^ @text@ - a text string or 'Nothing'
 -> IO ()
tooltipSetText self text =
  maybeWith withUTFString text $ \textPtr ->
  {# call gtk_tooltip_set_text #}
    (toTooltip self)
    textPtr

-- | Sets the icon of the tooltip (which is in front of the text) to be
-- @pixbuf@. If @pixbuf@ is 'Nothing' the image will be hidden.
--
tooltipSetIcon :: TooltipClass self => self
  -> Maybe Pixbuf  -- ^ @pixbuf@ - a 'Pixbuf' or 'Nothing'
  -> IO ()
tooltipSetIcon self pixbuf =
  {#call tooltip_set_icon#}
    (toTooltip self)
    (fromMaybe (Pixbuf nullForeignPtr) pixbuf)

-- | Sets the icon of the tooltip (which is in front of the text) to be the
-- stock item indicated by @stockId@ with the size indicated by @size@. If
-- @stockId@ is 'Nothing' the image will be hidden.
--
tooltipSetIconFromStock :: (TooltipClass self, GlibString string) => self
  -> Maybe string -- ^ @id@ a stock id, or 'Nothing'
  -> IconSize -- ^ @size@ a stock icon size
  -> IO ()
tooltipSetIconFromStock self id size =
  maybeWith withUTFString id $ \ idPtr ->
  {#call tooltip_set_icon_from_stock#}
    (toTooltip self)
    idPtr
    ((fromIntegral . fromEnum) size)

#if GTK_CHECK_VERSION(2,14,0)
-- | Sets the icon of the tooltip (which is in front of the text) to be the
-- icon indicated by @iconName@ with the size indicated by @size@. If
-- @iconName@ is 'Nothing' the image will be hidden.
--
-- * Available since Gtk+ version 2.14
--
tooltipSetIconFromIconName :: (TooltipClass self, GlibString string) => self
  -> Maybe string -- ^ @iconName@ an icon name, or 'Nothing'
  -> IconSize  -- ^ @size@ a stock icon size
  -> IO ()
tooltipSetIconFromIconName self iconName size =
  maybeWith withUTFString iconName $ \ iconPtr ->
  {#call tooltip_set_icon_from_icon_name#}
    (toTooltip self)
    iconPtr
    ((fromIntegral . fromEnum) size)
#endif

-- | Replaces the widget packed into the tooltip with @customWidget@.
-- @customWidget@ does not get destroyed when the tooltip goes away. By default
-- a box with a 'Image' and 'Label' is embedded in the tooltip, which can be
-- configured using 'tooltipSetMarkup' and 'tooltipSetIcon'.
--
tooltipSetCustom :: (TooltipClass self, WidgetClass widget) => self
  -> Maybe widget  -- ^ @customWidget@ a 'Widget', or 'Nothing' to unset the old custom widget.
  -> IO ()
tooltipSetCustom self customWidget =
  {#call tooltip_set_custom#}
    (toTooltip self)
    (maybe (Widget nullForeignPtr) toWidget customWidget)

-- | Triggers a new tooltip query on @display@, in order to update the current
-- visible tooltip, or to show\/hide the current tooltip. This function is
-- useful to call when, for example, the state of the widget changed by a key
-- press.
--
tooltipTriggerTooltipQuery ::
    Display -- ^ @display@ - a 'Display'
 -> IO ()
tooltipTriggerTooltipQuery display =
  {# call gtk_tooltip_trigger_tooltip_query #}
    display

-- | Sets the area of the widget, where the contents of this tooltip apply, to
-- be @rect@ (in widget coordinates). This is especially useful for properly
-- setting tooltips on 'TreeView' rows and cells, 'IconView'
--
-- For setting tooltips on 'TreeView', please refer to the convenience
-- functions for this: 'treeViewSetTooltipRow' and 'treeViewSetTooltipCell'.
--
tooltipSetTipArea :: TooltipClass self => self -> Rectangle -> IO ()
tooltipSetTipArea self rect =
  with rect $ \ rectPtr ->
  {#call tooltip_set_tip_area#}
    (toTooltip self)
    (castPtr rectPtr)
#endif

#ifdef HAVE_GIO
#if GTK_CHECK_VERSION(2,20,0)
-- | Sets the icon of the tooltip (which is in front of the text) to be the icon indicated by gicon with
-- the size indicated by size. If gicon is 'Nothing', the image will be hidden.
tooltipSetIconFromGIcon :: TooltipClass self => self
                        -> Maybe Icon  -- ^ @gicon@   a GIcon representing the icon, or 'Nothing'. allow-none.
                        -> IconSize
                        -> IO ()
tooltipSetIconFromGIcon tooltip icon size =
  {#call gtk_tooltip_set_icon_from_gicon #}
    (toTooltip tooltip)
    (fromMaybe (Icon nullForeignPtr) icon)
    ((fromIntegral . fromEnum) size)
#endif
#endif