diff options
author | Claudio Cambra <claudio.cambra@gmail.com> | 2022-01-10 13:29:24 +0300 |
---|---|---|
committer | Camila (Rebase PR Action) <hello@camila.codes> | 2022-01-24 12:40:28 +0300 |
commit | 624213956e624c0f7319dae7ea01c121a274135c (patch) | |
tree | 6f465eff8c62710675b19fbad8469d1349469188 /src/gui | |
parent | d0364e697adc003abcbf5366ad5cd83feb3d2be0 (diff) |
Add ability to copy internal link from share dialog
Signed-off-by: Claudio Cambra <claudio.cambra@gmail.com>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/gui/internallinkwidget.cpp | 86 | ||||
-rw-r--r-- | src/gui/internallinkwidget.h | 59 | ||||
-rw-r--r-- | src/gui/internallinkwidget.ui | 168 | ||||
-rw-r--r-- | src/gui/sharedialog.cpp | 6 | ||||
-rw-r--r-- | src/gui/sharedialog.h | 2 |
6 files changed, 323 insertions, 0 deletions
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 744d6501a..0834d25c8 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -27,6 +27,7 @@ set(theme_dir ${CMAKE_SOURCE_DIR}/theme) set(client_UI_SRCS accountsettings.ui conflictdialog.ui + internallinkwidget.ui invalidfilenamedialog.ui foldercreationdialog.ui folderwizardsourcepage.ui @@ -80,6 +81,7 @@ set(client_SRCS folderwizard.cpp generalsettings.cpp legalnotice.cpp + internallinkwidget.cpp ignorelisteditor.cpp ignorelisttablewidget.cpp lockwatcher.cpp diff --git a/src/gui/internallinkwidget.cpp b/src/gui/internallinkwidget.cpp new file mode 100644 index 000000000..e8c65005f --- /dev/null +++ b/src/gui/internallinkwidget.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2022 by Claudio Cambra <claudio.cambra@nextcloud.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "internallinkwidget.h" +#include "accountstate.h" +#include "folderman.h" +#include "theme.h" + +#include "QProgressIndicator.h" +#include <QClipboard> + +namespace OCC { + +Q_LOGGING_CATEGORY(lcInternalLink, "nextcloud.gui.internallink", QtInfoMsg) + +InternalLinkWidget::InternalLinkWidget(const QString &localPath, + QWidget *parent) + : QWidget(parent) + , _localPath(localPath) +{ + _ui->setupUi(this); + + const auto folder = FolderMan::instance()->folderForPath(_localPath); + const auto folderRelativePath = _localPath.mid(folder->cleanPath().length() + 1); + const auto serverRelativePath = QDir(folder->remotePath()).filePath(folderRelativePath); + + const auto bindLinkSlot = [this](QString link) { slotLinkFetched(link); }; + + fetchPrivateLinkUrl( + folder->accountState()->account(), + serverRelativePath, + {}, + this, + bindLinkSlot + ); + + _ui->copyInternalLinkButton->setEnabled(false); + _ui->internalLinkProgressIndicator->setVisible(true); + _ui->internalLinkProgressIndicator->startAnimation(); + + connect(_ui->copyInternalLinkButton, &QPushButton::clicked, this, &InternalLinkWidget::slotCopyInternalLink); +} + +void InternalLinkWidget::slotLinkFetched(const QString &url) +{ + _internalUrl = url; + _ui->copyInternalLinkButton->setEnabled(true); + _ui->internalLinkProgressIndicator->setVisible(false); + _ui->internalLinkProgressIndicator->stopAnimation(); + _ui->horizontalSpacer->changeSize(0, 0); + _ui->horizontalSpacer_2->changeSize(0, 0); +} + +void InternalLinkWidget::slotCopyInternalLink() const +{ + QApplication::clipboard()->setText(_internalUrl); +} + +void InternalLinkWidget::setupUiOptions() +{ + customizeStyle(); +} + +void InternalLinkWidget::slotStyleChanged() +{ + customizeStyle(); +} + +void InternalLinkWidget::customizeStyle() +{ + _ui->copyInternalLinkButton->setIcon(Theme::createColorAwareIcon(":/client/theme/copy.svg")); + _ui->internalLinkIconLabel->setPixmap(Theme::createColorAwarePixmap(":/client/theme/external.svg")); +} + +} diff --git a/src/gui/internallinkwidget.h b/src/gui/internallinkwidget.h new file mode 100644 index 000000000..cb343a11e --- /dev/null +++ b/src/gui/internallinkwidget.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2022 by Claudio Cambra <claudio.cambra@nextcloud.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#ifndef INTERNALLINKWIDGET_H +#define INTERNALLINKWIDGET_H + +#include "QProgressIndicator.h" +#include <QList> +#include <QPushButton> + +#include "ui_internallinkwidget.h" + +namespace OCC { + +/** + * @brief The ShareDialog class + * @ingroup gui + */ +class InternalLinkWidget : public QWidget +{ + Q_OBJECT + +public: + explicit InternalLinkWidget(const QString &localPath, + QWidget *parent = nullptr); + ~InternalLinkWidget() override = default; + + void setupUiOptions(); + +public slots: + void slotStyleChanged(); + +private slots: + void slotLinkFetched(const QString &url); + void slotCopyInternalLink() const; + +private: + void customizeStyle(); + + std::unique_ptr<Ui::InternalLinkWidget> _ui = std::make_unique<Ui::InternalLinkWidget>(); + QString _localPath; + QString _internalUrl; + + QPushButton *_copyInternalLinkButton{}; +}; +} + +#endif // INTERNALLINKWIDGET_H diff --git a/src/gui/internallinkwidget.ui b/src/gui/internallinkwidget.ui new file mode 100644 index 000000000..202ec7240 --- /dev/null +++ b/src/gui/internallinkwidget.ui @@ -0,0 +1,168 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>OCC::InternalLinkWidget</class> + <widget class="QWidget" name="OCC::InternalLinkWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>238</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>12</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>20</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="internalLinkIconLabel"> + <property name="text"> + <string notr="true"/> + </property> + <property name="pixmap"> + <pixmap resource="../../theme.qrc">:/client/theme/external.svg</pixmap> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalTextLayout"> + <item> + <widget class="QLabel" name="internalLinkLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Internal link</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="infoMessage"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="styleSheet"> + <string notr="true">color: rgb(118, 118, 118)</string> + </property> + <property name="text"> + <string>Only works for users with access to this folder</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>25</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QProgressIndicator" name="internalLinkProgressIndicator" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>28</width> + <height>27</height> + </size> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>25</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="copyInternalLinkButton"> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../theme.qrc"> + <normaloff>:/client/theme/copy.svg</normaloff>:/client/theme/copy.svg</iconset> + </property> + <property name="checkable"> + <bool>false</bool> + </property> + <property name="flat"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <layoutdefault spacing="6" margin="11"/> + <customwidgets> + <customwidget> + <class>QProgressIndicator</class> + <extends>QWidget</extends> + <header>QProgressIndicator.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources> + <include location="../../theme.qrc"/> + </resources> + <connections/> +</ui> diff --git a/src/gui/sharedialog.cpp b/src/gui/sharedialog.cpp index b88bf5409..6e48b70be 100644 --- a/src/gui/sharedialog.cpp +++ b/src/gui/sharedialog.cpp @@ -16,6 +16,7 @@ #include "sharedialog.h" #include "sharee.h" #include "sharelinkwidget.h" +#include "internallinkwidget.h" #include "shareusergroupwidget.h" #include "passwordinputdialog.h" @@ -142,6 +143,11 @@ ShareDialog::ShareDialog(QPointer<AccountState> accountState, _scrollAreaLayout = new QVBoxLayout(_scrollAreaViewPort); _scrollAreaLayout->setContentsMargins(0, 0, 0, 0); _ui->scrollArea->setWidget(_scrollAreaViewPort); + + _internalLinkWidget = new InternalLinkWidget(localPath, this); + _ui->verticalLayout->addWidget(_internalLinkWidget); + _internalLinkWidget->setupUiOptions(); + connect(this, &ShareDialog::styleChanged, _internalLinkWidget, &InternalLinkWidget::slotStyleChanged); } ShareLinkWidget *ShareDialog::addLinkShareWidget(const QSharedPointer<LinkShare> &linkShare) diff --git a/src/gui/sharedialog.h b/src/gui/sharedialog.h index 531998d42..7b4aade18 100644 --- a/src/gui/sharedialog.h +++ b/src/gui/sharedialog.h @@ -35,6 +35,7 @@ namespace Ui { } class ShareLinkWidget; +class InternalLinkWidget; class ShareUserGroupWidget; class ShareManager; class LinkShare; @@ -96,6 +97,7 @@ private: QList<ShareLinkWidget*> _linkWidgetList; ShareLinkWidget* _emptyShareLinkWidget = nullptr; + InternalLinkWidget* _internalLinkWidget = nullptr; ShareUserGroupWidget *_userGroupWidget = nullptr; QProgressIndicator *_progressIndicator = nullptr; |