File indexing completed on 2024-04-28 05:46:36

0001 /*
0002     SPDX-FileCopyrightText: 2010 Volker Lanz <vl@fidra.de>
0003     SPDX-FileCopyrightText: 2014-2017 Andrius Štikonas <andrius@stikonas.eu>
0004 
0005     SPDX-License-Identifier: GPL-3.0-or-later
0006 */
0007 
0008 #include "gui/smartdialogwidget.h"
0009 
0010 #include "util/guihelpers.h"
0011 
0012 #include <KLocalizedString>
0013 
0014 #include <QStyledItemDelegate>
0015 #include <QStyleOptionViewItem>
0016 #include <QPainter>
0017 #include <QPoint>
0018 #include <QTextDocument>
0019 
0020 #include <config.h>
0021 
0022 class SmartAttrDelegate : public QStyledItemDelegate
0023 {
0024 public:
0025     SmartAttrDelegate() : QStyledItemDelegate() {}
0026 
0027     virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
0028 };
0029 
0030 void SmartAttrDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
0031 {
0032     QString text = index.data().toString();
0033 
0034     painter->save();
0035 
0036     QStyleOptionViewItem opt = option;
0037     initStyleOption(&opt, index);
0038 
0039     QApplication::style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter);
0040 
0041     QTextDocument doc;
0042     doc.setHtml(text);
0043     doc.setPageSize(option.rect.size());
0044 
0045     painter->setClipRect(option.rect);
0046     qint32 offset = (option.rect.height() - doc.size().height()) / 2;
0047     if (offset < 0)
0048         offset = 0;
0049 
0050     painter->translate(option.rect.x(), option.rect.y() + offset);
0051     doc.drawContents(painter);
0052 
0053     painter->restore();
0054 }
0055 
0056 SmartDialogWidget::SmartDialogWidget(QWidget* parent) :
0057     QWidget(parent),
0058     m_SmartAttrDelegate(new SmartAttrDelegate())
0059 {
0060     setupUi(this);
0061     setupConnections();
0062 
0063     loadConfig();
0064 
0065     treeSmartAttributes().setItemDelegateForColumn(1, m_SmartAttrDelegate);
0066     treeSmartAttributes().header()->setContextMenuPolicy(Qt::CustomContextMenu);
0067 }
0068 
0069 SmartDialogWidget::~SmartDialogWidget()
0070 {
0071     saveConfig();
0072     delete m_SmartAttrDelegate;
0073 }
0074 
0075 void SmartDialogWidget::loadConfig()
0076 {
0077     QList<int> colWidths = Config::treeSmartAttributesColumnWidths();
0078     QList<int> colPositions = Config::treeSmartAttributesColumnPositions();
0079     QList<int> colVisible = Config::treeSmartAttributesColumnVisible();
0080     QHeaderView* header = treeSmartAttributes().header();
0081 
0082     for (int i = 0; i < treeSmartAttributes().columnCount(); i++) {
0083         if (colPositions[0] != -1 && colPositions.size() > i)
0084             header->moveSection(header->visualIndex(i), colPositions[i]);
0085 
0086         if (colVisible[0] != -1 && colVisible.size() > i)
0087             treeSmartAttributes().setColumnHidden(i, colVisible[i] == 0);
0088 
0089         if (colWidths[0] != -1 && colWidths.size() > i)
0090             treeSmartAttributes().setColumnWidth(i, colWidths[i]);
0091     }
0092 }
0093 
0094 void SmartDialogWidget::saveConfig() const
0095 {
0096     QList<int> colWidths;
0097     QList<int> colPositions;
0098     QList<int> colVisible;
0099 
0100     for (int i = 0; i < treeSmartAttributes().columnCount(); i++) {
0101         colPositions.append(treeSmartAttributes().header()->visualIndex(i));
0102         colVisible.append(treeSmartAttributes().isColumnHidden(i) ? 0 : 1);
0103         colWidths.append(treeSmartAttributes().columnWidth(i));
0104     }
0105 
0106     Config::setTreeSmartAttributesColumnPositions(colPositions);
0107     Config::setTreeSmartAttributesColumnVisible(colVisible);
0108     Config::setTreeSmartAttributesColumnWidths(colWidths);
0109 
0110     Config::self()->save();
0111 }
0112 
0113 void SmartDialogWidget::setupConnections()
0114 {
0115     connect(treeSmartAttributes().header(), &QHeaderView::customContextMenuRequested, this, &SmartDialogWidget::onHeaderContextMenu);
0116 }
0117 
0118 void SmartDialogWidget::onHeaderContextMenu(const QPoint& p)
0119 {
0120     showColumnsContextMenu(p, treeSmartAttributes());
0121 }