From 7545698380fa4d0203109d340404574c20aad1bc Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Sat, 6 Mar 2021 23:36:58 +0100 Subject: [PATCH] Fix bug #12181 The context menu for InsetMathRef is now usable. InsetMathRef still misses support for RefStyle and thus the corresponding entries are omitted from the menu. But this would be a different bug. --- lib/ui/stdcontext.inc | 20 ++++++++++++++++ src/BufferView.cpp | 10 +++++++- src/mathed/InsetMathRef.cpp | 47 +++++++++++++++++++++++++++---------- src/mathed/InsetMathRef.h | 4 ++-- 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/lib/ui/stdcontext.inc b/lib/ui/stdcontext.inc index 238b001e4e..115d58b4b6 100644 --- a/lib/ui/stdcontext.inc +++ b/lib/ui/stdcontext.inc @@ -85,6 +85,26 @@ Menuset End +# +# InsetMathRef context menu +# + Menu "context-mathref" + Item "Next Cross-Reference|N" "reference-next" + Item "Go to Label|G" "label-goto" + Separator + Item "|R" "inset-modify changetype ref" + Item "()|e" "inset-modify changetype eqref" + Item "|P" "inset-modify changetype pageref" + Item "On Page |O" "inset-modify changetype vpageref" + Item " on Page |f" "inset-modify changetype vref" + Item "Formatted Reference|t" "inset-modify changetype formatted" + Item "Textual Reference|x" "inset-modify changetype nameref" + Item "Label Only|L" "inset-modify changetype labelonly" + Separator + Item "Settings...|S" "inset-settings" + End + + # # InsetRef context menu # diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 3abb5331b0..29056b1389 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -51,6 +51,7 @@ #include "insets/InsetText.h" #include "mathed/InsetMathNest.h" +#include "mathed/InsetMathRef.h" #include "mathed/MathData.h" #include "mathed/MathRow.h" @@ -1244,7 +1245,8 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag) case LFUN_LABEL_GOTO: flag.setEnabled(!cmd.argument().empty() - || getInsetByCode(cur, REF_CODE)); + || getInsetByCode(cur, REF_CODE) + || getInsetByCode(cur, MATH_REF_CODE)); break; case LFUN_CHANGES_MERGE: @@ -1535,6 +1537,12 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) // eventually call LFUN_PARAGRAPH_GOTO, but it seems best // to have it here. dr.screenUpdate(Update::Force | Update::FitCursor); + } else { + InsetMathRef * minset = + getInsetByCode(cur, MATH_REF_CODE); + if (minset) + lyx::dispatch(FuncRequest(LFUN_LABEL_GOTO, + minset->getTarget())); } break; } diff --git a/src/mathed/InsetMathRef.cpp b/src/mathed/InsetMathRef.cpp index 7170ca6378..b70b7eae5e 100644 --- a/src/mathed/InsetMathRef.cpp +++ b/src/mathed/InsetMathRef.cpp @@ -65,10 +65,20 @@ void InsetMathRef::infoize(odocstream & os) const void InsetMathRef::doDispatch(Cursor & cur, FuncRequest & cmd) { + // Ctrl + click: go to label + if (cmd.action() == LFUN_MOUSE_RELEASE && cmd.modifier() == ControlModifier) { + LYXERR0("trying to goto ref '" << to_utf8(asString(cell(0))) << "'"); + //FIXME: use DispatchResult argument + lyx::dispatch(FuncRequest(LFUN_LABEL_GOTO, asString(cell(0)))); + return; + } + switch (cmd.action()) { - case LFUN_INSET_MODIFY: - if (cmd.getArg(0) == "ref") { - if (cmd.getArg(1) == "changetarget") { + case LFUN_INSET_MODIFY: { + string const arg0 = cmd.getArg(0); + string const arg1 = cmd.getArg(1); + if (arg0 == "ref") { + if (arg1 == "changetarget") { string const oldtarget = cmd.getArg(2); string const newtarget = cmd.getArg(3); if (!oldtarget.empty() && !newtarget.empty() @@ -85,9 +95,20 @@ void InsetMathRef::doDispatch(Cursor & cur, FuncRequest & cmd) setBuffer(buf); break; } + } else if (arg0 == "changetype") { + docstring const data = from_ascii(createDialogStr(arg1)); + MathData ar; + if (createInsetMath_fromDialogStr(data, ar)) { + cur.recordUndo(); + Buffer & buf = buffer(); + *this = *ar[0].nucleus()->asRefInset(); + setBuffer(buf); + break; + } } cur.undispatched(); break; + } case LFUN_INSET_DIALOG_UPDATE: { string const data = createDialogStr(); @@ -95,19 +116,19 @@ void InsetMathRef::doDispatch(Cursor & cur, FuncRequest & cmd) break; } + case LFUN_INSET_SETTINGS: { + string const data = createDialogStr(); + cur.bv().showDialog("ref", data, this); + cur.dispatched(); + break; + } + case LFUN_MOUSE_RELEASE: if (cur.selection()) { cur.undispatched(); break; } - if (cmd.button() == mouse_button::button3) { - LYXERR0("trying to goto ref '" << to_utf8(asString(cell(0))) << "'"); - //FIXME: use DispatchResult argument - lyx::dispatch(FuncRequest(LFUN_LABEL_GOTO, asString(cell(0)))); - break; - } if (cmd.button() == mouse_button::button1) { - // Eventually trigger dialog with button 3, not 1 string const data = createDialogStr(); cur.bv().showDialog("ref", data, this); break; @@ -144,6 +165,7 @@ bool InsetMathRef::getStatus(Cursor & cur, FuncRequest const & cmd, // we handle these case LFUN_INSET_MODIFY: case LFUN_INSET_DIALOG_UPDATE: + case LFUN_INSET_SETTINGS: case LFUN_MOUSE_RELEASE: case LFUN_MOUSE_PRESS: case LFUN_MOUSE_DOUBLE: @@ -227,9 +249,10 @@ void InsetMathRef::updateBuffer(ParIterator const & it, UpdateType /*utype*/, bo } -string const InsetMathRef::createDialogStr() const +string const InsetMathRef::createDialogStr(string const & type) const { - InsetCommandParams icp(REF_CODE, to_ascii(commandname())); + InsetCommandParams icp(REF_CODE, (type.empty() + ? to_ascii(commandname()) : type)); icp["reference"] = asString(cell(0)); if (!cell(1).empty()) icp["name"] = asString(cell(1)); diff --git a/src/mathed/InsetMathRef.h b/src/mathed/InsetMathRef.h index 3f7a8a6003..6d7f0a10cf 100644 --- a/src/mathed/InsetMathRef.h +++ b/src/mathed/InsetMathRef.h @@ -37,7 +37,7 @@ public: /// bool clickable(BufferView const &, int, int) const override { return true; } /// - std::string contextMenuName() const override { return "context-ref"; } + std::string contextMenuName() const override { return "context-mathref"; } /// mode_type currentMode() const override { return TEXT_MODE; } /// @@ -56,7 +56,7 @@ public: /// docbook output void docbook(XMLStream &, OutputParams const &) const override; /// generate something that will be understood by the Dialogs. - std::string const createDialogStr() const; + std::string const createDialogStr(std::string const & type = std::string()) const; struct ref_type_info { ///