Re: [Patch] Re: [Patch] partial support for units

2007-09-17 Thread Martin Vermeer
On Mon, 17 Sep 2007 13:53:03 +0200
Helge Hafting <[EMAIL PROTECTED]> wrote:

> Martin Vermeer wrote:
> > On Fri, Sep 14, 2007 at 03:36:10PM +0200, Helge Hafting wrote:
> >   
> >> "\unitfrac" supports a similiar optional argument for the number, but
> >> that capability is not used in lyx. So we can now write
> >> $35\unitfrac{km}{h}$
> >> but not
> >> $\unitfrac[35]{km}{h}$
> >> The latter looks better, with better spacing. One can insert
> >> the missing space explicitly, and get $35\,\unitfrac{km}{h}
> >> which looks the same in the dvi.
> >> 
> >
> > The attached supports now all these alternatives. As a bonus, we have
> > now the option of varying numbers of cells. Also cursor motion should
> > now be OK.
> >
> > I will commit this if I don't hear an outcry. Suggestions for better
> > toolbar pop-up texts are especially welcome.
> >   
> I was unable to test because the patch did not apply. Too
> many other patches going in probably.  I guess this stuff
> is fine anyway.
> 
> Helge Hafting

The patch is already in (perhaps that's why it didn't apply :-)

- Martin
 
 


Re: [Patch] Re: [Patch] partial support for units

2007-09-17 Thread Helge Hafting

Martin Vermeer wrote:

On Fri, Sep 14, 2007 at 03:36:10PM +0200, Helge Hafting wrote:
  

"\unitfrac" supports a similiar optional argument for the number, but
that capability is not used in lyx. So we can now write
$35\unitfrac{km}{h}$
but not
$\unitfrac[35]{km}{h}$
The latter looks better, with better spacing. One can insert
the missing space explicitly, and get $35\,\unitfrac{km}{h}
which looks the same in the dvi.



The attached supports now all these alternatives. As a bonus, we have
now the option of varying numbers of cells. Also cursor motion should
now be OK.

I will commit this if I don't hear an outcry. Suggestions for better
toolbar pop-up texts are especially welcome.
  

I was unable to test because the patch did not apply. Too
many other patches going in probably.  I guess this stuff
is fine anyway.

Helge Hafting




Re: [Patch] Re: [Patch] partial support for units

2007-09-15 Thread Martin Vermeer
On Fri, Sep 14, 2007 at 03:36:10PM +0200, Helge Hafting wrote:
> Martin Vermeer wrote:

...

> >I am not entirely happy with this patch. It works allright, but...
> >  
> I tested this. Mostly fine, but a few small problems:
> 
> Using "unit" gives two math boxes. One for the numer and one
> for the unit itself. This typesets very nice as \unit[45]{m} for example.
> 
> "\unitfrac" supports a similiar optional argument for the number, but
> that capability is not used in lyx. So we can now write
> $35\unitfrac{km}{h}$
> but not
> $\unitfrac[35]{km}{h}$
> The latter looks better, with better spacing. One can insert
> the missing space explicitly, and get $35\,\unitfrac{km}{h}
> which looks the same in the dvi.

The attached supports now all these alternatives. As a bonus, we have
now the option of varying numbers of cells. Also cursor motion should
now be OK.

I will commit this if I don't hear an outcry. Suggestions for better
toolbar pop-up texts are especially welcome.

The current implementation is a bit arbitrary in the sense that now 
InsetMathFrac combines a large number of fraction-like things, but
outside it are still tfrac, dfrac and binomial. 

> Finally, is the fraction toolbar menu the right place for "unit", or does
> this thing fit better in the font menu beside it?

Not really... it's not a font thing either.

At least the current solution is LaTeX-like, because also the units
package is built on top of nicefrac.

- Martin

Index: src/mathed/InsetMathFrac.h
===
--- src/mathed/InsetMathFrac.h	(revision 20236)
+++ src/mathed/InsetMathFrac.h	(working copy)
@@ -28,12 +28,18 @@
 		OVER,
 		ATOP,
 		NICEFRAC,
-		UNITFRAC
+		UNITFRAC,
+		UNIT,
+		UNITFRAC3
 	};
 
 	///
-	explicit InsetMathFrac(Kind kind = FRAC);
+	explicit InsetMathFrac(Kind kind = FRAC, idx_type ncells = 2);
 	///
+	bool idxRight(Cursor &) const;
+	///
+	bool idxLeft(Cursor &) const;
+	///
 	bool metrics(MetricsInfo & mi, Dimension & dim) const;
 	///
 	void draw(PainterInfo &, int x, int y) const;
