summaryrefslogtreecommitdiffstats
path: root/src/ui/widget/icon-widget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/widget/icon-widget.cpp')
-rw-r--r--src/ui/widget/icon-widget.cpp165
1 files changed, 165 insertions, 0 deletions
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 <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 "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 :