On Mon, 2006-03-27 at 11:16 +0200, Abdelrazak Younes wrote: > Martin Vermeer a écrit :
... > We should not define slot connections inside the ui file. If possible, > please do that in the code, this is simple enough: > > connect(moveinPB, SIGNAL(clicked()), this, SLOT(movein_adaptor())); > > And this will help me porting the code to Qt4. Attached a new patch which does it this way. This patch also positions the current header visibly in the window. In other words, it does pretty much everything outlining is supposed to do. I gave it some testing including corner cases. OK to commit to trunk? - Martin
Index: LyXAction.C =================================================================== --- LyXAction.C (revision 13473) +++ LyXAction.C (working copy) @@ -240,6 +240,7 @@ void LyXAction::init() { LFUN_DOWN_PARAGRAPH, "paragraph-down", ReadOnly | NoUpdate}, { LFUN_DOWN_PARAGRAPHSEL, "paragraph-down-select", ReadOnly }, { LFUN_GOTO_PARAGRAPH, "paragraph-goto", ReadOnly }, + { LFUN_OUTLINE, "outline", ReadOnly }, { LFUN_PARAGRAPH_SPACING, "paragraph-spacing", Noop }, { LFUN_UP_PARAGRAPH, "paragraph-up", ReadOnly | NoUpdate}, { LFUN_UP_PARAGRAPHSEL, "paragraph-up-select", ReadOnly }, Index: BufferView_pimpl.C =================================================================== --- BufferView_pimpl.C (revision 13473) +++ BufferView_pimpl.C (working copy) @@ -49,6 +49,7 @@ #include "ParagraphParameters.h" #include "pariterator.h" #include "rowpainter.h" +#include "toc.h" #include "undo.h" #include "vspace.h" @@ -1042,6 +1043,7 @@ FuncStatus BufferView::Pimpl::getStatus( case LFUN_INSERT_LABEL: case LFUN_BOOKMARK_SAVE: case LFUN_GOTO_PARAGRAPH: + case LFUN_OUTLINE: case LFUN_GOTOERROR: case LFUN_GOTONOTE: case LFUN_REFERENCE_GOTO: @@ -1196,6 +1198,16 @@ bool BufferView::Pimpl::dispatch(FuncReq break; } + case LFUN_OUTLINE: { + lyx::toc::OutlineOp const op = + static_cast<lyx::toc::OutlineOp>(convert<int>(cmd.argument)); + lyx::toc::Outline(op, buffer_, cursor_.pit()); + bv_->text()->setCursor(cursor_, cursor_.pit(), 0); + buffer_->markDirty(); + updateCounters(*buffer_); + update(); + } + case LFUN_GOTOERROR: bv_funcs::gotoInset(bv_, InsetBase::ERROR_CODE, false); break; Index: frontends/qt2/QTocDialog.C =================================================================== --- frontends/qt2/QTocDialog.C (revision 13473) +++ frontends/qt2/QTocDialog.C (working copy) @@ -32,8 +32,11 @@ QTocDialog::QTocDialog(QToc * form) if (w) w->hide(); - connect(closePB, SIGNAL(clicked()), - form, SLOT(slotClose())); + connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose())); + connect(moveupPB, SIGNAL(clicked()), this, SLOT(moveup_adaptor())); + connect(movednPB, SIGNAL(clicked()), this, SLOT(movedn_adaptor())); + connect(moveinPB, SIGNAL(clicked()), this, SLOT(movein_adaptor())); + connect(moveoutPB, SIGNAL(clicked()), this, SLOT(moveout_adaptor())); } @@ -66,6 +69,30 @@ void QTocDialog::update_adaptor() } +void QTocDialog::moveup_adaptor() +{ + form_->moveup(); +} + + +void QTocDialog::movedn_adaptor() +{ + form_->movedn(); +} + + +void QTocDialog::movein_adaptor() +{ + form_->movein(); +} + + +void QTocDialog::moveout_adaptor() +{ + form_->moveout(); +} + + void QTocDialog::closeEvent(QCloseEvent * e) { form_->slotWMHide(); Index: frontends/qt2/ui/QTocDialogBase.ui =================================================================== --- frontends/qt2/ui/QTocDialogBase.ui (revision 13473) +++ frontends/qt2/ui/QTocDialogBase.ui (working copy) @@ -171,7 +171,52 @@ <string>&Update</string> </property> </widget> - <spacer> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>moveupPB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Up</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>movednPB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Dn</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>moveinPB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>In</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>moveoutPB</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Out</string> + </property> + </widget> + + <spacer> <property> <name>name</name> <cstring>Spacer2</cstring> Index: frontends/qt2/QTocDialog.h =================================================================== --- frontends/qt2/QTocDialog.h (revision 13473) +++ frontends/qt2/QTocDialog.h (working copy) @@ -29,6 +29,10 @@ public slots: void depth_adaptor(int); void select_adaptor(QListViewItem *); void update_adaptor(); + void moveup_adaptor(); + void movedn_adaptor(); + void movein_adaptor(); + void moveout_adaptor(); protected: void closeEvent(QCloseEvent * e); private: Index: frontends/qt2/QToc.C =================================================================== --- frontends/qt2/QToc.C (revision 13473) +++ frontends/qt2/QToc.C (working copy) @@ -107,6 +107,7 @@ void QToc::updateToc(int newdepth) QListViewItem * last = 0; QListViewItem * parent = 0; QListViewItem * item; + QListViewItem * selected_item = 0; // Yes, it is this ugly. Two reasons - root items must have // a QListView parent, rather than QListViewItem; and the @@ -157,10 +158,17 @@ void QToc::updateToc(int newdepth) item->setOpen(iter->depth < depth_); curdepth = iter->depth; last = item; + + // Recognise part past the counter + if (iter->str.substr(iter->str.find(' ') + 1) == text_) + selected_item = item; } dialog_->tocLV->setUpdatesEnabled(true); dialog_->tocLV->update(); + dialog_->tocLV->ensureItemVisible(selected_item); + dialog_->tocLV->setSelected(selected_item, true); + dialog_->tocLV->scrollBy(0, 50); setTitle(fromqstr(dialog_->typeCO->currentText())); } @@ -180,6 +188,8 @@ void QToc::select(string const & text) return; } + // Lop off counter part and save: + text_ = text.substr(text.find(' ') + 1); controller().goTo(*iter); } @@ -190,5 +200,34 @@ void QToc::set_depth(int depth) updateToc(depth); } + +void QToc::moveup() +{ + controller().outline(toc::UP); + update_contents(); +} + + +void QToc::movedn() +{ + controller().outline(toc::DOWN); + update_contents(); +} + + +void QToc::movein() +{ + controller().outline(toc::IN); + update_contents(); +} + + +void QToc::moveout() +{ + controller().outline(toc::OUT); + update_contents(); +} + + } // namespace frontend } // namespace lyx Index: frontends/qt2/QToc.h =================================================================== --- frontends/qt2/QToc.h (revision 13473) +++ frontends/qt2/QToc.h (working copy) @@ -42,6 +42,15 @@ private: /// set the depth void set_depth(int depth); + /// Move header up/down/in/out in list (outlining) + void moveup(); + /// + void movedn(); + /// + void movein(); + /// + void moveout(); + virtual void apply() {} /// update dialog @@ -55,6 +64,9 @@ private: /// depth of list shown int depth_; + + /// Store selected item's string + std::string text_; }; } // namespace frontend Index: frontends/controllers/ControlToc.C =================================================================== --- frontends/controllers/ControlToc.C (revision 13473) +++ frontends/controllers/ControlToc.C (working copy) @@ -8,9 +8,12 @@ * Full author contact details are available in file CREDITS. */ +#include <sstream> + #include <config.h> #include "ControlToc.h" +#include "funcrequest.h" #include "gettext.h" using std::vector; @@ -34,6 +37,14 @@ void ControlToc::goTo(toc::TocItem const } +void ControlToc::outline(toc::OutlineOp op) +{ + std::ostringstream o; + o << op << std::flush; + kernel().dispatch(FuncRequest(LFUN_OUTLINE, o.str())); +} + + vector<string> const ControlToc::getTypes() const { return toc::getTypes(kernel().buffer()); Index: frontends/controllers/ControlToc.h =================================================================== --- frontends/controllers/ControlToc.h (revision 13473) +++ frontends/controllers/ControlToc.h (working copy) @@ -38,6 +38,9 @@ public: /// Given a type, returns the contents toc::Toc const getContents(std::string const & type) const; + + /// Apply the selected outlining operation + void outline(toc::OutlineOp op); }; } // namespace frontend Index: lfuns.h =================================================================== --- lfuns.h (revision 13473) +++ lfuns.h (working copy) @@ -357,6 +357,7 @@ enum kb_action { LFUN_BIBDB_ADD, LFUN_BIBDB_DEL, LFUN_INSERT_CITATION, + LFUN_OUTLINE, // Vermeer 20060323 LFUN_LASTACTION // end of the table }; Index: toc.C =================================================================== --- toc.C (revision 13473) +++ toc.C (working copy) @@ -19,7 +19,6 @@ #include "funcrequest.h" #include "LyXAction.h" #include "paragraph.h" -#include "pariterator.h" #include "frontends/LyXView.h" @@ -167,5 +166,106 @@ void asciiTocList(string const & type, B } +void Outline(OutlineOp mode, Buffer * buf, pit_type & pit) +{ + ParagraphList & pars = buf->text().paragraphs(); + ParagraphList::iterator bgn = pars.begin(); + ParagraphList::iterator s = boost::next(bgn, pit); + ParagraphList::iterator p = s; + ParagraphList::iterator end = pars.end(); + + LyXTextClass::const_iterator lit = + buf->params().getLyXTextClass().begin(); + LyXTextClass::const_iterator const lend = + buf->params().getLyXTextClass().end(); + + int const thistoclevel = s->layout()->toclevel; + int toclevel; + switch (mode) { + case UP: { + if (p != end) + ++p; + for (; p != end; ++p) { + toclevel = p->layout()->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC + && toclevel <= thistoclevel) { + break; + } + } + ParagraphList::iterator q = s; + if (q != bgn) + --q; + else + break; + for (; q != bgn; --q) { + toclevel = q->layout()->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC + && toclevel <= thistoclevel) { + break; + } + } + pit_type const newpit = std::distance(pars.begin(), q); + pit_type const len = std::distance(s, p); + pit += len; + pars.insert(q, s, p); + s = boost::next(pars.begin(), pit); + ParagraphList::iterator t = boost::next(s, len); + pit = newpit; + pars.erase(s, t); + break; + } + case DOWN: { + if (p != end) + ++p; + for (; p != end; ++p) { + toclevel = p->layout()->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC + && toclevel <= thistoclevel) { + break; + } + } + ParagraphList::iterator q = p; + if (q != end) + ++q; + else + break; + for (; q != end; ++q) { + toclevel = q->layout()->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC + && toclevel <= thistoclevel) { + break; + } + } + pit_type const newpit = std::distance(pars.begin(), q); + pit_type const len = std::distance(s, p); + pars.insert(q, s, p); + s = boost::next(pars.begin(), pit); + ParagraphList::iterator t = boost::next(s, len); + pit = newpit - len; + pars.erase(s, t); + break; + } + case IN: + for (; lit != lend; ++lit) { + if ((*lit)->toclevel == thistoclevel + 1) { + s->layout((*lit)); + break; + } + } + break; + case OUT: + for (; lit != lend; ++lit) { + if ((*lit)->toclevel == thistoclevel - 1) { + s->layout((*lit)); + break; + } + } + break; + default: + break; + } +} + + } // namespace toc } // namespace lyx Index: toc.h =================================================================== --- toc.h (revision 13473) +++ toc.h (working copy) @@ -20,6 +20,8 @@ #include <vector> #include <string> +#include "pariterator.h" + class Buffer; class LyXView; class Paragraph; @@ -84,6 +86,18 @@ bool operator!=(TocItem const & a, TocIt } +/// the type of outline operation +enum OutlineOp { + UP, // Move this header with text down + DOWN, // Move this header with text up + IN, // Make this header deeper + OUT // Make this header shallower +}; + + +void Outline(OutlineOp, Buffer *, pit_type &); + + } // namespace toc } // namespace lyx
signature.asc
Description: This is a digitally signed message part