[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