* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* SECTION:gtkarrow
* @Short_description: Displays an arrow
* @Title: GtkArrow
- * @See_also: gtk_paint_arrow()
+ * @See_also: gtk_render_arrow()
*
* GtkArrow should be used to draw simple arrows that need to point in
* one of the four cardinal directions (up, down, left, or right). The
#include <math.h>
#include "gtkarrow.h"
#include "gtksizerequest.h"
+#include "gtktypebuiltins.h"
#include "gtkprivate.h"
#include "gtkintl.h"
+#include "a11y/gtkarrowaccessible.h"
+
#define MIN_ARROW_SIZE 15
struct _GtkArrowPrivate
GTK_PARAM_READABLE));
g_type_class_add_private (class, sizeof (GtkArrowPrivate));
+
+ gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ARROW_ACCESSIBLE);
}
static void
gint *minimum_size,
gint *natural_size)
{
- gint xpad;
+ GtkBorder border;
- gtk_misc_get_padding (GTK_MISC (widget), &xpad, NULL);
+ _gtk_misc_get_padding_and_border (GTK_MISC (widget), &border);
if (minimum_size)
- *minimum_size = MIN_ARROW_SIZE + xpad * 2;
+ *minimum_size = MIN_ARROW_SIZE + border.left + border.right;
if (natural_size)
- *natural_size = MIN_ARROW_SIZE + xpad * 2;
+ *natural_size = MIN_ARROW_SIZE + border.left + border.right;
}
static void
gint *minimum_size,
gint *natural_size)
{
- gint ypad;
+ GtkBorder border;
- gtk_misc_get_padding (GTK_MISC (widget), NULL, &ypad);
+ _gtk_misc_get_padding_and_border (GTK_MISC (widget), &border);
if (minimum_size)
- *minimum_size = MIN_ARROW_SIZE + ypad * 2;
+ *minimum_size = MIN_ARROW_SIZE + border.top + border.bottom;
if (natural_size)
- *natural_size = MIN_ARROW_SIZE + ypad * 2;
+ *natural_size = MIN_ARROW_SIZE + border.top + border.bottom;
}
-
/**
* gtk_arrow_new:
* @arrow_type: a valid #GtkArrowType.
}
}
-
static gboolean
gtk_arrow_draw (GtkWidget *widget,
cairo_t *cr)
{
GtkArrow *arrow = GTK_ARROW (widget);
GtkArrowPrivate *priv = arrow->priv;
- GtkMisc *misc = GTK_MISC (widget);
- GtkShadowType shadow_type;
- GtkStateType state;
- gint x, y, width, height;
+ GtkStyleContext *context;
+ gdouble x, y;
+ gint width, height;
gint extent;
- gint xpad, ypad;
+ GtkBorder border;
gfloat xalign, yalign;
GtkArrowType effective_arrow_type;
gfloat arrow_scaling;
+ gdouble angle;
+
+ if (priv->arrow_type == GTK_ARROW_NONE)
+ return FALSE;
+ context = gtk_widget_get_style_context (widget);
gtk_widget_style_get (widget, "arrow-scaling", &arrow_scaling, NULL);
- gtk_misc_get_padding (misc, &xpad, &ypad);
- gtk_misc_get_alignment (misc, &xalign, &yalign);
+ _gtk_misc_get_padding_and_border (GTK_MISC (widget), &border);
+ gtk_misc_get_alignment (GTK_MISC (widget), &xalign, &yalign);
- width = gtk_widget_get_allocated_width (widget);
- height = gtk_widget_get_allocated_height (widget);
+ width = gtk_widget_get_allocated_width (widget) - border.left - border.right;
+ height = gtk_widget_get_allocated_height (widget) - border.top - border.bottom;
- extent = MIN (width - 2 * xpad, height - 2 * ypad) * arrow_scaling;
+ extent = MIN (width, height) * arrow_scaling;
effective_arrow_type = priv->arrow_type;
if (gtk_widget_get_direction (widget) != GTK_TEXT_DIR_LTR)
effective_arrow_type = GTK_ARROW_LEFT;
}
- x = floor (xpad + ((width - extent) * xalign));
- y = floor (ypad + ((height - extent) * yalign));
-
- shadow_type = priv->shadow_type;
- state = gtk_widget_get_state (widget);
+ x = border.left + ((width - extent) * xalign);
+ y = border.top + ((height - extent) * yalign);
- if (state == GTK_STATE_ACTIVE)
+ switch (effective_arrow_type)
{
- if (shadow_type == GTK_SHADOW_IN)
- shadow_type = GTK_SHADOW_OUT;
- else if (shadow_type == GTK_SHADOW_OUT)
- shadow_type = GTK_SHADOW_IN;
- else if (shadow_type == GTK_SHADOW_ETCHED_IN)
- shadow_type = GTK_SHADOW_ETCHED_OUT;
- else if (shadow_type == GTK_SHADOW_ETCHED_OUT)
- shadow_type = GTK_SHADOW_ETCHED_IN;
+ case GTK_ARROW_UP:
+ angle = 0;
+ break;
+ case GTK_ARROW_RIGHT:
+ angle = G_PI / 2;
+ break;
+ case GTK_ARROW_DOWN:
+ angle = G_PI;
+ break;
+ case GTK_ARROW_LEFT:
+ default:
+ angle = (3 * G_PI) / 2;
+ break;
}
- gtk_paint_arrow (gtk_widget_get_style (widget), cr,
- state, shadow_type,
- widget, "arrow",
- effective_arrow_type, TRUE,
- x, y, extent, extent);
+ gtk_render_arrow (context, cr, angle, x, y, extent);
return FALSE;
}