diff --git a/resources.qrc b/resources.qrc index 715f7cf8174bc..6036fa0e1bff0 100644 --- a/resources.qrc +++ b/resources.qrc @@ -13,7 +13,7 @@ src/gui/filedetails/FileDetailsWindow.qml src/gui/filedetails/FileTag.qml src/gui/filedetails/NCInputDateField.qml - src/gui/filedetails/NCInputTextEdit.qml + src/gui/filedetails/NCInputTextArea.qml src/gui/filedetails/NCInputTextField.qml src/gui/filedetails/NCTabButton.qml src/gui/filedetails/ShareeDelegate.qml diff --git a/src/gui/filedetails/NCInputTextEdit.qml b/src/gui/filedetails/NCInputTextArea.qml similarity index 77% rename from src/gui/filedetails/NCInputTextEdit.qml rename to src/gui/filedetails/NCInputTextArea.qml index 24dacdd3a831d..d3e917ff5113f 100644 --- a/src/gui/filedetails/NCInputTextEdit.qml +++ b/src/gui/filedetails/NCInputTextArea.qml @@ -19,28 +19,20 @@ import QtQuick.Layouts import com.nextcloud.desktopclient import Style -TextEdit { +TextArea { id: root readonly property color accentColor: palette.highlight readonly property color secondaryColor: palette.placeholderText readonly property alias submitButton: submitButton - clip: true - textMargin: Style.smallSpacing - wrapMode: TextEdit.Wrap + // no implicitHeight here -- let the textarea take as much as it needs + // otherwise it will cut off some text vertically on multi-line strings... + selectByMouse: true - height: Math.max(Style.talkReplyTextFieldPreferredHeight, contentHeight) + rightPadding: submitButton.width - Rectangle { - id: textFieldBorder - anchors.fill: parent - radius: Style.trayWindowRadius - border.width: Style.normalBorderWidth - border.color: root.activeFocus ? root.accentColor : root.secondaryColor - color: palette.base - z: -1 - } + wrapMode: TextEdit.Wrap Button { id: submitButton @@ -61,4 +53,3 @@ TextEdit { onClicked: root.editingFinished() } } - diff --git a/src/gui/filedetails/ShareDelegate.qml b/src/gui/filedetails/ShareDelegate.qml index 895153fba632a..d6bb454a94090 100644 --- a/src/gui/filedetails/ShareDelegate.qml +++ b/src/gui/filedetails/ShareDelegate.qml @@ -38,7 +38,6 @@ GridLayout { signal toggleAllowResharing(bool enable) signal togglePasswordProtect(bool enable) signal toggleExpirationDate(bool enable) - signal toggleNoteToRecipient(bool enable) signal permissionModeChanged(int permissionMode) signal setLinkShareLabel(string label) @@ -252,7 +251,6 @@ GridLayout { onToggleHideDownload: root.toggleHideDownload(enable) onTogglePasswordProtect: root.togglePasswordProtect(enable) onToggleExpirationDate: root.toggleExpirationDate(enable) - onToggleNoteToRecipient: root.toggleNoteToRecipient(enable) onPermissionModeChanged: root.permissionModeChanged(permissionMode) onSetLinkShareLabel: root.setLinkShareLabel(label) diff --git a/src/gui/filedetails/ShareDetailsPage.qml b/src/gui/filedetails/ShareDetailsPage.qml index 79897f73f44bd..8035b40d9d195 100644 --- a/src/gui/filedetails/ShareDetailsPage.qml +++ b/src/gui/filedetails/ShareDetailsPage.qml @@ -87,7 +87,6 @@ Page { readonly property bool isFolderItem: shareModelData.sharedItemType === ShareModel.SharedItemTypeFolder readonly property bool isEncryptedItem: shareModelData.sharedItemType === ShareModel.SharedItemTypeEncryptedFile || shareModelData.sharedItemType === ShareModel.SharedItemTypeEncryptedFolder || shareModelData.sharedItemType === ShareModel.SharedItemTypeEncryptedTopLevelFolder - property bool waitingForNoteEnabledChange: false property bool waitingForExpireDateEnabledChange: false property bool waitingForPasswordProtectEnabledChange: false property bool waitingForExpireDateChange: false @@ -101,7 +100,7 @@ Page { } function resetNoteField() { - noteTextEdit.text = note; + noteTextArea.text = note; waitingForNoteChange = false; } @@ -133,7 +132,7 @@ Page { function resetNoteEnabledField() { noteEnabledMenuItem.checked = noteEnabled; - waitingForNoteEnabledChange = false; + waitingForNoteChange = false; } function resetExpireDateEnabledField() { @@ -662,16 +661,18 @@ Page { checkable: true checked: root.noteEnabled text: qsTr("Note to recipient") - enabled: !root.waitingForNoteEnabledChange + enabled: !root.waitingForNoteChange onClicked: { - root.toggleNoteToRecipient(checked); - root.waitingForNoteEnabledChange = true; + if (!checked && root.note !== "") { + root.setNote(""); + root.waitingForNoteChange = true; + } } NCBusyIndicator { anchors.fill: parent - visible: root.waitingForNoteEnabledChange + visible: root.waitingForNoteChange && !noteEnabledMenuItem.checked running: visible z: 1 } @@ -682,7 +683,7 @@ Page { height: visible ? implicitHeight : 0 spacing: scrollContentsColumn.indicatorSpacing - visible: root.noteEnabled + visible: noteEnabledMenuItem.checked Image { Layout.preferredWidth: scrollContentsColumn.indicatorItemWidth @@ -697,27 +698,25 @@ Page { sourceSize.height: scrollContentsColumn.rowIconWidth } - NCInputTextEdit { - id: noteTextEdit + NCInputTextArea { + id: noteTextArea Layout.fillWidth: true - height: visible ? Math.max(Style.talkReplyTextFieldPreferredHeight, contentHeight) : 0 + // no height here -- let the textarea figure it out how much it needs submitButton.height: Math.min(Style.talkReplyTextFieldPreferredHeight, height - 2) text: root.note - enabled: root.noteEnabled && - !root.waitingForNoteChange && - !root.waitingForNoteEnabledChange + placeholderText: qsTr("Enter a note for the recipient") + enabled: noteEnabledMenuItem.checked && !root.waitingForNoteChange - onEditingFinished: if(text !== root.note) { + onEditingFinished: if (text !== "" && text !== root.note) { root.setNote(text); root.waitingForNoteChange = true; } NCBusyIndicator { anchors.fill: parent - visible: root.waitingForNoteChange || - root.waitingForNoteEnabledChange + visible: root.waitingForNoteChange && noteEnabledMenuItem.checked running: visible z: 1 } diff --git a/src/gui/filedetails/ShareView.qml b/src/gui/filedetails/ShareView.qml index 51bbb891a8897..1b7b9ca7de067 100644 --- a/src/gui/filedetails/ShareView.qml +++ b/src/gui/filedetails/ShareView.qml @@ -263,7 +263,6 @@ ColumnLayout { onToggleHideDownload: shareModel.toggleHideDownloadFromQml(model.share, enable) onTogglePasswordProtect: shareModel.toggleSharePasswordProtectFromQml(model.share, enable) onToggleExpirationDate: shareModel.toggleShareExpirationDateFromQml(model.share, enable) - onToggleNoteToRecipient: shareModel.toggleShareNoteToRecipientFromQml(model.share, enable) onPermissionModeChanged: shareModel.changePermissionModeFromQml(model.share, permissionMode) onSetLinkShareLabel: shareModel.setLinkShareLabelFromQml(model.share, label) diff --git a/src/gui/filedetails/sharemodel.cpp b/src/gui/filedetails/sharemodel.cpp index e3be7122aea61..c23ed0b05aeb3 100644 --- a/src/gui/filedetails/sharemodel.cpp +++ b/src/gui/filedetails/sharemodel.cpp @@ -1088,26 +1088,6 @@ void ShareModel::toggleShareExpirationDateFromQml(const QVariant &share, const b toggleShareExpirationDate(ptr, enable); } -void ShareModel::toggleShareNoteToRecipient(const SharePtr &share, const bool enable) const -{ - if (share.isNull()) { - return; - } - - const QString note = enable ? tr("Enter a note for the recipient") : QString(); - if (const auto linkShare = share.objectCast()) { - linkShare->setNote(note); - } else if (const auto userGroupShare = share.objectCast()) { - userGroupShare->setNote(note); - } -} - -void ShareModel::toggleShareNoteToRecipientFromQml(const QVariant &share, const bool enable) const -{ - const auto ptr = share.value(); - toggleShareNoteToRecipient(ptr, enable); -} - void ShareModel::changePermissionModeFromQml(const QVariant &share, const OCC::ShareModel::SharePermissionsMode permissionMode) { const auto sharePtr = share.value(); diff --git a/src/gui/filedetails/sharemodel.h b/src/gui/filedetails/sharemodel.h index 12b262bde7a5a..c40329b3cf3b3 100644 --- a/src/gui/filedetails/sharemodel.h +++ b/src/gui/filedetails/sharemodel.h @@ -190,8 +190,6 @@ public slots: void toggleSharePasswordProtectFromQml(const QVariant &share, const bool enable); void toggleShareExpirationDate(const OCC::SharePtr &share, const bool enable) const; void toggleShareExpirationDateFromQml(const QVariant &share, const bool enable) const; - void toggleShareNoteToRecipient(const OCC::SharePtr &share, const bool enable) const; - void toggleShareNoteToRecipientFromQml(const QVariant &share, const bool enable) const; void changePermissionModeFromQml(const QVariant &share, const OCC::ShareModel::SharePermissionsMode permissionMode); void setLinkShareLabel(const QSharedPointer &linkShare, const QString &label) const; diff --git a/test/testsharemodel.cpp b/test/testsharemodel.cpp index 1385dc73dc06c..c1e92bba66cb6 100644 --- a/test/testsharemodel.cpp +++ b/test/testsharemodel.cpp @@ -820,7 +820,7 @@ private slots: helper.resetTestData(); // Test with an existing link share. - // This one has a pre-existing password + // This one has a pre-existing note helper.appendShareReplyData(_testLinkShareDefinition); QCOMPARE(helper.shareCount(), 1); @@ -844,7 +844,7 @@ private slots: const auto linkSharePtr = sharePtr.dynamicCast(); // Need to connect to signal QSignalSpy noteSet(linkSharePtr.data(), &LinkShare::noteSet); - model.toggleShareNoteToRecipient(sharePtr, false); + model.setShareNote(sharePtr, QStringLiteral("")); QVERIFY(noteSet.wait(3000)); QCOMPARE(shareIndex.data(ShareModel::NoteEnabledRole).toBool(), false); @@ -852,7 +852,7 @@ private slots: model.setShareNote(sharePtr, note); QVERIFY(noteSet.wait(3000)); QCOMPARE(shareIndex.data(ShareModel::NoteEnabledRole).toBool(), true); - // The model stores the recently set password. + // The model stores the recently set note. // We want to present the user with it in the UI while the model is alive QCOMPARE(shareIndex.data(ShareModel::NoteRole).toString(), note); }