Index: src/mathed/MathFactory.cpp
===
--- src/mathed/MathFactory.cpp	(revision 20236)
+++ src/mathed/MathFactory.cpp	(working copy)
@@ -260,7 +260,7 @@
 
 MathAtom createInsetMath(docstring const & s)
 {
-	//lyxerr << "creating inset with name: '" << s << '\'' << endl;
+	//lyxerr << "creating inset with name: '" << to_utf8(s) << '\'' << endl;
 	latexkeys const * l = in_word_set(s);
 	if (l) {
 		docstring const & inset = l->inset;
@@ -372,6 +372,10 @@
 		return MathAtom(new InsetMathFrac(InsetMathFrac::NICEFRAC));
 	if (s == "unitfrac")
 		return MathAtom(new InsetMathFrac(InsetMathFrac::UNITFRAC));
+	if (s == "unitfracthree")
+		return MathAtom(new InsetMathFrac(InsetMathFrac::UNITFRAC3, 3));
+	if (s == "unit")
+		return MathAtom(new InsetMathFrac(InsetMathFrac::UNIT));
 	//if (s == "infer")
 	//	return MathAtom(new MathInferInset);
 	if (s == "atop")
Index: src/mathed/InsetMathFracBase.h
===
--- src/mathed/InsetMathFracBase.h	(revision 20235)
+++ src/mathed/InsetMathFracBase.h	(working copy)
@@ -21,7 +21,7 @@
 class InsetMathFracBase : public InsetMathNest {
 public:
 	///
-	InsetMathFracBase();
+	explicit InsetMathFracBase(idx_type ncells = 2);
 	///
 	bool idxUpDown(Cursor &, bool up) const;
 	///
Index: src/mathed/InsetMathFracBase.cpp
===
--- src/mathed/InsetMathFracBase.cpp	(revision 20235)
+++ src/mathed/InsetMathFracBase.cpp	(working copy)
@@ -18,8 +18,8 @@
 namespace lyx {
 
 
-InsetMathFracBase::InsetMathFracBase()
-	: InsetMathNest(2)
+InsetMathFracBase::InsetMathFracBase(idx_type ncells)
+	: InsetMathNest(ncells)
 {}
 
 
Index: src/mathed/InsetMathFrac.cpp
===
--- src/mathed/InsetMathFrac.cpp	(revision 20236)
+++ src/mathed/InsetMathFrac.cpp	(working copy)
@@ -17,13 +17,14 @@
 #include "TextPainter.h"
 #include "LaTeXFeatures.h"
 #include "Color.h"
+#include "Cursor.h"
 #include "frontends/Painter.h"
 
 
 namespace lyx {
 
-InsetMathFrac::InsetMathFrac(Kind kind)
-	: kind_(kind)
+InsetMathFrac::InsetMathFrac(Kind kind, InsetMath::idx_type ncells)
+	: InsetMathFracBase(ncells), kind_(kind)
 {}
 
 
@@ -45,24 +46,76 @@
 }
 
 
+bool InsetMathFrac::idxRight(Cursor & cur) const
+{
+	InsetMath::idx_type target;
+	if (kind_ == UNITFRAC3)
+		target = 0;
+	else if (kind_ == UNIT) 
+		target = 1;
+	else
+	return false;
+	if (cur.idx() == target)
+		return false;
+	cur.idx() = target;
+	cur.pos() = cell(target).x2pos(cur.x_target());
+	return true;
+}
+
+
+bool InsetMathFrac::idxLeft(Cursor & cur) const
+{
+	InsetMath::idx_type target;
+	if (kind_ == UNITFRAC3)
+		target = 2;
+	else if (kind_ == UNIT) 
+		target = 0;
+	else
+	return false;
+	if (cur.idx() == target)
+		return false;
+	cur.idx() = target;
+	

Re: [Patch] Re: [Patch] partial support for units

2007-09-14 Thread Martin Vermeer
On Fri, 14 Sep 2007 15:36:10 +0200
Helge Hafting <[EMAIL PROTECTED]> wrote:

...

> > Here is a further patch, that Helge asked for (I think). It now does
> > also non-fraction units (but still support is only partial).
> >
> > I am not entirely happy with this patch. It works allright, but...
> >   
> I tested this. Mostly fine, but a few small problems:
> 
> Using "unit" gives two math boxes. One for the numer and one
> for the unit itself. This typesets very nice as \unit[45]{m} for example.
> 
> "\unitfrac" supports a similiar optional argument for the number, but
> that capability is not used in lyx. So we can now write
> $35\unitfrac{km}{h}$
> but not
> $\unitfrac[35]{km}{h}$
> The latter looks better, with better spacing. One can insert
> the missing space explicitly, and get $35\,\unitfrac{km}{h}
> which looks the same in the dvi.

Yes, I know about this. This would require the frac inset to be
modified to take a variable number (3 instead of 2) of cells.

It is doable (I had even some prototype code), but shouldn't we first
think this through at a more fundamental level?
 
> Finally, is the fraction toolbar menu the right place for "unit", or does
> this thing fit better in the font menu beside it?

Arguably yes. Another thing is that to move between cells, you must now use
cursor up/down. Makes sense for a "real" or even a "nice" fraction, but 
not here.

Also this is fixable, but doing it within fractions becomes a bit kludgy.

> Helge Hafting

André, any ideas?

- Martin


Re: [Patch] Re: [Patch] partial support for units

2007-09-14 Thread Helge Hafting

Martin Vermeer wrote:

On Tue, 11 Sep 2007 18:18:05 +0300
Martin Vermeer <[EMAIL PROTECTED]> wrote:

  

On Tue, 11 Sep 2007 10:50:56 +0300
Martin Vermeer <[EMAIL PROTECTED]> wrote:



On Tue, 11 Sep 2007 08:15:11 +0300
Martin Vermeer <[EMAIL PROTECTED]> wrote:

  

On Mon, Sep 10, 2007 at 10:42:32PM +0200, Andre Poenitz wrote:


On Mon, Sep 10, 2007 at 10:44:01PM +0300, Martin Vermeer wrote:
  

OK for trunk?


Here's a better one.

- Martin
  

Grmf. Not my day. Here is one that actually, verifiedly, works (and not
only for a units fraction).



Here is a further patch, that Helge asked for (I think). It now does
also non-fraction units (but still support is only partial).

I am not entirely happy with this patch. It works allright, but...
  

I tested this. Mostly fine, but a few small problems:

Using "unit" gives two math boxes. One for the numer and one
for the unit itself. This typesets very nice as \unit[45]{m} for example.

"\unitfrac" supports a similiar optional argument for the number, but
that capability is not used in lyx. So we can now write
$35\unitfrac{km}{h}$
but not
$\unitfrac[35]{km}{h}$
The latter looks better, with better spacing. One can insert
the missing space explicitly, and get $35\,\unitfrac{km}{h}
which looks the same in the dvi.

Finally, is the fraction toolbar menu the right place for "unit", or does
this thing fit better in the font menu beside it?


Helge Hafting



[Patch] Re: [Patch] partial support for units

2007-09-13 Thread Martin Vermeer
On Tue, 11 Sep 2007 18:18:05 +0300
Martin Vermeer <[EMAIL PROTECTED]> wrote:

> On Tue, 11 Sep 2007 10:50:56 +0300
> Martin Vermeer <[EMAIL PROTECTED]> wrote:
> 
> > On Tue, 11 Sep 2007 08:15:11 +0300
> > Martin Vermeer <[EMAIL PROTECTED]> wrote:
> > 
> > > On Mon, Sep 10, 2007 at 10:42:32PM +0200, Andre Poenitz wrote:
> > > > On Mon, Sep 10, 2007 at 10:44:01PM +0300, Martin Vermeer wrote:
> > > > > OK for trunk?
> > 
> > Here's a better one.
> > 
> > - Martin
> 
> 
> Grmf. Not my day. Here is one that actually, verifiedly, works (and not
> only for a units fraction).

Here is a further patch, that Helge asked for (I think). It now does
also non-fraction units (but still support is only partial).

I am not entirely happy with this patch. It works allright, but...

- Martin
 

Index: src/mathed/InsetMathFrac.h
===
--- src/mathed/InsetMathFrac.h	(revision 20236)
+++ src/mathed/InsetMathFrac.h	(working copy)
@@ -28,7 +28,8 @@
 		OVER,
 		ATOP,
 		NICEFRAC,
-		UNITFRAC
+		UNITFRAC,
+		UNIT
 	};
 
 	///
Index: src/mathed/MathFactory.cpp
===
--- src/mathed/MathFactory.cpp	(revision 20236)
+++ src/mathed/MathFactory.cpp	(working copy)
@@ -372,6 +372,8 @@
 		return MathAtom(new InsetMathFrac(InsetMathFrac::NICEFRAC));
 	if (s == "unitfrac")
 		return MathAtom(new InsetMathFrac(InsetMathFrac::UNITFRAC));
+	if (s == "unit")
+		return MathAtom(new InsetMathFrac(InsetMathFrac::UNIT));
 	//if (s == "infer")
 	//	return MathAtom(new MathInferInset);
 	if (s == "atop")
Index: src/mathed/InsetMathFrac.cpp
===
--- src/mathed/InsetMathFrac.cpp	(revision 20236)
+++ src/mathed/InsetMathFrac.cpp	(working copy)
@@ -47,22 +47,31 @@
 
 bool InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
 {
-	FracChanger dummy(mi.base);
-	cell(0).metrics(mi);
-	cell(1).metrics(mi);
-	if (kind_ == NICEFRAC) {
-		dim.wid = cell(0).width() + cell(1).width() + 5;
-		dim.asc = cell(0).height() + 5;
-		dim.des = cell(1).height() - 5;
-	} else if (kind_ == UNITFRAC) {
+	if (kind_ == UNIT) {
+		cell(0).metrics(mi);
 		ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE);
+		cell(1).metrics(mi);
 		dim.wid = cell(0).width() + cell(1).width() + 5;
-		dim.asc = cell(0).height() + 5;
-		dim.des = cell(1).height() - 5;
+		dim.asc = std::max(cell(0).ascent(), cell(1).ascent());
+		dim.des = std::max(cell(0).descent(), cell(1).descent());
 	} else {
-		dim.wid = std::max(cell(0).width(), cell(1).width()) + 2;
-		dim.asc = cell(0).height() + 2 + 5;
-		dim.des = cell(1).height() + 2 - 5;
+		FracChanger dummy(mi.base);
+		cell(0).metrics(mi);
+		cell(1).metrics(mi);
+		if (kind_ == NICEFRAC) {
+			dim.wid = cell(0).width() + cell(1).width() + 5;
+			dim.asc = cell(0).height() + 5;
+			dim.des = cell(1).height() - 5;
+		} else if (kind_ == UNITFRAC) {
+			ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE);
+			dim.wid = cell(0).width() + cell(1).width() + 5;
+			dim.asc = cell(0).height() + 5;
+			dim.des = cell(1).height() - 5;
+		} else {
+			dim.wid = std::max(cell(0).width(), cell(1).width()) + 2;
+			dim.asc = cell(0).height() + 2 + 5;
+			dim.des = cell(1).height() + 2 - 5;
+		}
 	}
 	metricsMarkers(dim);
 	if (dim_ == dim)
@@ -76,23 +85,29 @@
 {
 	setPosCache(pi, x, y);
 	int m = x + dim_.wid / 2;
-	FracChanger dummy(pi.base);
-	if (kind_ == NICEFRAC) {
-		cell(0).draw(pi, x + 2,
-y - cell(0).descent() - 5);
-		cell(1).draw(pi, x + cell(0).width() + 5,
-y + cell(1).ascent() / 2);
-	} else if (kind_ == UNITFRAC) {
+	if (kind_ == UNIT) {
+		cell(0).draw(pi, x + 1, y);
 		ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE);
-		cell(0).draw(pi, x + 2,
-y - cell(0).descent() - 5);
-		cell(1).draw(pi, x + cell(0).width() + 5,
-y + cell(1).ascent() / 2);
+		cell(1).draw(pi, x + cell(0).width() + 5, y);
 	} else {
-		cell(0).draw(pi, m - cell(0).width() / 2,
-y - cell(0).descent() - 2 - 5);
-		cell(1).draw(pi, m - cell(1).width() / 2,
-y + cell(1).ascent()  + 2 - 5);
+		FracChanger dummy(pi.base);
+		if (kind_ == NICEFRAC) {
+			cell(0).draw(pi, x + 2,
+	y - cell(0).descent() - 5);
+			cell(1).draw(pi, x + cell(0).width() + 5,
+	y + cell(1).ascent() / 2);
+		} else if (kind_ == UNITFRAC) {
+			ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE);
+			cell(0).draw(pi, x + 2,
+	y - cell(0).descent() - 5);
+			cell(1).draw(pi, x + cell(0).width() + 5,
+	y + cell(1).ascent() / 2);
+		} else {
+			cell(0).draw(pi, m - cell(0).width() / 2,
+	y - cell(0).descent() - 2 - 5);
+			cell(1).draw(pi, m - cell(1).width() / 2,
+	y + cell(1).ascent()  + 2 - 5);
+		}
 	}
 	if (kind_ == NICEFRAC || kind_ == UNITFRAC) {
 		pi.pain.line(x + cell(0).width(),
@@ -144,6 +159,9 @@
 	case UNITFRAC:
 		InsetMathNest::write(os);
 		break;
+	case UNIT:
+		os << "\\unit[" << cell(0) << "]{" << cell(1) << '}';
+		break;
 	}
 }
 
@@ -159,6 +177,8 @@
 		r

Re: [Patch] partial support for units

2007-09-11 Thread Andre Poenitz
On Tue, Sep 11, 2007 at 07:41:29PM +0300, Martin Vermeer wrote:
> On Tue, Sep 11, 2007 at 05:37:32PM +0200, Andre Poenitz wrote:
> > On Tue, Sep 11, 2007 at 10:50:56AM +0300, Martin Vermeer wrote:
> > > Here's a better one.
> > 
> > Not really ;-)
> > 
> > > Index: src/mathed/InsetMathFrac.cpp
> > > ===
> > > --- src/mathed/InsetMathFrac.cpp  (revision 20193)
> > > +++ src/mathed/InsetMathFrac.cpp  (working copy)
> > > @@ -48,9 +48,11 @@
> > >  bool InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
> > >  {
> > >FracChanger dummy(mi.base);
> > > +  if (kind_ == UNITFRAC)
> > > + ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE);
> > >cell(0).metrics(mi);
> > >cell(1).metrics(mi);
> > 
> > The ShapeChanger changes the Shape back to the original state when it is
> > destructed, i.e. the end of its scope. In this particular piece of code
> > the scope of 'dummy2' is the 'if' branch, i.e. the shape will already be
> > restored before cell(0).metrics() is called.
> > 
> > I am not sure that changing the shape is needed at all. Is the resulting 
> > metrics visually different?
> 
> Perhaps not, but would it be wise to count on that?

*shrug* If it walks likes a duck...

Andre'


Re: [Patch] partial support for units

2007-09-11 Thread Andre Poenitz
On Tue, Sep 11, 2007 at 05:58:56PM +0200, Jean-Marc Lasgouttes wrote:
> Andre Poenitz <[EMAIL PROTECTED]> writes:
> 
> > The ShapeChanger changes the Shape back to the original state when it is
> > destructed, i.e. the end of its scope. In this particular piece of code
> > the scope of 'dummy2' is the 'if' branch, i.e. the shape will already be
> > restored before cell(0).metrics() is called.
> 
> It would maybe be more useful to have a FontSaver, then, like:
> 
>FontSaver dummy(mi.base.font);
>if (whatever)
>   mi.base.font.setShape(Font::UP_SHAPE);
> 
> and mi.base.font would be restored on scope exit. Actually, a generic
> Saver class would be enough to solve all needs and seems much simpler
> to me than all the hand-made FooChanger classes.

It used to be shorter for common cases. Of course it is not forbidden to
copy the whole font.

Andre'


Re: [Patch] partial support for units

2007-09-11 Thread Martin Vermeer
On Tue, Sep 11, 2007 at 05:58:56PM +0200, Jean-Marc Lasgouttes wrote:
> Andre Poenitz <[EMAIL PROTECTED]> writes:
> 
> > The ShapeChanger changes the Shape back to the original state when it is
> > destructed, i.e. the end of its scope. In this particular piece of code
> > the scope of 'dummy2' is the 'if' branch, i.e. the shape will already be
> > restored before cell(0).metrics() is called.
> 
> It would maybe be more useful to have a FontSaver, then, like:
> 
>FontSaver dummy(mi.base.font);
>if (whatever)
>   mi.base.font.setShape(Font::UP_SHAPE);
> 
> and mi.base.font would be restored on scope exit. Actually, a generic
> Saver class would be enough to solve all needs and seems much simpler
> to me than all the hand-made FooChanger classes.

Not a bad idea actually. 
 
- Martin


Re: [Patch] partial support for units

2007-09-11 Thread Martin Vermeer
On Tue, Sep 11, 2007 at 05:37:32PM +0200, Andre Poenitz wrote:
> On Tue, Sep 11, 2007 at 10:50:56AM +0300, Martin Vermeer wrote:
> > Here's a better one.
> 
> Not really ;-)
> 
> > Index: src/mathed/InsetMathFrac.cpp
> > ===
> > --- src/mathed/InsetMathFrac.cpp  (revision 20193)
> > +++ src/mathed/InsetMathFrac.cpp  (working copy)
> > @@ -48,9 +48,11 @@
> >  bool InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
> >  {
> >FracChanger dummy(mi.base);
> > +  if (kind_ == UNITFRAC)
> > +   ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE);
> >cell(0).metrics(mi);
> >cell(1).metrics(mi);
> 
> The ShapeChanger changes the Shape back to the original state when it is
> destructed, i.e. the end of its scope. In this particular piece of code
> the scope of 'dummy2' is the 'if' branch, i.e. the shape will already be
> restored before cell(0).metrics() is called.
> 
> I am not sure that changing the shape is needed at all. Is the resulting 
> metrics visually different?

Perhaps not, but would it be wise to count on that?
 
> If so, something like
> 
>   bool InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
>   {
> FracChanger dummy(mi.base);
>   std::auto_ptr dummy2;
>   if (kind_ == UNITFRAC)
>   dummy2.reset(new ShapeChanger(mi.base.font, Font::UP_SHAPE));
> cell(0).metrics(mi);
> cell(1).metrics(mi);
> 
> might help. I this case the ShapeChanger will be destroyed at the
> end of the function body.

I was looking for something like this, but decided for another approach.

> Andre'

- Martin



Re: [Patch] partial support for units

2007-09-11 Thread Jean-Marc Lasgouttes
Andre Poenitz <[EMAIL PROTECTED]> writes:

> The ShapeChanger changes the Shape back to the original state when it is
> destructed, i.e. the end of its scope. In this particular piece of code
> the scope of 'dummy2' is the 'if' branch, i.e. the shape will already be
> restored before cell(0).metrics() is called.

It would maybe be more useful to have a FontSaver, then, like:

   FontSaver dummy(mi.base.font);
   if (whatever)
  mi.base.font.setShape(Font::UP_SHAPE);

and mi.base.font would be restored on scope exit. Actually, a generic
Saver class would be enough to solve all needs and seems much simpler
to me than all the hand-made FooChanger classes.

JMarc



Re: [Patch] partial support for units

2007-09-11 Thread Andre Poenitz
On Tue, Sep 11, 2007 at 10:50:56AM +0300, Martin Vermeer wrote:
> Here's a better one.

Not really ;-)

> Index: src/mathed/InsetMathFrac.cpp
> ===
> --- src/mathed/InsetMathFrac.cpp  (revision 20193)
> +++ src/mathed/InsetMathFrac.cpp  (working copy)
> @@ -48,9 +48,11 @@
>  bool InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
>  {
>FracChanger dummy(mi.base);
> +  if (kind_ == UNITFRAC)
> + ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE);
>cell(0).metrics(mi);
>cell(1).metrics(mi);

The ShapeChanger changes the Shape back to the original state when it is
destructed, i.e. the end of its scope. In this particular piece of code
the scope of 'dummy2' is the 'if' branch, i.e. the shape will already be
restored before cell(0).metrics() is called.

I am not sure that changing the shape is needed at all. Is the resulting 
metrics visually different?

If so, something like

  bool InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
  {
FracChanger dummy(mi.base);
std::auto_ptr dummy2;
if (kind_ == UNITFRAC)
dummy2.reset(new ShapeChanger(mi.base.font, Font::UP_SHAPE));
cell(0).metrics(mi);
cell(1).metrics(mi);

might help. I this case the ShapeChanger will be destroyed at the
end of the function body.

Andre'



Re: [Patch] partial support for units

2007-09-11 Thread Martin Vermeer
On Tue, 11 Sep 2007 10:50:56 +0300
Martin Vermeer <[EMAIL PROTECTED]> wrote:

> On Tue, 11 Sep 2007 08:15:11 +0300
> Martin Vermeer <[EMAIL PROTECTED]> wrote:
> 
> > On Mon, Sep 10, 2007 at 10:42:32PM +0200, Andre Poenitz wrote:
> > > On Mon, Sep 10, 2007 at 10:44:01PM +0300, Martin Vermeer wrote:
> > > > OK for trunk?
> 
> Here's a better one.
> 
> - Martin


Grmf. Not my day. Here is one that actually, verifiedly, works (and not
only for a units fraction).

- Martin
Index: src/mathed/InsetMathFrac.h
===
--- src/mathed/InsetMathFrac.h	(revision 20193)
+++ src/mathed/InsetMathFrac.h	(working copy)
@@ -27,7 +27,8 @@
 		FRAC,
 		OVER,
 		ATOP,
-		NICEFRAC
+		NICEFRAC,
+		UNITFRAC
 	};
 
 	///
Index: src/mathed/MathFactory.cpp
===
--- src/mathed/MathFactory.cpp	(revision 20193)
+++ src/mathed/MathFactory.cpp	(working copy)
@@ -370,6 +370,8 @@
 		return MathAtom(new InsetMathFrac(InsetMathFrac::OVER));
 	if (s == "nicefrac")
 		return MathAtom(new InsetMathFrac(InsetMathFrac::NICEFRAC));
+	if (s == "unitfrac")
+		return MathAtom(new InsetMathFrac(InsetMathFrac::UNITFRAC));
 	//if (s == "infer")
 	//	return MathAtom(new MathInferInset);
 	if (s == "atop")
Index: src/mathed/InsetMathFrac.cpp
===
--- src/mathed/InsetMathFrac.cpp	(revision 20193)
+++ src/mathed/InsetMathFrac.cpp	(working copy)
@@ -54,6 +54,11 @@
 		dim.wid = cell(0).width() + cell(1).width() + 5;
 		dim.asc = cell(0).height() + 5;
 		dim.des = cell(1).height() - 5;
+	} else if (kind_ == UNITFRAC) {
+		ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE);
+		dim.wid = cell(0).width() + cell(1).width() + 5;
+		dim.asc = cell(0).height() + 5;
+		dim.des = cell(1).height() - 5;
 	} else {
 		dim.wid = std::max(cell(0).width(), cell(1).width()) + 2;
 		dim.asc = cell(0).height() + 2 + 5;
@@ -77,16 +82,24 @@
 y - cell(0).descent() - 5);
 		cell(1).draw(pi, x + cell(0).width() + 5,
 y + cell(1).ascent() / 2);
-		pi.pain.line(x + cell(0).width(),
-y + dim_.des - 2,
-x + cell(0).width() + 5,
-y - dim_.asc + 2, Color::math);
+	} else if (kind_ == UNITFRAC) {
+		ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE);
+		cell(0).draw(pi, x + 2,
+y - cell(0).descent() - 5);
+		cell(1).draw(pi, x + cell(0).width() + 5,
+y + cell(1).ascent() / 2);
 	} else {
 		cell(0).draw(pi, m - cell(0).width() / 2,
 y - cell(0).descent() - 2 - 5);
 		cell(1).draw(pi, m - cell(1).width() / 2,
 y + cell(1).ascent()  + 2 - 5);
 	}
+	if (kind_ == NICEFRAC || kind_ == UNITFRAC) {
+		pi.pain.line(x + cell(0).width(),
+y + dim_.des - 2,
+x + cell(0).width() + 5,
+y - dim_.asc + 2, Color::math);
+	}
 	if (kind_ == FRAC || kind_ == OVER)
 		pi.pain.line(x + 1, y - 5,
 x + dim_.wid - 2, y - 5, Color::math);
@@ -111,7 +124,7 @@
 	cell(0).drawT(pain, m - cell(0).width() / 2, y - cell(0).descent() - 1);
 	cell(1).drawT(pain, m - cell(1).width() / 2, y + cell(1).ascent());
 	// ASCII art: ignore niceties
-	if (kind_ == FRAC || kind_ == OVER || kind_ == NICEFRAC)
+	if (kind_ == FRAC || kind_ == OVER || kind_ == NICEFRAC || kind_ == UNITFRAC)
 		pain.horizontalLine(x, y, dim_.width());
 }
 
@@ -128,6 +141,7 @@
 		break;
 	case FRAC:
 	case NICEFRAC:
+	case UNITFRAC:
 		InsetMathNest::write(os);
 		break;
 	}
@@ -143,6 +157,8 @@
 		return from_ascii("over");
 	case NICEFRAC:
 		return from_ascii("nicefrac");
+	case UNITFRAC:
+		return from_ascii("unitfrac");
 	case ATOP:
 		return from_ascii("atop");
 	}
@@ -183,8 +199,8 @@
 
 void InsetMathFrac::validate(LaTeXFeatures & features) const
 {
-	if (kind_ == NICEFRAC)
-		features.require("nicefrac");
+	if (kind_ == NICEFRAC || kind_ == UNITFRAC)
+		features.require("units");
 	InsetMathNest::validate(features);
 }
 
Index: src/LaTeXFeatures.cpp
===
--- src/LaTeXFeatures.cpp	(revision 20193)
+++ src/LaTeXFeatures.cpp	(working copy)
@@ -405,7 +405,7 @@
 	"dvipost",
 	"fancybox",
 	"calc",
-	"nicefrac",
+	"units",
 	"tipa",
 	"framed",
 	"pdfcolmk",
Index: lib/ui/stdtoolbars.inc
===
--- lib/ui/stdtoolbars.inc	(revision 20175)
+++ lib/ui/stdtoolbars.inc	(working copy)
@@ -273,7 +273,8 @@
 	Toolbar "frac-square" "Fractions"
 		Item "Standard	\\frac" "math-insert \frac"
 		Item "No hor. line	\\atop" "math-insert \atop"
-		Item "Nice	\\nicefrac" "math-insert \nicefrac"
+		Item "Nice (3/4)	\\nicefrac" "math-insert \nicefrac"
+		Item "Units (km/h)	\\unitfrac" "math-insert \unitfrac"
 		Item "Text frac (amsmath)	\\tfrac" "math-insert \tfrac"
 		Item "Display frac (amsmath)	\\dfrac" "math-insert \dfrac"
 		Item "Binomial	\\choose"  "math-insert \choose"


Re: [Patch] partial support for units

2007-09-11 Thread Martin Vermeer
On Tue, 11 Sep 2007 08:15:11 +0300
Martin Vermeer <[EMAIL PROTECTED]> wrote:

> On Mon, Sep 10, 2007 at 10:42:32PM +0200, Andre Poenitz wrote:
> > On Mon, Sep 10, 2007 at 10:44:01PM +0300, Martin Vermeer wrote:
> > > OK for trunk?

