File indexing completed on 2024-07-21 05:07:34

0001 /***************************************************************************
0002  *   Copyright (C) 2005 by David Saxton                                    *
0003  *   david@bluehaze.org                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  ***************************************************************************/
0010 
0011 #include "solidshape.h"
0012 #include "libraryitem.h"
0013 #include "resizeoverlay.h"
0014 
0015 #include <KLocalizedString>
0016 #include <QPainter>
0017 #include <cmath>
0018 
0019 #include <algorithm>
0020 
0021 // BEGIN class DPRectangle
0022 Item *DPRectangle::construct(ItemDocument *itemDocument, bool newItem, const char *id)
0023 {
0024     return new DPRectangle(itemDocument, newItem, id);
0025 }
0026 
0027 LibraryItem *DPRectangle::libraryItem()
0028 {
0029     return new LibraryItem(QStringList(QString("dp/rectangle")), i18n("Rectangle"), i18n("Other"), QIcon::fromTheme("text"), LibraryItem::lit_drawpart, DPRectangle::construct);
0030 }
0031 
0032 DPRectangle::DPRectangle(ItemDocument *itemDocument, bool newItem, const char *id)
0033     : DrawPart(itemDocument, newItem, id ? id : "rectangle")
0034 {
0035     m_pRectangularOverlay = new RectangularOverlay(this);
0036     m_name = i18n("Rectangle");
0037 
0038     createProperty("background", Variant::Type::Bool);
0039     property("background")->setValue(false);
0040     property("background")->setCaption(i18n("Display Background"));
0041     property("background")->setAdvanced(true);
0042 
0043     createProperty("background-color", Variant::Type::Color);
0044     property("background-color")->setValue(QColor(Qt::white));
0045     property("background-color")->setCaption(i18n("Background Color"));
0046     property("background-color")->setAdvanced(true);
0047 
0048     createProperty("line-color", Variant::Type::Color);
0049     property("line-color")->setValue(QColor(Qt::black));
0050     property("line-color")->setCaption(i18n("Line Color"));
0051     property("line-color")->setAdvanced(true);
0052 
0053     createProperty("line-width", Variant::Type::Int);
0054     property("line-width")->setCaption(i18n("Line Width"));
0055     property("line-width")->setMinValue(1);
0056     property("line-width")->setMaxValue(1000);
0057     property("line-width")->setValue(1);
0058     property("line-width")->setAdvanced(true);
0059 
0060     createProperty("line-style", Variant::Type::PenStyle);
0061     property("line-style")->setAdvanced(true);
0062     property("line-style")->setCaption(i18n("Line Style"));
0063     setDataPenStyle("line-style", Qt::SolidLine);
0064 }
0065 
0066 DPRectangle::~DPRectangle()
0067 {
0068 }
0069 
0070 void DPRectangle::setSelected(bool yes)
0071 {
0072     if (yes == isSelected())
0073         return;
0074 
0075     DrawPart::setSelected(yes);
0076     m_pRectangularOverlay->showResizeHandles(yes);
0077 }
0078 
0079 void DPRectangle::dataChanged()
0080 {
0081     bool displayBackground = dataBool("background");
0082     QColor line_color = dataColor("line-color");
0083     unsigned width = unsigned(dataInt("line-width"));
0084     Qt::PenStyle style = getDataPenStyle("line-style");
0085 
0086     setPen(QPen(line_color, width, style));
0087 
0088     if (displayBackground)
0089         setBrush(dataColor("background-color"));
0090     else
0091         setBrush(Qt::NoBrush);
0092 
0093     postResize();
0094     update();
0095 }
0096 
0097 QSize DPRectangle::minimumSize() const
0098 {
0099     int side = std::max(16, pen().width() + 2);
0100     return QSize(side, side);
0101 }
0102 
0103 void DPRectangle::postResize()
0104 {
0105     setItemPoints(m_sizeRect, false);
0106 }
0107 
0108 QRect DPRectangle::drawRect() const
0109 {
0110     int lw = pen().width();
0111 
0112     if (lw > m_sizeRect.width())
0113         lw = m_sizeRect.width();
0114 
0115     if (lw > m_sizeRect.height())
0116         lw = m_sizeRect.height();
0117 
0118     return QRect(int(x() + m_sizeRect.x() + lw / 2), int(y() + m_sizeRect.y() + lw / 2), m_sizeRect.width() - lw, m_sizeRect.height() - lw);
0119 }
0120 
0121 void DPRectangle::drawShape(QPainter &p)
0122 {
0123     p.drawRect(drawRect());
0124 }
0125 // END class DPRectangle
0126 
0127 // BEGIN class DPEllipse
0128 Item *DPEllipse::construct(ItemDocument *itemDocument, bool newItem, const char *id)
0129 {
0130     return new DPEllipse(itemDocument, newItem, id);
0131 }
0132 
0133 LibraryItem *DPEllipse::libraryItem()
0134 {
0135     return new LibraryItem(QStringList(QString("dp/ellipse")), i18n("Ellipse"), i18n("Other"), QIcon::fromTheme("text"), LibraryItem::lit_drawpart, DPEllipse::construct);
0136 }
0137 
0138 DPEllipse::DPEllipse(ItemDocument *itemDocument, bool newItem, const char *id)
0139     : DPRectangle(itemDocument, newItem, id ? id : "ellipse")
0140 {
0141     m_name = i18n("Ellipse");
0142 }
0143 
0144 DPEllipse::~DPEllipse()
0145 {
0146 }
0147 
0148 void DPEllipse::postResize()
0149 {
0150     QRect br = m_sizeRect;
0151 
0152     // Make octagon that roughly covers ellipse
0153     QPolygon pa(8);
0154     pa[0] = QPoint(br.x() + br.width() / 4, br.y());
0155     pa[1] = QPoint(br.x() + 3 * br.width() / 4, br.y());
0156     pa[2] = QPoint(br.x() + br.width(), br.y() + br.height() / 4);
0157     pa[3] = QPoint(br.x() + br.width(), br.y() + 3 * br.height() / 4);
0158     pa[4] = QPoint(br.x() + 3 * br.width() / 4, br.y() + br.height());
0159     pa[5] = QPoint(br.x() + br.width() / 4, br.y() + br.height());
0160     pa[6] = QPoint(br.x(), br.y() + 3 * br.height() / 4);
0161     pa[7] = QPoint(br.x(), br.y() + br.height() / 4);
0162 
0163     setItemPoints(pa, false);
0164 }
0165 
0166 void DPEllipse::drawShape(QPainter &p)
0167 {
0168     p.drawEllipse(drawRect());
0169 }
0170 // END class SolidShape