[PATCH] Adding LFUN for removing LyX modules
Yuriy Skalko
yuriy.skalko at gmail.com
Thu Oct 21 23:39:00 UTC 2021
> I like this idea! What if layout-module-remove is used on a module that
> a different module depends on? e.g., AMS Theorems (Extended) depends on
> AMS Theorems. If I have both added and I try to remove AMS Theorems,
> what happens? Do we need a layoutModuleCanBeRemoved helper function?
> Actually there must already be some code because "delete" is greyed out
> if I do this in the GUI.
>
> Scott
You are right, module dependencies were not taken into account in first
version of the patch. Here is the updated patch that forbids removing
modules that have dependents.
Yuriy
-------------- next part --------------
From f62034cbd7ed6469f20a2605a965074817e8d270 Mon Sep 17 00:00:00 2001
From: Yuriy Skalko <yuriy.skalko at gmail.com>
Date: Fri, 22 Oct 2021 02:30:06 +0300
Subject: [PATCH] Add LFUN for removing LyX modules
---
src/BufferParams.cpp | 12 ++++++++++++
src/BufferParams.h | 4 ++++
src/BufferView.cpp | 19 +++++++++++++++++++
src/FuncCode.h | 1 +
src/LayoutModuleList.cpp | 12 ++++++++++++
src/LayoutModuleList.h | 5 +++++
src/LyXAction.cpp | 10 ++++++++++
7 files changed, 63 insertions(+)
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index bbbce16bef..90f52a38fb 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -2580,6 +2580,12 @@ bool BufferParams::layoutModuleCanBeAdded(string const & modName) const
}
+bool BufferParams::layoutModuleCanBeRemoved(string const & modName) const
+{
+ return layout_modules_.moduleCanBeRemoved(modName, baseClass());
+}
+
+
docstring BufferParams::getLocalLayout(bool forced) const
{
if (forced)
@@ -2608,6 +2614,12 @@ bool BufferParams::addLayoutModule(string const & modName)
}
+void BufferParams::removeLayoutModule(string const & modName)
+{
+ layout_modules_.remove(modName);
+}
+
+
string BufferParams::bufferFormat() const
{
return documentClass().outputFormat();
diff --git a/src/BufferParams.h b/src/BufferParams.h
index 52d8219cb4..fb9364f333 100644
--- a/src/BufferParams.h
+++ b/src/BufferParams.h
@@ -175,10 +175,14 @@ public:
/// if you want to check for compatibility.
/// \return true if module was successfully added.
bool addLayoutModule(std::string const & modName);
+ ///
+ void removeLayoutModule(std::string const & modName);
/// checks to make sure module's requriements are satisfied, that it does
/// not conflict with already-present modules, isn't already loaded, etc.
bool layoutModuleCanBeAdded(std::string const & modName) const;
///
+ bool layoutModuleCanBeRemoved(std::string const & modName) const;
+ ///
void addRemovedModule(std::string const & modName)
{ removed_modules_.push_back(modName); }
/// Clear the list
diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index ac9a8235db..e4fc04df4d 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -1156,6 +1156,7 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
case LFUN_BUFFER_PARAMS_APPLY:
case LFUN_LAYOUT_MODULES_CLEAR:
case LFUN_LAYOUT_MODULE_ADD:
+ case LFUN_LAYOUT_MODULE_REMOVE:
case LFUN_LAYOUT_RELOAD:
case LFUN_TEXTCLASS_APPLY:
case LFUN_TEXTCLASS_LOAD:
@@ -1400,6 +1401,24 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
break;
}
+ case LFUN_LAYOUT_MODULE_REMOVE: {
+ BufferParams const & params = buffer_.params();
+ if (!params.layoutModuleCanBeRemoved(argument)) {
+ LYXERR0("Module `" << argument <<
+ "' cannot be removed, it is required by another active module.");
+ break;
+ }
+ // FIXME: this modifies the document in cap::switchBetweenClasses
+ // without calling recordUndo. Fix this before using
+ // recordUndoBufferParams().
+ cur.recordUndoFullBuffer();
+ buffer_.params().removeLayoutModule(argument);
+ makeDocumentClass();
+ dr.screenUpdate(Update::Force);
+ dr.forceBufferUpdate();
+ break;
+ }
+
case LFUN_TEXTCLASS_APPLY: {
// since this shortcircuits, the second call is made only if
// the first fails
diff --git a/src/FuncCode.h b/src/FuncCode.h
index 20231eb164..2a3221641d 100644
--- a/src/FuncCode.h
+++ b/src/FuncCode.h
@@ -502,6 +502,7 @@ enum FuncCode
LFUN_SPELLING_REMOVE_LOCAL, // jspitzm 20210307
LFUN_FINISHED_DOWN, // lasgouttes 20210629
LFUN_FINISHED_UP, // lasgouttes 20210629
+ LFUN_LAYOUT_MODULE_REMOVE, // yuriy 20211021
LFUN_LASTACTION // end of the table
};
diff --git a/src/LayoutModuleList.cpp b/src/LayoutModuleList.cpp
index b2e9067ed2..040931df70 100644
--- a/src/LayoutModuleList.cpp
+++ b/src/LayoutModuleList.cpp
@@ -99,6 +99,18 @@ bool LayoutModuleList::moduleCanBeAdded(string const & modName,
}
+bool LayoutModuleList::moduleCanBeRemoved(string const & modName,
+ LayoutFile const * const lay) const
+{
+ for (string const & mod : *this) {
+ vector<string> reqs = theModuleList[mod]->getRequiredModules();
+ if (find(reqs.begin(), reqs.end(), modName) != reqs.end())
+ return false;
+ }
+ return true;
+}
+
+
bool LayoutModuleList::moduleConflicts(string const & modName,
LayoutFile const * const lay) const
{
diff --git a/src/LayoutModuleList.h b/src/LayoutModuleList.h
index 868c1cf945..eaa8ac1820 100644
--- a/src/LayoutModuleList.h
+++ b/src/LayoutModuleList.h
@@ -51,6 +51,8 @@ public:
///
void push_back(std::string const & str) { lml_.push_back(str); }
///
+ void remove(std::string const & str) { lml_.remove(str); }
+ ///
size_t size() const { return lml_.size(); }
/// This is needed in GuiDocument. It seems better than an
/// implicit conversion.
@@ -59,6 +61,9 @@ public:
/// not conflict with already-present modules, isn't already loaded, etc.
bool moduleCanBeAdded(std::string const & modName,
LayoutFile const * const lay) const;
+ ///
+ bool moduleCanBeRemoved(std::string const & modName,
+ LayoutFile const * const lay) const;
/// Like !moduleCanBeAdded(), but does not check requirements
bool moduleConflicts(std::string const & modName,
LayoutFile const * const lay) const;
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index 254060e789..e2d6cd3cca 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -2477,6 +2477,16 @@ void LyXAction::init()
*/
{ LFUN_LAYOUT_MODULE_ADD, "layout-module-add", NoInternal, Layout },
+/*!
+ * \var lyx::FuncCode lyx::LFUN_LAYOUT_MODULE_REMOVE
+ * \li Action: Removes a module.
+ * \li Notion: Removes a module from the list of included modules for the current buffer.
+ * \li Syntax: layout-module-remove <MODULE>
+ * \li Params: <MODULE>: the module to be removed
+ * \endvar
+ */
+ { LFUN_LAYOUT_MODULE_REMOVE, "layout-module-remove", NoInternal, Layout },
+
/*!
* \var lyx::FuncCode lyx::LFUN_LAYOUT_PARAGRAPH
* \li Action: Launches the paragraph settings dialog.
--
2.28.0.windows.1
More information about the lyx-devel
mailing list