← Back to team overview

ubuntu-touch-coreapps-reviewers team mailing list archive

Re: [Merge] lp:~mzanetti/reminders-app/contenthub-import into lp:reminders-app

 

Review: Needs Fixing

Looks good (just three little things to change if you don't mind).


Diff comments:

> === modified file 'CMakeLists.txt'
> --- CMakeLists.txt	2015-02-16 22:01:20 +0000
> +++ CMakeLists.txt	2015-06-15 00:00:45 +0000
> @@ -74,6 +74,7 @@
>          reminders.url-dispatcher
>          push-helper.json
>          push-helper.apparmor
> +        reminders-contenthub.json
>          DESTINATION ${CMAKE_INSTALL_PREFIX})
>  install(FILES COPYING DESTINATION ${CMAKE_INSTALL_PREFIX})
>  else(CLICK_MODE)
> 
> === modified file 'manifest.json.in'
> --- manifest.json.in	2015-03-20 11:16:35 +0000
> +++ manifest.json.in	2015-06-15 00:00:45 +0000
> @@ -8,7 +8,8 @@
>              "account-service": "@ACCOUNT_SERVICE_DIR@/com.ubuntu.reminders_reminders.service",
>              "apparmor": "reminders.apparmor",
>              "desktop": "com.ubuntu.reminders.desktop",
> -            "urls": "reminders.url-dispatcher"
> +            "urls": "reminders.url-dispatcher",
> +            "content-hub": "reminders-contenthub.json"
>          },
>          "evernote-account-plugin": {
>              "account-qml-plugin": "@ACCOUNT_QML_PLUGIN_DIR@/evernote",
> 
> === added file 'reminders-contenthub.json'
> --- reminders-contenthub.json	1970-01-01 00:00:00 +0000
> +++ reminders-contenthub.json	2015-06-15 00:00:45 +0000
> @@ -0,0 +1,8 @@
> +{
> +    "destination": [
> +        "pictures",
> +        "links",
> +        "text"
> +    ]
> +}
> +
> 
> === modified file 'src/app/qml/components/NotesDelegate.qml'
> --- src/app/qml/components/NotesDelegate.qml	2015-03-15 20:00:21 +0000
> +++ src/app/qml/components/NotesDelegate.qml	2015-06-15 00:00:45 +0000
> @@ -136,7 +136,7 @@
>                                  Layout.fillHeight: true
>                                  text: "<font color=\"" + root.notebookColor + "\">" +
>                                      Qt.formatDateTime(root.date, Qt.LocalDate) +
> -                                    " </font>" + root.content
> +                                    " </font>" + root.content.replace("\n", " ").trim()
>                                  wrapMode: Text.WordWrap
>                                  textFormat: Text.StyledText
>                                  maximumLineCount: 2
> 
> === modified file 'src/app/qml/components/StatusBar.qml'
> --- src/app/qml/components/StatusBar.qml	2015-03-08 21:29:28 +0000
> +++ src/app/qml/components/StatusBar.qml	2015-06-15 00:00:45 +0000
> @@ -10,36 +10,50 @@
>  
>      property bool shown: false
>      property alias iconName: icon.name
> +    property alias iconColor: icon.color
>      property alias text: label.text
> +    property alias showCancelButton: cancelButton.visible
> +
> +    signal cancel();
>  
>      Behavior on height {
>          UbuntuNumberAnimation {}
>      }
>  
> -    ColumnLayout {
> +    RowLayout {
>          id: statusBarContents
> -        anchors { left: parent.left; top: parent.top; right: parent.right }
> +        anchors { left: parent.left; right: parent.right; leftMargin: units.gu(1); rightMargin: units.gu(1); verticalCenter: parent.verticalCenter }
>          spacing: units.gu(1)
> -
> -        Row {
> -            anchors { left: parent.left; right: parent.right; margins: units.gu(1) }
> +        Column {
>              spacing: units.gu(1)
> -            height: label.height
> -
> -            Icon {
> -                id: icon
> -                height: units.gu(3)
> -                width: height
> -                color: UbuntuColors.red
> -                anchors.verticalCenter: parent.verticalCenter
> -            }
> -
> -            Label {
> -                id: label
> -                width: parent.width - x
> -                wrapMode: Text.WordWrap
> -                anchors.verticalCenter: parent.verticalCenter
> -            }
> +            Layout.fillWidth: true
> +
> +            Row {
> +                anchors { left: parent.left; right: parent.right }
> +                spacing: units.gu(1)
> +                height: label.height
> +
> +                Icon {
> +                    id: icon
> +                    height: units.gu(3)
> +                    width: height
> +                    anchors.verticalCenter: parent.verticalCenter
> +                }
> +
> +                Label {
> +                    id: label
> +                    width: parent.width - x
> +                    wrapMode: Text.WordWrap
> +                    anchors.verticalCenter: parent.verticalCenter
> +                }
> +            }
> +        }
> +
> +        Button {
> +            id: cancelButton
> +            Layout.preferredWidth: height
> +            iconName: "cancel"
> +            onClicked: root.cancel();
>          }
>      }
>  }
> 
> === modified file 'src/app/qml/reminders.qml'
> --- src/app/qml/reminders.qml	2015-06-12 09:48:22 +0000
> +++ src/app/qml/reminders.qml	2015-06-15 00:00:45 +0000
> @@ -26,6 +26,7 @@
>  import Ubuntu.OnlineAccounts 0.1
>  import Ubuntu.OnlineAccounts.Client 0.1
>  import Ubuntu.PushNotifications 0.1
> +import Ubuntu.Content 1.0
>  import "components"
>  import "ui"
>  
> @@ -79,6 +80,46 @@
>          }
>      }
>  
> +    property var importTransfer: null
> +    function handleImportTransfer(note) {
> +        if (importTransfer == null) return;
> +
> +        for (var i = 0; i < importTransfer.items.length; i++) {
> +            var url = importTransfer.items[i].url;
> +            switch (importTransfer.contentType) {
> +            case ContentType.Links:
> +                note.insertLink(note.plaintextContent.length, url)
> +                break;
> +            default:
> +                note.attachFile(note.plaintextContent.length, url)
> +                break;
> +            }
> +        }
> +        note.save();
> +        importTransfer = null;
> +    }
> +
> +    Connections {
> +        target: ContentHub
> +        onImportRequested: {
> +            importTransfer = transfer
> +            var popup = PopupUtils.open(importQuestionComponent);
> +            popup.accepted.connect(function(createNew) {
> +                PopupUtils.close(popup)
> +                if (createNew) {
> +                    var note = NotesStore.createNote(i18n.tr("Untitled"))

Nitpick: you forgot the ';'

> +                    handleImportTransfer(note);
> +                }
> +            })
> +
> +            popup.rejected.connect(function() {
> +                PopupUtils.close(popup)
> +                importTransfer = null;
> +            })
> +
> +        }
> +    }
> +
>      Timer {
>          id: connectDelayTimer
>          interval: 2000
> @@ -107,6 +148,10 @@
>              conflictMode = false;
>          }
>  
> +        if (importTransfer != null) {
> +            handleImportTransfer(note);
> +        }
> +
>          print("displayNote:", note.guid)
>          note.load(true);
>          if (root.narrowMode) {
> @@ -436,28 +481,46 @@
>          }
>      }
>  
> -    StatusBar {
> +    Column {
>          id: statusBar
>          anchors { left: parent.left; right: parent.right; top: parent.top; topMargin: units.gu(9) }
> -        color: root.backgroundColor
> -        shown: text
> -        text: EvernoteConnection.error || NotesStore.error
> -        iconName: "sync-error"
> -
> -        Timer {
> -            interval: 5000
> -            repeat: true
> -            running: NotesStore.error
> -            onTriggered: NotesStore.clearError();
> -        }
> -
> -        MouseArea {
> -            anchors.fill: parent
> -            onClicked: NotesStore.clearError();
> -        }
> -
> +
> +        StatusBar {
> +            anchors { left: parent.left; right: parent.right }
> +            color: root.backgroundColor
> +            shown: text
> +            text: EvernoteConnection.error || NotesStore.error
> +            iconName: "sync-error"
> +            iconColor: UbuntuColors.red
> +            showCancelButton: true
> +
> +            onCancel: {
> +                NotesStore.clearError();
> +            }
> +
> +            Timer {
> +                interval: 5000
> +                repeat: true
> +                running: NotesStore.error
> +                onTriggered: NotesStore.clearError();
> +            }
> +        }
> +
> +        StatusBar {
> +            anchors { left: parent.left; right: parent.right }
> +            color: root.backgroundColor
> +            shown: importTransfer != null
> +            text: importTransfer.items.length === 1 ? i18n.tr("Select note to attach imported file") : i18n.tr("Select note to attach imported files")
> +            iconName: "document-save"
> +            showCancelButton: true
> +
> +            onCancel: {
> +                importTransfer = null;
> +            }
> +        }
>      }
>  
> +

Nitpick, this is useless :-)

