Fixed #278.
This commit is contained in:
		
							parent
							
								
									9e31eda78a
								
							
						
					
					
						commit
						34fb273212
					
				
					 3 changed files with 61 additions and 7 deletions
				
			
		|  | @ -131,9 +131,19 @@ void MessagesForFiltersModel::testFilter(MessageFilter* filter, QJSEngine* engin | |||
| } | ||||
| 
 | ||||
| Message* MessagesForFiltersModel::messageForRow(int row) { | ||||
|   if (row >= 0 && row < m_messages.size()) { | ||||
|     return &m_messages[row]; | ||||
|   } | ||||
|   else { | ||||
|     return nullptr; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| Message MessagesForFiltersModel::messageForRow(int row) const { | ||||
|   if (row >= 0 && row < m_messages.size()) { | ||||
|     return m_messages[row]; | ||||
|   } | ||||
|   else { | ||||
|     return Message(); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -45,6 +45,7 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q | |||
|   m_ui.m_btnRunOnMessages->setIcon(qApp->icons()->fromTheme(QSL("media-playback-start"))); | ||||
|   m_ui.m_btnDetailedHelp->setIcon(qApp->icons()->fromTheme(QSL("help-contents"))); | ||||
|   m_ui.m_txtScript->setFont(QFontDatabase::systemFont(QFontDatabase::SystemFont::FixedFont)); | ||||
|   m_ui.m_treeExistingMessages->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu); | ||||
| 
 | ||||
|   m_ui.m_treeExistingMessages->header()->setSectionResizeMode(MFM_MODEL_ISREAD, QHeaderView::ResizeMode::ResizeToContents); | ||||
|   m_ui.m_treeExistingMessages->header()->setSectionResizeMode(MFM_MODEL_ISIMPORTANT, QHeaderView::ResizeMode::ResizeToContents); | ||||
|  | @ -59,8 +60,9 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q | |||
|   }); | ||||
|   connect(m_ui.m_listFilters, &QListWidget::currentRowChanged, | ||||
|           this, &FormMessageFiltersManager::loadFilter); | ||||
|   connect(m_ui.m_btnAddNew, &QPushButton::clicked, | ||||
|           this, &FormMessageFiltersManager::addNewFilter); | ||||
|   connect(m_ui.m_btnAddNew, &QPushButton::clicked, this, [this]() { | ||||
|     addNewFilter(); | ||||
|   }); | ||||
|   connect(m_ui.m_btnRemoveSelected, &QPushButton::clicked, | ||||
|           this, &FormMessageFiltersManager::removeSelectedFilter); | ||||
|   connect(m_ui.m_txtTitle, &QLineEdit::textChanged, this, &FormMessageFiltersManager::saveSelectedFilter); | ||||
|  | @ -78,6 +80,8 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q | |||
|           this, &FormMessageFiltersManager::displayMessagesOfFeed); | ||||
|   connect(m_ui.m_btnRunOnMessages, &QPushButton::clicked, | ||||
|           this, &FormMessageFiltersManager::processCheckedFeeds); | ||||
|   connect(m_ui.m_treeExistingMessages, &QTreeView::customContextMenuRequested, | ||||
|           this, &FormMessageFiltersManager::showMessageContextMenu); | ||||
| 
 | ||||
|   initializeTestingMessage(); | ||||
|   loadFilters(); | ||||
|  | @ -104,6 +108,42 @@ ServiceRoot* FormMessageFiltersManager::selectedAccount() const { | |||
|   return dat.isNull() ? nullptr : dat.value<ServiceRoot*>(); | ||||
| } | ||||
| 
 | ||||
| void FormMessageFiltersManager::filterMessagesLikeThis(const Message& msg) { | ||||
|   QString filter_script = QSL("function filterMessage() {\n" | ||||
|                               "  // Adjust the condition to suit your needs.\n" | ||||
|                               "  var is_message_same =\n" | ||||
|                               "    msg.isRead == %1 &&\n" | ||||
|                               "    msg.isImportant == %2 &&\n" | ||||
|                               "    msg.title == '%3' &&\n" | ||||
|                               "    msg.url == '%4';\n" | ||||
|                               "\n" | ||||
|                               "  if (is_message_same) {\n" | ||||
|                               "    return MessageObject.Accept;\n" | ||||
|                               "  }\n" | ||||
|                               "  else {\n" | ||||
|                               "    return MessageObject.Ignore;\n" | ||||
|                               "  }\n" | ||||
|                               "}").arg(QString::number(int(msg.m_isRead)), | ||||
|                                        QString::number(int(msg.m_isImportant)), | ||||
|                                        msg.m_title, | ||||
|                                        msg.m_url); | ||||
| 
 | ||||
|   addNewFilter(filter_script); | ||||
| } | ||||
| 
 | ||||
| void FormMessageFiltersManager::showMessageContextMenu(const QPoint& pos) { | ||||
|   Message* msg = m_msgModel->messageForRow(m_ui.m_treeExistingMessages->indexAt(pos).row()); | ||||
| 
 | ||||
|   if (msg != nullptr) { | ||||
|     QMenu menu(tr("Context menu"), m_ui.m_treeExistingMessages); | ||||
| 
 | ||||
|     menu.addAction(tr("Filter messages like this"), this, [=]() { | ||||
|       filterMessagesLikeThis(*msg); | ||||
|     }); | ||||
|     menu.exec(m_ui.m_treeExistingMessages->mapToGlobal(pos)); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void FormMessageFiltersManager::removeSelectedFilter() { | ||||
|   auto* fltr = selectedFilter(); | ||||
| 
 | ||||
|  | @ -123,11 +163,13 @@ void FormMessageFiltersManager::loadFilters() { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| void FormMessageFiltersManager::addNewFilter() { | ||||
| void FormMessageFiltersManager::addNewFilter(const QString& filter_script) { | ||||
|   try { | ||||
|     auto* fltr = m_reader->addMessageFilter( | ||||
|       tr("New message filter"), | ||||
|       QSL("function filterMessage() { return MessageObject.Accept; }")); | ||||
|       filter_script.isEmpty() | ||||
|                    ? QSL("function filterMessage() { return MessageObject.Accept; }") | ||||
|                    : filter_script); | ||||
|     auto* it = new QListWidgetItem(fltr->name(), m_ui.m_listFilters); | ||||
| 
 | ||||
|     it->setData(Qt::ItemDataRole::UserRole, QVariant::fromValue<MessageFilter*>(fltr)); | ||||
|  |  | |||
|  | @ -25,8 +25,10 @@ class FormMessageFiltersManager : public QDialog { | |||
|     ServiceRoot* selectedAccount() const; | ||||
| 
 | ||||
|   private slots: | ||||
|     void filterMessagesLikeThis(const Message& msg); | ||||
|     void showMessageContextMenu(const QPoint& pos); | ||||
|     void removeSelectedFilter(); | ||||
|     void addNewFilter(); | ||||
|     void addNewFilter(const QString& filter_script = QString()); | ||||
|     void saveSelectedFilter(); | ||||
|     void loadFilter(); | ||||
|     void loadFilters(); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue