[Uml-devel] branches/work/soc-umbrello/umbrello
Gopala Krishna A
krishna.ggk at gmail.com
Sun Jul 13 07:40:28 UTC 2008
SVN commit 831721 by gopala:
1) Ported UseCaseWidget to use TextItems.
2) Very small refactor : Changed TextItemGroup::ensureTextItemNumbers to TextItemGroup::ensureTextItemCount.
This is the last commit from me as part of kde.in monsoon hackathon :-)
M +1 -1 activitywidget.cpp
M +1 -1 datatypewidget.cpp
M +1 -1 notewidget.cpp
M +1 -1 textitemgroup.cpp
M +1 -1 textitemgroup.h
M +73 -46 usecasewidget.cpp
M +21 -29 usecasewidget.h
M +2 -2 widget_factory.cpp
--- branches/work/soc-umbrello/umbrello/activitywidget.cpp #831720:831721
@@ -176,7 +176,7 @@
dummy.setAlignment(Qt::AlignCenter);
dummy.setBackgroundBrush(Qt::NoBrush);
- m_textItemGroup->ensureTextItemNumbers(maxItemCount);
+ m_textItemGroup->ensureTextItemCount(maxItemCount);
switch(m_activityType) {
case Normal:
--- branches/work/soc-umbrello/umbrello/datatypewidget.cpp #831720:831721
@@ -97,7 +97,7 @@
dummy.setAlignment(Qt::AlignCenter);
dummy.setBackgroundBrush(Qt::NoBrush);
- m_textItemGroup->ensureTextItemNumbers(totalItemCount);
+ m_textItemGroup->ensureTextItemCount(totalItemCount);
TextItem *stereo = m_textItemGroup->textItemAt(DatatypeWidget::StereoTypeItemIndex);
stereo->setText(umlObject()->getStereotype(true));
--- branches/work/soc-umbrello/umbrello/notewidget.cpp #831720:831721
@@ -191,7 +191,7 @@
void NoteWidget::updateGeometry()
{
- m_textItemGroup->ensureTextItemNumbers(TextItemCount);
+ m_textItemGroup->ensureTextItemCount(TextItemCount);
TextItem dummy("");
dummy.setDefaultTextColor(fontColor());
--- branches/work/soc-umbrello/umbrello/textitemgroup.cpp #831720:831721
@@ -194,7 +194,7 @@
}
}
-void TextItemGroup::ensureTextItemNumbers(int newSize)
+void TextItemGroup::ensureTextItemCount(int newSize)
{
while(size() < newSize) {
appendTextItem(new TextItem(""));
--- branches/work/soc-umbrello/umbrello/textitemgroup.h #831720:831721
@@ -75,7 +75,7 @@
void unparent();
void reparent();
- void ensureTextItemNumbers(int count);
+ void ensureTextItemCount(int count);
private:
QGraphicsItem *m_parentItem;
--- branches/work/soc-umbrello/umbrello/usecasewidget.cpp #831720:831721
@@ -11,66 +11,93 @@
// own header file
#include "usecasewidget.h"
-// system includes
-#include <qpainter.h>
-#include <kdebug.h>
-// local includes
+
+// app includes
+#include "textitemgroup.h"
+#include "textitem.h"
+#include "umlview.h"
#include "usecase.h"
-#include "umlview.h"
+// qt includes
+#include <QtGui/QPainter>
-UseCaseWidget::UseCaseWidget(UMLScene * view, UMLUseCase *o) : NewUMLRectWidget(view, o) {
- NewUMLRectWidget::setBaseType(Uml::wt_UseCase);
- //updateComponentSize(); Doing this during loadFromXMI() gives futile updates.
- // Instead, it is done afterwards by NewUMLRectWidget::activate()
+const qreal UseCaseWidget::Margin = 5;
+
+/**
+ * Creates a UseCase widget.
+ *
+ * @param o The UMLObject to represent.
+ */
+UseCaseWidget::UseCaseWidget(UMLUseCase *o) : NewUMLRectWidget(o)
+{
+ m_baseType = Uml::wt_UseCase;
+ m_textItemGroup = new TextItemGroup(this);
}
-UseCaseWidget::~UseCaseWidget() {}
+/**
+ * destructor
+ */
+UseCaseWidget::~UseCaseWidget()
+{
+}
void UseCaseWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *o, QWidget *)
{
- QPainter &p = *painter;
- qreal offsetX = 0, offsetY = 0;
+ painter->setPen(QPen(lineColor(), lineWidth()));
+ painter->setBrush(brush());
- setPenFromSettings(p);
- if ( NewUMLRectWidget::getUseFillColour() )
- p.setBrush( NewUMLRectWidget::getFillColour() );
- QFont font = NewUMLRectWidget::getFont();
- font.setUnderline(false);
- font.setBold(false);
- font.setItalic( umlObject()->getAbstract() );
- p.setFont( font );
- const QFontMetrics &fm = getFontMetrics(FT_NORMAL);
- const int fontHeight = fm.lineSpacing();
- const int w = getWidth();
- const int h = getHeight();
- //int middleX = w / 2;
- const int textStartY = (h / 2) - (fontHeight / 2);
+ painter->drawEllipse(rect());
+ // The text part is drawn by the TextItemGroup and TextItem within it.
+}
- p.drawEllipse(offsetX, offsetY, w, h);
- p.setPen(Qt::black);
- p.drawText(offsetX + UC_MARGIN, offsetY + textStartY, w - UC_MARGIN * 2, fontHeight, Qt::AlignCenter, getName());
- setPenFromSettings(p);
- if(isSelected())
- drawSelected(&p, offsetX, offsetY);
+/**
+ * Saves this UseCase to file.
+ */
+void UseCaseWidget::saveToXMI( QDomDocument & qDoc, QDomElement & qElement ) {
+ QDomElement usecaseElement = qDoc.createElement( "usecasewidget" );
+ NewUMLRectWidget::saveToXMI( qDoc, usecaseElement );
+ qElement.appendChild( usecaseElement );
}
-QSizeF UseCaseWidget::calculateSize() {
- const NewUMLRectWidget::FontType ft = ( umlObject()->getAbstract() ? FT_BOLD_ITALIC : FT_BOLD );
- const QFontMetrics &fm = NewUMLRectWidget::getFontMetrics(ft);
- const int fontHeight = fm.lineSpacing();
- const int textWidth = fm.width(getName());
- int width = textWidth > UC_WIDTH?textWidth:UC_WIDTH;
- int height = UC_HEIGHT + fontHeight + UC_MARGIN;
+QSizeF UseCaseWidget::sizeHint(Qt::SizeHint which)
+{
+ if(which == Qt::MinimumSize) {
+ return m_minimumSize;
+ }
+ return NewUMLRectWidget::sizeHint(which);
+}
- width += UC_MARGIN * 2;
+void UseCaseWidget::updateGeometry()
+{
+ if(umlObject()) {
+ m_textItemGroup->ensureTextItemCount(UseCaseWidget::TextItemCount);
- return QSizeF(width, height);
+ TextItem *nameItem = m_textItemGroup->textItemAt(UseCaseWidget::NameItemIndex);
+ // Hide and then change visuals to compress many updates to one.
+ nameItem->hide();
+ // Apply the properties
+ nameItem->setDefaultTextColor(fontColor());
+ nameItem->setFont(font());
+ nameItem->setAlignment(Qt::AlignCenter);
+ nameItem->setBackgroundBrush(Qt::NoBrush);
+ nameItem->setText(name());
+ nameItem->setItalic(umlObject()->getAbstract());
+ // Now show the item back
+ nameItem->show();
+
+ m_minimumSize = m_textItemGroup->calculateMinimumSize();
+ m_minimumSize += QSizeF(UseCaseWidget::Margin * 2, UseCaseWidget::Margin * 2);
+ }
+ NewUMLRectWidget::updateGeometry();
}
-void UseCaseWidget::saveToXMI( QDomDocument & qDoc, QDomElement & qElement ) {
- QDomElement usecaseElement = qDoc.createElement( "usecasewidget" );
- NewUMLRectWidget::saveToXMI( qDoc, usecaseElement );
- qElement.appendChild( usecaseElement );
+void UseCaseWidget::sizeHasChanged(const QSizeF& oldSize)
+{
+ const QSizeF groupSize = size() - QSizeF(UseCaseWidget::Margin * 2, UseCaseWidget::Margin * 2);
+ const QPointF offset(UseCaseWidget::Margin, UseCaseWidget::Margin);
+
+ m_textItemGroup->alignVertically(groupSize);
+ m_textItemGroup->setPos(offset);
+
+ NewUMLRectWidget::sizeHasChanged(oldSize);
}
-
--- branches/work/soc-umbrello/umbrello/usecasewidget.h #831720:831721
@@ -11,14 +11,11 @@
#ifndef USECASEWIDGET_H
#define USECASEWIDGET_H
+
#include "umlwidget.h"
-#define UC_MARGIN 5
-#define UC_WIDTH 60
-#define UC_HEIGHT 30
-
-
class UMLUseCase;
+class TextItemGroup;
/**
* This class is the graphical version of a UMLUseCase. A UseCaseWidget is created
@@ -33,42 +30,37 @@
*
* @short A graphical version of a UMLUseCase.
* @author Paul Hensgen <phensgen at techie.com>
+ * @author Gopala Krishna (port using TextItem)
* Bugs and comments to uml-devel at lists.sf.net or http://bugs.kde.org
*/
-class UseCaseWidget : public NewUMLRectWidget {
+class UseCaseWidget : public NewUMLRectWidget
+{
public:
- /**
- * Creates a UseCase widget.
- *
- * @param view The parent of the widget.
- * @param o The UMLObject to represent.
- */
- UseCaseWidget(UMLScene * view, UMLUseCase *o);
-
-
- /**
- * destructor
- */
+ UseCaseWidget(UMLUseCase *o);
virtual ~UseCaseWidget();
- /**
- * Overrides the standard paint event.
- */
void paint(QPainter *p, const QStyleOptionGraphicsItem *item, QWidget *w);
- /**
- * Saves this UseCase to file.
- */
+ // For loading we can use the loadFromXMI() inherited from
+ // NewUMLRectWidget.
void saveToXMI( QDomDocument & qDoc, QDomElement & qElement );
- // For loading we can use the loadFromXMI() inherited from NewUMLRectWidget.
+ QSizeF sizeHint(Qt::SizeHint which);
protected:
- /**
- * Overrides method from NewUMLRectWidget
- */
- QSizeF calculateSize();
+ void updateGeometry();
+ void sizeHasChanged(const QSizeF& oldSize);
+
+private:
+ enum {
+ NameItemIndex,
+ TextItemCount
+ };
+ static const qreal Margin;
+
+ TextItemGroup *m_textItemGroup;
+ QSizeF m_minimumSize;
};
#endif
--- branches/work/soc-umbrello/umbrello/widget_factory.cpp #831720:831721
@@ -82,7 +82,7 @@
newWidget = new ActorWidget(scene, static_cast<UMLActor*>(o));
break;
case Uml::ot_UseCase:
- newWidget = new UseCaseWidget(scene, static_cast<UMLUseCase*>(o));
+ newWidget = new UseCaseWidget(static_cast<UMLUseCase*>(o));
break;
case Uml::ot_Package:
newWidget = new PackageWidget(static_cast<UMLPackage*>(o));
@@ -235,7 +235,7 @@
widget = new ActorWidget(scene, static_cast<UMLActor*>(o));
} else if (tag == "usecasewidget" || tag == "UML:UseCaseWidget") {
if (validateObjType(Uml::ot_UseCase, o, id))
- widget = new UseCaseWidget(scene, static_cast<UMLUseCase*>(o));
+ widget = new UseCaseWidget(static_cast<UMLUseCase*>(o));
} else if (tag == "classwidget" || tag == "UML:ClassWidget") {
if (validateObjType(Uml::ot_Class, o, id))
widget = new ClassifierWidget(scene, static_cast<UMLClassifier*>(o));
More information about the umbrello-devel
mailing list