[LyX/master] child documents: allow inheritance of bibliography file list (#4427)

Juergen Spitzmueller spitz at lyx.org
Sat Feb 19 12:38:13 UTC 2022


commit 8fa7e27e7ef78f3529be63c5c98c6ad4beb541ef
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Sat Feb 19 14:09:59 2022 +0100

    child documents: allow inheritance of bibliography file list (#4427)
---
 src/Buffer.h                    |    8 +++---
 src/frontends/qt/GuiBibtex.cpp  |   49 +++++++++++++++++++++++++++++++++++++++
 src/frontends/qt/GuiBibtex.h    |    3 ++
 src/frontends/qt/ui/BibtexUi.ui |   14 +++++++++-
 4 files changed, 68 insertions(+), 6 deletions(-)

diff --git a/src/Buffer.h b/src/Buffer.h
index 332ef86..0d79ffa 100644
--- a/src/Buffer.h
+++ b/src/Buffer.h
@@ -784,6 +784,10 @@ public:
 	void registerBibfiles(docstring_list const & bf) const;
 	///
 	support::FileName getBibfilePath(docstring const & bibid) const;
+	/// Return the list with all bibfiles in use (including bibfiles
+	/// of loaded child documents).
+	docstring_list const &
+		getBibfiles(UpdateScope scope = UpdateMaster) const;
 
 	/// routines for dealing with possible self-inclusion
 	void pushIncludedBuffer(Buffer const * buf) const;
@@ -807,10 +811,6 @@ private:
 	/// last time we loaded the cache. Note that this does NOT update the
 	/// cached information.
 	void checkIfBibInfoCacheIsValid() const;
-	/// Return the list with all bibfiles in use (including bibfiles
-	/// of loaded child documents).
-	docstring_list const &
-		getBibfiles(UpdateScope scope = UpdateMaster) const;
 	///
 	void collectChildren(ListOfBuffers & children, bool grand_children) const;
 
diff --git a/src/frontends/qt/GuiBibtex.cpp b/src/frontends/qt/GuiBibtex.cpp
index 64bb987..3c71884 100644
--- a/src/frontends/qt/GuiBibtex.cpp
+++ b/src/frontends/qt/GuiBibtex.cpp
@@ -34,6 +34,7 @@
 #include "insets/InsetBibtex.h"
 
 #include "support/debug.h"
+#include "support/docstring_list.h"
 #include "support/ExceptionMessage.h"
 #include "support/FileName.h"
 #include "support/filetools.h" // changeExtension
@@ -88,6 +89,8 @@ GuiBibtex::GuiBibtex(GuiView & lv)
 		this, SLOT(change_adaptor()));
 	connect(browseBibPB, SIGNAL(clicked()),
 		this, SLOT(browseBibPressed()));
+	connect(inheritPB, SIGNAL(clicked()),
+		this, SLOT(inheritPressed()));
 
 	selected_model_.insertColumns(0, 1);
 	selectionManager = new GuiSelectionManager(this, availableLV, selectedLV,
@@ -178,6 +181,7 @@ void GuiBibtex::setButtons()
 	int const srows = selectedLV->model()->rowCount();
 	buttonBox->button(QDialogButtonBox::Apply)->setEnabled(srows > 0);
 	buttonBox->button(QDialogButtonBox::Ok)->setEnabled(srows > 0);
+	inheritPB->setEnabled(hasInherits());
 }
 
 
@@ -240,6 +244,49 @@ void GuiBibtex::browseBibPressed()
 }
 
 
+bool GuiBibtex::hasInherits()
+{
+	if (!buffer().parent())
+		return false;
+
+	docstring_list const mbibs = buffer().masterBuffer()->getBibfiles();
+	if (mbibs.empty())
+		return false;
+
+	for (auto const & f : mbibs) {
+		if (!selected_bibs_.contains(toqstr(f)))
+			return true;
+	}
+	return false;
+}
+
+
+void GuiBibtex::inheritPressed()
+{
+	docstring_list const mbibs = buffer().masterBuffer()->getBibfiles();
+	bool chng = false;
+	vector<docstring> nfe;
+	for (auto const & f : mbibs) {
+		if (!selected_bibs_.contains(toqstr(f))) {
+			selected_bibs_.append(toqstr(f));
+			setSelectedBibs(selected_bibs_);
+			string enc;
+			if (usingBiblatex()) {
+				string const bfe = buffer().masterParams().bibFileEncoding(to_utf8(f));
+				if (!bfe.empty())
+					nfe.push_back(f + " " + from_utf8(bfe));
+			}
+			chng = true;
+		}
+	}
+	if (chng) {
+		if (!nfe.empty())
+			setFileEncodings(nfe);
+		change_adaptor();
+	}
+}
+
+
 void GuiBibtex::on_editPB_clicked()
 {
 	QModelIndexList selIdx =
@@ -351,6 +398,8 @@ void GuiBibtex::updateContents()
 	bibtocCB->setChecked((bibtotoc() && !bibtopic) || hasbibintoc);
 	bibtocCB->setEnabled(!bibtopic && !hasbibintoc);
 
+	inheritPB->setEnabled(hasInherits());
+
 	btPrintCO->clear();
 	btPrintCO->addItem(qt_("all cited references"), toqstr("btPrintCited"));
 	if (bibtopic)
diff --git a/src/frontends/qt/GuiBibtex.h b/src/frontends/qt/GuiBibtex.h
index 2258ec9..5d54be7 100644
--- a/src/frontends/qt/GuiBibtex.h
+++ b/src/frontends/qt/GuiBibtex.h
@@ -40,6 +40,7 @@ private Q_SLOTS:
 	void on_buttonBox_accepted();
 	void browseBstPressed();
 	void browseBibPressed();
+	void inheritPressed();
 	void on_editPB_clicked();
 	void databaseChanged();
 	void rescanClicked();
@@ -99,6 +100,8 @@ private:
 	void dispatchParams() override;
 	///
 	bool isBufferDependent() const override { return true; }
+	/// Is his a child which can inherit bibs from its master?
+	bool hasInherits();
 
 private:
 	///
diff --git a/src/frontends/qt/ui/BibtexUi.ui b/src/frontends/qt/ui/BibtexUi.ui
index ac41646..ab2769d 100644
--- a/src/frontends/qt/ui/BibtexUi.ui
+++ b/src/frontends/qt/ui/BibtexUi.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>523</width>
-    <height>617</height>
+    <width>542</width>
+    <height>702</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -86,6 +86,16 @@
          </widget>
         </item>
         <item>
+         <widget class="QPushButton" name="inheritPB">
+          <property name="toolTip">
+           <string>Inherit bibliography databases from the master document</string>
+          </property>
+          <property name="text">
+           <string>&Inherit from Master</string>
+          </property>
+         </widget>
+        </item>
+        <item>
          <widget class="QPushButton" name="deletePB">
           <property name="toolTip">
            <string>Remove the selected database</string>


More information about the lyx-cvs mailing list