mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2024-10-01 01:26:01 -04:00
Move category tab widgets to separate widget and hide history category when there is no history
This commit is contained in:
parent
851c7b891e
commit
cee297b218
@ -70,6 +70,7 @@ set(keepassx_SOURCES
|
|||||||
format/KeePass2XmlWriter.cpp
|
format/KeePass2XmlWriter.cpp
|
||||||
gui/AboutDialog.cpp
|
gui/AboutDialog.cpp
|
||||||
gui/Application.cpp
|
gui/Application.cpp
|
||||||
|
gui/CategoryListWidget.cpp
|
||||||
gui/ChangeMasterKeyWidget.cpp
|
gui/ChangeMasterKeyWidget.cpp
|
||||||
gui/Clipboard.cpp
|
gui/Clipboard.cpp
|
||||||
gui/DatabaseOpenWidget.cpp
|
gui/DatabaseOpenWidget.cpp
|
||||||
@ -132,6 +133,7 @@ set(keepassx_FORMS
|
|||||||
gui/ChangeMasterKeyWidget.ui
|
gui/ChangeMasterKeyWidget.ui
|
||||||
gui/DatabaseOpenWidget.ui
|
gui/DatabaseOpenWidget.ui
|
||||||
gui/DatabaseSettingsWidget.ui
|
gui/DatabaseSettingsWidget.ui
|
||||||
|
gui/CategoryListWidget.ui
|
||||||
gui/EditWidget.ui
|
gui/EditWidget.ui
|
||||||
gui/EditWidgetIcons.ui
|
gui/EditWidgetIcons.ui
|
||||||
gui/EditWidgetProperties.ui
|
gui/EditWidgetProperties.ui
|
||||||
|
173
src/gui/CategoryListWidget.cpp
Normal file
173
src/gui/CategoryListWidget.cpp
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 KeePassXC Team
|
||||||
|
*
|
||||||
|
* 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 or (at your option)
|
||||||
|
* version 3 of the License.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "CategoryListWidget.h"
|
||||||
|
#include "ui_CategoryListWidget.h"
|
||||||
|
|
||||||
|
#include <QListWidget>
|
||||||
|
#include <QScrollBar>
|
||||||
|
#include <QSize>
|
||||||
|
#include <QStyledItemDelegate>
|
||||||
|
#include <QPainter>
|
||||||
|
|
||||||
|
CategoryListWidget::CategoryListWidget(QWidget* parent)
|
||||||
|
: QWidget(parent),
|
||||||
|
m_ui(new Ui::CategoryListWidget())
|
||||||
|
{
|
||||||
|
m_ui->setupUi(this);
|
||||||
|
m_ui->categoryList->setItemDelegate(new CategoryListWidgetDelegate(this));
|
||||||
|
|
||||||
|
connect(m_ui->categoryList, SIGNAL(currentRowChanged(int)), SLOT(emitCategoryChanged(int)));
|
||||||
|
|
||||||
|
connect(m_ui->scrollUp, SIGNAL(clicked()), SLOT(scrollCategoriesUp()));
|
||||||
|
connect(m_ui->scrollDown, SIGNAL(clicked()), SLOT(scrollCategoriesDown()));
|
||||||
|
connect(m_ui->categoryList->verticalScrollBar(), SIGNAL(valueChanged(int)), SLOT(updateCategoryScrollButtons()));
|
||||||
|
connect(m_ui->categoryList->verticalScrollBar(), SIGNAL(rangeChanged(int, int)), SLOT(updateCategoryScrollButtons()));
|
||||||
|
}
|
||||||
|
|
||||||
|
CategoryListWidget::~CategoryListWidget()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize CategoryListWidget::sizeHint() const
|
||||||
|
{
|
||||||
|
QSize sizeHint = QWidget::sizeHint();
|
||||||
|
|
||||||
|
int width = m_ui->categoryList->sizeHintForColumn(0) + m_ui->categoryList->frameWidth() * 2;
|
||||||
|
if (m_ui->categoryList->verticalScrollBar()->isVisible()) {
|
||||||
|
width += m_ui->categoryList->verticalScrollBar()->width();
|
||||||
|
}
|
||||||
|
sizeHint.setWidth(width);
|
||||||
|
|
||||||
|
return sizeHint;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize CategoryListWidget::minimumSizeHint() const
|
||||||
|
{
|
||||||
|
return QSize(sizeHint().width(), m_ui->categoryList->sizeHintForRow(0) * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CategoryListWidget::addCategory(const QString& labelText, const QIcon& icon)
|
||||||
|
{
|
||||||
|
QListWidgetItem* item = new QListWidgetItem(m_ui->categoryList);
|
||||||
|
item->setText(labelText);
|
||||||
|
item->setIcon(icon);
|
||||||
|
m_ui->categoryList->addItem(item);
|
||||||
|
return m_ui->categoryList->count() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CategoryListWidget::removeCategory(int index)
|
||||||
|
{
|
||||||
|
m_ui->categoryList->removeItemWidget(m_ui->categoryList->item(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
int CategoryListWidget::currentCategory()
|
||||||
|
{
|
||||||
|
return m_ui->categoryList->currentRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CategoryListWidget::setCurrentCategory(int index)
|
||||||
|
{
|
||||||
|
m_ui->categoryList->setCurrentRow(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CategoryListWidget::setCategoryHidden(int index, bool hidden)
|
||||||
|
{
|
||||||
|
m_ui->categoryList->item(index)->setHidden(hidden);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CategoryListWidget::isCategoryHidden(int index)
|
||||||
|
{
|
||||||
|
return m_ui->categoryList->item(index)->isHidden();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CategoryListWidget::showEvent(QShowEvent* event)
|
||||||
|
{
|
||||||
|
QWidget::showEvent(event);
|
||||||
|
updateCategoryScrollButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CategoryListWidget::updateCategoryScrollButtons()
|
||||||
|
{
|
||||||
|
m_ui->scrollUp->setEnabled(m_ui->categoryList->verticalScrollBar()->value() != 0);
|
||||||
|
m_ui->scrollDown->setEnabled(m_ui->categoryList->verticalScrollBar()->value()
|
||||||
|
!= m_ui->categoryList->verticalScrollBar()->maximum());
|
||||||
|
|
||||||
|
m_ui->scrollUp->setVisible(m_ui->categoryList->verticalScrollBar()->maximum() > 0);
|
||||||
|
m_ui->scrollDown->setVisible(m_ui->scrollUp->isVisible());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CategoryListWidget::scrollCategoriesUp()
|
||||||
|
{
|
||||||
|
m_ui->categoryList->verticalScrollBar()->setValue(
|
||||||
|
m_ui->categoryList->verticalScrollBar()->value() - m_ui->categoryList->verticalScrollBar()->pageStep()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CategoryListWidget::scrollCategoriesDown()
|
||||||
|
{
|
||||||
|
m_ui->categoryList->verticalScrollBar()->setValue(
|
||||||
|
m_ui->categoryList->verticalScrollBar()->value() + m_ui->categoryList->verticalScrollBar()->pageStep()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CategoryListWidget::emitCategoryChanged(int index)
|
||||||
|
{
|
||||||
|
emit categoryChanged(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
CategoryListWidgetDelegate::CategoryListWidgetDelegate(QWidget* parent)
|
||||||
|
: QStyledItemDelegate(parent),
|
||||||
|
m_size(96, 96)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void CategoryListWidgetDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
|
||||||
|
{
|
||||||
|
QStyleOptionViewItem opt = option;
|
||||||
|
initStyleOption(&opt, index);
|
||||||
|
|
||||||
|
painter->save();
|
||||||
|
|
||||||
|
QIcon icon = opt.icon;
|
||||||
|
QSize iconSize = opt.icon.actualSize(QSize(32, 32));
|
||||||
|
opt.icon = QIcon();
|
||||||
|
opt.decorationAlignment = Qt::AlignHCenter | Qt::AlignVCenter;
|
||||||
|
opt.decorationPosition = QStyleOptionViewItem::Top;
|
||||||
|
|
||||||
|
QStyle* style = opt.widget ? opt.widget->style() : QApplication::style();
|
||||||
|
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
|
||||||
|
|
||||||
|
QRect fontRect = painter->fontMetrics().boundingRect(
|
||||||
|
QRect(0, 0, m_size.width(), m_size.height()), Qt::AlignHCenter | Qt::AlignBottom | Qt::TextWordWrap, opt.text);
|
||||||
|
|
||||||
|
int paddingTop = fontRect.height() < 30 ? 15 : 10;
|
||||||
|
int left = opt.rect.left() + opt.rect.width() / 2 - iconSize.width() / 2;
|
||||||
|
painter->drawPixmap(left, opt.rect.top() + paddingTop, icon.pixmap(iconSize));
|
||||||
|
|
||||||
|
painter->restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize CategoryListWidgetDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(option);
|
||||||
|
Q_UNUSED(index);
|
||||||
|
return m_size;
|
||||||
|
}
|
79
src/gui/CategoryListWidget.h
Normal file
79
src/gui/CategoryListWidget.h
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 KeePassXC Team
|
||||||
|
*
|
||||||
|
* 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 or (at your option)
|
||||||
|
* version 3 of the License.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QStyledItemDelegate>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class CategoryListWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CategoryListWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
CategoryListWidget(QWidget* parent = 0);
|
||||||
|
~CategoryListWidget();
|
||||||
|
|
||||||
|
int currentCategory();
|
||||||
|
void setCurrentCategory(int index);
|
||||||
|
int addCategory(const QString& labelText, const QIcon& icon);
|
||||||
|
void setCategoryHidden(int index, bool hidden);
|
||||||
|
bool isCategoryHidden(int index);
|
||||||
|
void removeCategory(int index);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void categoryChanged(int index);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void showEvent(QShowEvent* event) override;
|
||||||
|
QSize sizeHint() const override;
|
||||||
|
QSize minimumSizeHint() const override;
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void updateCategoryScrollButtons();
|
||||||
|
void scrollCategoriesDown();
|
||||||
|
void scrollCategoriesUp();
|
||||||
|
void emitCategoryChanged(int index);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const QScopedPointer<Ui::CategoryListWidget> m_ui;
|
||||||
|
|
||||||
|
Q_DISABLE_COPY(CategoryListWidget)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
class CategoryListWidgetDelegate : public QStyledItemDelegate
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit CategoryListWidgetDelegate(QWidget* parent = nullptr);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
|
||||||
|
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSize m_size;
|
||||||
|
|
||||||
|
Q_DISABLE_COPY(CategoryListWidgetDelegate)
|
||||||
|
};
|
116
src/gui/CategoryListWidget.ui
Normal file
116
src/gui/CategoryListWidget.ui
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>CategoryListWidget</class>
|
||||||
|
<widget class="QWidget" name="CategoryListWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>182</width>
|
||||||
|
<height>418</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="scrollUp">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>15</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true"/>
|
||||||
|
</property>
|
||||||
|
<property name="arrowType">
|
||||||
|
<enum>Qt::UpArrow</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="categoryList">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="verticalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="movement">
|
||||||
|
<enum>QListView::Static</enum>
|
||||||
|
</property>
|
||||||
|
<property name="flow">
|
||||||
|
<enum>QListView::TopToBottom</enum>
|
||||||
|
</property>
|
||||||
|
<property name="isWrapping" stdset="0">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="viewMode">
|
||||||
|
<enum>QListView::IconMode</enum>
|
||||||
|
</property>
|
||||||
|
<property name="uniformItemSizes">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="scrollDown">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>15</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true"/>
|
||||||
|
</property>
|
||||||
|
<property name="arrowType">
|
||||||
|
<enum>Qt::DownArrow</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>categoryList</tabstop>
|
||||||
|
<tabstop>scrollUp</tabstop>
|
||||||
|
<tabstop>scrollDown</tabstop>
|
||||||
|
</tabstops>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -34,41 +34,43 @@ EditWidget::EditWidget(QWidget* parent)
|
|||||||
headerLabelFont.setPointSize(headerLabelFont.pointSize() + 2);
|
headerLabelFont.setPointSize(headerLabelFont.pointSize() + 2);
|
||||||
headlineLabel()->setFont(headerLabelFont);
|
headlineLabel()->setFont(headerLabelFont);
|
||||||
|
|
||||||
connect(m_ui->categoryList, SIGNAL(currentRowChanged(int)),
|
connect(m_ui->categoryList, SIGNAL(categoryChanged(int)),
|
||||||
m_ui->stackedWidget, SLOT(setCurrentIndex(int)));
|
m_ui->stackedWidget, SLOT(setCurrentIndex(int)));
|
||||||
|
|
||||||
connect(m_ui->buttonBox, SIGNAL(accepted()), SIGNAL(accepted()));
|
connect(m_ui->buttonBox, SIGNAL(accepted()), SIGNAL(accepted()));
|
||||||
connect(m_ui->buttonBox, SIGNAL(rejected()), SIGNAL(rejected()));
|
connect(m_ui->buttonBox, SIGNAL(rejected()), SIGNAL(rejected()));
|
||||||
|
|
||||||
connect(m_ui->scrollUp, SIGNAL(clicked()), SLOT(scrollCategoriesUp()));
|
|
||||||
connect(m_ui->scrollDown, SIGNAL(clicked()), SLOT(scrollCategoriesDown()));
|
|
||||||
connect(m_ui->categoryList->verticalScrollBar(), SIGNAL(valueChanged(int)), SLOT(updateCategoryScrollButtons()));
|
|
||||||
connect(m_ui->categoryList->verticalScrollBar(), SIGNAL(rangeChanged(int, int)), SLOT(updateCategoryScrollButtons()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EditWidget::~EditWidget()
|
EditWidget::~EditWidget()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditWidget::add(const QString& labelText, QWidget* widget)
|
void EditWidget::addPage(const QString& labelText, const QIcon& icon, QWidget* widget)
|
||||||
{
|
{
|
||||||
m_ui->categoryList->addItem(labelText);
|
|
||||||
QListWidgetItem* item = m_ui->categoryList->item(m_ui->categoryList->count() - 1);
|
|
||||||
item->setIcon(FilePath::instance()->icon("apps", "keepassxc"));
|
|
||||||
m_ui->stackedWidget->addWidget(widget);
|
m_ui->stackedWidget->addWidget(widget);
|
||||||
|
m_ui->categoryList->addCategory(labelText, icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditWidget::setRowHidden(QWidget* widget, bool hide)
|
void EditWidget::setPageHidden(QWidget* widget, bool hidden)
|
||||||
{
|
{
|
||||||
int row = m_ui->stackedWidget->indexOf(widget);
|
int index = m_ui->stackedWidget->indexOf(widget);
|
||||||
if (row != -1) {
|
if (index != -1) {
|
||||||
m_ui->categoryList->item(row)->setHidden(hide);
|
m_ui->categoryList->setCategoryHidden(index, hidden);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index == m_ui->stackedWidget->currentIndex()) {
|
||||||
|
int newIndex = m_ui->stackedWidget->currentIndex() - 1;
|
||||||
|
if (newIndex < 0) {
|
||||||
|
newIndex = m_ui->stackedWidget->count() - 1;
|
||||||
|
}
|
||||||
|
m_ui->stackedWidget->setCurrentIndex(newIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditWidget::setCurrentRow(int index)
|
void EditWidget::setCurrentPage(int index)
|
||||||
{
|
{
|
||||||
m_ui->categoryList->setCurrentRow(index);
|
m_ui->categoryList->setCurrentCategory(index);
|
||||||
|
m_ui->stackedWidget->setCurrentIndex(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditWidget::setHeadline(const QString& text)
|
void EditWidget::setHeadline(const QString& text)
|
||||||
@ -109,33 +111,3 @@ void EditWidget::hideMessage()
|
|||||||
m_ui->messageWidget->animatedHide();
|
m_ui->messageWidget->animatedHide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditWidget::updateCategoryScrollButtons()
|
|
||||||
{
|
|
||||||
m_ui->scrollUp->setEnabled(m_ui->categoryList->verticalScrollBar()->value() != 0);
|
|
||||||
m_ui->scrollDown->setEnabled(m_ui->categoryList->verticalScrollBar()->value()
|
|
||||||
!= m_ui->categoryList->verticalScrollBar()->maximum());
|
|
||||||
|
|
||||||
m_ui->scrollUp->setVisible(m_ui->categoryList->verticalScrollBar()->maximum() > 0);
|
|
||||||
m_ui->scrollDown->setVisible(m_ui->scrollUp->isVisible());
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditWidget::showEvent(QShowEvent* event)
|
|
||||||
{
|
|
||||||
QWidget::showEvent(event);
|
|
||||||
updateCategoryScrollButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditWidget::scrollCategoriesUp()
|
|
||||||
{
|
|
||||||
m_ui->categoryList->verticalScrollBar()->setValue(
|
|
||||||
m_ui->categoryList->verticalScrollBar()->value() - m_ui->categoryList->verticalScrollBar()->pageStep()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditWidget::scrollCategoriesDown()
|
|
||||||
{
|
|
||||||
m_ui->categoryList->verticalScrollBar()->setValue(
|
|
||||||
m_ui->categoryList->verticalScrollBar()->value() + m_ui->categoryList->verticalScrollBar()->pageStep()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
@ -39,25 +39,19 @@ public:
|
|||||||
explicit EditWidget(QWidget* parent = nullptr);
|
explicit EditWidget(QWidget* parent = nullptr);
|
||||||
~EditWidget();
|
~EditWidget();
|
||||||
|
|
||||||
void add(const QString& labelText, QWidget* widget);
|
void addPage(const QString& labelText, const QIcon& icon, QWidget* widget);
|
||||||
void setRowHidden(QWidget* widget, bool hide);
|
void setPageHidden(QWidget* widget, bool hidden);
|
||||||
void setCurrentRow(int index);
|
void setCurrentPage(int index);
|
||||||
void setHeadline(const QString& text);
|
void setHeadline(const QString& text);
|
||||||
QLabel* headlineLabel();
|
QLabel* headlineLabel();
|
||||||
void setReadOnly(bool readOnly);
|
void setReadOnly(bool readOnly);
|
||||||
bool readOnly() const;
|
bool readOnly() const;
|
||||||
|
|
||||||
protected:
|
|
||||||
void showEvent(QShowEvent* event) override;
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void accepted();
|
void accepted();
|
||||||
void rejected();
|
void rejected();
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void updateCategoryScrollButtons();
|
|
||||||
void scrollCategoriesDown();
|
|
||||||
void scrollCategoriesUp();
|
|
||||||
void showMessage(const QString& text, MessageWidget::MessageType type);
|
void showMessage(const QString& text, MessageWidget::MessageType type);
|
||||||
void hideMessage();
|
void hideMessage();
|
||||||
|
|
||||||
|
@ -39,60 +39,9 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="scrollUp">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>15</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
<property name="arrowType">
|
|
||||||
<enum>Qt::UpArrow</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="CategoryListWidget" name="categoryList"/>
|
<widget class="CategoryListWidget" name="categoryList"/>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="scrollDown">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>15</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
<property name="arrowType">
|
|
||||||
<enum>Qt::DownArrow</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QStackedWidget" name="stackedWidget">
|
<widget class="QStackedWidget" name="stackedWidget">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
@ -128,14 +77,9 @@
|
|||||||
<customwidget>
|
<customwidget>
|
||||||
<class>CategoryListWidget</class>
|
<class>CategoryListWidget</class>
|
||||||
<extends>QListWidget</extends>
|
<extends>QListWidget</extends>
|
||||||
<header>gui/entry/EditEntryWidget_p.h</header>
|
<header>gui/CategoryListWidget.h</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<tabstops>
|
|
||||||
<tabstop>categoryList</tabstop>
|
|
||||||
<tabstop>scrollUp</tabstop>
|
|
||||||
<tabstop>scrollDown</tabstop>
|
|
||||||
</tabstops>
|
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "autotype/AutoType.h"
|
#include "autotype/AutoType.h"
|
||||||
#include "core/Config.h"
|
#include "core/Config.h"
|
||||||
#include "core/Translator.h"
|
#include "core/Translator.h"
|
||||||
|
#include "core/FilePath.h"
|
||||||
|
|
||||||
class SettingsWidget::ExtraPage
|
class SettingsWidget::ExtraPage
|
||||||
{
|
{
|
||||||
@ -57,8 +58,8 @@ SettingsWidget::SettingsWidget(QWidget* parent)
|
|||||||
|
|
||||||
m_secUi->setupUi(m_secWidget);
|
m_secUi->setupUi(m_secWidget);
|
||||||
m_generalUi->setupUi(m_generalWidget);
|
m_generalUi->setupUi(m_generalWidget);
|
||||||
add(tr("General"), m_generalWidget);
|
addPage(tr("General"), FilePath::instance()->icon("apps", "keepassxc"), m_generalWidget);
|
||||||
add(tr("Security"), m_secWidget);
|
addPage(tr("Security"), FilePath::instance()->icon("apps", "keepassxc"), m_secWidget);
|
||||||
|
|
||||||
m_generalUi->autoTypeShortcutWidget->setVisible(autoType()->isAvailable());
|
m_generalUi->autoTypeShortcutWidget->setVisible(autoType()->isAvailable());
|
||||||
m_generalUi->autoTypeShortcutLabel->setVisible(autoType()->isAvailable());
|
m_generalUi->autoTypeShortcutLabel->setVisible(autoType()->isAvailable());
|
||||||
@ -92,7 +93,7 @@ void SettingsWidget::addSettingsPage(ISettingsPage *page)
|
|||||||
QWidget * widget = page->createWidget();
|
QWidget * widget = page->createWidget();
|
||||||
widget->setParent(this);
|
widget->setParent(this);
|
||||||
m_extraPages.append(ExtraPage(page, widget));
|
m_extraPages.append(ExtraPage(page, widget));
|
||||||
add(page->name(), widget);
|
addPage(page->name(), FilePath::instance()->icon("apps", "keepassxc"), widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsWidget::loadSettings()
|
void SettingsWidget::loadSettings()
|
||||||
@ -146,7 +147,7 @@ void SettingsWidget::loadSettings()
|
|||||||
Q_FOREACH (const ExtraPage& page, m_extraPages)
|
Q_FOREACH (const ExtraPage& page, m_extraPages)
|
||||||
page.loadSettings();
|
page.loadSettings();
|
||||||
|
|
||||||
setCurrentRow(0);
|
setCurrentPage(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsWidget::saveSettings()
|
void SettingsWidget::saveSettings()
|
||||||
|
@ -90,7 +90,7 @@ EditEntryWidget::~EditEntryWidget()
|
|||||||
void EditEntryWidget::setupMain()
|
void EditEntryWidget::setupMain()
|
||||||
{
|
{
|
||||||
m_mainUi->setupUi(m_mainWidget);
|
m_mainUi->setupUi(m_mainWidget);
|
||||||
add(tr("Entry"), m_mainWidget);
|
addPage(tr("Entry"), FilePath::instance()->icon("apps", "keepassxc"), m_mainWidget);
|
||||||
|
|
||||||
m_mainUi->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show"));
|
m_mainUi->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show"));
|
||||||
m_mainUi->togglePasswordGeneratorButton->setIcon(filePath()->icon("actions", "password-generator", false));
|
m_mainUi->togglePasswordGeneratorButton->setIcon(filePath()->icon("actions", "password-generator", false));
|
||||||
@ -115,7 +115,7 @@ void EditEntryWidget::setupMain()
|
|||||||
void EditEntryWidget::setupAdvanced()
|
void EditEntryWidget::setupAdvanced()
|
||||||
{
|
{
|
||||||
m_advancedUi->setupUi(m_advancedWidget);
|
m_advancedUi->setupUi(m_advancedWidget);
|
||||||
add(tr("Advanced"), m_advancedWidget);
|
addPage(tr("Advanced"), FilePath::instance()->icon("apps", "keepassxc"), m_advancedWidget);
|
||||||
|
|
||||||
m_attachmentsModel->setEntryAttachments(m_entryAttachments);
|
m_attachmentsModel->setEntryAttachments(m_entryAttachments);
|
||||||
m_advancedUi->attachmentsView->setModel(m_attachmentsModel);
|
m_advancedUi->attachmentsView->setModel(m_attachmentsModel);
|
||||||
@ -139,13 +139,13 @@ void EditEntryWidget::setupAdvanced()
|
|||||||
|
|
||||||
void EditEntryWidget::setupIcon()
|
void EditEntryWidget::setupIcon()
|
||||||
{
|
{
|
||||||
add(tr("Icon"), m_iconsWidget);
|
addPage(tr("Icon"), FilePath::instance()->icon("apps", "keepassxc"), m_iconsWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditEntryWidget::setupAutoType()
|
void EditEntryWidget::setupAutoType()
|
||||||
{
|
{
|
||||||
m_autoTypeUi->setupUi(m_autoTypeWidget);
|
m_autoTypeUi->setupUi(m_autoTypeWidget);
|
||||||
add(tr("Auto-Type"), m_autoTypeWidget);
|
addPage(tr("Auto-Type"), FilePath::instance()->icon("apps", "keepassxc"), m_autoTypeWidget);
|
||||||
|
|
||||||
m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->inheritSequenceButton);
|
m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->inheritSequenceButton);
|
||||||
m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->customSequenceButton);
|
m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->customSequenceButton);
|
||||||
@ -177,13 +177,13 @@ void EditEntryWidget::setupAutoType()
|
|||||||
|
|
||||||
void EditEntryWidget::setupProperties()
|
void EditEntryWidget::setupProperties()
|
||||||
{
|
{
|
||||||
add(tr("Properties"), m_editWidgetProperties);
|
addPage(tr("Properties"), FilePath::instance()->icon("apps", "keepassxc"), m_editWidgetProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditEntryWidget::setupHistory()
|
void EditEntryWidget::setupHistory()
|
||||||
{
|
{
|
||||||
m_historyUi->setupUi(m_historyWidget);
|
m_historyUi->setupUi(m_historyWidget);
|
||||||
add(tr("History"), m_historyWidget);
|
addPage(tr("History"), FilePath::instance()->icon("apps", "keepassxc"), m_historyWidget);
|
||||||
|
|
||||||
m_sortModel->setSourceModel(m_historyModel);
|
m_sortModel->setSourceModel(m_historyModel);
|
||||||
m_sortModel->setDynamicSortFilter(true);
|
m_sortModel->setDynamicSortFilter(true);
|
||||||
@ -291,8 +291,8 @@ void EditEntryWidget::loadEntry(Entry* entry, bool create, bool history, const Q
|
|||||||
setForms(entry);
|
setForms(entry);
|
||||||
setReadOnly(m_history);
|
setReadOnly(m_history);
|
||||||
|
|
||||||
setCurrentRow(0);
|
setCurrentPage(0);
|
||||||
setRowHidden(m_historyWidget, m_history);
|
setPageHidden(m_historyWidget, m_history || m_entry->historyItems().count() < 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditEntryWidget::setForms(const Entry* entry, bool restore)
|
void EditEntryWidget::setForms(const Entry* entry, bool restore)
|
||||||
|
@ -18,90 +18,8 @@
|
|||||||
#ifndef KEEPASSX_EDITENTRYWIDGET_P_H
|
#ifndef KEEPASSX_EDITENTRYWIDGET_P_H
|
||||||
#define KEEPASSX_EDITENTRYWIDGET_P_H
|
#define KEEPASSX_EDITENTRYWIDGET_P_H
|
||||||
|
|
||||||
#include <QListWidget>
|
#include <QListView>
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
#include <QSize>
|
|
||||||
#include <QStyledItemDelegate>
|
|
||||||
#include <QPainter>
|
|
||||||
|
|
||||||
class CategoryListViewDelegate : public QStyledItemDelegate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit CategoryListViewDelegate(QListView* parent = nullptr)
|
|
||||||
: QStyledItemDelegate(parent), m_size(96, 96)
|
|
||||||
{}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
|
|
||||||
{
|
|
||||||
QStyleOptionViewItem opt = option;
|
|
||||||
initStyleOption(&opt, index);
|
|
||||||
|
|
||||||
painter->save();
|
|
||||||
|
|
||||||
QIcon icon = opt.icon;
|
|
||||||
QSize iconSize = opt.icon.actualSize(QSize(32, 32));
|
|
||||||
opt.icon = QIcon();
|
|
||||||
opt.decorationAlignment = Qt::AlignHCenter | Qt::AlignVCenter;
|
|
||||||
opt.decorationPosition = QStyleOptionViewItem::Top;
|
|
||||||
|
|
||||||
QStyle* style = opt.widget ? opt.widget->style() : QApplication::style();
|
|
||||||
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
|
|
||||||
|
|
||||||
QRect fontRect = painter->fontMetrics().boundingRect(
|
|
||||||
QRect(0, 0, m_size.width(), m_size.height()), Qt::AlignHCenter | Qt::AlignBottom | Qt::TextWordWrap, opt.text);
|
|
||||||
|
|
||||||
int paddingTop = fontRect.height() < 30 ? 15 : 10;
|
|
||||||
int left = opt.rect.left() + opt.rect.width() / 2 - iconSize.width() / 2;
|
|
||||||
painter->drawPixmap(left, opt.rect.top() + paddingTop, icon.pixmap(iconSize));
|
|
||||||
|
|
||||||
painter->restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
|
|
||||||
{
|
|
||||||
Q_UNUSED(option);
|
|
||||||
Q_UNUSED(index);
|
|
||||||
return m_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QSize m_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CategoryListWidget : public QListWidget
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit CategoryListWidget(QWidget* parent = 0)
|
|
||||||
: QListWidget(parent)
|
|
||||||
{
|
|
||||||
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
|
|
||||||
setItemDelegate(new CategoryListViewDelegate(this));
|
|
||||||
setMovement(QListView::Static);
|
|
||||||
setViewMode(QListWidget::IconMode);
|
|
||||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
||||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
||||||
setWordWrap(true);
|
|
||||||
}
|
|
||||||
protected:
|
|
||||||
QSize sizeHint() const override
|
|
||||||
{
|
|
||||||
QSize sizeHint = QListWidget::sizeHint();
|
|
||||||
|
|
||||||
int width = sizeHintForColumn(0) + frameWidth() * 2;
|
|
||||||
if (verticalScrollBar()->isVisible()) {
|
|
||||||
width += verticalScrollBar()->width();
|
|
||||||
}
|
|
||||||
sizeHint.setWidth(width);
|
|
||||||
|
|
||||||
return sizeHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
QSize minimumSizeHint() const override
|
|
||||||
{
|
|
||||||
return QSize(sizeHint().width(), sizeHintForRow(0) * 2);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class AttributesListView : public QListView
|
class AttributesListView : public QListView
|
||||||
{
|
{
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "ui_EditGroupWidgetMain.h"
|
#include "ui_EditGroupWidgetMain.h"
|
||||||
|
|
||||||
#include "core/Metadata.h"
|
#include "core/Metadata.h"
|
||||||
|
#include "core/FilePath.h"
|
||||||
#include "gui/EditWidgetIcons.h"
|
#include "gui/EditWidgetIcons.h"
|
||||||
#include "gui/EditWidgetProperties.h"
|
#include "gui/EditWidgetProperties.h"
|
||||||
|
|
||||||
@ -33,9 +34,9 @@ EditGroupWidget::EditGroupWidget(QWidget* parent)
|
|||||||
{
|
{
|
||||||
m_mainUi->setupUi(m_editGroupWidgetMain);
|
m_mainUi->setupUi(m_editGroupWidgetMain);
|
||||||
|
|
||||||
add(tr("Group"), m_editGroupWidgetMain);
|
addPage(tr("Group"), FilePath::instance()->icon("apps", "keepassxc"), m_editGroupWidgetMain);
|
||||||
add(tr("Icon"), m_editGroupWidgetIcons);
|
addPage(tr("Icon"), FilePath::instance()->icon("apps", "keepassxc"), m_editGroupWidgetIcons);
|
||||||
add(tr("Properties"), m_editWidgetProperties);
|
addPage(tr("Properties"), FilePath::instance()->icon("apps", "keepassxc"), m_editWidgetProperties);
|
||||||
|
|
||||||
connect(m_mainUi->expireCheck, SIGNAL(toggled(bool)), m_mainUi->expireDatePicker, SLOT(setEnabled(bool)));
|
connect(m_mainUi->expireCheck, SIGNAL(toggled(bool)), m_mainUi->expireDatePicker, SLOT(setEnabled(bool)));
|
||||||
connect(m_mainUi->autoTypeSequenceCustomRadio, SIGNAL(toggled(bool)),
|
connect(m_mainUi->autoTypeSequenceCustomRadio, SIGNAL(toggled(bool)),
|
||||||
@ -94,7 +95,7 @@ void EditGroupWidget::loadGroup(Group* group, bool create, Database* database)
|
|||||||
|
|
||||||
m_editWidgetProperties->setFields(group->timeInfo(), group->uuid());
|
m_editWidgetProperties->setFields(group->timeInfo(), group->uuid());
|
||||||
|
|
||||||
setCurrentRow(0);
|
setCurrentPage(0);
|
||||||
|
|
||||||
m_mainUi->editName->setFocus();
|
m_mainUi->editName->setFocus();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user