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}