master chld/haikuprg / src / Bitype.cpp
  1#include <Application.h>
  2#include <Window.h>
  3#include <Bitmap.h>
  4#include <View.h>
  5
  6#include <vector>
  7#include <cstdio>
  8
  9struct Bmp {
 10  BBitmap *b;
 11  BView *v;
 12  BPoint l;
 13  bool dr;
 14  uint32 s;
 15};
 16
 17struct Fnt {
 18  BFont f;
 19  uint32 s;
 20  font_height h;
 21};
 22
 23class View:public BView
 24{
 25public:View(BRect f):
 26  BView(f, "Text", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS){
 27
 28  /* bitmap shit */
 29  SetHighColor(0,0,0);
 30  bmp.b=new BBitmap(Bounds(), B_RGB32, true);
 31  bmp.v=new BView(Bounds(), "bmpView", B_FOLLOW_ALL, B_WILL_DRAW);
 32  bmp.b->AddChild(bmp.v);
 33  bmp.b->Lock();
 34
 35  bmp.s=20;
 36
 37  bmp.v->SetHighColor(255,255,255);
 38  bmp.v->FillRect(Bounds());
 39  bmp.v->SetHighColor(0,0,0);
 40
 41  bmp.v->SetPenSize(bmp.s);
 42  bmp.v->SetLineMode(B_ROUND_CAP, B_ROUND_JOIN);
 43  bmp.b->Unlock();
 44  bmp.dr=false;
 45
 46  l.push_back(BString());
 47
 48  fnt.s=16;
 49  fnt.f.SetSize(fnt.s);
 50  fnt.f.SetFamilyAndStyle("PxPlus IBM VGA 9x16", "Regular");
 51}
 52
 53  void AttachedToWindow()
 54  {
 55    MakeFocus(true);
 56  }
 57
 58  virtual void FrameResized(float w, float h) override
 59  {
 60    if (w > bmp.b->Bounds().Width() || h > bmp.b->Bounds().Height()){
 61    BRect nB(0, 0, w, h);
 62    BBitmap *nBmp = new BBitmap(nB, B_RGB32, true);
 63    BView *nV = new BView(nB, "bmpView", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS);
 64    nBmp->AddChild(nV);
 65
 66    bmp.b->Lock();
 67    bmp.v->Sync();
 68    bmp.b->Unlock();
 69
 70    nBmp->Lock();
 71    nV->SetHighColor(255, 255, 255);
 72    nV->FillRect(nB);
 73    nV->SetHighColor(0, 0, 0);
 74    nV->DrawBitmap(bmp.b, BPoint(0, 0));
 75    nV->SetPenSize(bmp.s);
 76    nV->SetLineMode(B_ROUND_CAP, B_ROUND_JOIN);
 77    nV->Sync();
 78    nBmp->Unlock();
 79
 80    delete bmp.b;
 81    bmp.b=nBmp;
 82    bmp.v=nV;
 83    }
 84
 85    Invalidate();
 86  }
 87
 88  void Draw(BRect r)
 89  {
 90    bmp.b->Lock();
 91    bmp.v->Sync();
 92    bmp.b->Unlock();
 93    DrawBitmap(bmp.b, r, r);
 94
 95    fnt.f.GetHeight(&fnt.h);
 96    
 97    SetFont(&fnt.f, B_FONT_ALL);
 98    float y=fnt.h.ascent+fnt.h.descent;
 99
100    for (size_t i=0; i<l.size(); i++)
101      {
102	DrawString(l[i], l[i].Length(), BPoint(0, (y)));
103	y+=fnt.h.ascent+fnt.h.descent;
104      }
105  }
106
107  void MouseMoved(BPoint p, uint32 c, const BMessage *m)
108  {
109    if (!bmp.dr){
110      if (p.y<=20)
111	kbd=true;
112      else
113	kbd=false;
114
115      return;
116    };
117
118    bmp.b->Lock();
119    bmp.v->StrokeLine(bmp.l, p);
120    bmp.v->Sync();
121    bmp.b->Unlock();
122
123    Invalidate();
124    bmp.l=p;
125  }
126
127  void MouseDown(BPoint p)
128  {
129    bmp.dr=true;
130    bmp.l=p;
131  }
132
133  void MouseUp(BPoint p)
134  {
135    bmp.dr=false;
136  }
137
138  void KeyDown(const char *c, int32 n)
139  {
140    bmp.b->Lock();
141    if (kbd){
142    switch (c[0])
143      {
144      case 'c':
145	bmp.v->SetHighColor(255, 255, 255);
146	bmp.v->FillRect(Bounds());
147	bmp.v->SetHighColor(0, 0, 0);
148	break;
149      case 'e':
150	er=!er;
151	if (er){
152	  bmp.v->SetHighColor(255, 255, 255);
153	}else{
154	  bmp.v->SetHighColor(0, 0, 0);
155	}
156	break;
157      case 'i':
158	bmp.s+=2;
159	bmp.v->SetPenSize(bmp.s);
160	break;
161      case 'o':
162	bmp.s-=2;
163	bmp.v->SetPenSize(bmp.s);
164	break;
165      case 'p':
166	bmp.s=20;
167	bmp.v->SetPenSize(bmp.s);
168	break;
169      }
170        bmp.b->Unlock();
171	Invalidate();
172	return;
173    }
174    
175    if (c[0]==B_BACKSPACE){
176      if (l.size()>0){
177	l[l.size()-1].Truncate(l[l.size()-1].Length() - 1);
178	if (l[l.size()-1].Length()<1 && l.size()-1>0) l.pop_back();
179      }
180    }else if (c[0]==B_ENTER){
181      l.push_back(BString());
182    }else{
183      l[l.size()-1].Append(c, n);
184    }
185
186    if (fnt.f.StringWidth(l[l.size()-1])>Bounds().Width()-5){
187	l.push_back(BString());
188      }
189      if (l.size()*(fnt.h.ascent+fnt.h.descent) > Bounds().Height()){
190	l.erase(l.begin());
191      }
192    Invalidate();
193  }
194private:
195  Bmp bmp;
196  Fnt fnt;
197  std::vector<BString> l;
198  uint32 z;
199  bool er=false;
200  bool kbd=false;
201  
202};
203
204class Win:public BWindow
205{
206public:Win(BRect f):
207  BWindow(f, "BitType", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE)
208  {
209    View *view=new View(Bounds());
210    AddChild(view);
211  }
212};
213
214class App:public BApplication
215{
216public:App():BApplication("application/x-vnd.example.bitype")
217  {
218    BRect rect(100,100,640,480);
219    Win *w = new Win(rect);
220    w->Show();
221  }
222};
223
224int main(void)
225{
226  App a;
227  a.Run();
228  return 0;
229}