mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-06 14:29:54 +08:00
212 lines
6.3 KiB
C++
212 lines
6.3 KiB
C++
#include "deleteconfirmdialog.h"
|
|
|
|
#include <QVBoxLayout>
|
|
#include <QHBoxLayout>
|
|
#include <QLabel>
|
|
#include <QListWidget>
|
|
#include <QListWidgetItem>
|
|
#include <QCheckBox>
|
|
#include <QUrl>
|
|
#include <QScrollArea>
|
|
|
|
#include "global.h"
|
|
#include <utils/widgetutils.h>
|
|
#include "selectionitemwidget.h"
|
|
|
|
using namespace vnotex;
|
|
|
|
DeleteConfirmDialog::DeleteConfirmDialog(const QString &p_title,
|
|
const QString &p_text,
|
|
const QString &p_info,
|
|
const QVector<ConfirmItemInfo> &p_items,
|
|
DeleteConfirmDialog::Flags p_flags,
|
|
bool p_noAskAgainChecked,
|
|
QWidget *p_parent)
|
|
: ScrollDialog(p_parent),
|
|
m_items(p_items)
|
|
{
|
|
setupUI(p_title, p_text, p_info, p_flags, p_noAskAgainChecked);
|
|
|
|
updateItemsList();
|
|
|
|
updateCountLabel();
|
|
}
|
|
|
|
void DeleteConfirmDialog::setupUI(const QString &p_title,
|
|
const QString &p_text,
|
|
const QString &p_info,
|
|
DeleteConfirmDialog::Flags p_flags,
|
|
bool p_noAskAgainChecked)
|
|
{
|
|
auto mainWidget = new QWidget(this);
|
|
setCentralWidget(mainWidget);
|
|
|
|
auto mainLayout = new QVBoxLayout(mainWidget);
|
|
|
|
// Text.
|
|
if (!p_text.isEmpty()) {
|
|
auto textLabel = new QLabel(p_text, mainWidget);
|
|
textLabel->setWordWrap(true);
|
|
mainLayout->addWidget(textLabel);
|
|
}
|
|
|
|
// Info.
|
|
if (!p_info.isEmpty()) {
|
|
auto infoLabel = new QLabel(p_info, mainWidget);
|
|
infoLabel->setWordWrap(true);
|
|
mainLayout->addWidget(infoLabel);
|
|
}
|
|
|
|
// Ask again.
|
|
if (p_flags & Flag::AskAgain) {
|
|
m_noAskCB = new QCheckBox(tr("Do not ask again"), mainWidget);
|
|
m_noAskCB->setChecked(p_noAskAgainChecked);
|
|
mainLayout->addWidget(m_noAskCB);
|
|
}
|
|
|
|
// Count.
|
|
{
|
|
QHBoxLayout *labelLayout = new QHBoxLayout();
|
|
|
|
m_countLabel = new QLabel("Items", mainWidget);
|
|
|
|
labelLayout->addWidget(m_countLabel);
|
|
labelLayout->addStretch();
|
|
labelLayout->setContentsMargins(0, 0, 0, 0);
|
|
|
|
mainLayout->addLayout(labelLayout);
|
|
}
|
|
|
|
// List and preview.
|
|
{
|
|
auto listLayout = new QHBoxLayout();
|
|
|
|
m_listWidget = new QListWidget(mainWidget);
|
|
connect(m_listWidget, &QListWidget::currentRowChanged,
|
|
this, &DeleteConfirmDialog::currentFileChanged);
|
|
connect(m_listWidget, &QListWidget::itemActivated,
|
|
this, [this](QListWidgetItem *p_item) {
|
|
if (!p_item) {
|
|
return;
|
|
}
|
|
|
|
auto widget = getItemWidget(p_item);
|
|
Q_ASSERT(widget);
|
|
QString filePath = m_items[widget->getData().toInt()].m_path;
|
|
if (!filePath.isEmpty()) {
|
|
WidgetUtils::openUrlByDesktop(QUrl::fromLocalFile(filePath));
|
|
}
|
|
});
|
|
|
|
listLayout->addWidget(m_listWidget);
|
|
|
|
if (p_flags & Flag::Preview) {
|
|
m_previewer = new QLabel(mainWidget);
|
|
m_previewer->setScaledContents(true);
|
|
|
|
m_previewArea = new QScrollArea(mainWidget);
|
|
m_previewArea->setBackgroundRole(QPalette::Dark);
|
|
m_previewArea->setWidget(m_previewer);
|
|
m_previewArea->setMinimumSize(256, 256);
|
|
|
|
listLayout->addWidget(m_previewArea);
|
|
}
|
|
|
|
mainLayout->addLayout(listLayout);
|
|
}
|
|
|
|
setDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
|
|
|
setWindowTitle(p_title);
|
|
}
|
|
|
|
QVector<ConfirmItemInfo> DeleteConfirmDialog::getConfirmedItems() const
|
|
{
|
|
QVector<ConfirmItemInfo> confirmedItems;
|
|
|
|
for (int i = 0; i < m_listWidget->count(); ++i) {
|
|
SelectionItemWidget *widget = getItemWidget(m_listWidget->item(i));
|
|
if (widget->isChecked()) {
|
|
confirmedItems.push_back(m_items[widget->getData().toInt()]);
|
|
}
|
|
}
|
|
|
|
return confirmedItems;
|
|
}
|
|
|
|
void DeleteConfirmDialog::updateItemsList()
|
|
{
|
|
m_listWidget->clear();
|
|
|
|
for (int i = 0; i < m_items.size(); ++i) {
|
|
auto itemWidget = new SelectionItemWidget(m_items[i].m_icon, m_items[i].m_name, this);
|
|
itemWidget->setChecked(true);
|
|
itemWidget->setData(i);
|
|
itemWidget->setToolTip(m_items[i].m_tip);
|
|
connect(itemWidget, &SelectionItemWidget::checkStateChanged,
|
|
this, &DeleteConfirmDialog::updateCountLabel);
|
|
|
|
QListWidgetItem *item = new QListWidgetItem(m_listWidget);
|
|
QSize size = itemWidget->sizeHint();
|
|
size.setHeight(size.height() * 2);
|
|
item->setSizeHint(size);
|
|
|
|
m_listWidget->setItemWidget(item, itemWidget);
|
|
}
|
|
|
|
m_listWidget->setMinimumSize(m_listWidget->sizeHint());
|
|
m_listWidget->setCurrentRow(-1);
|
|
m_listWidget->setCurrentRow(0);
|
|
}
|
|
|
|
bool DeleteConfirmDialog::isNoAskChecked() const
|
|
{
|
|
return m_noAskCB->isChecked();
|
|
}
|
|
|
|
void DeleteConfirmDialog::currentFileChanged(int p_row)
|
|
{
|
|
if (m_previewer) {
|
|
bool succeed = false;
|
|
if (p_row > -1) {
|
|
SelectionItemWidget *widget = getItemWidget(m_listWidget->item(p_row));
|
|
if (widget) {
|
|
int idx = widget->getData().toInt();
|
|
Q_ASSERT(idx < m_items.size());
|
|
QPixmap image(m_items[idx].m_path);
|
|
if (!image.isNull()) {
|
|
m_previewer->setPixmap(image);
|
|
m_previewer->adjustSize();
|
|
succeed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
m_previewArea->setVisible(succeed);
|
|
if (succeed) {
|
|
resizeToHideScrollBarLater(true, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
SelectionItemWidget *DeleteConfirmDialog::getItemWidget(QListWidgetItem *p_item) const
|
|
{
|
|
QWidget *wid = m_listWidget->itemWidget(p_item);
|
|
return static_cast<SelectionItemWidget *>(wid);
|
|
}
|
|
|
|
void DeleteConfirmDialog::updateCountLabel()
|
|
{
|
|
int total = m_listWidget->count();
|
|
int checked = 0;
|
|
|
|
for (int i = 0; i < total; ++i) {
|
|
SelectionItemWidget *widget = getItemWidget(m_listWidget->item(i));
|
|
if (widget->isChecked()) {
|
|
++checked;
|
|
}
|
|
}
|
|
|
|
m_countLabel->setText(tr("%1/%2 Items").arg(checked).arg(total));
|
|
}
|