sorry, I described it unclearly.
You are right, Ian's code is working in the expected way on Linux as well as on
Windows.
What I wanted to say: when using textfont() and textsize() instead of fl_font()
the topmost Fl_Output is measured with w=0. Measurement of the second and
following widgets is ok. That is what I can't understand: what's different as
for the topmost one?
You suggested to overloading value() and do the measurement when passing a new
value to Fl_Output.
I tried that before and I could swear width always being 0. But as I wrote this
I tried again (on Linux) and it worked. Perhaps it was on Windows? I'll try on
Monday.
Thanks to you all for your appreciated help and have a nice day
testalucida
> On 02/03/12 15:08, testalucida wrote:
> > That's my layout by column of Fl_Output widgets in a Fl_Group:
> > |_| <--- measurement returns w = 0 ==> BAD
>
> Hmm, when add a printf() to show the wi/he values
> from the code Ian posted, it always printed non-zero values,
> so I guess I'm not able to get that w=0.
>
> Here's what I get when I run his example on linux
> with the printf() added:
>
> $ ./iantest
> label: Label 1:
> label: Label 2:
> label: Label 3:
> WI/HE=33 14 <-- label #1's width
> WI/HE=72 14 <-- label #2's width
> WI/HE=47 14 <-- label #3's width
>
> Still, I think you can/should rewrite this class
> so as to avoid using resize() inside draw().
>
> If I were writing this, I'd remove the draw() code completely,
> because it seems the goal of the app is to auto-size the widget
> based on the value() passed to it, not change how the widget draws
> itself.
>
> I'd suggest overloading value() instead, to measure the string
> and resize the widget whenever the string's contents is changed.
>
> This avoids having resize() inside draw(), which many
> folks here agree should be avoided.
>
> Here's what I'd recommend, and again, not getting w==0 when I run it:
>
> // testalucida's measure with Ian's changes,
> // Erco added changes to remove draw() and repurpose value() instead.
> // fltk-config --compile measure-test.cxx
>
> #include <FL/Fl.H>
> #include <FL/Fl_Group.H>
> #include <FL/Fl_Double_Window.H>
> #include <FL/Fl_Output.H>
> #include <FL/fl_draw.H>
>
> #include <string>
> #include <vector>
>
> class MyDisplay : public Fl_Output {
>
> public:
> MyDisplay(int x, int y, int w, int h, const char *lbl) :
> Fl_Output(x,y,w,h,lbl) {
> textsize(11);
> }
>
> // Set the value, auto-size the widget to the width of the string
> void value(const char *val) {
> fl_font(textfont(), textsize());
> int wi=0, he=0;
> fl_measure(val, wi, he, 0);
> printf("WI/HE=%d %d\n", wi,he); // DEBUGGING
> resize(x(), y(), wi+6, h());
> Fl_Output::value(val);
> }
> };
>
> class TestMyDisplay : public Fl_Group {
> public:
> TestMyDisplay(int X, int Y, int W, int H):Fl_Group(X, Y, W, H) {
> end();
> }
> void setData(std::vector<std::string> &labels,
> std::vector<std::string> &values) {
> begin();
> for (int i=0, imax=labels.size(); i<imax; i++) {
> fprintf(stderr, "label: %s\n", labels[i].c_str());
> MyDisplay *pDy = new MyDisplay(150, y()+3+i*30, 150, 25,
> labels[i].c_str());
> pDy->value(values[i].c_str());
> }
> end();
> }
> };
>
> int main() {
> Fl_Double_Window *pWin = new Fl_Double_Window(100, 100, 300, 300,
> "TestMyDisplay");
> TestMyDisplay *pDisp = new TestMyDisplay(0, 0, 300, 300);
> pWin->show();
>
> std::vector<std::string> labels, values;
> labels.push_back("Label 1: ");
> labels.push_back("Label 2: ");
> labels.push_back("Label 3: ");
>
> values.push_back("Val 1: ");
> values.push_back("TestValue 2: ");
> values.push_back("Value 3: ");
>
> pDisp->setData(labels, values);
>
> return Fl::run();
> }
_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk