File indexing completed on 2024-05-12 16:43:51

0001 /*
0002     SPDX-FileCopyrightText: 2012 Alessandro Russo <axela74@yahoo.it>
0003     SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef KTAGSVIEW_P_H
0008 #define KTAGSVIEW_P_H
0009 
0010 #include "ktagsview.h"
0011 
0012 // ----------------------------------------------------------------------------
0013 // QT Includes
0014 
0015 #include <QList>
0016 
0017 // ----------------------------------------------------------------------------
0018 // KDE Includes
0019 
0020 #include <KLocalizedString>
0021 #include <KSharedConfig>
0022 #include <KConfigGroup>
0023 #include <KListWidgetSearchLine>
0024 
0025 // ----------------------------------------------------------------------------
0026 // Project Includes
0027 
0028 #include "ui_ktagsview.h"
0029 
0030 #include "kmymoneyviewbase_p.h"
0031 #include "mymoneyaccount.h"
0032 #include "mymoneyfile.h"
0033 #include "mymoneytag.h"
0034 #include "mymoneytransactionfilter.h"
0035 #include "icons.h"
0036 #include "viewenums.h"
0037 #include "widgetenums.h"
0038 
0039 using namespace Icons;
0040 namespace Ui {
0041 class KTagsView;
0042 }
0043 
0044 // *** KTagListItem Implementation ***
0045 
0046 /**
0047   * This class represents an item in the tags list view.
0048   */
0049 class KTagListItem : public QListWidgetItem
0050 {
0051 public:
0052     /**
0053       * Constructor to be used to construct a tag entry object.
0054       *
0055       * @param parent pointer to the QListWidget object this entry should be
0056       *               added to.
0057       * @param tag    const reference to MyMoneyTag for which
0058       *               the QListWidget entry is constructed
0059       */
0060     explicit KTagListItem(QListWidget *parent, const MyMoneyTag& tag) :
0061         QListWidgetItem(parent, QListWidgetItem::UserType),
0062         m_tag(tag)
0063     {
0064         setText(tag.name());
0065         // allow in column rename
0066         setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
0067     }
0068 
0069     ~KTagListItem() {}
0070 
0071     MyMoneyTag tag() const
0072     {
0073         return m_tag;
0074     }
0075 
0076 private:
0077     MyMoneyTag  m_tag;
0078 };
0079 
0080 class KTagsViewPrivate : public KMyMoneyViewBasePrivate
0081 {
0082     Q_DECLARE_PUBLIC(KTagsView)
0083 
0084 public:
0085     explicit KTagsViewPrivate(KTagsView *qq) :
0086         q_ptr(qq),
0087         ui(new Ui::KTagsView),
0088         m_needLoad(true),
0089         m_searchWidget(nullptr),
0090         m_inSelection(false),
0091         m_allowEditing(true),
0092         m_tagFilterType(0)
0093     {
0094     }
0095 
0096     ~KTagsViewPrivate() override
0097     {
0098         if (!m_needLoad) {
0099             // remember the splitter settings for startup
0100             KConfigGroup grp = KSharedConfig::openConfig()->group("Last Use Settings");
0101             grp.writeEntry("KTagsViewSplitterSize", ui->m_splitter->saveState());
0102             grp.sync();
0103         }
0104         delete ui;
0105     }
0106 
0107     void init()
0108     {
0109         Q_Q(KTagsView);
0110         m_needLoad = false;
0111         ui->setupUi(q);
0112 
0113         // create the searchline widget
0114         // and insert it into the existing layout
0115         m_searchWidget = new KListWidgetSearchLine(q, ui->m_tagsList);
0116         m_searchWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
0117         ui->m_tagsList->setContextMenuPolicy(Qt::CustomContextMenu);
0118         ui->m_listTopHLayout->insertWidget(0, m_searchWidget);
0119 
0120         //load the filter type
0121         ui->m_filterBox->addItem(i18nc("@item Show all tags", "All"));
0122         ui->m_filterBox->addItem(i18nc("@item Show only used tags", "Used"));
0123         ui->m_filterBox->addItem(i18nc("@item Show only unused tags", "Unused"));
0124         ui->m_filterBox->addItem(i18nc("@item Show only opened tags", "Opened"));
0125         ui->m_filterBox->addItem(i18nc("@item Show only closed tags", "Closed"));
0126         ui->m_filterBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
0127 
0128         ui->m_newButton->setIcon(Icons::get(Icon::ListAddTag));
0129         ui->m_renameButton->setIcon(Icons::get(Icon::EditRename));
0130         ui->m_deleteButton->setIcon(Icons::get(Icon::ListRemoveTag));
0131         ui->m_updateButton->setIcon(Icons::get(Icon::DialogOK));
0132         ui->m_updateButton->setEnabled(false);
0133 
0134         ui->m_register->setupRegister(MyMoneyAccount(),
0135                                       QList<eWidgets::eTransaction::Column> { eWidgets::eTransaction::Column::Date,
0136                                               eWidgets::eTransaction::Column::Account,
0137                                               eWidgets::eTransaction::Column::Detail,
0138                                               eWidgets::eTransaction::Column::ReconcileFlag,
0139                                               eWidgets::eTransaction::Column::Payment,
0140                                               eWidgets::eTransaction::Column::Deposit
0141                                                                             });
0142         ui->m_register->setSelectionMode(QTableWidget::SingleSelection);
0143         ui->m_register->setDetailsColumnType(eWidgets::eRegister::DetailColumn::AccountFirst);
0144         ui->m_balanceLabel->hide();
0145 
0146         q->connect(ui->m_tagsList, &QListWidget::currentItemChanged, q, static_cast<void (KTagsView::*)(QListWidgetItem *, QListWidgetItem *)>(&KTagsView::slotSelectTag));
0147         q->connect(ui->m_tagsList, &QListWidget::itemSelectionChanged, q, static_cast<void (KTagsView::*)()>(&KTagsView::slotSelectTag));
0148         q->connect(ui->m_tagsList, &QListWidget::itemDoubleClicked, q, &KTagsView::slotStartRename);
0149         q->connect(ui->m_tagsList, &QListWidget::itemChanged, q, &KTagsView::slotRenameSingleTag);
0150         q->connect(ui->m_tagsList, &QWidget::customContextMenuRequested, q, &KTagsView::slotShowTagsMenu);
0151 
0152         q->connect(ui->m_newButton,    &QAbstractButton::clicked, q, &KTagsView::slotNewTag);
0153         q->connect(ui->m_renameButton, &QAbstractButton::clicked, q, &KTagsView::slotRenameTag);
0154         q->connect(ui->m_deleteButton, &QAbstractButton::clicked, q, &KTagsView::slotDeleteTag);
0155 
0156         q->connect(ui->m_colorbutton, &KColorButton::changed,   q, &KTagsView::slotTagDataChanged);
0157         q->connect(ui->m_closed,      &QCheckBox::stateChanged, q, &KTagsView::slotTagDataChanged);
0158         q->connect(ui->m_notes,       &QTextEdit::textChanged,  q, &KTagsView::slotTagDataChanged);
0159 
0160         q->connect(ui->m_updateButton, &QAbstractButton::clicked, q, &KTagsView::slotUpdateTag);
0161         q->connect(ui->m_helpButton, &QAbstractButton::clicked,   q, &KTagsView::slotHelp);
0162 
0163         q->connect(ui->m_register, &KMyMoneyRegister::Register::editTransaction, q, &KTagsView::slotSelectTransaction);
0164 
0165         q->connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, q, &KTagsView::refresh);
0166 
0167         q->connect(ui->m_filterBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), q, &KTagsView::slotChangeFilter);
0168 
0169         // use the size settings of the last run (if any)
0170         auto grp = KSharedConfig::openConfig()->group("Last Use Settings");
0171         ui->m_splitter->restoreState(grp.readEntry("KTagsViewSplitterSize", QByteArray()));
0172         ui->m_splitter->setChildrenCollapsible(false);
0173 
0174         // At start we haven't any tag selected
0175         ui->m_tabWidget->setEnabled(false); // disable tab widget
0176         ui->m_deleteButton->setEnabled(false); // disable delete and rename button
0177         ui->m_renameButton->setEnabled(false);
0178         m_tag = MyMoneyTag(); // make sure we don't access an undefined tag
0179         q->clearItemData();
0180     }
0181 
0182     /**
0183       * Check if a list contains a tag with a given id
0184       *
0185       * @param list const reference to value list
0186       * @param id const reference to id
0187       *
0188       * @retval true object has been found
0189       * @retval false object is not in list
0190       */
0191     bool tagInList(const QList<MyMoneyTag>& list, const QString& id) const
0192     {
0193         bool rc = false;
0194         QList<MyMoneyTag>::const_iterator it_p = list.begin();
0195         while (it_p != list.end()) {
0196             if ((*it_p).id() == id) {
0197                 rc = true;
0198                 break;
0199             }
0200             ++it_p;
0201         }
0202         return rc;
0203     }
0204 
0205     KTagsView       *q_ptr;
0206     Ui::KTagsView   *ui;
0207 
0208     MyMoneyTag   m_tag;
0209     QString      m_newName;
0210 
0211     /**
0212         * This member holds a list of all transactions
0213         */
0214     QList<QPair<MyMoneyTransaction, MyMoneySplit> > m_transactionList;
0215 
0216     /**
0217         * This member holds the load state of page
0218         */
0219     bool m_needLoad;
0220 
0221     /**
0222         * Search widget for the list
0223         */
0224     KListWidgetSearchLine*  m_searchWidget;
0225 
0226     /**
0227        * Semaphore to suppress loading during selection
0228        */
0229     bool m_inSelection;
0230 
0231     /**
0232        * This signals whether a tag can be edited
0233        **/
0234     bool m_allowEditing;
0235 
0236     /**
0237         * This holds the filter type
0238         */
0239     int m_tagFilterType;
0240 
0241     QList<MyMoneyTag> m_selectedTags;
0242 };
0243 
0244 
0245 #endif