]> git.lyx.org Git - features.git/commitdiff
child documents: allow inheritance of bibliography file list (#4427)
authorJuergen Spitzmueller <spitz@lyx.org>
Sat, 19 Feb 2022 13:09:59 +0000 (14:09 +0100)
committerJuergen Spitzmueller <spitz@lyx.org>
Sat, 19 Feb 2022 13:09:59 +0000 (14:09 +0100)
src/Buffer.h
src/frontends/qt/GuiBibtex.cpp
src/frontends/qt/GuiBibtex.h
src/frontends/qt/ui/BibtexUi.ui

index 332ef864044c05498395f2a8ec577b2652e9cd39..0d79ffaff4ed25cab530d71fa6b87c89acae1a5e 100644 (file)
@@ -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;
 
index 64bb987137f8ea85ae3269b12fba9d8ba364ed39..3c71884246aee54333104190f37ec6568d024da1 100644 (file)
@@ -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)
index 2258ec9d167de4e9953c1b425c45e11d21dfe15b..5d54be755438eecbc32e815feb23ecd613d6eb44 100644 (file)
@@ -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:
        ///
index ac41646afd8c457fbb0ef44b05f55edcdffbc860..ab2769d9ac2d3c244e5d7c1c7a313cbe57d4c64a 100644 (file)
@@ -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">
           </property>
          </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>&amp;Inherit from Master</string>
+          </property>
+         </widget>
+        </item>
         <item>
          <widget class="QPushButton" name="deletePB">
           <property name="toolTip">