Support for copy-pasting specific fields on mobile

Initial implementation/prototype of copy-paste support for
Subsurface-mobile. The UI part is really lacking; right now the copy
button is initially visible and paste is achieved by long press on a
dive and clicking the paste button when it appears. Delete is currently
not possible at all, as I just failed to layout the buttons properly
using QML. It just sounds so simple, to put all the copy-paste-delete
buttons next to each other...

The data to be copied is currently hard-coded. A dialog to choose
inteded fields would be nice, but it'll take quite a bit effort to get
used to QML enough to be able to hack something together.

Anyway, this seems to work, even though the UI is not always reflecting
the paste without switching dives (when testing on laptop).

Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
This commit is contained in:
Miika Turkia 2018-10-27 10:21:40 +03:00 committed by Dirk Hohndel
parent 49d1144336
commit 76a68f71a4
5 changed files with 116 additions and 1 deletions

View file

@ -118,9 +118,13 @@ Kirigami.ScrollablePage {
}
property bool deleteButtonVisible: false
property bool copyButtonVisible: true // TODO: false
property bool pasteButtonVisible: false
onPressAndHold: {
deleteButtonVisible = true
deleteButtonVisible = false // TODO: true
copyButtonVisible = false // TODO: true
pasteButtonVisible = true
timer.restart()
}
Item {
@ -195,6 +199,77 @@ Kirigami.ScrollablePage {
}
}
Rectangle {
id: copyButton
visible: copyButtonVisible
height: diveListEntry.height - 2 * Kirigami.Units.smallSpacing
width: height - 3 * Kirigami.Units.smallSpacing
color: subsurfaceTheme.lightDrawerColor
antialiasing: true
radius: Kirigami.Units.smallSpacing
anchors {
left: diveListEntry.right
right: parent.right
verticalCenter: diveListEntry.verticalCenter
verticalCenterOffset: Kirigami.Units.smallSpacing / 2
}
Kirigami.Icon {
anchors {
horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter
}
source: ":/icons/edit-copy"
width: parent.height
height: width
}
MouseArea {
anchors.fill: parent
enabled: parent.visible
onClicked: {
deleteButtonVisible = false
copyButtonVisible = false
pasteButtonVisible = false
timer.stop()
manager.copyDiveData(dive.id)
}
}
}
Rectangle {
id: pasteButton
visible: pasteButtonVisible
height: diveListEntry.height - 2 * Kirigami.Units.smallSpacing
width: height - 3 * Kirigami.Units.smallSpacing
color: subsurfaceTheme.contrastAccentColor
antialiasing: true
radius: Kirigami.Units.smallSpacing
anchors {
left: diveListEntry.right
right: parent.right
verticalCenter: diveListEntry.verticalCenter
verticalCenterOffset: Kirigami.Units.smallSpacing / 2
}
Kirigami.Icon {
anchors {
horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter
}
source: ":/icons/edit-paste"
width: parent.height
height: width
}
MouseArea {
anchors.fill: parent
enabled: parent.visible
onClicked: {
deleteButtonVisible = false
copyButtonVisible = false
pasteButtonVisible = false
timer.stop()
manager.pasteDiveData(dive.id)
}
}
}
Rectangle {
id: deleteButton
visible: deleteButtonVisible
height: diveListEntry.height - 2 * Kirigami.Units.smallSpacing
width: height - 3 * Kirigami.Units.smallSpacing
@ -221,6 +296,8 @@ Kirigami.ScrollablePage {
enabled: parent.visible
onClicked: {
deleteButtonVisible = false
copyButtonVisible = false
pasteButtonVisible = false
timer.stop()
manager.deleteDive(dive.id)
}
@ -231,6 +308,8 @@ Kirigami.ScrollablePage {
interval: 4000
onTriggered: {
deleteButtonVisible = false
copyButtonVisible = false
pasteButtonVisible = false
}
}
}

View file

@ -75,6 +75,8 @@
<file alias="icons/list-add.svg">kirigami/icons/list-add.svg</file>
<file alias="icons/overflow-menu.svg">kirigami/icons/overflow-menu.svg</file>
<file alias="icons/trash-empty.svg">kirigami/icons/trash-empty.svg</file>
<file alias="icons/edit-copy.svg">kirigami/icons/edit-copy.svg</file>
<file alias="icons/edit-paste.svg">kirigami/icons/edit-paste.svg</file>
<file alias="icons/view-readermode.svg">kirigami/icons/view-readermode.svg</file>
</qresource>

View file

@ -1322,6 +1322,34 @@ void QMLManager::deleteDive(int id)
changesNeedSaving();
}
void QMLManager::copyDiveData(int id)
{
m_copyPasteDive = get_dive_by_uniq_id(id);
if (!m_copyPasteDive) {
appendTextToLog("trying to copy non-existing dive");
return;
}
// TODO: selection dialog for the data to be copied
what.divemaster = true;
what.buddy = true;
what.suit = true;
what.tags = true;
what.cylinders = true;
what.weights = true;
}
void QMLManager::pasteDiveData(int id)
{
struct dive *d = get_dive_by_uniq_id(id);
if (!d) {
appendTextToLog("trying to paste to non-existing dive");
return;
}
selective_copy_dive(m_copyPasteDive, d, what, false);
changesNeedSaving();
}
void QMLManager::cancelDownloadDC()
{
import_thread_cancelled = true;

View file

@ -163,6 +163,8 @@ public slots:
void saveChangesLocal();
void saveChangesCloud(bool forceRemoteSync);
void deleteDive(int id);
void copyDiveData(int id);
void pasteDiveData(int id);
bool undoDelete(int id);
QString addDive();
void addDiveAborted(int id);
@ -224,6 +226,8 @@ private:
bool m_btEnabled;
void updateAllGlobalLists();
QString m_pluggedInDeviceName;
struct dive *m_copyPasteDive;
struct dive_components what;
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
QString appLogFileName;

View file

@ -44,6 +44,8 @@ cp $BREEZE/icons/actions/16/view-readermode.svg $MC/icons
cp $BREEZE/icons/actions/24/application-menu.svg $MC/icons
cp $BREEZE/icons/actions/22/gps.svg $MC/icons
cp $BREEZE/icons/actions/24/trash-empty.svg $MC/icons
cp $BREEZE/icons/actions/24/edit-copy.svg $MC/icons
cp $BREEZE/icons/actions/24/edit-paste.svg $MC/icons
cp $BREEZE/icons/actions/24/list-add.svg $MC/icons
cp $BREEZE/icons/actions/22/handle-left.svg $MC/icons
cp $BREEZE/icons/actions/22/handle-right.svg $MC/icons