File indexing completed on 2024-05-19 05:40:37

0001 /***************************************************************************
0002  *  Copyright (C) 2022 by Renaud Guezennec                               *
0003  *   http://www.rolisteam.org/contact                                      *
0004  *                                                                         *
0005  *   This software is free software; you can redistribute it and/or modify *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
0019  ***************************************************************************/
0020 #include "controller/view_controller/sidemenucontroller.h"
0021 
0022 #include "mindmap/model/minditemmodel.h"
0023 
0024 namespace mindmap
0025 {
0026 FilteredModel::FilteredModel()
0027 {
0028     setDynamicSortFilter(true);
0029 }
0030 
0031 void FilteredModel::setPattern(const QString& newPattern)
0032 {
0033     if(m_pattern == newPattern)
0034         return;
0035     m_pattern= newPattern;
0036     emit patternChanged();
0037     invalidateFilter();
0038 }
0039 
0040 bool FilteredModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
0041 {
0042     auto index= sourceModel()->index(source_row, 0, source_parent);
0043 
0044     auto type= index.data(MindItemModel::Type).value<MindItem::Type>();
0045 
0046     if(type != MindItem::NodeType)
0047         return false;
0048 
0049     if(m_pattern.isEmpty())
0050         return true;
0051 
0052     auto node= index.data(MindItemModel::Object).value<MindNode*>();
0053     if(!node)
0054         return false;
0055     auto parent= node->parentNode();
0056 
0057     bool res= false;
0058     switch(m_criteria)
0059     {
0060     case FilteredModel::NoCrit:
0061         res = true;
0062         break;
0063     case FilteredModel::NameCrit:
0064         res= node->text().contains(m_pattern, Qt::CaseInsensitive);
0065         break;
0066     case FilteredModel::DescriptionCrit:
0067         res= node->description().contains(m_pattern, Qt::CaseInsensitive);
0068         break;
0069     case FilteredModel::TagCrit:
0070         res= node->tagsText().contains(m_pattern, Qt::CaseInsensitive);
0071         break;
0072     case FilteredModel::ParentOfCrit:
0073         res= parent ? parent->id().contains(m_pattern, Qt::CaseInsensitive) : false;
0074         break;
0075     case FilteredModel::AllCrit:
0076         res= node->text().contains(m_pattern, Qt::CaseInsensitive) || node->tagsText().contains(m_pattern, Qt::CaseInsensitive) || node->description().contains(m_pattern, Qt::CaseInsensitive);
0077         break;
0078     }
0079 
0080     return res;
0081 }
0082 
0083 FilteredModel::Criteria FilteredModel::criteria() const
0084 {
0085     return m_criteria;
0086 }
0087 
0088 void FilteredModel::setCriteria(Criteria newCriteria)
0089 {
0090     if(m_criteria == newCriteria)
0091         return;
0092     m_criteria= newCriteria;
0093     emit criteriaChanged();
0094     invalidateFilter();
0095 }
0096 
0097 const QString& FilteredModel::pattern() const
0098 {
0099     return m_pattern;
0100 }
0101 
0102 SideMenuController::SideMenuController(QObject* parent) : QObject{parent}, m_model{new mindmap::FilteredModel}
0103 {
0104     connect(m_model.get(), &mindmap::FilteredModel::criteriaChanged, this, &SideMenuController::criteriaChanged);
0105     connect(m_model.get(), &mindmap::FilteredModel::patternChanged, this, &SideMenuController::patternChanged);
0106 }
0107 
0108 mindmap::MindMapControllerBase* SideMenuController::controller() const
0109 {
0110     return m_controller;
0111 }
0112 
0113 void SideMenuController::setController(mindmap::MindMapControllerBase* newController)
0114 {
0115     if(m_controller == newController)
0116         return;
0117     m_controller= newController;
0118     emit controllerChanged();
0119     m_model->setSourceModel(newController->itemModel());
0120     connect(m_controller, &mindmap::MindMapControllerBase::nameChanged, this, &SideMenuController::nameChanged);
0121     emit nameChanged();
0122 }
0123 
0124 FilteredModel* SideMenuController::model() const
0125 {
0126     return m_model.get();
0127 }
0128 
0129 const QString& SideMenuController::pattern() const
0130 {
0131     return m_model->pattern();
0132 }
0133 
0134 void SideMenuController::setPattern(const QString& newPattern)
0135 {
0136     m_model->setPattern(newPattern);
0137 }
0138 
0139 FilteredModel::Criteria SideMenuController::criteria() const
0140 {
0141     return m_model->criteria();
0142 }
0143 
0144 void SideMenuController::setCriteria(FilteredModel::Criteria newCriteria)
0145 {
0146     m_model->setCriteria(newCriteria);
0147 }
0148 
0149 QString SideMenuController::name() const
0150 {
0151     return m_controller ? m_controller->name() : QString();
0152 }
0153 
0154 void SideMenuController::setName(const QString &newName)
0155 {
0156     if(m_controller)
0157         m_controller->setName(newName);
0158 }
0159 
0160 } // namespace mindmap