Here's a better one.

- Martin
Index: src/mathed/InsetMathFrac.h
===
--- src/mathed/InsetMathFrac.h	(revision 20193)
+++ src/mathed/InsetMathFrac.h	(working copy)
@@ -27,7 +27,8 @@
 		FRAC,
 		OVER,
 		ATOP,
-		NICEFRAC
+		NICEFRAC,
+		UNITFRAC
 	};
 
 	///
Index: src/mathed/MathFactory.cpp
===
--- src/mathed/MathFactory.cpp	(revision 20193)
+++ src/mathed/MathFactory.cpp	(working copy)
@@ -370,6 +370,8 @@
 		return MathAtom(new InsetMathFrac(InsetMathFrac::OVER));
 	if (s == "nicefrac")
 		return MathAtom(new InsetMathFrac(InsetMathFrac::NICEFRAC));
+	if (s == "unitfrac")
+		return MathAtom(new InsetMathFrac(InsetMathFrac::UNITFRAC));
 	//if (s == "infer")
 	//	return MathAtom(new MathInferInset);
 	if (s == "atop")
Index: src/mathed/InsetMathFrac.cpp
===
--- src/mathed/InsetMathFrac.cpp	(revision 20193)
+++ src/mathed/InsetMathFrac.cpp	(working copy)
@@ -48,9 +48,11 @@
 bool InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
 {
 	FracChanger dummy(mi.base);
+	if (kind_ == UNITFRAC)
+		ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE);
 	cell(0).metrics(mi);
 	cell(1).metrics(mi);
-	if (kind_ == NICEFRAC) {
+	if (kind_ == NICEFRAC || kind_ == UNITFRAC) {
 		dim.wid = cell(0).width() + cell(1).width() + 5;
 		dim.asc = cell(0).height() + 5;
 		dim.des = cell(1).height() - 5;
@@ -72,7 +74,9 @@
 	setPosCache(pi, x, y);
 	int m = x + dim_.wid / 2;
 	FracChanger dummy(pi.base);
-	if (kind_ == NICEFRAC) {
+	if (kind_ == UNITFRAC)
+		ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE);
+	if (kind_ == NICEFRAC || kind_ == UNITFRAC) {
 		cell(0).draw(pi, x + 2,
 y - cell(0).descent() - 5);
 		cell(1).draw(pi, x + cell(0).width() + 5,
@@ -111,7 +115,7 @@
 	cell(0).drawT(pain, m - cell(0).width() / 2, y - cell(0).descent() - 1);
 	cell(1).drawT(pain, m - cell(1).width() / 2, y + cell(1).ascent());
 	// ASCII art: ignore niceties
-	if (kind_ == FRAC || kind_ == OVER || kind_ == NICEFRAC)
+	if (kind_ == FRAC || kind_ == OVER || kind_ == NICEFRAC || kind_ == UNITFRAC)
 		pain.horizontalLine(x, y, dim_.width());
 }
 
@@ -128,6 +132,7 @@
 		break;
 	case FRAC:
 	case NICEFRAC:
+	case UNITFRAC:
 		InsetMathNest::write(os);
 		break;
 	}
@@ -143,6 +148,8 @@
 		return from_ascii("over");
 	case NICEFRAC:
 		return from_ascii("nicefrac");
+	case UNITFRAC:
+		return from_ascii("unitfrac");
 	case ATOP:
 		return from_ascii("atop");
 	}
@@ -183,8 +190,8 @@
 
 void InsetMathFrac::validate(LaTeXFeatures & features) const
 {
-	if (kind_ == NICEFRAC)
-		features.require("nicefrac");
+	if (kind == NICEFRAC || kind_ == UNITFRAC)
+		features.require("units");
 	InsetMathNest::validate(features);
 }
 
Index: src/LaTeXFeatures.cpp
===
--- src/LaTeXFeatures.cpp	(revision 20193)
+++ src/LaTeXFeatures.cpp	(working copy)
@@ -405,7 +405,7 @@
 	"dvipost",
 	"fancybox",
 	"calc",
-	"nicefrac",
+	"units",
 	"tipa",
 	"framed",
 	"pdfcolmk",
Index: lib/ui/stdtoolbars.inc
===
--- lib/ui/stdtoolbars.inc	(revision 20175)
+++ lib/ui/stdtoolbars.inc	(working copy)
@@ -273,7 +273,8 @@
 	Toolbar "frac-square" "Fractions"
 		Item "Standard	\\frac" "math-insert \frac"
 		Item "No hor. line	\\atop" "math-insert \atop"
-		Item "Nice	\\nicefrac" "math-insert \nicefrac"
+		Item "Nice (3/4)	\\nicefrac" "math-insert \nicefrac"
+		Item "Units (km/h)	\\unitfrac" "math-insert \unitfrac"
 		Item "Text frac (amsmath)	\\tfrac" "math-insert \tfrac"
 		Item "Display frac (amsmath)	\\dfrac" "math-insert \dfrac"
 		Item "Binomial	\\choose"  "math-insert \choose"
 


Re: [Patch] partial support for units

2007-09-10 Thread Martin Vermeer
On Mon, Sep 10, 2007 at 10:42:32PM +0200, Andre Poenitz wrote:
> On Mon, Sep 10, 2007 at 10:44:01PM +0300, Martin Vermeer wrote:
> > OK for trunk?
> 
> > Index: src/mathed/InsetMathFrac.cpp
> > ===
> > --- src/mathed/InsetMathFrac.cpp(revision 20193)
> > +++ src/mathed/InsetMathFrac.cpp(working copy)
> > @@ -48,9 +48,10 @@
> >  bool InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
> >  {
> > FracChanger dummy(mi.base);
> > +   ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE);
> 
> This means the metrics for all fractions are based on UP_SHAPE?

Oops... good catch.
 
> > cell(0).metrics(mi);
> > cell(1).metrics(mi);
> > -   if (kind_ == NICEFRAC) {
> > +   if (kind_ == NICEFRAC || kind_ == UNITFRAC) {
> > dim.wid = cell(0).width() + cell(1).width() + 5;
> > dim.asc = cell(0).height() + 5;
> > dim.des = cell(1).height() - 5;
> > @@ -72,7 +73,8 @@
> > setPosCache(pi, x, y);
> > int m = x + dim_.wid / 2;
> > FracChanger dummy(pi.base);
> > -   if (kind_ == NICEFRAC) {
> > +   ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE);
> > +   if (kind_ == NICEFRAC || kind_ == UNITFRAC) {
> 
> And NICEFRAC and UNITFRAC are drawn as such?

Another problem I'm not sure about is whether to use nicefrac, units, or
both. Easiest probably to just use units always.

- Martin



Re: [Patch] partial support for units

2007-09-10 Thread Andre Poenitz
On Mon, Sep 10, 2007 at 10:44:01PM +0300, Martin Vermeer wrote:
> OK for trunk?

> Index: src/mathed/InsetMathFrac.cpp
> ===
> --- src/mathed/InsetMathFrac.cpp  (revision 20193)
> +++ src/mathed/InsetMathFrac.cpp  (working copy)
> @@ -48,9 +48,10 @@
>  bool InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
>  {
>   FracChanger dummy(mi.base);
> + ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE);

This means the metrics for all fractions are based on UP_SHAPE?

>   cell(0).metrics(mi);
>   cell(1).metrics(mi);
> - if (kind_ == NICEFRAC) {
> + if (kind_ == NICEFRAC || kind_ == UNITFRAC) {
>   dim.wid = cell(0).width() + cell(1).width() + 5;
>   dim.asc = cell(0).height() + 5;
>   dim.des = cell(1).height() - 5;
> @@ -72,7 +73,8 @@
>   setPosCache(pi, x, y);
>   int m = x + dim_.wid / 2;
>   FracChanger dummy(pi.base);
> - if (kind_ == NICEFRAC) {
> + ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE);
> + if (kind_ == NICEFRAC || kind_ == UNITFRAC) {

And NICEFRAC and UNITFRAC are drawn as such?

Andre'