> On 05/16/12 22:59, Greg Ercolano wrote:
> >     What's the goal: is it to add up/dn/lt/rt key control
> >     to the caret position of the text display widget?

My goals are
0) to (re)/place (fg,bg) color text anywhere in the text display widget (TDW)
1) to grab ALL keys from the TDW
2) to move/show/hide the caret anywhere in the TDW
   All above are INDEPENDENT of each other
> >
> >     If so, I'd think you'd want to derive a class from
> >     Fl_Text_Display to handle() the key events.
>
>     This seems to work reliably wrt to displaying the caret,
>     and doesn't seem to need the explicit take_focus() call.
   CORRECT !
>     This is probably because here we're responding to FL_FOCUS/UNFOCUS,
>     and I'm calling redraw() on those events to properly show/hide
>     the cursor, which is probably why Fl_Text_Display wasn't drawing
>     the caret correctly. (Showing the caret in Fl_Text_Display was
>     probably never tested during its development)

  For what I need I found I didn't even need redraw() see below.

>     This example just shows adding caret cursor motion for
>     up/dn/lt/right keys. It doesn't show copy selection, etc.
>     But hopefully that too is easily added by checking the state keys,
>     ie. checking Fl::event_state() for FL_SHIFT, FL_CTRL, etc.
>
>     The following should be a good start.
>
> #include <FL/Fl.H>
> #include <FL/Fl_Window.H>
> #include <FL/Fl_Text_Display.H>
> //
> // Add up/dn/lt/rt keynav to Fl_Text_Display caret cursor -erco 5/16/12
> //
> class MyTextDisplay : public Fl_Text_Display {
> public:
>   MyTextDisplay(int X,int Y,int W,int H,const char*L=0) : 
> Fl_Text_Display(X,Y,W,H,L)   {
>     show_cursor();              // ENABLE CURSOR
>     cursor_color(0xFF000000);   // CURSOR RED
>     cursor_style(Fl_Text_Display::HEAVY_CURSOR);
>     //take_focus();             // UNNEEDED
>   }
>   int handle(int e) {
>     int ret = Fl_Text_Display::handle(e);       // let text display handle 
> event first
>     switch (e) {
>       case FL_FOCUS:
>       case FL_UNFOCUS:
>       case FL_KEYUP:
>         redraw();                               // show/hide cursor
Both lines above I did without!
>         return 1;
>       case FL_KEYBOARD: {
>         switch (Fl::event_key()) {
>           case FL_Up:    printf("UP\n");    move_up();    break;
>           case FL_Down:  printf("DOWN\n");  move_down();  break;
>           case FL_Left:  printf("LEFT\n");  move_left();  break;
>           case FL_Right: printf("RIGHT\n"); move_right(); break;
>         }
          for my needs I would just steal all keys here deleting above 4 lines
>         break;
>       }
>     }
>     return(ret);
>   }
> };
> int main() {
>   Fl_Window       *win   = new Fl_Window(640,480,"Display");
>   MyTextDisplay   *mDisp = new MyTextDisplay(20,20,640-40,480-40);
>   Fl_Text_Buffer  *mBuff = new Fl_Text_Buffer();
>   mDisp->buffer(mBuff);
>   mBuff->text("line 0\nline 1\nline 2\nline 3\nline 4\nline 5\n");
>   mDisp->insert_position(5);
>   win->end();
>   win->show();
>   return Fl::run();
> }

This Method (at first testing) works CLEANLY.
It WORKS because keys(events) are taken from Fl_Text_Display (NOT Fl_Window)
This is ALL MY FAULT as I just assumed (from examples)
that events HAD to be taken from the Fl_Window. This is clearly wrong.

I do have one follow up question though.
I am currently trying to flesh out a class TextWindow
(obviously simplified)

class MyTextDisplay : public Fl_Text_Display
{
private:
  // ... etc
public:
  MyTextDisplay(int X,int Y,int W,int H,const char* l)
  : Fl_Text_Display(X,Y,W,H,l) {
  // ...
  }
  // ... methods (trap keys, show/hideCursor(pos), replaceText etc)
};

class MyTextWindow: public Fl_Window, MyTextDisplay
{
public:
  MyTextWindow(int W, int H,const char* l)
  : Fl_Window(W,H,l), MyTextDisplay(20,20,W-40,H-40,NULL)
  {
    Fl_Window::label(l);
    Fl_Window::add(this);  // Compile error  : ambiguous base class Fl_Widget
//  Fl_Window::add(this->MyTextDisplay) ??
//                (MyTextDisplay::)     ??
// I know what I want to do here but I just don't know C++ well enough
// for the correct syntax
  }
  // ...
};

If necessary I can work around the above syntax issue,
but if someone knows the correct syntax I would be grateful.
I intend to make this TextWindow a class so it can appear/disappear.
I seem to recall reading a posting that someone wanted a window that can 
appear/disappear.
More of that later.


_______________________________________________
fltk-dev mailing list
fltk-dev@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk-dev

Reply via email to