| 1 | /* |
|---|
| 2 | * Copyright (c) 2004-2006 Kazunori "jagarl" Ueno |
|---|
| 3 | * All rights reserved. |
|---|
| 4 | * |
|---|
| 5 | * Redistribution and use in source and binary forms, with or without |
|---|
| 6 | * modification, are permitted provided that the following conditions |
|---|
| 7 | * are met: |
|---|
| 8 | * 1. Redistributions of source code must retain the above copyright |
|---|
| 9 | * notice, this list of conditions and the following disclaimer. |
|---|
| 10 | * 2. Redistributions in binary form must reproduce the above copyright |
|---|
| 11 | * notice, this list of conditions and the following disclaimer in the |
|---|
| 12 | * documentation and/or other materials provided with the distribution. |
|---|
| 13 | * 3. The name of the author may not be used to endorse or promote products |
|---|
| 14 | * derived from this software without specific prior written permission. |
|---|
| 15 | * |
|---|
| 16 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
|---|
| 17 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|---|
| 18 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
|---|
| 19 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
|---|
| 20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|---|
| 21 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|---|
| 22 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|---|
| 23 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|---|
| 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
|---|
| 25 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|---|
| 26 | */ |
|---|
| 27 | |
|---|
| 28 | #ifndef __WIDGET_H__ |
|---|
| 29 | #define __WIDGET_H__ |
|---|
| 30 | |
|---|
| 31 | #include <vector> |
|---|
| 32 | #include "font/font.h" |
|---|
| 33 | #include "font/text.h" |
|---|
| 34 | #include "event.h" |
|---|
| 35 | #include "picture.h" |
|---|
| 36 | |
|---|
| 37 | #define TimeCursor WidTimeCursor |
|---|
| 38 | #define MouseCursor WidMouseCursor |
|---|
| 39 | #define Button WidButton |
|---|
| 40 | #define Scale WidScale |
|---|
| 41 | #define Label WidLabel |
|---|
| 42 | #define Dialog WidDialog |
|---|
| 43 | #define TextButton WidTextButton |
|---|
| 44 | #define Text WidText |
|---|
| 45 | #define AnmTime WidAnmTime |
|---|
| 46 | #define AnmMove WidAnmMove |
|---|
| 47 | #define AnmAlpha WidAnmAlpha |
|---|
| 48 | #define AnmPtnSolid WidAnmPtnSolid |
|---|
| 49 | #define AnmPtnAlpha WidAnmPtnAlpha |
|---|
| 50 | |
|---|
| 51 | // namespace Widget { |
|---|
| 52 | |
|---|
| 53 | struct TimeCursor : public Event::Time, PicWidget { |
|---|
| 54 | int x, y, dx, dy, nptn; |
|---|
| 55 | int old_time, count, interval; |
|---|
| 56 | TimeCursor(Event::Container& container, int _interval, PicContainer* parent, const char* fname, int sx, int sy, int sdx, int sdy, int nptn, const Rect& r); |
|---|
| 57 | void Elapsed(unsigned int current_time); |
|---|
| 58 | }; |
|---|
| 59 | |
|---|
| 60 | struct MouseCursor : public Event::Video, PicWidget { |
|---|
| 61 | int x, y; |
|---|
| 62 | Event::Container& container; |
|---|
| 63 | MouseCursor(Event::Container& container, PicContainer* parent, const char* s, int x, int y, int w, int h); |
|---|
| 64 | MouseCursor(Event::Container& container, PicContainer* parent, Surface* s, int x, int y, int w, int h); |
|---|
| 65 | ~MouseCursor(); |
|---|
| 66 | static bool Motionfunc(int x, int y, void* pointer); |
|---|
| 67 | }; |
|---|
| 68 | |
|---|
| 69 | struct Button : public Event::Video, PicWidget { |
|---|
| 70 | int sx, sy, sdx, sdy, nptn; |
|---|
| 71 | bool is_in; |
|---|
| 72 | bool is_toggled; |
|---|
| 73 | bool is_toggle_switch; |
|---|
| 74 | Button(Event::Container& container, PicContainer* parent, const char* s, int sx, int sy, int sdx, int sdy, int nptn, const Rect& r, int _z); |
|---|
| 75 | Button(Event::Container& container, PicContainer* parent, Surface* s, int sx, int sy, int sdx, int sdy, int nptn, const Rect& r, int _z); |
|---|
| 76 | ~Button(); |
|---|
| 77 | void Press(void); |
|---|
| 78 | void Release(void); |
|---|
| 79 | void Drag(int x_from, int y_from, int x_to, int y_to); |
|---|
| 80 | void In(void); |
|---|
| 81 | void Out(void); |
|---|
| 82 | void Toggle(bool new_toggle); |
|---|
| 83 | typedef void (*PressFunc)(void* pointer, Button* from); |
|---|
| 84 | typedef void (*DragFunc)(int x_from, int y_from, int x_to, int y_to, void* pointer, Button* from); |
|---|
| 85 | PressFunc press_func; |
|---|
| 86 | void* press_pointer; |
|---|
| 87 | DragFunc drag_func; |
|---|
| 88 | void* drag_pointer; |
|---|
| 89 | |
|---|
| 90 | /* ç¶æ¿ */ |
|---|
| 91 | void activate(void) { Event::Video::activate();} |
|---|
| 92 | void deactivate(void) { Event::Video::deactivate();} |
|---|
| 93 | void SetRegion(const Rect& new_rect) { Event::Video::SetRegion(new_rect);} |
|---|
| 94 | }; |
|---|
| 95 | struct Scale : Event::Video, PicWidget { |
|---|
| 96 | private: |
|---|
| 97 | Button* arrow_down, *arrow_up; |
|---|
| 98 | Button* cursor; |
|---|
| 99 | PicContainer* panel; |
|---|
| 100 | Event::Container& container; |
|---|
| 101 | PicContainer* parent; |
|---|
| 102 | Color cursor_color; |
|---|
| 103 | |
|---|
| 104 | int mouse_x, mouse_y; |
|---|
| 105 | enum {scale_max = 65536}; |
|---|
| 106 | int min, max; |
|---|
| 107 | int value; |
|---|
| 108 | int value_add; |
|---|
| 109 | int value_dragstart; |
|---|
| 110 | int cursor_width; |
|---|
| 111 | bool is_vertical; |
|---|
| 112 | |
|---|
| 113 | public: |
|---|
| 114 | Scale(Event::Container& container, PicContainer* parent, const Rect& r_orig, const Color& cursor_color, bool _is_vertical); |
|---|
| 115 | void InitCursor(int cursor_width_ratio); // 1024=max |
|---|
| 116 | void SetRange(int min, int max); |
|---|
| 117 | void SetValue(int value); |
|---|
| 118 | int GetValue(void) const; |
|---|
| 119 | typedef void (*ChangeFunc)(void* pointer, Scale* from); |
|---|
| 120 | ChangeFunc change_func; |
|---|
| 121 | void* change_pointer; |
|---|
| 122 | |
|---|
| 123 | private: |
|---|
| 124 | void Init(Rect r_orig); |
|---|
| 125 | int CalcValue(void); |
|---|
| 126 | void SetScaleValue(int value); |
|---|
| 127 | |
|---|
| 128 | // callback |
|---|
| 129 | static void PressArrowDown(void* pointer, Button* from); |
|---|
| 130 | static void PressArrowUp(void* pointer, Button* from); |
|---|
| 131 | static void PressCursor(void* pointer, Button* from); |
|---|
| 132 | static void DragCursor(int x_from, int y_from,int x, int y, void* pointer, Button* from); |
|---|
| 133 | |
|---|
| 134 | // ç¶æ¿ïŒEvent::Video |
|---|
| 135 | void Press(void); |
|---|
| 136 | void Motion(int x, int y); |
|---|
| 137 | |
|---|
| 138 | /* ç¶æ¿ : PicWidget */ |
|---|
| 139 | void activate(void) { Event::Video::activate();} |
|---|
| 140 | void deactivate(void) { Event::Video::deactivate();} |
|---|
| 141 | void SetRegion(const Rect& new_rect) { Event::Video::SetRegion(new_rect);} |
|---|
| 142 | }; |
|---|
| 143 | |
|---|
| 144 | struct TextButton : public Button { |
|---|
| 145 | enum Attribute {CENTER=1, REVERSE=2, NOPADDING=4}; |
|---|
| 146 | PicRoot& root; |
|---|
| 147 | Surface* surface; |
|---|
| 148 | Attribute attribute; |
|---|
| 149 | int text_size; |
|---|
| 150 | Color fore, pressed, back; |
|---|
| 151 | TextButton(Event::Container& container, PicContainer* parent, const char* s, int text_size, Attribute attr, const Rect& r, int _z, const Color& fore, const Color& pressed, const Color& back); |
|---|
| 152 | void SetText(const char* s, const Color& fore, const Color& pressed, const Color& back); |
|---|
| 153 | void SetText(const char* s) { |
|---|
| 154 | SetText(s, fore, pressed, back); |
|---|
| 155 | } |
|---|
| 156 | ~TextButton(); |
|---|
| 157 | }; |
|---|
| 158 | |
|---|
| 159 | struct Text : public Event::Video, Event::Time, PicWidget { |
|---|
| 160 | typedef TextGlyphStream::iterator iterator; |
|---|
| 161 | |
|---|
| 162 | private: |
|---|
| 163 | Event::Container& event; |
|---|
| 164 | public: |
|---|
| 165 | PicBase* pictext; |
|---|
| 166 | private: |
|---|
| 167 | TimeCursor* cursor; |
|---|
| 168 | Surface* surface; |
|---|
| 169 | TextGlyphStream gstream; |
|---|
| 170 | std::vector<int> bottom_pos; // è¡é«ã(height)ã®çޝèšå€ |
|---|
| 171 | XKFont::HorizLayout layout; |
|---|
| 172 | int fontsize; |
|---|
| 173 | |
|---|
| 174 | iterator cur_pos; |
|---|
| 175 | int line_number; |
|---|
| 176 | Rect srcrect; |
|---|
| 177 | int press_count; |
|---|
| 178 | int scrolled_count; |
|---|
| 179 | int scroll_height; |
|---|
| 180 | bool window_activated; |
|---|
| 181 | bool cursor_activated; |
|---|
| 182 | |
|---|
| 183 | int speed; // chars / sec or -1 |
|---|
| 184 | int wait_delay; // msec |
|---|
| 185 | int old_time; |
|---|
| 186 | int wait_starttime; |
|---|
| 187 | |
|---|
| 188 | int CalcScrollHeight(void); |
|---|
| 189 | void DrawText(int& nChar); |
|---|
| 190 | void Scrollup(int& nChar); |
|---|
| 191 | |
|---|
| 192 | public: |
|---|
| 193 | Text(Event::Container& container, PicContainer* parent, const Rect& r, const Rect& text_r, int fontsize); |
|---|
| 194 | ~Text(); |
|---|
| 195 | |
|---|
| 196 | TextStream stream; |
|---|
| 197 | enum {PREPARE, DRAW, WAIT, SCROLL, DRAW2, WAIT2} status; |
|---|
| 198 | |
|---|
| 199 | void Clear(void); |
|---|
| 200 | void Start(void); |
|---|
| 201 | void Flush(void); |
|---|
| 202 | |
|---|
| 203 | void Elapsed(unsigned int current_time); |
|---|
| 204 | static bool Pressed(int x, int y, void* pointer); |
|---|
| 205 | void activate(void); |
|---|
| 206 | void deactivate(void); |
|---|
| 207 | void SetSpeed(int new_speed); |
|---|
| 208 | void SetWait(int new_wait); |
|---|
| 209 | |
|---|
| 210 | void SetCursor(TimeCursor* cursor); |
|---|
| 211 | }; |
|---|
| 212 | |
|---|
| 213 | extern void SetFont(const char* fontname); |
|---|
| 214 | |
|---|
| 215 | struct Label : PicWidget{ |
|---|
| 216 | private: |
|---|
| 217 | Surface* surface; |
|---|
| 218 | bool is_center; |
|---|
| 219 | PicRoot& root; |
|---|
| 220 | int text_size; |
|---|
| 221 | public: |
|---|
| 222 | Label(PicContainer* parent, const Rect& r_orig, bool is_center=true, const char* text=0, int textsize = 26); |
|---|
| 223 | ~Label(); |
|---|
| 224 | void SetText(const char* text); |
|---|
| 225 | }; |
|---|
| 226 | |
|---|
| 227 | class Dialog : public Event::Video, PicWidget { |
|---|
| 228 | private: |
|---|
| 229 | Surface* surface_btn; |
|---|
| 230 | Surface* surface_diag; |
|---|
| 231 | |
|---|
| 232 | public: |
|---|
| 233 | enum { WAIT, OK, CANCEL} status; |
|---|
| 234 | Dialog(Event::Container& container, PicContainer* parent, const char* text, bool with_cancel); |
|---|
| 235 | ~Dialog(); |
|---|
| 236 | static void press_ok(void* pointer, Button* btn); |
|---|
| 237 | static void press_cancel(void* pointer, Button* btn); |
|---|
| 238 | static void DrawBox(Surface* s, const Rect& r); |
|---|
| 239 | typedef void (*SetFunc)(void* pointer, Dialog* from); |
|---|
| 240 | SetFunc set_func; |
|---|
| 241 | void* set_pointer; |
|---|
| 242 | }; |
|---|
| 243 | |
|---|
| 244 | struct AnmTime : public Event::Time, PicAnm { |
|---|
| 245 | enum { PLAYING=1, FINISHED=3 } status; |
|---|
| 246 | unsigned int start_time; |
|---|
| 247 | unsigned int total_time; |
|---|
| 248 | int all_count; |
|---|
| 249 | |
|---|
| 250 | AnmTime(Event::Container& container, PicBase* _pic, int total_time, int all_count = 0); |
|---|
| 251 | AnmTime(Event::Container& container, std::vector<PicBase*> _pic, int total_time, int all_count = 0); |
|---|
| 252 | virtual ~AnmTime() {} |
|---|
| 253 | void SetAllCount(int new_all_count) { all_count = new_all_count; } |
|---|
| 254 | void SetTotalTime(int new_total) { total_time = new_total; } |
|---|
| 255 | void Elapsed(unsigned int current_time); |
|---|
| 256 | void Play(void) { |
|---|
| 257 | start_time = 0; |
|---|
| 258 | status = PLAYING; |
|---|
| 259 | } |
|---|
| 260 | |
|---|
| 261 | virtual void Start(void) {}; |
|---|
| 262 | virtual void Exec(int count) = 0; |
|---|
| 263 | virtual void Finish(void) {}; |
|---|
| 264 | void Abort(void); |
|---|
| 265 | bool IsEnd(void); |
|---|
| 266 | }; |
|---|
| 267 | |
|---|
| 268 | struct AnmMove : public AnmTime { |
|---|
| 269 | Rect from, to; |
|---|
| 270 | AnmMove(Event::Container& container, PicBase* _pic, const Rect& to, int total_time); |
|---|
| 271 | void Exec(int count); |
|---|
| 272 | }; |
|---|
| 273 | |
|---|
| 274 | #define ALPHA_MAX 255 |
|---|
| 275 | struct AnmAlpha : public AnmTime { |
|---|
| 276 | int from, to; |
|---|
| 277 | unsigned char alpha; Rect alpha_r; |
|---|
| 278 | AnmAlpha(Event::Container& container, PicBase* _pic, int alpha_from, int alpha_to, int total_time); |
|---|
| 279 | AnmAlpha(Event::Container& container, std::vector<PicBase*> _pic, int alpha_from, int alpha_to, int total_time); |
|---|
| 280 | void Start(void); |
|---|
| 281 | void Exec(int count); |
|---|
| 282 | void Finish(void); |
|---|
| 283 | }; |
|---|
| 284 | |
|---|
| 285 | struct AnmAlphaMove : public AnmTime { |
|---|
| 286 | struct Ptn { |
|---|
| 287 | Rect pos; |
|---|
| 288 | Rect surface_pos; |
|---|
| 289 | unsigned char alpha; |
|---|
| 290 | unsigned int next_tick; |
|---|
| 291 | Ptn(const Rect& _r, const Rect& _surface_r, unsigned char _a, unsigned int _n) : |
|---|
| 292 | pos(_r), surface_pos(_surface_r), alpha(_a), next_tick(_n) {} |
|---|
| 293 | }; |
|---|
| 294 | std::vector<Ptn> ptns; |
|---|
| 295 | int cur_count; |
|---|
| 296 | AnmAlphaMove(Event::Container& container, PicBase* _pic); |
|---|
| 297 | void SetPtn(void); |
|---|
| 298 | void Exec(int count); |
|---|
| 299 | void Finish(void); |
|---|
| 300 | }; |
|---|
| 301 | |
|---|
| 302 | struct AnmPtnSolid : public AnmTime { |
|---|
| 303 | AnmPtnSolid(Event::Container& container, PicBase* _pic, const unsigned char* ptn, const Rect& alpha_r, int total_time); |
|---|
| 304 | ~AnmPtnSolid() { delete[] alpha; } |
|---|
| 305 | const unsigned char* ptn; |
|---|
| 306 | int ptn_len; |
|---|
| 307 | unsigned char* alpha; |
|---|
| 308 | Rect alpha_r; |
|---|
| 309 | |
|---|
| 310 | void Start(void); |
|---|
| 311 | void Exec(int count); |
|---|
| 312 | void Finish(void); |
|---|
| 313 | }; |
|---|
| 314 | |
|---|
| 315 | struct AnmPtnAlpha : public AnmTime { |
|---|
| 316 | AnmPtnAlpha(Event::Container& container, PicBase* _pic, const unsigned char* ptn, const Rect& alpha_r, int alpha_bandwidth, int total_time); |
|---|
| 317 | ~AnmPtnAlpha() { delete[] alpha; } |
|---|
| 318 | const unsigned char* ptn; |
|---|
| 319 | int ptn_len; |
|---|
| 320 | int band; |
|---|
| 321 | unsigned char* alpha; |
|---|
| 322 | Rect alpha_r; |
|---|
| 323 | void Start(void); |
|---|
| 324 | void Exec(int count); |
|---|
| 325 | void Finish(void); |
|---|
| 326 | }; |
|---|
| 327 | |
|---|
| 328 | // } /* end of namespace Widget */ |
|---|
| 329 | |
|---|
| 330 | #undef Text |
|---|
| 331 | |
|---|
| 332 | #endif |
|---|
| 333 | |
|---|