>      PageStack {
>          id: pagestack
>          anchors.rightMargin: root.narrowMode ? 0 : root.width - units.gu(40)
> @@ -673,4 +736,35 @@
>              }
>          }
>      }
> +
> +    Component {
> +        id: importQuestionComponent
> +
> +        Dialog {
> +            id: importDialog
> +            title: importTransfer.items.length > 1 ?
> +                       i18n.tr("Importing %1 items").arg(importTransfer.items.length)
> +                     : i18n.tr("Importing 1 item")
> +            text: i18n.tr("Do you want to create a new note for this item or do you want to attach it to an existing note?")

I think you should create the single/plural option also there (this item/these items)

> +
> +            signal accepted(bool createNew);
> +            signal rejected();
> +
> +            Button {
> +                text: i18n.tr("Create new note")
> +                onClicked: importDialog.accepted(true)
> +                color: UbuntuColors.green
> +            }
> +            Button {
> +                text: i18n.tr("Attach to existing note")
> +                onClicked: importDialog.accepted(false);
> +                color: UbuntuColors.blue
> +            }
> +            Button {
> +                text: i18n.tr("Cancel import")
> +                onClicked: importDialog.rejected();
> +                color: UbuntuColors.red
> +            }
> +        }
> +    }
>  }
> 
> === modified file 'src/app/qml/ui/NotesPage.qml'
> --- src/app/qml/ui/NotesPage.qml	2015-06-11 22:02:25 +0000
> +++ src/app/qml/ui/NotesPage.qml	2015-06-15 00:00:45 +0000
> @@ -142,15 +142,12 @@
>      }
>  
>      function sortOrderToString(sortOrder){
> -        print("asking for sortOrder", sortOrder, Notes.SortOrderDateUpdatedNewest)
>          switch(sortOrder) {
>          case Notes.SortOrderDateCreatedNewest:
>          case Notes.SortOrderDateCreatedOldest:
> -            print("returning createdString")
>              return "createdString";
>          case Notes.SortOrderDateUpdatedNewest:
>          case Notes.SortOrderDateUpdatedOldest:
> -            print("returning updatedString")
>              return "updatedString";
>          case Notes.SortOrderTitleAscending:
>          case Notes.SortOrderTitleDescending:
> 
> === modified file 'src/libqtevernote/note.cpp'
> --- src/libqtevernote/note.cpp	2015-06-03 17:45:45 +0000
> +++ src/libqtevernote/note.cpp	2015-06-15 00:00:45 +0000
> @@ -277,7 +277,7 @@
>  
>  QString Note::plaintextContent() const
>  {
> -    return m_content.toPlaintext().trimmed();
> +    return m_content.toPlaintext();
>  }
>  
>  QString Note::tagline() const
> @@ -570,6 +570,20 @@
>      NotesStore::instance()->untagNote(m_guid, tagGuid);
>  }
>  
> +void Note::insertText(int position, const QString &text)
> +{
> +    m_content.insertText(position, text);
> +    m_tagline = m_content.toPlaintext().left(100);
> +    emit contentChanged();
> +}
> +
> +void Note::insertLink(int position, const QString &url)
> +{
> +    m_content.insertLink(position, url);
> +    m_tagline = m_content.toPlaintext().left(100);
> +    emit contentChanged();
> +}
> +
>  int Note::renderWidth() const
>  {
>      return m_content.renderWidth();
> 
> === modified file 'src/libqtevernote/note.h'
> --- src/libqtevernote/note.h	2015-03-15 20:00:21 +0000
> +++ src/libqtevernote/note.h	2015-06-15 00:00:45 +0000
> @@ -165,6 +165,8 @@
>      Q_INVOKABLE void attachFile(int position, const QUrl &fileName);
>      Q_INVOKABLE void addTag(const QString &tagGuid);
>      Q_INVOKABLE void removeTag(const QString &tagGuid);
> +    Q_INVOKABLE void insertText(int position, const QString &text);
> +    Q_INVOKABLE void insertLink(int position, const QString &url);
>  
>      int renderWidth() const;
>      void setRenderWidth(int renderWidth);
> 
> === modified file 'src/libqtevernote/utils/enmldocument.cpp'
> --- src/libqtevernote/utils/enmldocument.cpp	2015-04-13 20:42:38 +0000
> +++ src/libqtevernote/utils/enmldocument.cpp	2015-06-15 00:00:45 +0000
> @@ -486,48 +486,161 @@
>  
>  void EnmlDocument::attachFile(int position, const QString &hash, const QString &type)
>  {
> -    QXmlStreamReader reader(m_enml);
> -
> -    QString output;
> -    QXmlStreamWriter writer(&output);
> -    writer.writeStartDocument();
> -    writer.writeDTD("<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\";>");
> -
> -    int textPos = 0;
> -    bool inserted = false;
> -
> -    while (!reader.atEnd() && !reader.hasError()) {
> -        QXmlStreamReader::TokenType token = reader.readNext();
> -
> -        if (token == QXmlStreamReader::StartElement) {
> -            writer.writeStartElement(reader.name().toString());
> -            writer.writeAttributes(reader.attributes());
> -        }
> -
> -        if (token == QXmlStreamReader::Characters) {
> -            QString textString = reader.text().toString();
> -            if (textPos <= position && textPos + textString.length() > position) {
> -                writer.writeCharacters(textString.left(position - textPos));
> -
> -                writer.writeStartElement("en-media");
> -                writer.writeAttribute("hash", hash);
> -                writer.writeAttribute("type", type);
> -                writer.writeEndElement();
> -                inserted = true;
> -
> -                writer.writeCharacters(textString.right(textString.length() - (position - textPos)));
> -            } else {
> -                writer.writeCharacters(reader.text().toString());
> -            }
> -            textPos += textString.length();
> -        }
> -        if (token == QXmlStreamReader::EndElement) {
> -
> -            // The above logic would fail on an empty note
> -            if (reader.name() == "en-note" && !inserted) {
> -                writer.writeStartElement("en-media");
> -                writer.writeAttribute("hash", hash);
> -                writer.writeAttribute("type", type);
> +    qCDebug(dcEnml) << "Attaching file at position" << position;
> +    QXmlStreamReader reader(m_enml);
> +
> +    QString output;
> +    QXmlStreamWriter writer(&output);
> +    writer.writeStartDocument();
> +    writer.writeDTD("<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\";>");
> +
> +    int textPos = 0;
> +    bool inserted = false;
> +
> +    while (!reader.atEnd() && !reader.hasError()) {
> +        QXmlStreamReader::TokenType token = reader.readNext();
> +
> +        if (token == QXmlStreamReader::StartElement) {
> +            writer.writeStartElement(reader.name().toString());
> +            writer.writeAttributes(reader.attributes());
> +        }
> +
> +        if (token == QXmlStreamReader::Characters) {
> +            QString textString = reader.text().toString();
> +            if (textPos <= position && textPos + textString.length() > position) {
> +                writer.writeCharacters(textString.left(position - textPos));
> +
> +                writer.writeStartElement("en-media");
> +                writer.writeAttribute("hash", hash);
> +                writer.writeAttribute("type", type);
> +                writer.writeEndElement();
> +                inserted = true;
> +
> +                writer.writeCharacters(textString.right(textString.length() - (position - textPos)));
> +            } else {
> +                writer.writeCharacters(reader.text().toString());
> +            }
> +            textPos += textString.length();
> +        }
> +        if (token == QXmlStreamReader::EndElement) {
> +
> +            // The above logic would fail on an empty note
> +            if (reader.name() == "en-note" && !inserted) {
> +                writer.writeStartElement("en-media");
> +                writer.writeAttribute("hash", hash);
> +                writer.writeAttribute("type", type);
> +                writer.writeEndElement();
> +            }
> +
> +            writer.writeEndElement();
> +        }
> +    }
> +    m_enml = output;
> +}
> +
> +void EnmlDocument::insertText(int position, const QString &text)
> +{
> +    qCDebug(dcEnml) << "Inserting Text at position" << position;
> +
> +    QXmlStreamReader reader(m_enml);
> +
> +    QString output;
> +    QXmlStreamWriter writer(&output);
> +    writer.writeStartDocument();
> +    writer.writeDTD("<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\";>");
> +
> +    int textPos = 0;
> +    bool inserted = false;
> +
> +    while (!reader.atEnd() && !reader.hasError()) {
> +        QXmlStreamReader::TokenType token = reader.readNext();
> +
> +        if (token == QXmlStreamReader::StartElement) {
> +            writer.writeStartElement(reader.name().toString());
> +            writer.writeAttributes(reader.attributes());
> +        }
> +
> +        if (token == QXmlStreamReader::Characters) {
> +            QString textString = reader.text().toString();
> +            if (textPos <= position && textPos + textString.length() > position) {
> +                writer.writeCharacters(textString.left(position - textPos));
> +
> +                writer.writeStartElement("div");
> +                writer.writeCharacters(text);
> +                writer.writeEndElement();
> +                inserted = true;
> +
> +                writer.writeCharacters(textString.right(textString.length() - (position - textPos)));
> +            } else {
> +                writer.writeCharacters(reader.text().toString());
> +            }
> +            textPos += textString.length();
> +        }
> +        if (token == QXmlStreamReader::EndElement) {
> +
> +            // The above logic would fail on an empty note
> +            if (reader.name() == "en-note" && !inserted) {
> +                writer.writeStartElement("div");
> +                writer.writeCharacters(text);
> +                writer.writeEndElement();
> +            }
> +
> +            writer.writeEndElement();
> +        }
> +    }
> +    m_enml = output;
> +}
> +
> +void EnmlDocument::insertLink(int position, const QString &url)
> +{
> +    qCDebug(dcEnml) << "Inserting Link at position" << position;
> +
> +    QXmlStreamReader reader(m_enml);
> +
> +    QString output;
> +    QXmlStreamWriter writer(&output);
> +    writer.writeStartDocument();
> +    writer.writeDTD("<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\";>");
> +
> +    int textPos = 0;
> +    bool inserted = false;
> +
> +    while (!reader.atEnd() && !reader.hasError()) {
> +        QXmlStreamReader::TokenType token = reader.readNext();
> +
> +        if (token == QXmlStreamReader::StartElement) {
> +            writer.writeStartElement(reader.name().toString());
> +            writer.writeAttributes(reader.attributes());
> +        }
> +
> +        if (token == QXmlStreamReader::Characters) {
> +            QString textString = reader.text().toString();
> +            if (textPos <= position && textPos + textString.length() > position) {
> +                writer.writeCharacters(textString.left(position - textPos));
> +
> +                writer.writeStartElement("div");
> +                writer.writeStartElement("a");
> +                writer.writeAttribute("href", url);
> +                writer.writeCharacters(url);
> +                writer.writeEndElement();
> +                writer.writeEndElement();
> +                inserted = true;
> +
> +                writer.writeCharacters(textString.right(textString.length() - (position - textPos)));
> +            } else {
> +                writer.writeCharacters(reader.text().toString());
> +            }
> +            textPos += textString.length();
> +        }
> +        if (token == QXmlStreamReader::EndElement) {
> +
> +            // The above logic would fail on an empty note
> +            if (reader.name() == "en-note" && !inserted) {
> +                writer.writeStartElement("div");
> +                writer.writeStartElement("a");
> +                writer.writeAttribute("href", url);
> +                writer.writeCharacters(url);
> +                writer.writeEndElement();
>                  writer.writeEndElement();
>              }
>  
> @@ -551,10 +664,8 @@
>          // Write all normal text inside <body> </body> to output
>          if (token == QXmlStreamReader::Characters) {
>              plaintext.append(reader.text().toString());
> -            plaintext.append(' ');
>          }
>      }
>  
> -    plaintext.remove('\n').trimmed();
>      return plaintext;
>  }
> 
> === modified file 'src/libqtevernote/utils/enmldocument.h'
> --- src/libqtevernote/utils/enmldocument.h	2015-03-05 18:23:25 +0000
> +++ src/libqtevernote/utils/enmldocument.h	2015-06-15 00:00:45 +0000
> @@ -41,6 +41,10 @@
>      // Will insert the file described by hash at position in the plaintext string
>      void attachFile(int position, const QString &hash, const QString &type);
>  
> +    // Convenience functions to insert some text without having a complete Editor attached
> +    void insertText(int position, const QString &text);
> +    void insertLink(int position, const QString &url);
> +
>      void markTodo(const QString &todoId, bool checked);
>  
>      int renderWidth() const;
> 


-- 
https://code.launchpad.net/~mzanetti/reminders-app/contenthub-import/+merge/261919
Your team Ubuntu Reminders app developers is subscribed to branch lp:reminders-app.


References