From 4501dc34292961b32a467a5daf66decda3e7825f Mon Sep 17 00:00:00 2001
From: ale rimoldi <ale@graphicslab.org>
Date: Wed, 16 Apr 2025 22:29:36 +0200
Subject: allow de/activating multiple fonts at once


diff --git a/scribus/ui/fontlistview.cpp b/scribus/ui/fontlistview.cpp
index fe0cb683a..d9cf23419 100644
--- a/scribus/ui/fontlistview.cpp
+++ b/scribus/ui/fontlistview.cpp
@@ -7,17 +7,38 @@ for which a new license (GPL+exception) is in place.
 #include "fontlistview.h"
 #include "fontlistmodel.h"
 
+#include <QMenu>
+#include <QModelIndex>
+#include <QPoint>
 
 FontListView::FontListView(QWidget * parent)
-	: QTableView(parent)
+	: QTableView(parent),
+	contextMenu(new QMenu(this)),
+	activateAction(new QAction("Activate", this)),
+	deactivateAction(new QAction("Deactivate", this)),
+	subsetAction(new QAction("Subset", this)),
+	notSubsetAction(new QAction("Do not subset", this))
 {
-	setSelectionMode(QAbstractItemView::SingleSelection);
+	setSelectionMode(QAbstractItemView::ExtendedSelection);
 	setSelectionBehavior(QAbstractItemView::SelectRows);
 	sortByColumn(FontListModel::SortIndex, Qt::AscendingOrder);
 	// do not show default sorting to user
 	hideColumn(FontListModel::SortIndex);
 	setSortingEnabled(false);
 	setAlternatingRowColors(true);
+	setContextMenuPolicy(Qt::CustomContextMenu);
+
+	contextMenu->addAction(activateAction);
+	contextMenu->addAction(deactivateAction);
+	contextMenu->addAction(subsetAction);
+	contextMenu->addAction(notSubsetAction);
+
+	connect(activateAction, &QAction::triggered, this, &FontListView::activateSelection);
+	connect(deactivateAction, &QAction::triggered, this, &FontListView::deactivateSelection);
+	connect(subsetAction, &QAction::triggered, this, &FontListView::subsetSelection);
+	connect(notSubsetAction, &QAction::triggered, this, &FontListView::notSubsetSelection);
+
+	connect(this, &QTableView::customContextMenuRequested, this, &FontListView::customContextMenuRequested);
 }
 
 void FontListView::setModel(QAbstractItemModel * model)
@@ -58,3 +79,43 @@ bool FontListView::isFontSubsetted(int i)
 	return (checkState == Qt::Checked);
 }
 
+void FontListView::customContextMenuRequested(QPoint pos)
+{
+    contextMenu->popup(viewport()->mapToGlobal(pos));
+}
+
+void FontListView::activateSelection()
+{
+	FontListModel* fontModel = qobject_cast<FontListModel*>(model());
+	for (const auto& selectedRow: selectionModel()->selectedRows())
+	{
+		fontModel->setData(selectedRow, Qt::Checked, Qt::CheckStateRole);
+	}
+}
+
+void FontListView::deactivateSelection()
+{
+	FontListModel* fontModel = qobject_cast<FontListModel*>(model());
+	for (const auto& selectedRow: selectionModel()->selectedRows())
+	{
+		fontModel->setData(selectedRow, Qt::Unchecked, Qt::CheckStateRole);
+	}
+}
+
+void FontListView::subsetSelection()
+{
+	FontListModel* fontModel = qobject_cast<FontListModel*>(model());
+	for (const auto& selectedRow: selectionModel()->selectedRows())
+	{
+		fontModel->setData(fontModel->index(selectedRow.row(), FontListModel::FontSubset), Qt::Checked, Qt::CheckStateRole);
+	}
+}
+
+void FontListView::notSubsetSelection()
+{
+	FontListModel* fontModel = qobject_cast<FontListModel*>(model());
+	for (const auto& selectedRow: selectionModel()->selectedRows())
+	{
+		fontModel->setData(fontModel->index(selectedRow.row(), FontListModel::FontSubset), Qt::Unchecked, Qt::CheckStateRole);
+	}
+}
diff --git a/scribus/ui/fontlistview.h b/scribus/ui/fontlistview.h
index 10ed47b70..bbf0dc744 100644
--- a/scribus/ui/fontlistview.h
+++ b/scribus/ui/fontlistview.h
@@ -8,6 +8,7 @@ for which a new license (GPL+exception) is in place.
 #define FONTLISTVIEW_H
 
 #include <QTableView>
+#include <QWheelEvent>
 
 #include "scfonts.h"
 
@@ -26,10 +27,21 @@ class SCRIBUS_API FontListView : public QTableView
 
 		void setModel(QAbstractItemModel * model);
 		void setFonts(const SCFonts& f);
-
 		QString fontName(int i);
 		bool    isFontUsable(int i);
 		bool    isFontSubsetted(int i);
+	public slots:
+		void customContextMenuRequested(QPoint pos);
+	private:
+		QMenu* contextMenu;
+		QAction* activateAction;
+		QAction* deactivateAction;
+		QAction* subsetAction;
+		QAction* notSubsetAction;
+		void activateSelection();
+		void deactivateSelection();
+		void subsetSelection();
+		void notSubsetSelection();
 };
 
 #endif
