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