Mercurial > otakunoraifu
diff window/widget.h @ 0:223b71206888
Initial import
author | thib |
---|---|
date | Fri, 01 Aug 2008 16:32:45 +0000 |
parents | |
children | 5ae5533b3a9a |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/window/widget.h @@ -0,0 +1,299 @@ +#ifndef __WIDGET_H__ +#define __WIDGET_H__ + +#include<vector> +#include"font/font.h" +#include"font/text.h" +#include"event.h" +#include"picture.h" + +#define TimeCursor WidTimeCursor +#define MouseCursor WidMouseCursor +#define Button WidButton +#define Scale WidScale +#define Label WidLabel +#define Dialog WidDialog +#define TextButton WidTextButton +#define Text WidText +#define AnmTime WidAnmTime +#define AnmMove WidAnmMove +#define AnmAlpha WidAnmAlpha +#define AnmPtnSolid WidAnmPtnSolid +#define AnmPtnAlpha WidAnmPtnAlpha + +// namespace Widget { + +struct TimeCursor : public Event::Time, PicWidget { + int x,y,dx,dy, nptn; + int old_time, count, interval; + TimeCursor(Event::Container& container, int _interval, PicContainer* parent, const char* fname, int sx, int sy, int sdx, int sdy, int nptn, const Rect& r); + void Elapsed(unsigned int current_time); +}; + +struct MouseCursor : public Event::Video, PicWidget { + int x, y; + Event::Container& container; + MouseCursor(Event::Container& container, PicContainer* parent, const char* s, int x, int y, int w, int h); + MouseCursor(Event::Container& container, PicContainer* parent, Surface* s, int x, int y, int w, int h); + ~MouseCursor(); + static bool Motionfunc(int x, int y, void* pointer); +}; + +struct Button : public Event::Video, PicWidget { + int sx, sy, sdx, sdy, nptn; + bool is_in; + bool is_toggled; + bool is_toggle_switch; + Button(Event::Container& container, PicContainer* parent, const char* s, int sx, int sy, int sdx, int sdy, int nptn, const Rect& r, int _z); + Button(Event::Container& container, PicContainer* parent, Surface* s, int sx, int sy, int sdx, int sdy, int nptn, const Rect& r, int _z); + ~Button(); + void Press(void); + void Release(void); + void Drag(int x_from, int y_from, int x_to, int y_to); + void In(void); + void Out(void); + void Toggle(bool new_toggle); + typedef void (*PressFunc)(void* pointer, Button* from); + typedef void (*DragFunc)(int x_from, int y_from, int x_to, int y_to, void* pointer, Button* from); + PressFunc press_func; + void* press_pointer; + DragFunc drag_func; + void* drag_pointer; + + /* ·Ñ¾µ */ + void activate(void) { Event::Video::activate();} + void deactivate(void) { Event::Video::deactivate();} + void SetRegion(const Rect& new_rect) { Event::Video::SetRegion(new_rect);} +}; +struct Scale : Event::Video, PicWidget { +private: + Button* arrow_down, *arrow_up; + Button* cursor; + PicContainer* panel; + Event::Container& container; + PicContainer* parent; + Color cursor_color; + + int mouse_x, mouse_y; + enum {scale_max = 65536}; + int min, max; + int value; + int value_add; + int value_dragstart; + int cursor_width; + bool is_vertical; + +public: + + Scale(Event::Container& container, PicContainer* parent, const Rect& r_orig, const Color& cursor_color, bool _is_vertical); + void InitCursor(int cursor_width_ratio); // 1024=max + void SetRange(int min, int max); + void SetValue(int value); + int GetValue(void) const; + typedef void (*ChangeFunc)(void* pointer, Scale* from); + ChangeFunc change_func; + void* change_pointer; +private: + void Init(Rect r_orig); + int CalcValue(void); + void SetScaleValue(int value); + + // callback + static void PressArrowDown(void* pointer, Button* from); + static void PressArrowUp(void* pointer, Button* from); + static void PressCursor(void* pointer, Button* from); + static void DragCursor(int x_from, int y_from,int x, int y, void* pointer, Button* from); + + // ·Ñ¾µ¡§Event::Video + void Press(void); + void Motion(int x, int y); + + /* ·Ñ¾µ : PicWidget */ + void activate(void) { Event::Video::activate();} + void deactivate(void) { Event::Video::deactivate();} + void SetRegion(const Rect& new_rect) { Event::Video::SetRegion(new_rect);} +}; + +struct TextButton : public Button { + enum Attribute {CENTER=1, REVERSE=2, NOPADDING=4}; + PicRoot& root; + Surface* surface; + Attribute attribute; + int text_size; + Color fore, pressed, back; + 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); + void SetText(const char* s, const Color& fore, const Color& pressed, const Color& back); + void SetText(const char* s) { + SetText(s, fore, pressed, back); + } + ~TextButton(); +}; + +struct Text : public Event::Video, Event::Time, PicWidget { + typedef TextGlyphStream::iterator iterator; + +private: + Event::Container& event; +public: + PicBase* pictext; +private: + TimeCursor* cursor; + Surface* surface; + TextGlyphStream gstream; + std::vector<int> bottom_pos; // ¹Ô¹â¤µ(height)¤ÎÎß·×ÃÍ + XKFont::HorizLayout layout; + int fontsize; + + iterator cur_pos; + int line_number; + Rect srcrect; + int press_count; + int scrolled_count; + int scroll_height; + bool window_activated; + bool cursor_activated; + + int speed; // chars / sec or -1 + int wait_delay; // msec + int old_time; + int wait_starttime; + + int CalcScrollHeight(void); + void DrawText(int& nChar); + void Scrollup(int& nChar); +public: + Text(Event::Container& container, PicContainer* parent, const Rect& r, const Rect& text_r, int fontsize); + ~Text(); + + TextStream stream; + enum {PREPARE, DRAW, WAIT, SCROLL, DRAW2, WAIT2} status; + + void Clear(void); + void Start(void); + void Flush(void); + + void Elapsed(unsigned int current_time); + static bool Pressed(int x, int y, void* pointer); + void activate(void); + void deactivate(void); + void SetSpeed(int new_speed); + void SetWait(int new_wait); + + void SetCursor(TimeCursor* cursor); +}; + +extern void SetFont(const char* fontname); + +struct Label : PicWidget{ +private: + Surface* surface; + bool is_center; + PicRoot& root; + int text_size; +public: + Label(PicContainer* parent, const Rect& r_orig, bool is_center=true, const char* text=0, int textsize = 26); + ~Label(); + void SetText(const char* text); +}; + +class Dialog : public Event::Video, PicWidget { + Surface* surface_btn; + Surface* surface_diag; +public: + enum { WAIT, OK, CANCEL} status; + Dialog(Event::Container& container, PicContainer* parent, const char* text, bool with_cancel); + ~Dialog(); + static void press_ok(void* pointer, Button* btn); + static void press_cancel(void* pointer, Button* btn); + static void DrawBox(Surface* s, const Rect& r); + typedef void (*SetFunc)(void* pointer, Dialog* from); + SetFunc set_func; + void* set_pointer; +}; + +struct AnmTime : public Event::Time, PicAnm { + enum { PLAYING=1, FINISHED=3 } status; + unsigned int start_time; + unsigned int total_time; + int all_count; + + AnmTime(Event::Container& container, PicBase* _pic, int total_time, int all_count = 0); + AnmTime(Event::Container& container, std::vector<PicBase*> _pic, int total_time, int all_count = 0); + virtual ~AnmTime() {} + void SetAllCount(int new_all_count) { all_count = new_all_count; } + void SetTotalTime(int new_total) { total_time = new_total; } + void Elapsed(unsigned int current_time); + void Play(void) { + start_time = 0; + status = PLAYING; + } + + virtual void Start(void) {}; + virtual void Exec(int count) = 0; + virtual void Finish(void) {}; + void Abort(void); + bool IsEnd(void); +}; + +struct AnmMove : public AnmTime { + Rect from, to; + AnmMove(Event::Container& container, PicBase* _pic, const Rect& to, int total_time); + void Exec(int count); +}; +#define ALPHA_MAX 255 +struct AnmAlpha : public AnmTime { + int from, to; + unsigned char alpha; Rect alpha_r; + AnmAlpha(Event::Container& container, PicBase* _pic, int alpha_from, int alpha_to, int total_time); + AnmAlpha(Event::Container& container, std::vector<PicBase*> _pic, int alpha_from, int alpha_to, int total_time); + void Start(void); + void Exec(int count); + void Finish(void); +}; +struct AnmAlphaMove : public AnmTime { + struct Ptn { + Rect pos; + Rect surface_pos; + unsigned char alpha; + unsigned int next_tick; + Ptn(const Rect& _r, const Rect& _surface_r, unsigned char _a, unsigned int _n) : + pos(_r), surface_pos(_surface_r), alpha(_a), next_tick(_n) {} + }; + std::vector<Ptn> ptns; + int cur_count; + AnmAlphaMove(Event::Container& container, PicBase* _pic); + void SetPtn(void); + void Exec(int count); + void Finish(void); +}; +struct AnmPtnSolid : public AnmTime { + AnmPtnSolid(Event::Container& container, PicBase* _pic, const unsigned char* ptn, const Rect& alpha_r, int total_time); + ~AnmPtnSolid() { delete[] alpha; } + const unsigned char* ptn; + int ptn_len; + unsigned char* alpha; + Rect alpha_r; + + void Start(void); + void Exec(int count); + void Finish(void); +}; +struct AnmPtnAlpha : public AnmTime { + AnmPtnAlpha(Event::Container& container, PicBase* _pic, const unsigned char* ptn, const Rect& alpha_r, int alpha_bandwidth, int total_time); + ~AnmPtnAlpha() { delete[] alpha; } + const unsigned char* ptn; + int ptn_len; + int band; + unsigned char* alpha; + Rect alpha_r; + void Start(void); + void Exec(int count); + void Finish(void); +}; + +// } /* end of namespace Widget */ + +#undef Text + +#endif +