Hello community, here is the log from the commit of package umbrello for openSUSE:Factory checked in at 2016-11-13 23:01:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/umbrello (Old) and /work/SRC/openSUSE:Factory/.umbrello.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "umbrello" Changes: -------- --- /work/SRC/openSUSE:Factory/umbrello/umbrello.changes 2016-10-18 10:42:34.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.umbrello.new/umbrello.changes 2016-11-13 23:01:05.000000000 +0100 @@ -1,0 +2,7 @@ +Wed Nov 9 06:29:53 UTC 2016 - lbeltrame@kde.org + +- Update to KDE Applications 16.08.3 + * KDE Applications 16.08.3 + * https://www.kde.org/announcements/announce-applications-16.08.3.php + +------------------------------------------------------------------- Old: ---- umbrello-16.08.2.tar.xz New: ---- umbrello-16.08.3.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ umbrello.spec ++++++ --- /var/tmp/diff_new_pack.hjGRI6/_old 2016-11-13 23:01:06.000000000 +0100 +++ /var/tmp/diff_new_pack.hjGRI6/_new 2016-11-13 23:01:06.000000000 +0100 @@ -24,7 +24,7 @@ License: GPL-2.0 and GFDL-1.2 Group: Development/Tools/Other Url: http://www.kde.org/ -Version: 16.08.2 +Version: 16.08.3 Release: 0 Source0: %{name}-%{version}.tar.xz BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ umbrello-16.08.2.tar.xz -> umbrello-16.08.3.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/CMakeLists.txt new/umbrello-16.08.3/CMakeLists.txt --- old/umbrello-16.08.2/CMakeLists.txt 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/CMakeLists.txt 2016-11-07 13:02:12.000000000 +0100 @@ -3,7 +3,7 @@ # KDE Application Version, managed by release script set (KDE_APPLICATIONS_VERSION_MAJOR "16") set (KDE_APPLICATIONS_VERSION_MINOR "08") -set (KDE_APPLICATIONS_VERSION_MICRO "2") +set (KDE_APPLICATIONS_VERSION_MICRO "3") set(UMBRELLO_VERSION_MAJOR "2") MATH(EXPR UMBRELLO_VERSION_MINOR "12+${KDE_APPLICATIONS_VERSION_MINOR}") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/codegenerators/cpp/cppwriter.cpp new/umbrello-16.08.3/umbrello/codegenerators/cpp/cppwriter.cpp --- old/umbrello-16.08.2/umbrello/codegenerators/cpp/cppwriter.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/codegenerators/cpp/cppwriter.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -27,6 +27,7 @@ #include "umlclassifierlistitemlist.h" #include "classifierlistitem.h" #include "codegenerationpolicy.h" +#include "enumliteral.h" // qt includes #include <QFile> @@ -395,8 +396,11 @@ uint i = 0; cpp << "enum " << className_ << " {" << m_endl; foreach (UMLClassifierListItem* lit, litList) { + UMLEnumLiteral *el = static_cast<UMLEnumLiteral *>(lit); QString enumLiteral = cleanName(lit->name()); cpp << indent() << enumLiteral; + if (!el->value().isEmpty()) + cpp << " = " << el->value(); if (++i < (uint)litList.count()) cpp << ","; cpp << m_endl; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/codeimport/kdevcppparser/cpptree2uml.cpp new/umbrello-16.08.3/umbrello/codeimport/kdevcppparser/cpptree2uml.cpp --- old/umbrello-16.08.2/umbrello/codeimport/kdevcppparser/cpptree2uml.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/codeimport/kdevcppparser/cpptree2uml.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -163,7 +163,7 @@ typeId == m_currentNamespace[m_nsCnt]->name()) inner = m_currentNamespace[m_nsCnt]; else - inner = Import_Utils::createUMLObject(UMLObject::ot_Class, typeId, + inner = Import_Utils::createUMLObject(UMLObject::ot_Class, type, m_currentNamespace[m_nsCnt]); UMLObject *typedefObj = Import_Utils::createUMLObject(UMLObject::ot_Datatype, id, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umldoc.cpp new/umbrello-16.08.3/umbrello/umldoc.cpp --- old/umbrello-16.08.2/umbrello/umldoc.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umldoc.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -2406,6 +2406,8 @@ } resolveTypes(); + loadDiagrams(); + // set a default code generator if no <XMI.extensions><codegeneration> tag seen if (UMLApp::app()->generator() == 0) { UMLApp::app()->setGenerator(UMLApp::app()->defaultLanguage()); @@ -2452,6 +2454,42 @@ qApp->processEvents(); // give UI events a chance } +/** + * Load all diagrams collected from the xmi file. + * + * Loading diagrams is implemented as additional pass to avoid unresolved + * uml objects which are defined later in the xmi file. + */ +bool UMLDoc::loadDiagrams() +{ + bool result = true; + DiagramsMap::const_iterator i; + for (i = m_diagramsToLoad.constBegin(); i != m_diagramsToLoad.constEnd(); i++) { + UMLFolder *f = i.key(); + foreach(QDomNode node, i.value()) + if (!f->loadDiagramsFromXMI(node)) + result = false; + } + + m_diagramsToLoad.clear(); + return result; +} + +/** + * Add a xml node containing a diagram to the list of diagrams to load. + * Helper function for @ref loadDiagrams(). + * + * @param folder pointer to UMFolder instance the diagrams belongs to + * @param node xml document node containing the diagram + */ +void UMLDoc::addDiagramToLoad(UMLFolder *folder, QDomNode node) +{ + if (m_diagramsToLoad.contains(folder)) + m_diagramsToLoad[folder].append(node); + else + m_diagramsToLoad[folder] = QList<QDomNode>() << node; +} + DiagramsModel *UMLDoc::diagramsModel() { return m_diagramsModel; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umldoc.h new/umbrello-16.08.3/umbrello/umldoc.h --- old/umbrello-16.08.2/umbrello/umldoc.h 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umldoc.h 2016-11-07 13:02:12.000000000 +0100 @@ -234,6 +234,8 @@ void writeToStatusBar(const QString &text); void resolveTypes(); + bool loadDiagrams(); + void addDiagramToLoad(UMLFolder *folder, QDomNode node); DiagramsModel *diagramsModel(); StereotypesModel *stereotypesModel(); @@ -316,6 +318,12 @@ DiagramsModel *m_diagramsModel; StereotypesModel *m_stereotypesModel; + /** + * Holds diagram xml nodes on loading + */ + typedef QMap<UMLFolder*, QList<QDomNode>> DiagramsMap; + DiagramsMap m_diagramsToLoad; + public slots: void slotRemoveUMLObject(UMLObject*o); void slotAutoSave(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umllistview.cpp new/umbrello-16.08.3/umbrello/umllistview.cpp --- old/umbrello-16.08.2/umbrello/umllistview.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umllistview.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -2504,29 +2504,11 @@ // The existing item was created by the slot event triggered // by the loading of the corresponding model object from the // XMI file. - // This early creation is done in order to support the loading - // of foreign XMI files that do not have the umbrello specific - // <listview> tag. - // However, now that we encountered the real <listview> info, - // we need to delete the existing item: Its parent is always - // one of the default predefined folders, but the actual - // listview item might be located in a user created folder. - // Thanks to Achim Spangler for spotting the problem. UMLListViewItem *itmParent = dynamic_cast<UMLListViewItem*>(item->parent()); - DEBUG(DBG_SRC) << item->text(0) << " parent " + DEBUG(DBG_SRC) << "Loaded <listview> entry does not match uml model" + << item->text(0) << " parent " << parent->text(0) << " (" << parent << ") != " << itmParent->text(0) << " (" << itmParent << ")"; - if (item == m_datatypeFolder && itmParent == m_lv[Uml::ModelType::Logical]) { - DEBUG(DBG_SRC) << "Reparenting the Datatypes folder is prohibited"; - } else { - UMLListViewItem *newItem = moveObject(nID, lvType, parent); - item = newItem; - if (item) { - DEBUG(DBG_SRC) << "Attempted reparenting of " << item->text(0) - << "(current parent: " << (itmParent ? itmParent->text(0) : QLatin1String("0")) - << ", new parent: " << parent->text(0) << ")"; - } - } } break; case UMLListViewItem::lvt_Attribute: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umlmodel/folder.cpp new/umbrello-16.08.3/umbrello/umlmodel/folder.cpp --- old/umbrello-16.08.2/umbrello/umlmodel/folder.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umlmodel/folder.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -376,8 +376,9 @@ * Auxiliary to load(): * Load the diagrams from the "diagrams" in the <XMI.extension> */ -bool UMLFolder::loadDiagramsFromXMI(QDomNode& diagrams) +bool UMLFolder::loadDiagramsFromXMI(QDomNode& node) { + QDomNode diagrams = node.firstChild(); const Settings::OptionState optionState = Settings::optionState(); UMLDoc *umldoc = UMLApp::app()->document(); bool totalSuccess = true; @@ -484,9 +485,7 @@ QDomElement el = xtnode.toElement(); const QString xtag = el.tagName(); if (xtag == QLatin1String("diagrams")) { - QDomNode diagramNode = xtnode.firstChild(); - if (!loadDiagramsFromXMI(diagramNode)) - totalSuccess = false; + umldoc->addDiagramToLoad(this, xtnode); } else if (xtag == QLatin1String("external_file")) { #if QT_VERSION >= 0x050000 const QString rootDir(umldoc->url().adjusted(QUrl::RemoveFilename).path()); @@ -534,6 +533,16 @@ continue; } } + // check for invalid namespaces + QString ns = tempElement.attribute(QLatin1String("namespace")); + Uml::ID::Type id = Uml::ID::fromString(ns); + if (id != this->id()) { + uError() << "namespace" << ns << "not present; ignoring object with id" << idStr; + delete pObject; + pObject = 0; + totalSuccess = false; + continue; + } pObject->setUMLPackage(this); if (!pObject->loadFromXMI(tempElement)) { removeObject(pObject); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umlmodel/folder.h new/umbrello-16.08.3/umbrello/umlmodel/folder.h --- old/umbrello-16.08.2/umbrello/umlmodel/folder.h 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umlmodel/folder.h 2016-11-07 13:02:12.000000000 +0100 @@ -70,7 +70,7 @@ void save(QDomDocument& qDoc, QDomElement& qElement); - bool loadDiagramsFromXMI(QDomNode& diagrams); + bool loadDiagramsFromXMI(QDomNode& node); bool loadFolderFile(const QString& path); @@ -87,6 +87,8 @@ */ QString m_folderFile; UMLViewList m_diagrams; + + friend class UMLDoc; }; #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umlwidgets/associationwidget.cpp new/umbrello-16.08.3/umbrello/umlwidgets/associationwidget.cpp --- old/umbrello-16.08.2/umbrello/umlwidgets/associationwidget.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umlwidgets/associationwidget.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -3928,6 +3928,13 @@ { //TODO: ADD SUPPORT FOR ASSOC. ON SEQ. DIAGRAMS WHEN NOTES BACK IN. moveMidPointsBy(x, y); + // multi select + if (umlScene()->selectedCount() > 1) { + QPointF d(x, y); + QPointF s = m_associationLine->startPoint() + d; + QPointF e = m_associationLine->endPoint() + d; + m_associationLine->setEndPoints(s, e); + } calculateEndingPoints(); calculateNameTextSegment(); resetTextPositions(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umlwidgets/classifierwidget.cpp new/umbrello-16.08.3/umbrello/umlwidgets/classifierwidget.cpp --- old/umbrello-16.08.2/umbrello/umlwidgets/classifierwidget.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umlwidgets/classifierwidget.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -75,7 +75,7 @@ setShowAttSigs(ops.classState.showAttSig); if (c && c->isInterface()) { - m_baseType = WidgetBase::wt_Interface; + setBaseType(WidgetBase::wt_Interface); m_visualProperties = ShowOperations | ShowVisibility | ShowStereotype; setShowStereotype(true); updateSignatureTypes(); @@ -1152,7 +1152,7 @@ */ void ClassifierWidget::changeToClass() { - m_baseType = WidgetBase::wt_Class; + setBaseType(WidgetBase::wt_Class); m_umlObject->setBaseType(UMLObject::ot_Class); setVisualPropertyCmd(DrawAsCircle, false); const Settings::OptionState& ops = m_scene->optionState(); @@ -1170,7 +1170,7 @@ */ void ClassifierWidget::changeToInterface() { - m_baseType = WidgetBase::wt_Interface; + setBaseType(WidgetBase::wt_Interface); m_umlObject->setBaseType(UMLObject::ot_Interface); setVisualProperty(ShowAttributes, false); @@ -1186,7 +1186,7 @@ */ void ClassifierWidget::changeToPackage() { - m_baseType = WidgetBase::wt_Package; + setBaseType(WidgetBase::wt_Package); m_umlObject->setBaseType(UMLObject::ot_Package); setVisualProperty(ShowAttributes, false); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umlwidgets/pinportbase.cpp new/umbrello-16.08.3/umbrello/umlwidgets/pinportbase.cpp --- old/umbrello-16.08.2/umbrello/umlwidgets/pinportbase.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umlwidgets/pinportbase.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -318,8 +318,9 @@ */ void PinPortBase::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) { - QDomElement element = qDoc.createElement(m_baseType == wt_Pin ? QLatin1String("pinwidget") + QDomElement element = qDoc.createElement(baseType() == wt_Pin ? QLatin1String("pinwidget") : QLatin1String("portwidget")); + Q_ASSERT(ownerWidget() != NULL); element.setAttribute(QLatin1String("widgetaid"), Uml::ID::toString(ownerWidget()->id())); UMLWidget::saveToXMI(qDoc, element); if (m_pName && !m_pName->text().isEmpty()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umlwidgets/portwidget.cpp new/umbrello-16.08.3/umbrello/umlwidgets/portwidget.cpp --- old/umbrello-16.08.2/umbrello/umlwidgets/portwidget.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umlwidgets/portwidget.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -69,6 +69,7 @@ */ void PortWidget::connectOwnerMotion() { + Q_ASSERT(ownerWidget()->baseType() == WidgetBase::wt_Component); ComponentWidget *owner = static_cast<ComponentWidget*>(ownerWidget()); connect(owner, SIGNAL(sigCompMoved(qreal,qreal)), this, SLOT(slotOwnerMoved(qreal,qreal))); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umlwidgets/umlwidget.cpp new/umbrello-16.08.3/umbrello/umlwidgets/umlwidget.cpp --- old/umbrello-16.08.2/umbrello/umlwidgets/umlwidget.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umlwidgets/umlwidget.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -138,7 +138,7 @@ if (this == &other) return true; - if (m_baseType != other.m_baseType) { + if (baseType() != other.baseType()) { return false; } @@ -506,6 +506,7 @@ DEBUG(DBG_SRC) << "diffX=" << diffX << " / diffY=" << diffY; foreach(UMLWidget* widget, umlScene()->selectedWidgets()) { widget->moveWidgetBy(diffX, diffY); + widget->adjustUnselectedAssocs(delta.x(), delta.y()); widget->slotSnapToGrid(); } @@ -654,7 +655,7 @@ void UMLWidget::updateWidget() { updateGeometry(); - switch (m_baseType) { + switch (baseType()) { case WidgetBase::wt_Class: m_scene->createAutoAttributeAssociations(this); break; @@ -981,7 +982,7 @@ */ bool UMLWidget::activate(IDChangeLog* /*ChangeLog = 0 */) { - if (widgetHasUMLObject(m_baseType) && m_umlObject == NULL) { + if (widgetHasUMLObject(baseType()) && m_umlObject == NULL) { m_umlObject = m_doc->findObjectById(m_nId); if (m_umlObject == NULL) { uError() << "cannot find UMLObject with id=" << Uml::ID::toString(m_nId); @@ -1324,7 +1325,7 @@ void UMLWidget::setSelected(bool _select) { WidgetBase::setSelected(_select); - const WidgetBase::WidgetType wt = m_baseType; + const WidgetBase::WidgetType wt = baseType(); if (_select) { if (m_scene->selectedCount() == 0) { if (widgetHasUMLObject(wt)) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umlwidgets/widgetbase.cpp new/umbrello-16.08.3/umbrello/umlwidgets/widgetbase.cpp --- old/umbrello-16.08.2/umbrello/umlwidgets/widgetbase.cpp 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umlwidgets/widgetbase.cpp 2016-11-07 13:02:12.000000000 +0100 @@ -53,6 +53,7 @@ m_usesDiagramLineColor(true), m_usesDiagramLineWidth(true) { + Q_ASSERT(m_baseType > wt_MIN && m_baseType < wt_MAX); // Note: no virtual methods from derived classes available, // this operation need to be finished in derived class constructor. setLineColor(QColor("black")); @@ -88,14 +89,25 @@ */ WidgetBase::WidgetType WidgetBase::baseType() const { + Q_ASSERT(m_baseType > wt_MIN && m_baseType < wt_MAX); return m_baseType; } /** + * Set property m_baseType. Used for types changing their types during runtime. + */ +void WidgetBase::setBaseType(const WidgetType& baseType) +{ + Q_ASSERT(baseType > wt_MIN && baseType < wt_MAX); + m_baseType = baseType; +} + +/** * @return The type used for rtti as string. */ QLatin1String WidgetBase::baseTypeStr() const { + Q_ASSERT(m_baseType > wt_MIN && m_baseType < wt_MAX); return QLatin1String(ENUM_NAME(WidgetBase, WidgetType, m_baseType)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-16.08.2/umbrello/umlwidgets/widgetbase.h new/umbrello-16.08.3/umbrello/umlwidgets/widgetbase.h --- old/umbrello-16.08.2/umbrello/umlwidgets/widgetbase.h 2016-10-07 01:13:32.000000000 +0200 +++ new/umbrello-16.08.3/umbrello/umlwidgets/widgetbase.h 2016-11-07 13:02:12.000000000 +0100 @@ -41,7 +41,8 @@ public: enum WidgetType { - wt_UMLWidget = 300, // does not have UMLObject representation + wt_MIN = 299, // lower bounds check value + wt_UMLWidget, // does not have UMLObject representation wt_Actor, // has UMLObject representation wt_UseCase, // has UMLObject representation wt_Class, // has UMLObject representation @@ -70,7 +71,8 @@ wt_ObjectNode, wt_Region, wt_Category, // has UMLObject representation - wt_Port // has UMLObject representation + wt_Port, // has UMLObject representation + wt_MAX // upper bounds check value }; static QString toString(WidgetType wt); @@ -86,6 +88,7 @@ void setID(Uml::ID::Type id); WidgetType baseType() const; + void setBaseType(const WidgetType& baseType); QLatin1String baseTypeStr() const; virtual void setSelected(bool select); @@ -156,7 +159,9 @@ protected: virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); +private: WidgetType m_baseType; ///< Type of widget. +protected: UMLScene *m_scene; QPointer<UMLObject> m_umlObject; QString m_Doc; ///< Only used if m_umlObject is not set.