icon-widget.cpp revision 68e3bfbbc1aac7dac3e9c06487047f0377b2b3cd
/**
* \brief Icon Widget
*
* Author:
* Bryce Harrington <bryce@bryceharrington.org>
*
* Copyright (C) 2004 Bryce Harrington
* based on work by Lauris Kaplinski in 2002 released under GPL
*
* Released under GNU GPL. Read the file 'COPYING' for more information
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <glib/gmem.h>
#include "icon-widget.h"
namespace Inkscape {
namespace UI {
namespace Widget {
/**
* General purpose icon widget, supporting SVG, etc. icon loading
*
* \param ...
*
* An icon widget is a ...
*/
IconWidget::IconWidget()
{
_pb = NULL;
_size = 0;
}
IconWidget::IconWidget(int unsigned size, int unsigned scale, gchar const *name)
{
_size = std::max((int unsigned)128, std::min(size, (int unsigned)1));
char c[256];
g_snprintf (c, 256, "%d:%d:%s", _size, scale, name);
guchar *pixels = image_load_gtk(name, _size, scale);
if (pixels == NULL) {
g_warning("Couldn't find matching icon for %s - has this application been installed?", name);
_pb = NULL;
} else {
/* TODO
_pb = gdk_pixbuf_new_from_data(pixels, GDK_COLORSPACE_RGB,
TRUE, 8, _size, _size, _size * 4,
(GdkPixbufDestroyNotify)g_free, NULL);
*/
}
}
IconWidget::IconWidget(int unsigned size, guchar const */*px*/)
{
_size = std::max((int unsigned)128, std::min(size, (int unsigned)1));
/*
_pb = gdk_pixbuf_new_from_data((guchar *)px, GDK_COLORSPACE_RGB,
TRUE, 8, _size, _size, _size * 4, NULL, NULL);
*/
}
IconWidget::~IconWidget() {
}
void IconWidget::size_request(Gtk::Requisition &requisition)
{
requisition.width = _size;
requisition.height = _size;
}
void IconWidget::size_allocate(Gtk::Allocation const &allocation)
{
Gtk::Widget::size_allocate(allocation);
if (this->is_drawable()) {
this->queue_draw();
}
}
int IconWidget::expose(GdkEventExpose *event)
{
if (this->is_drawable()) {
paint(&(event->area));
}
return true;
}
void IconWidget::paint(GdkRectangle const *area)
{
Gtk::Allocation allocation = get_allocation();
int const x_pad = std::max(0, (allocation.get_width() - _size)/2);
int const y_pad = std::max(0, (allocation.get_height() - _size)/2);
int const x_max = std::max(area->x, allocation.get_x() + x_pad);
int const y_max = std::max(area->y, allocation.get_y() + y_pad);
int const x_min = std::min(area->x + area->width,
allocation.get_x() + x_pad + _size);
int const y_min = std::min(area->y + area->height,
allocation.get_y() + y_pad + _size);
if (_pb) {
gdk_draw_pixbuf(this->get_window()->gobj(), NULL, _pb,
x_max - allocation.get_x() - x_pad,
y_max - allocation.get_y() - y_pad,
x_max, y_max,
x_min - x_max, y_min - y_max,
GDK_RGB_DITHER_NORMAL, x_max, y_max);
}
}
guchar* IconWidget::image_load(gchar const *name, int unsigned size, int unsigned scale)
{
guchar *px;
if (_do_bitmap_icons) {
px = image_load_pixmap(name, size, scale);
if (!px) {
px = image_load_svg(name, size, scale);
}
} else {
px = image_load_svg(name, size, scale);
if (!px) {
px = image_load_pixmap(name, size, scale);
}
}
return px;
}
guchar* IconWidget::image_load_pixmap(gchar const */*name*/, int unsigned /*size*/, int unsigned /*scale*/)
{
// TODO
return NULL;
}
guchar* IconWidget::image_load_svg(gchar const */*name*/, int unsigned /*size*/, int unsigned /*scale*/)
{
// TODO
return NULL;
}
guchar* IconWidget::image_load_gtk(gchar const */*name*/, int unsigned /*size*/, int unsigned /*scale*/)
{
// TODO
return NULL;
}
} // namespace Widget
} // namespace UI
} // namespace Inkscape
/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
c-file-offsets:((innamespace . 0)(inline-open . 0))
indent-tabs-mode:nil
fill-column:99
End:
*/
// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :