mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-24 14:05:58 +03:00
Merge pull request #756 from jpnurmi/add-button
Make the "Add Folder Sync Connection" button act like a button
This commit is contained in:
commit
40c36a9ed3
6 changed files with 133 additions and 7 deletions
|
@ -53,6 +53,7 @@ set(client_SRCS
|
||||||
folderman.cpp
|
folderman.cpp
|
||||||
folderstatusmodel.cpp
|
folderstatusmodel.cpp
|
||||||
folderstatusdelegate.cpp
|
folderstatusdelegate.cpp
|
||||||
|
folderstatusview.cpp
|
||||||
folderwatcher.cpp
|
folderwatcher.cpp
|
||||||
folderwizard.cpp
|
folderwizard.cpp
|
||||||
generalsettings.cpp
|
generalsettings.cpp
|
||||||
|
|
|
@ -117,7 +117,7 @@
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QTreeView" name="_folderList">
|
<widget class="OCC::FolderStatusView" name="_folderList">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
|
@ -275,6 +275,11 @@
|
||||||
<extends>QToolButton</extends>
|
<extends>QToolButton</extends>
|
||||||
<header>sslbutton.h</header>
|
<header>sslbutton.h</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>OCC::FolderStatusView</class>
|
||||||
|
<extends>QTreeView</extends>
|
||||||
|
<header>folderstatusview.h</header>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include "folderstatusdelegate.h"
|
#include "folderstatusdelegate.h"
|
||||||
#include "folderstatusmodel.h"
|
#include "folderstatusmodel.h"
|
||||||
|
#include "folderstatusview.h"
|
||||||
#include "folderman.h"
|
#include "folderman.h"
|
||||||
#include "accountstate.h"
|
#include "accountstate.h"
|
||||||
#include <theme.h>
|
#include <theme.h>
|
||||||
|
@ -24,6 +25,7 @@
|
||||||
#include <QFileIconProvider>
|
#include <QFileIconProvider>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
|
||||||
inline static QFont makeAliasFont(const QFont &normalFont)
|
inline static QFont makeAliasFont(const QFont &normalFont)
|
||||||
{
|
{
|
||||||
|
@ -110,6 +112,10 @@ int FolderStatusDelegate::rootFolderHeightWithoutErrors(const QFontMetrics &fm,
|
||||||
void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
|
void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
|
||||||
const QModelIndex &index) const
|
const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
|
if (index.data(AddButton).toBool()) {
|
||||||
|
const_cast<QStyleOptionViewItem &>(option).showDecorationSelected = false;
|
||||||
|
}
|
||||||
|
|
||||||
QStyledItemDelegate::paint(painter, option, index);
|
QStyledItemDelegate::paint(painter, option, index);
|
||||||
|
|
||||||
auto textAlign = Qt::AlignLeft;
|
auto textAlign = Qt::AlignLeft;
|
||||||
|
@ -129,15 +135,15 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
|
||||||
int margin = subFm.height() / 4;
|
int margin = subFm.height() / 4;
|
||||||
|
|
||||||
if (index.data(AddButton).toBool()) {
|
if (index.data(AddButton).toBool()) {
|
||||||
QSize hint = sizeHint(option, index);
|
|
||||||
QStyleOptionButton opt;
|
QStyleOptionButton opt;
|
||||||
static_cast<QStyleOption &>(opt) = option;
|
static_cast<QStyleOption &>(opt) = option;
|
||||||
opt.state &= ~QStyle::State_Selected;
|
if (opt.state & QStyle::State_Enabled && opt.state & QStyle::State_MouseOver && index == _pressedIndex) {
|
||||||
|
opt.state |= QStyle::State_Sunken;
|
||||||
|
} else {
|
||||||
opt.state |= QStyle::State_Raised;
|
opt.state |= QStyle::State_Raised;
|
||||||
|
}
|
||||||
opt.text = addFolderText();
|
opt.text = addFolderText();
|
||||||
opt.rect.setWidth(qMin(opt.rect.width(), hint.width()));
|
opt.rect = addButtonRect(option.rect, option.direction);
|
||||||
opt.rect.adjust(0, aliasMargin, 0, -aliasMargin);
|
|
||||||
opt.rect = QStyle::visualRect(option.direction, option.rect, opt.rect);
|
|
||||||
painter->save();
|
painter->save();
|
||||||
painter->setFont(qApp->font("QPushButton"));
|
painter->setFont(qApp->font("QPushButton"));
|
||||||
QApplication::style()->drawControl(QStyle::CE_PushButton, &opt, painter, option.widget);
|
QApplication::style()->drawControl(QStyle::CE_PushButton, &opt, painter, option.widget);
|
||||||
|
@ -352,6 +358,27 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
|
||||||
bool FolderStatusDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
|
bool FolderStatusDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
|
||||||
const QStyleOptionViewItem &option, const QModelIndex &index)
|
const QStyleOptionViewItem &option, const QModelIndex &index)
|
||||||
{
|
{
|
||||||
|
switch (event->type()) {
|
||||||
|
case QEvent::MouseButtonPress:
|
||||||
|
case QEvent::MouseMove:
|
||||||
|
if (const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(option.widget)) {
|
||||||
|
QMouseEvent *me = static_cast<QMouseEvent *>(event);
|
||||||
|
QModelIndex index;
|
||||||
|
if (me->buttons()) {
|
||||||
|
index = view->indexAt(me->pos());
|
||||||
|
}
|
||||||
|
if (_pressedIndex != index) {
|
||||||
|
_pressedIndex = index;
|
||||||
|
view->viewport()->update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case QEvent::MouseButtonRelease:
|
||||||
|
_pressedIndex = QModelIndex();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
return QStyledItemDelegate::editorEvent(event, model, option, index);
|
return QStyledItemDelegate::editorEvent(event, model, option, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,6 +402,16 @@ QRect FolderStatusDelegate::optionsButtonRect(QRect within, Qt::LayoutDirection
|
||||||
return QStyle::visualRect(direction, within, r);
|
return QStyle::visualRect(direction, within, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QRect FolderStatusDelegate::addButtonRect(QRect within, Qt::LayoutDirection direction)
|
||||||
|
{
|
||||||
|
QFontMetrics fm(qApp->font("QPushButton"));
|
||||||
|
QStyleOptionButton opt;
|
||||||
|
opt.text = addFolderText();
|
||||||
|
QSize size = QApplication::style()->sizeFromContents(QStyle::CT_PushButton, &opt, fm.size(Qt::TextSingleLine, opt.text)).expandedTo(QApplication::globalStrut());
|
||||||
|
QRect r(QPoint(within.left(), within.top() + within.height() / 2 - size.height() / 2), size);
|
||||||
|
return QStyle::visualRect(direction, within, r);
|
||||||
|
}
|
||||||
|
|
||||||
QRect FolderStatusDelegate::errorsListRect(QRect within)
|
QRect FolderStatusDelegate::errorsListRect(QRect within)
|
||||||
{
|
{
|
||||||
QFont font = QFont();
|
QFont font = QFont();
|
||||||
|
|
|
@ -57,11 +57,13 @@ public:
|
||||||
* return the position of the option button within the item
|
* return the position of the option button within the item
|
||||||
*/
|
*/
|
||||||
static QRect optionsButtonRect(QRect within, Qt::LayoutDirection direction);
|
static QRect optionsButtonRect(QRect within, Qt::LayoutDirection direction);
|
||||||
|
static QRect addButtonRect(QRect within, Qt::LayoutDirection direction);
|
||||||
static QRect errorsListRect(QRect within);
|
static QRect errorsListRect(QRect within);
|
||||||
static int rootFolderHeightWithoutErrors(const QFontMetrics &fm, const QFontMetrics &aliasFm);
|
static int rootFolderHeightWithoutErrors(const QFontMetrics &fm, const QFontMetrics &aliasFm);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static QString addFolderText();
|
static QString addFolderText();
|
||||||
|
QPersistentModelIndex _pressedIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace OCC
|
} // namespace OCC
|
||||||
|
|
42
src/gui/folderstatusview.cpp
Normal file
42
src/gui/folderstatusview.cpp
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 by J-P Nurmi <jpnurmi@gmail.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 "folderstatusview.h"
|
||||||
|
#include "folderstatusdelegate.h"
|
||||||
|
|
||||||
|
namespace OCC {
|
||||||
|
|
||||||
|
FolderStatusView::FolderStatusView(QWidget *parent) : QTreeView(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex FolderStatusView::indexAt(const QPoint &point) const
|
||||||
|
{
|
||||||
|
QModelIndex index = QTreeView::indexAt(point);
|
||||||
|
if (index.data(FolderStatusDelegate::AddButton).toBool() && !visualRect(index).contains(point)) {
|
||||||
|
return QModelIndex();
|
||||||
|
}
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
QRect FolderStatusView::visualRect(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
QRect rect = QTreeView::visualRect(index);
|
||||||
|
if (index.data(FolderStatusDelegate::AddButton).toBool()) {
|
||||||
|
return FolderStatusDelegate::addButtonRect(rect, layoutDirection());
|
||||||
|
}
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace OCC
|
39
src/gui/folderstatusview.h
Normal file
39
src/gui/folderstatusview.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 by J-P Nurmi <jpnurmi@gmail.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 FOLDERSTATUSVIEW_H
|
||||||
|
#define FOLDERSTATUSVIEW_H
|
||||||
|
|
||||||
|
#include <QTreeView>
|
||||||
|
|
||||||
|
namespace OCC {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The FolderStatusView class
|
||||||
|
* @ingroup gui
|
||||||
|
*/
|
||||||
|
class FolderStatusView : public QTreeView
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit FolderStatusView(QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
QModelIndex indexAt(const QPoint &point) const override;
|
||||||
|
QRect visualRect(const QModelIndex &index) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace OCC
|
||||||
|
|
||||||
|
#endif // FOLDERSTATUSVIEW_H
|
Loading…
Reference in a new issue