On Wed, Feb 21, 2007 at 03:12:24PM +0100, Stefan Schimanski wrote: > Waiting for some comments
Ok. Updated patch attached. The patch is 'clean' C++-wise. There is no memory problem as far as I can tell. I also attach a .lyx file containing a simple macro. I personally find the editing experience inacceptable. I'd like some of the others to comment. Maybe the behaviour should be configurable on a per-macro base. Andre'
Index: InsetMathMacro.C
===================================================================
--- InsetMathMacro.C (revision 17284)
+++ InsetMathMacro.C (working copy)
@@ -33,6 +33,47 @@
using std::vector;
+/// This class is the value of a macro argument, technically
+/// a wrapper of the cells of MathMacro.
+class MathMacroArgumentValue : public InsetMathDim {
+public:
+ ///
+ MathMacroArgumentValue(MathArray const * value) : value_(value) {}
+ ///
+ bool metrics(MetricsInfo & mi, Dimension & dim) const;
+ ///
+ void draw(PainterInfo &, int x, int y) const;
+
+private:
+ std::auto_ptr<InsetBase> doClone() const;
+ MathArray const * value_;
+};
+
+
+auto_ptr<InsetBase> MathMacroArgumentValue::doClone() const
+{
+ return auto_ptr<InsetBase>(new MathMacroArgumentValue(*this));
+}
+
+
+bool MathMacroArgumentValue::metrics(MetricsInfo & mi, Dimension & dim) const
+{
+ value_->metrics(mi, dim);
+ metricsMarkers2(dim);
+ if (dim_ == dim)
+ return false;
+ dim_ = dim;
+ return true;
+}
+
+
+void MathMacroArgumentValue::draw(PainterInfo & pi, int x, int y) const
+{
+ value_->draw(pi, x, y);
+}
+
+
+
MathMacro::MathMacro(docstring const & name, int numargs)
: InsetMathNest(numargs), name_(name)
{}
@@ -63,24 +104,12 @@
{
if (!MacroTable::globalMacros().has(name())) {
mathed_string_dim(mi.base.font, "Unknown: " + name(), dim);
- } else if (editing(mi.base.bv)) {
- // FIXME UNICODE
- asArray(MacroTable::globalMacros().get(name()).def(), tmpl_);
- LyXFont font = mi.base.font;
- augmentFont(font, from_ascii("lyxtex"));
- tmpl_.metrics(mi, dim);
- // FIXME UNICODE
- dim.wid += mathed_string_width(font, name()) + 10;
- // FIXME UNICODE
- int ww = mathed_string_width(font, from_ascii("#1: "));
- for (idx_type i = 0; i < nargs(); ++i) {
- MathArray const & c = cell(i);
- c.metrics(mi);
- dim.wid = max(dim.wid, c.width() + ww);
- dim.des += c.height() + 10;
- }
} else {
- MacroTable::globalMacros().get(name()).expand(cells_, expanded_);
+ // create MathMacroArgumentValue object pointing to the cells of the macro
+ vector<MathArray> values(nargs());
+ for (size_t i = 0; i != nargs(); ++i)
+ values[i].insert(0, MathAtom(new MathMacroArgumentValue(&cells_[i])));
+ MacroTable::globalMacros().get(name()).expand(values, expanded_);
expanded_.metrics(mi, dim);
}
metricsMarkers2(dim);
@@ -96,26 +125,6 @@
if (!MacroTable::globalMacros().has(name())) {
// FIXME UNICODE
drawStrRed(pi, x, y, "Unknown: " + name());
- } else if (editing(pi.base.bv)) {
- LyXFont font = pi.base.font;
- augmentFont(font, from_ascii("lyxtex"));
- int h = y - dim_.ascent() + 2 + tmpl_.ascent();
- pi.pain.text(x + 3, h, name(), font);
- int const w = mathed_string_width(font, name());
- tmpl_.draw(pi, x + w + 12, h);
- h += tmpl_.descent();
- Dimension ldim;
- string t = "#1: ";
- mathed_string_dim(font, name(), ldim);
- for (idx_type i = 0; i < nargs(); ++i) {
- MathArray const & c = cell(i);
- h += max(c.ascent(), ldim.asc) + 5;
- c.draw(pi, x + ldim.wid, h);
- char_type str[] = { '#', '1', ':', '\0' };
- str[1] += static_cast<char_type>(i);
- pi.pain.text(x + 3, h, str, font);
- h += max(c.descent(), ldim.des) + 5;
- }
} else {
expanded_.draw(pi, x, y);
}
Index: InsetMathMacro.h
===================================================================
--- InsetMathMacro.h (revision 17284)
+++ InsetMathMacro.h (working copy)
@@ -20,8 +20,7 @@
namespace lyx {
-
-
+
/// This class contains the data for a macro.
class MathMacro : public InsetMathNest {
public:
newfile1.lyx
Description: application/lyx
