From 179fa413b047bede6e32109e2ce82437c5fb8d34 Mon Sep 17 00:00:00 2001 From: MenTaLguY Date: Mon, 16 Jan 2006 02:36:01 +0000 Subject: moving trunk for module inkscape (bzr r1) --- src/ui/widget/icon-widget.cpp | 165 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 src/ui/widget/icon-widget.cpp (limited to 'src/ui/widget/icon-widget.cpp') diff --git a/src/ui/widget/icon-widget.cpp b/src/ui/widget/icon-widget.cpp new file mode 100644 index 000000000..c456778b6 --- /dev/null +++ b/src/ui/widget/icon-widget.cpp @@ -0,0 +1,165 @@ +/** + * \brief Icon Widget + * + * Author: + * Bryce Harrington + * + * 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 +#endif + +#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)nr_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 : -- cgit v1.2.3