>>>>> "Jean-Marc" == Jean-Marc Lasgouttes <[EMAIL PROTECTED]> writes:
Jean-Marc> The is still a problem that I am not sure how to solve: Jean-Marc> when I set the min/max value of the depthSL slider, the Jean-Marc> value of the slider will be changed if it is outside of the Jean-Marc> new range. This in turn will invoke updateNumbering through Jean-Marc> the valueChanged signal, and therefore lead to an infinite Jean-Marc> recursion. Is there a way in Qt to block a signal Jean-Marc> temporarily? Otherwise I will have to use a static bool to Jean-Marc> avoid nesting, but I do not like this solution much. OK, here is the updated version. I'd be glad if people who know about QDocument and QDocumentDialog (I did not) could take a look and check that I have put things at the right place. I also changed QDocumentDialog::classChanged to update everything everytime, I hope this cannot cause problems. JMarc
Index: src/ChangeLog =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/ChangeLog,v retrieving revision 1.2178 diff -u -p -r1.2178 ChangeLog --- src/ChangeLog 11 May 2005 07:44:17 -0000 1.2178 +++ src/ChangeLog 11 May 2005 14:16:18 -0000 @@ -1,3 +1,21 @@ +2005-05-10 Jean-Marc Lasgouttes <[EMAIL PROTECTED]> + + * buffer_funcs.C (setCounter): fix test for numbering of + environments. + + * toc.C (getTocList): use LyXTextClass:min_toclevel to set toc + depth correctly; use optional argument when it exists + + * lyxtextclass.C: remove unused MaxCounterTags enum + (Read): compute min_toclevel_ and max_toclevel_ after reading class. + (max_toclevel, min_toclevel): new methods. + + * MenuBackend.C (expandToc2): fix case where depth is smaller than + the smallest depth in toc. + + * lyxlayout.[Ch]: add special NOT_IN_TOC toclevel value for + layouts that should not appear in a table of contents. + 2005-05-11 Martin Vermeer <[EMAIL PROTECTED]> * BufferView_pimpl.C (update): fix processEvents -caused update Index: src/MenuBackend.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/MenuBackend.C,v retrieving revision 1.103 diff -u -p -r1.103 MenuBackend.C --- src/MenuBackend.C 6 Jan 2005 16:39:20 -0000 1.103 +++ src/MenuBackend.C 11 May 2005 14:16:18 -0000 @@ -607,6 +607,15 @@ void expandToc2(Menu & tomenu, lyx::toc::Toc::size_type to, int depth) { int shortcut_count = 0; + + // check whether depth is smaller than the smallest depth in toc. + int min_depth = 1000; + for (lyx::toc::Toc::size_type i = from; i < to; ++i) + min_depth = std::min(min_depth, toc_list[i].depth); + if (min_depth > depth) + depth = min_depth; + + if (to - from <= max_number_of_items) { for (lyx::toc::Toc::size_type i = from; i < to; ++i) { string label(4 * max(0, toc_list[i].depth - depth),' '); Index: src/buffer_funcs.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer_funcs.C,v retrieving revision 1.27 diff -u -p -r1.27 buffer_funcs.C --- src/buffer_funcs.C 5 May 2005 18:33:47 -0000 1.27 +++ src/buffer_funcs.C 11 May 2005 14:16:18 -0000 @@ -379,7 +379,7 @@ void setCounter(Buffer const & buf, ParI // is it a layout that has an automatic label? if (layout->labeltype == LABEL_COUNTER) { if (layout->toclevel <= buf.params().secnumdepth - && (!layout->isEnvironment() + && (layout->latextype != LATEX_ENVIRONMENT || isFirstInSequence(it.pit(), it.plist()))) { counters.step(layout->counter); string label = expandLabel(textclass, layout, Index: src/lyxlayout.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxlayout.C,v retrieving revision 1.27 diff -u -p -r1.27 lyxlayout.C --- src/lyxlayout.C 28 Apr 2005 13:08:05 -0000 1.27 +++ src/lyxlayout.C 11 May 2005 14:16:18 -0000 @@ -25,6 +25,8 @@ using lyx::support::trim; using std::endl; using std::string; +/// Special value of toclevel for layouts that to not belong in a TOC +const int LyXLayout::NOT_IN_TOC = -1000; // The order of the LayoutTags enum is no more important. [asierra300396] // Tags indexes. @@ -121,7 +123,7 @@ LyXLayout::LyXLayout () free_spacing = false; pass_thru = false; is_environment = false; - toclevel = -2; + toclevel = NOT_IN_TOC; commanddepth = 0; } Index: src/lyxlayout.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxlayout.h,v retrieving revision 1.19 diff -u -p -r1.19 lyxlayout.h --- src/lyxlayout.h 27 Jan 2005 21:05:33 -0000 1.19 +++ src/lyxlayout.h 11 May 2005 14:16:18 -0000 @@ -149,6 +149,8 @@ public: bool is_environment; /// show this in toc int toclevel; + /// special value of toclevel for non-section layouts + static const int NOT_IN_TOC; /// for new environment insets std::string latexheader; /// for new environment insets Index: src/lyxtextclass.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtextclass.C,v retrieving revision 1.48 diff -u -p -r1.48 lyxtextclass.C --- src/lyxtextclass.C 31 Mar 2004 09:44:40 -0000 1.48 +++ src/lyxtextclass.C 11 May 2005 14:16:18 -0000 @@ -384,6 +384,27 @@ bool LyXTextClass::Read(string const & f << "' is missing a defaultstyle." << endl; error = true; } + + min_toclevel_ = LyXLayout::NOT_IN_TOC; + max_toclevel_ = LyXLayout::NOT_IN_TOC; + const_iterator cit = begin(); + const_iterator the_end = end(); + for ( ; cit != the_end ; ++cit) { + int const toclevel = (*cit)->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC) { + if (min_toclevel_ == LyXLayout::NOT_IN_TOC) + min_toclevel_ = toclevel; + else + min_toclevel_ = std::min(min_toclevel_, + toclevel); + max_toclevel_ = std::max(max_toclevel_, + toclevel); + } + } + lyxerr[Debug::TCLASS] + << "Minimum TocLevel is " << min_toclevel_ + << ", maximum is " << max_toclevel_ <<endl; + } else lyxerr[Debug::TCLASS] << "Finished reading input file " << MakeDisplayPath(filename) @@ -451,20 +472,6 @@ void LyXTextClass::readOutputType(LyXLex } -enum MaxCounterTags { - MC_COUNTER_CHAPTER = 1, - MC_COUNTER_SECTION, - MC_COUNTER_SUBSECTION, - MC_COUNTER_SUBSUBSECTION, - MC_COUNTER_PARAGRAPH, - MC_COUNTER_SUBPARAGRAPH, - MC_COUNTER_ENUMI, - MC_COUNTER_ENUMII, - MC_COUNTER_ENUMIII, - MC_COUNTER_ENUMIV -}; - - enum ClassOptionsTags { CO_FONTSIZE = 1, CO_PAGESTYLE, @@ -1008,6 +1015,18 @@ string const & LyXTextClass::titlename() int LyXTextClass::size() const { return layoutlist_.size(); +} + + +int LyXTextClass::min_toclevel() const +{ + return min_toclevel_; +} + + +int LyXTextClass::max_toclevel() const +{ + return max_toclevel_; } Index: src/lyxtextclass.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtextclass.h,v retrieving revision 1.27 diff -u -p -r1.27 lyxtextclass.h --- src/lyxtextclass.h 19 Jan 2005 15:03:29 -0000 1.27 +++ src/lyxtextclass.h 11 May 2005 14:16:18 -0000 @@ -172,6 +172,10 @@ public: /// int size() const; + /// The minimal TocLevel of sectioning layouts + int min_toclevel() const; + /// The maximal TocLevel of sectioning layouts + int max_toclevel() const; private: /// bool delete_layout(std::string const &); @@ -242,6 +246,11 @@ private: /// Is the TeX class available? bool texClassAvail_; + + /// The minimal TocLevel of sectioning layouts + int min_toclevel_; + /// The maximal TocLevel of sectioning layouts + int max_toclevel_; }; Index: src/toc.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/toc.C,v retrieving revision 1.42 diff -u -p -r1.42 toc.C --- src/toc.C 6 Jan 2005 16:39:32 -0000 1.42 +++ src/toc.C 11 May 2005 14:16:18 -0000 @@ -23,6 +23,7 @@ #include "frontends/LyXView.h" #include "insets/insetfloat.h" +#include "insets/insetoptarg.h" #include "insets/insetwrap.h" #include "support/convert.h" @@ -69,30 +70,54 @@ TocList const getTocList(Buffer const & TocList toclist; BufferParams const & bufparams = buf.params(); + const int min_toclevel = bufparams.getLyXTextClass().min_toclevel(); ParConstIterator pit = buf.par_iterator_begin(); ParConstIterator end = buf.par_iterator_end(); for (; pit != end; ++pit) { - int const toclevel = pit->layout()->toclevel; - if (toclevel > 0 && toclevel <= bufparams.tocdepth) { - // insert this into the table of contents - TocItem const item(pit->id(), toclevel - 1, pit->asString(buf, true)); - toclist["TOC"].push_back(item); - } + // the string that goes to the toc (could be the optarg) + string tocstring; // For each paragraph, traverse its insets and look for // FLOAT_CODE or WRAP_CODE InsetList::const_iterator it = pit->insetlist.begin(); InsetList::const_iterator end = pit->insetlist.end(); for (; it != end; ++it) { - if (it->inset->lyxCode() == InsetBase::FLOAT_CODE) { + switch (it->inset->lyxCode()) { + case InsetBase::FLOAT_CODE: static_cast<InsetFloat*>(it->inset) ->addToToc(toclist, buf); - } else if (it->inset->lyxCode() == InsetBase::WRAP_CODE) { + break; + case InsetBase::WRAP_CODE: static_cast<InsetWrap*>(it->inset) ->addToToc(toclist, buf); + break; + case InsetBase::OPTARG_CODE: { + if (!tocstring.empty()) + break; + Paragraph const & par = *static_cast<InsetOptArg*>(it->inset)->paragraphs().begin(); + if (!pit->getLabelstring().empty()) + tocstring = pit->getLabelstring() + + ' '; + tocstring += par.asString(buf, false); + break; + } + default: + break; } + } + + /// now the toc entry for the paragraph + int const toclevel = pit->layout()->toclevel; + if (toclevel >= min_toclevel + && toclevel <= bufparams.tocdepth) { + // insert this into the table of contents + if (tocstring.empty()) + tocstring = pit->asString(buf, true); + TocItem const item(pit->id(), toclevel - min_toclevel, + tocstring); + toclist["TOC"].push_back(item); } } return toclist; Index: src/frontends/qt2/ChangeLog =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/ChangeLog,v retrieving revision 1.773 diff -u -p -r1.773 ChangeLog --- src/frontends/qt2/ChangeLog 11 May 2005 07:44:20 -0000 1.773 +++ src/frontends/qt2/ChangeLog 11 May 2005 14:16:18 -0000 @@ -1,3 +1,17 @@ +2005-05-11 Jean-Marc Lasgouttes <[EMAIL PROTECTED]> + + * QDocument.C (update_contents): set the limits of the numbering + sliders depending on the class; disable the numbering module when + the class does not have a sectioning structure. + + * QDocumentDialog.h: remove the numberlevel* listviewitems. + + * QDocumentDialog.C (QDocumentDialog): no need to populate + numbering listview here. + (classChanged): always invoke QDocument::update_content(). + (updateNumbering): populate the listview directly from the + textclass information; + 2005-05-11 Martin Vermeer <[EMAIL PROTECTED]> * lyx_gui.C (sync_events): Index: src/frontends/qt2/QDocument.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QDocument.C,v retrieving revision 1.78 diff -u -p -r1.78 QDocument.C --- src/frontends/qt2/QDocument.C 6 Jan 2005 15:40:45 -0000 1.78 +++ src/frontends/qt2/QDocument.C 11 May 2005 14:16:18 -0000 @@ -36,6 +36,7 @@ #include <qcheckbox.h> #include <qslider.h> #include <qlineedit.h> +#include <qlistview.h> #include "lengthcombo.h" @@ -511,8 +512,20 @@ void QDocument::update_contents() } // numbering - dialog_->numberingModule->tocSL->setValue(params.tocdepth); + int const min_toclevel = controller().textClass().min_toclevel(); + int const max_toclevel = controller().textClass().max_toclevel(); + if (min_toclevel != LyXLayout::NOT_IN_TOC) + dialog_->numberingModule->setEnabled(true); + else { + dialog_->numberingModule->setEnabled(false); + dialog_->numberingModule->tocLV->clear(); + } + dialog_->numberingModule->depthSL->setMinValue(min_toclevel - 1); + dialog_->numberingModule->depthSL->setMaxValue(max_toclevel); dialog_->numberingModule->depthSL->setValue(params.secnumdepth); + dialog_->numberingModule->tocSL->setMinValue(min_toclevel - 1); + dialog_->numberingModule->tocSL->setMaxValue(max_toclevel); + dialog_->numberingModule->tocSL->setValue(params.tocdepth); dialog_->updateNumbering(); // bullets Index: src/frontends/qt2/QDocumentDialog.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QDocumentDialog.C,v retrieving revision 1.57 diff -u -p -r1.57 QDocumentDialog.C --- src/frontends/qt2/QDocumentDialog.C 26 Apr 2005 11:12:18 -0000 1.57 +++ src/frontends/qt2/QDocumentDialog.C 11 May 2005 14:16:18 -0000 @@ -211,22 +211,6 @@ QDocumentDialog::QDocumentDialog(QDocume marginsModule->headheightLE)); marginsModule->footskipLE->setValidator(unsignedLengthValidator( marginsModule->footskipLE)); - - // create the numbering items, in reverse order - numberlevel7 = - new QListViewItem(numberingModule->tocLV, qt_("Subparagraph")); - numberlevel6 = - new QListViewItem(numberingModule->tocLV, qt_("Paragraph")); - numberlevel5 = - new QListViewItem(numberingModule->tocLV, qt_("Subsubsection")); - numberlevel4 = - new QListViewItem(numberingModule->tocLV, qt_("Subsection")); - numberlevel3 = - new QListViewItem(numberingModule->tocLV, qt_("Section")); - numberlevel2 = - new QListViewItem(numberingModule->tocLV, qt_("Chapter")); - numberlevel1 = - new QListViewItem(numberingModule->tocLV, qt_("Part")); } @@ -407,17 +391,9 @@ void QDocumentDialog::classChanged() if (form_->controller().loadTextclass(tc)) { params.textclass = tc; - - if (lyxrc.auto_reset_options) { + if (lyxrc.auto_reset_options) params.useClassDefaults(); - form_->update_contents(); - } else { - updateFontsize(cntrl.textClass().opt_fontsize(), - params.fontsize); - updatePagestyle(cntrl.textClass().opt_pagestyle(), - params.pagestyle); - updateNumbering(); - } + form_->update_contents(); } else { latexModule->classCO->setCurrentItem(params.textclass); } @@ -426,61 +402,28 @@ void QDocumentDialog::classChanged() void QDocumentDialog::updateNumbering() { - int const depth = numberingModule->depthSL->value(); - int const toc = numberingModule->tocSL->value(); - - // check if the document class features chapter LyXTextClass const & tclass = form_->controller().params().getLyXTextClass(); - bool const hasChapter = tclass.hasLayout("Chapter"); - - QString const no = qt_("No"); - QString const yes = qt_("Yes"); //numberingModule->tocLV->setUpdatesEnabled(false); - numberlevel1->setText(1, yes); - numberlevel2->setText(1, yes); - numberlevel3->setText(1, yes); - numberlevel4->setText(1, yes); - numberlevel5->setText(1, yes); - numberlevel6->setText(1, yes); - numberlevel7->setText(1, yes); - - numberlevel1->setText(2, yes); - numberlevel2->setText(2, yes); - numberlevel3->setText(2, yes); - numberlevel4->setText(2, yes); - numberlevel5->setText(2, yes); - numberlevel6->setText(2, yes); - numberlevel7->setText(2, yes); - - // numbering - if (depth < -1) numberlevel1->setText(1, no); - if (depth < 0) numberlevel2->setText(1, no); - if (depth < 1) numberlevel3->setText(1, no); - if (depth < 2) numberlevel4->setText(1, no); - if (depth < 3) numberlevel5->setText(1, no); - if (depth < 4) numberlevel6->setText(1, no); - if (depth < 5) numberlevel7->setText(1, no); - - // in toc - if (toc < 0 && hasChapter) numberlevel2->setText(2, no); - if (toc < 1) numberlevel3->setText(2, no); - if (toc < 2) numberlevel4->setText(2, no); - if (toc < 3) numberlevel5->setText(2, no); - if (toc < 4) numberlevel6->setText(2, no); - if (toc < 5) numberlevel7->setText(2, no); - - // in article style classes, the part number is shifted by 1 - if (!hasChapter) { - numberlevel1->setText(0, qt_("")); - numberlevel1->setText(1, qt_("")); - numberlevel1->setText(2, qt_("")); - numberlevel2->setText(0, qt_("Part")); - } else { - numberlevel1->setText(0, qt_("Part")); - numberlevel2->setText(0, qt_("Chapter")); + // Update the example QListView + int const depth = numberingModule->depthSL->value(); + int const toc = numberingModule->tocSL->value(); + QString const no = qt_("No"); + QString const yes = qt_("Yes"); + LyXTextClass::const_iterator end = tclass.end(); + LyXTextClass::const_iterator cit = tclass.begin(); + numberingModule->tocLV->clear(); + QListViewItem * item = 0; + for ( ; cit != end ; ++cit) { + int const toclevel = (*cit)->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC) { + item = new QListViewItem(numberingModule->tocLV, + item, qt_((*cit)->name())); + item->setText(1, (toclevel <= depth) ? yes : no); + item->setText(2, (toclevel <= toc) ? yes : no); + } } //numberingModule->tocLV->setUpdatesEnabled(true); Index: src/frontends/qt2/QDocumentDialog.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QDocumentDialog.h,v retrieving revision 1.23 diff -u -p -r1.23 QDocumentDialog.h --- src/frontends/qt2/QDocumentDialog.h 14 Apr 2005 09:40:35 -0000 1.23 +++ src/frontends/qt2/QDocumentDialog.h 11 May 2005 14:16:18 -0000 @@ -87,14 +87,6 @@ private: FloatPlacement * floatModule; BranchesModuleBase * branchesModule; - QListViewItem * numberlevel7; - QListViewItem * numberlevel6; - QListViewItem * numberlevel5; - QListViewItem * numberlevel4; - QListViewItem * numberlevel3; - QListViewItem * numberlevel2; - QListViewItem * numberlevel1; - QDocument * form_; };