2000-09-13 John Levon <[EMAIL PROTECTED]> * src/frontends/kde/formtocdialog.C * src/frontends/kde/formtocdialog.h * src/frontends/kde/FormToc.C * src/frontends/kde/FormToc.h: change to make TOC hierarchical properly
? formtoc.diff Index: FormToc.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/kde/FormToc.C,v retrieving revision 1.1 diff -u -r1.1 FormToc.C --- FormToc.C 2000/09/12 15:13:18 1.1 +++ FormToc.C 2000/09/13 06:35:32 @@ -15,6 +15,8 @@ #include <config.h> +#include <stack> + #include "formtocdialog.h" #include "Dialogs.h" @@ -28,6 +30,7 @@ using std::vector; using std::pair; +using std::stack; FormToc::FormToc(LyXView *v, Dialogs *d) : dialog_(0), lv_(v), d_(d), inset_(0), h_(0), u_(0), ih_(0), @@ -92,18 +95,59 @@ toclist = tmp[type]; dialog_->tree->clear(); + + dialog_->tree->setUpdatesEnabled(false); - - // FIXME: should do hierarchically. at each point we need to know - // id of item we've just inserted, id of most recent sibling, and - // id of parent + int depth = 0; + stack< pair< QListViewItem *, QListViewItem *> > istack; + QListViewItem *last = 0; + QListViewItem *parent = 0; + QListViewItem *item; + + // Yes, it is this ugly. Two reasons - root items must have a QListView +parent, + // rather than QListViewItem; and the TOC can move in and out an arbitrary +number + // of levels - dialog_->tree->setAutoUpdate(false); for (vector< Buffer::TocItem >::const_iterator iter = toclist.begin(); iter != toclist.end(); ++iter) { - dialog_->tree->insertItem((string(4*(*iter).depth,' ')+(*iter).str).c_str(), 0, -1, false); + if (iter->depth == depth) { + // insert it after the last one we processed + if (!parent) + item = (last) ? (new +QListViewItem(dialog_->tree,last)) : (new QListViewItem(dialog_->tree)); + else + item = (last) ? (new QListViewItem(parent,last)) : +(new QListViewItem(parent)); + } else if (iter->depth > depth) { + int diff = iter->depth - depth; + // first save old parent and last + while (diff--) + istack.push(pair< QListViewItem *, QListViewItem * +>(parent,last)); + item = (last) ? (new QListViewItem(last)) : (new +QListViewItem(dialog_->tree)); + parent = last; + } else { + int diff = depth - iter->depth; + pair< QListViewItem *, QListViewItem * > top; + // restore context + while (diff--) { + top = istack.top(); + istack.pop(); + } + parent = top.first; + last = top.second; + // insert it after the last one we processed + if (!parent) + item = (last) ? (new +QListViewItem(dialog_->tree,last)) : (new QListViewItem(dialog_->tree)); + else + item = (last) ? (new QListViewItem(parent,last)) : +(new QListViewItem(parent)); + } + lyxerr[Debug::GUI] "Table of contents" << endl << "Added item " << +iter->str.c_str() + << " at depth " << iter->depth << ", previous sibling \"" << +(last ? last->text(0) : "0") + << "\", parent \"" << (parent ? parent->text(0) : "0") << "\"" +<< endl; + item->setText(0,iter->str.c_str()); + depth = iter->depth; + last = item; } - dialog_->tree->setAutoUpdate(true); + + dialog_->tree->setUpdatesEnabled(true); dialog_->tree->update(); } @@ -113,15 +157,19 @@ switch (type) { case Buffer::TOC_TOC: dialog_->setCaption(_("Table of Contents")); + dialog_->tree->setColumnText(0,_("Table of Contents")); break; case Buffer::TOC_LOF: dialog_->setCaption(_("List of Figures")); + dialog_->tree->setColumnText(0,_("List of Figures")); break; case Buffer::TOC_LOT: dialog_->setCaption(_("List of Tables")); + dialog_->tree->setColumnText(0,_("List of Tables")); break; case Buffer::TOC_LOA: dialog_->setCaption(_("List of Algorithms")); + dialog_->tree->setColumnText(0,_("List of Algorithms")); break; } } @@ -145,22 +193,19 @@ updateToc(); } -void FormToc::highlight(int index) +void FormToc::select(const char *text) { if (!lv_->view()->available()) return; - // FIXME: frontStrip can go once it's hierarchical - string tmp(frontStrip(dialog_->tree->itemAt(index)->getText(),' ')); - vector <Buffer::TocItem>::const_iterator iter = toclist.begin(); for (; iter != toclist.end(); ++iter) { - if (iter->str==tmp) + if (iter->str==text) break; - } + } if (iter==toclist.end()) { - lyxerr[Debug::GUI] << "Couldn't find highlighted TOC entry : " << tmp << endl; + lyxerr[Debug::GUI] << "Couldn't find highlighted TOC entry : " << text +<< endl; return; } Index: FormToc.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/kde/FormToc.h,v retrieving revision 1.1 diff -u -r1.1 FormToc.h --- FormToc.h 2000/09/12 15:13:18 1.1 +++ FormToc.h 2000/09/13 06:35:32 @@ -34,10 +34,10 @@ ~FormToc(); //@} - /// Highlighted an item - void highlight(int index); + /// Selected a tree item + void select(const char *); /// Choose which type - void set_type(Buffer::TocType type); + void set_type(Buffer::TocType); /// Update the dialog. void update(); /// close the connections Index: formtocdialog.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/kde/formtocdialog.C,v retrieving revision 1.1 diff -u -r1.1 formtocdialog.C --- formtocdialog.C 2000/09/12 15:13:18 1.1 +++ formtocdialog.C 2000/09/13 06:35:32 @@ -30,8 +30,11 @@ menu->insertItem(_("List of Algorithms")); menu->setMinimumSize(menu->sizeHint()); - tree = new KTreeList(this,"tree"); + tree = new QListView(this); tree->setMinimumHeight(200); + tree->setRootIsDecorated(true); + tree->setSorting(-1); + tree->addColumn("Table of Contents"); buttonUpdate = new QPushButton(this); buttonUpdate->setMinimumSize(buttonUpdate->sizeHint()); @@ -66,7 +69,7 @@ // connections - connect(tree, SIGNAL(highlighted(int)), this, SLOT(highlight_adaptor(int))); + connect(tree, SIGNAL(selectionChanged(QListViewItem *)), this, +SLOT(select_adaptor(QListViewItem *))); connect(menu, SIGNAL(activated(int)), this, SLOT(activate_adaptor(int))); connect(buttonUpdate, SIGNAL(clicked()), this, SLOT(update_adaptor())); connect(buttonClose, SIGNAL(clicked()), this, SLOT(close_adaptor())); Index: formtocdialog.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/kde/formtocdialog.h,v retrieving revision 1.1 diff -u -r1.1 formtocdialog.h --- formtocdialog.h 2000/09/12 15:13:18 1.1 +++ formtocdialog.h 2000/09/13 06:35:32 @@ -24,8 +24,7 @@ #include <qlayout.h> #include <qpushbutton.h> #include <qcombobox.h> - -#include <ktreelist.h> +#include <qlistview.h> #include "FormToc.h" @@ -39,7 +38,7 @@ // widgets QComboBox *menu; - KTreeList *tree; + QListView *tree; QPushButton *buttonUpdate; QPushButton *buttonClose; @@ -56,9 +55,9 @@ QHBoxLayout *buttonLayout; private slots: - /// adaptor to FormToc::highlight - void highlight_adaptor(int index) { - form_->highlight(index); + /// adaptor to FormToc::select + void select_adaptor(QListViewItem *item) { + form_->select(item->text(0)); } /// adaptor to FormToc::update