2 * psychlops_figure_prototype.cpp
3 * Psychlops Standard Library (Universal)
5 * Last Modified 2009/02/15 by Kenchi HOSOKAWA
6 * (C) 2009 Kenchi HOSOKAWA, Kazushi MARUYA, Takao SATO
9 #include "psychlops_widget.h"
10 #include "psychlops_widgets.h"
11 #include "psychlops_widgets_prototype.h"
12 #include "../../../core/ApplicationInterfaces/psychlops_code_snippets.h"
24 void TextBlock::initialize()
28 area.fill = Color::gray;
29 area.stroke = Stroke::hair_line;
30 area.set( content.length()*label.font.size, label.font.size + 4 );
31 area.shift( -area.getWidth()/2, -label.font.size/2 - 2 );
33 label.fill = Color::white;
34 label.stroke = Stroke::hair_line;
35 label.shift(0, label.font.size/4 - 1 );
36 label.align = Letters::TEXT_ALIGN_CENTER;
42 TextBlock::TextBlock()
46 TextBlock::TextBlock(std::wstring s, double hei)
53 Point TextBlock::getHitDatum()
57 TextBlock& TextBlock::set(const std::wstring s, double hei)
63 TextBlock& TextBlock::set(double w, double h)
70 void TextBlock::setText(const std::wstring &str)
73 label.setString(content);
76 std::wstring& TextBlock::getText()
84 void Button_::evokeP(Events::Evoke &ev)
86 if(onClick!=0) (*onClick)();
88 void Button_::evokeMouse(Events::MouseLeftUp &ev)
97 getSlots().connectEventDelegate(this, &Button_::evokeMouse);
98 getSlots().connectEventDelegate(this, &Button_::evokeP);
100 Button_::Button_(std::wstring s, double hei)
106 getSlots().connectEventDelegate(this, &Button_::evokeMouse);
107 getSlots().connectEventDelegate(this, &Button_::evokeP);
109 void Button_::onEvoked(void (*f)())
111 getSlots().connectActionFunction<Events::Evoke>(f);
113 //Button_& Button_::set(double w, double h)
115 // TextBlock::set(w,h);
123 // Deplecated Widgets
126 void TextBox::setBase()
128 cache.fill = Color::white;
129 area.fill = Color::null_color;
130 area.stroke = Stroke::hair_line;
136 TextBox::TextBox(std::wstring s)
140 TextBox& TextBox::set(std::wstring s)
145 TextBox& TextBox::draw(Drawable &target)
147 // if(!tabStopRegistered) { TabStopHotKey::tabStopHotKey.set(this); tabStopRegistered=true; }
148 if(getLeft()<1 && getTop()<1) WidgetRect::__autoAlign(*this);
151 cache.setString(content);
155 void TextBox::setText(const std::wstring &str)
159 std::wstring& TextBox::getText()
168 void doNothingP(void *p) {}
175 Button::Button(std::wstring s)
179 Button::Button(std::wstring s, double size)
183 void Button::setBase() {
188 Button& Button::set(std::wstring s, double size) {
190 WidgetRect::set(s, size);
193 Button& Button::set(double w, double h)
196 WidgetRect::set(w, h);
199 Button& Button::draw(Drawable &target) {
200 // if(!tabStopRegistered) { TabStopHotKey::tabStopHotKey.set(this); tabStopRegistered=true; }
201 if(getLeft()<1 && getTop()<1) WidgetRect::__autoAlign(*this);
203 Point mouse = drawableMouse(target);
204 if(area.include(mouse)) {
205 area.fill = theme->over_background[theme_type];
208 if(onClick!=0) onClick();
209 if(onClickP!=0) onClickP(arg);
210 label.fill = theme->active_foreground[theme_type];
211 area.stroke = theme->active_stroke[theme_type];
214 label.fill = theme->normal_foreground[theme_type];
215 area.fill = theme->normal_background[theme_type];
216 area.stroke = theme->normal_stroke[theme_type];
220 Canvas* tag = dynamic_cast<Canvas*>(&target);
221 if(tag!=0) tag->drawImage(*(theme->button_back), area);
222 //label.align = Letters::TEXT_ALIGN_CENTER;
223 label.centering(area.getCenter().x, area.getBottom()-2);
224 label.draw(label.fill, target);
228 ToggleButton::ToggleButton()
229 : Button(), checked_(false) {
231 ToggleButton::ToggleButton(std::wstring s)
232 : Button(s), checked_(false) {
234 ToggleButton::ToggleButton(std::wstring s, double size)
235 : Button(s, size), checked_(false) {
237 bool ToggleButton::toggle()
240 checked_ = !checked_;
243 bool ToggleButton::toggle(bool on_off)
249 bool ToggleButton::isChecked()
253 ToggleButton& ToggleButton::draw(Drawable &target)
255 // if(!tabStopRegistered) { TabStopHotKey::tabStopHotKey.set(this); tabStopRegistered=true; }
256 if(getLeft()<1 && getTop()<1) WidgetRect::__autoAlign(*this);
258 Point mouse = drawableMouse(target);
259 if(area.include(mouse)) {
260 area.fill = isChecked() ? theme->active_background[theme_type] : theme->over_background[theme_type];
264 if(onClick!=0) onClick();
265 if(onClickP!=0) onClickP(arg);
266 label.fill = theme->active_foreground[theme_type];
267 area.stroke = theme->active_stroke[theme_type];
271 label.fill = theme->active_foreground[theme_type];
272 area.fill = theme->active_background[theme_type];
273 area.stroke = theme->active_stroke[theme_type];
275 label.fill = theme->normal_foreground[theme_type];
276 area.fill = theme->normal_background[theme_type];
277 area.stroke = theme->normal_stroke[theme_type];
282 Canvas* tag = dynamic_cast<Canvas*>(&target);
283 if(tag!=0) tag->drawImage(*(theme->button_back), area);
284 label.centering(area.getCenter().x, area.getBottom()-2);
285 label.draw(label.fill, target);
291 Image ScreenShotButton::buffer;
292 void ScreenShotButton::shoot(void *ffname)
294 Psychlops::Rectangle rect(Display::the_canvas->getWidth(), Display::the_canvas->getHeight());
295 Display::the_canvas->to(buffer, rect);
296 std::string fname("psychlops_");
297 fname += (char*)ffname;
301 ScreenShotButton::ScreenShotButton(char *name__)
305 arg = (void*)name.c_str();
310 const Interval Slider::def_itvl(0, Interval::CLOSE, 1, Interval::CLOSE);
313 if(isLocal_ && var!=0) delete var;
321 //StackPanel::default_stack.append(this);
323 Slider::Slider(ExperimentalMethods::Variable &v)
330 //StackPanel::default_stack.append(this);
332 Slider::Slider(double wid, double hei)
337 WidgetRect::set(wid, hei);
340 link(local, 0<=rng<=1, 0.125, 10.0);
341 //StackPanel::default_stack.append(this);
343 Slider::Slider(std::string s, Interval rng, double d_step, double e_step)
349 link(local, s, rng, d_step, e_step);
351 //StackPanel::default_stack.append(this);
353 void Slider::setBase() {
357 area.fill = Color(0.3);
358 internal.fill = Color::blue;
361 setSize(150, Font::default_font.size - 4);
363 Slider& Slider::set(ExperimentalMethods::Variable &v)
368 Slider& Slider::setSize(double wid, double hei)
370 WidgetRect::set(wid, hei);
371 label.fill = Color::white;
372 label.align = Letters::TEXT_ALIGN_LEFT;
373 show_value = label.getString().length()*area.getHeight()*2/3 < area.getWidth();
376 Slider& Slider::set(std::string s, Interval rng, double d_step, double e_step)
379 link(local, s, rng, d_step, e_step);
381 var->setInterval(rng);
382 //var->set(s, rng, d_step, e_step);
387 Slider& Slider::set(std::string s, double hei) { return set(StringToWString(s), hei); }
388 Slider& Slider::set(std::wstring s, double hei)
390 WidgetRect::set(s, hei);
391 label.fill = Color::white;
392 label.align = Letters::TEXT_ALIGN_LEFT;
393 show_value = label.getString().length()*area.getHeight()*2/3 < area.getWidth();
397 Slider& Slider::setLabel(std::string s) { return setLabel(StringToWString(s)); }
398 Slider& Slider::setLabel(std::wstring s)
400 WidgetRect::setLabel(s);
401 label.fill = Color::white;
402 label.align = Letters::TEXT_ALIGN_LEFT;
403 show_value = label.getString().length()*area.getHeight()*2/3 < area.getWidth();
406 Slider& Slider::draw(Drawable &target)
408 if(!tabStopRegistered) { TabStopHotKey::tabStopHotKey.set(this); tabStopRegistered=true; }
409 if(getLeft()<1 && getTop()<1) WidgetRect::__autoAlign(*this);
411 Point mouse = drawableMouse(target);
412 bool mouse_over = area.include(mouse), focused = true;
413 if(Display::the_canvas!=0) focused = Display::the_canvas->eventroot.isFocused__(this);
414 Canvas* cnvs = dynamic_cast<Canvas*>(&target);
419 if(mleft.pushed() && mouse_over) { dragged = true; pushThis(); }
420 if(mleft.pressed() && dragged) {
421 if(area.getWidth()>area.getHeight()) { var->setByRatioInStep((mouse.x-area.getLeft())/area.getWidth()); changed_=true; }
422 else { var->setByRatioInStep((area.getBottom()-mouse.y)/area.getHeight()); changed_=true; }
425 if(Keyboard::left.pressed()) { if(pressFrame<=0) { var->decrement(Keyboard::shift.pressed()); changed_=true; pressFrame = pressFrame==0 ? HumanInterfaceDevice::pushRepeatInterval : HumanInterfaceDevice::pushRepeatFrames; } }
426 else if(Keyboard::right.pressed()) { if(pressFrame<=0) { var->increment(Keyboard::shift.pressed()); changed_=true; pressFrame = pressFrame==0 ? HumanInterfaceDevice::pushRepeatInterval : HumanInterfaceDevice::pushRepeatFrames; } }
427 else { pressFrame = -1; }
428 if(pressFrame>0) pressFrame--;
430 if(!mleft.pressed()) dragged = false;
432 if(area.getWidth()>area.getHeight()) {
433 internal.set(area.getLeft()+1, area.getTop()+1, area.getLeft()+area.getWidth()*(var->getRatio()), area.getBottom()-1).draw(target);
435 internal.set(area.getLeft()+1, area.getBottom()-area.getHeight()*(var->getRatio()), area.getRight()-1, area.getBottom()-1).draw(target);
437 area.draw(mouse_over ? Stroke::hair_line : Stroke::null_line);
438 label.locate(area.getLeft()+5, area.getBottom()-2);
440 label.draw(Color::white, target);
441 if(cnvs!=0 && show_value) cnvs->msg(var->to_str(), area.getRight()-2, area.getBottom()-5, Color::white, Letters::TEXT_ALIGN_RIGHT);
443 label.draw(Color::gray, target);
444 if(cnvs!=0 && show_value) cnvs->msg(var->to_str(), area.getRight()-2, area.getBottom()-5, Color::gray, Letters::TEXT_ALIGN_RIGHT);
450 Slider& Slider::linkTo(ExperimentalMethods::Variable *v)
455 Slider& Slider::operator =(ExperimentalMethods::Variable &v)
459 bool Slider::changed()
465 Slider::operator double()
469 double Slider::operator =(double v)
473 void Slider::setByRatio(double ratio) { var->setByRatio(ratio); }
474 double Slider::getRatio() const { return var->getRatio(); }
475 Interval Slider::getInterval() const { return var->getInterval(); }
476 Interval Slider::setInterval(const Interval &itvl) { return var->setInterval(itvl); }
477 void Slider::increment(int modulation) { var->increment(modulation); }
478 void Slider::decrement(int modulation) { var->decrement(modulation); }
485 Dial::Dial(double r) {
489 void Dial::setBase() {
493 current_theta = factor = 0;
494 pressed = dragged = false;
495 ext.fill = Color(0.3);
496 internal.fill = Color::black;
498 Dial& Dial::set(double r) {
500 internal.set(r/5, r/5);
503 Dial& Dial::link(double &item, double fac)
507 let.align = Letters::TEXT_ALIGN_CENTER;
510 Dial& Dial::draw(Drawable &target) {
511 Point mouse = drawableMouse(target);
512 ext.centering(getDatum());
513 bool mouse_over = ext.include(mouse);
514 target.ellipse(ext, ext.fill);
515 if(!pressed && Mouse::left.pressed() && mouse_over) {
517 former_theta = atan2(mouse.y-ext.getCenter().y, mouse.x-ext.getCenter().x);
519 if(mouse_over || dragged) {
520 target.ellipse(ext, Stroke::hair_line);
521 if(Keyboard::left.pressed()) { current_theta-=2*PI/36; (*var) = *var-factor/36; changed_=true; }
522 if(Keyboard::right.pressed()) { current_theta+=2*PI/36; (*var) = *var+factor/36; changed_=true; }
524 pressed = Mouse::left.pressed();
525 if(Mouse::left.pressed() && dragged) {
526 current_theta = atan2(mouse.y-ext.getCenter().y, mouse.x-ext.getCenter().x);
527 double delta_theta = Math::mod(current_theta-former_theta, 2*PI);
528 if(delta_theta>PI) delta_theta-=2*PI;
529 (*var) = *var+delta_theta/2/PI*factor;
531 former_theta = current_theta;
535 internal.centering(ext).shift(ext.getWidth()/2.2*cos(current_theta), ext.getWidth()/2.2*sin(current_theta));
536 target.ellipse(internal, internal.fill);
537 //let.centering(ext.getCenter().x, ext.getBottom());
538 //let.draw(let.fill, target);
541 bool Dial::changed() {
546 Dial::operator double() {
549 double Dial::operator =(double v) {
554 SelectBox::SelectBox()
557 set(Font::default_font.size);
559 SelectBox::SelectBox(double size)
564 SelectBox& SelectBox::set(double hei)
568 SelectBox& SelectBox::set(double wid, double hei)
572 area.resize(wid, hei);
575 void SelectBox::makeVertical()
577 area.resize(area.getHeight(), area.getWidth());
580 void SelectBox::appendL(Letters &let)
582 area.resize(Math::max(area.getWidth(), let.getString().length()*Font::default_font.size), area.getHeight());
583 let.fill = theme->normal_foreground[theme_type];
584 let.font.size = area.getHeight() - 4;;
587 int SelectBox::getSelected() { return selected_; }
588 void SelectBox::setSelected(int dd) { selected_ = Math::min( Math::max(dd, 0), item.size() ); }
589 void SelectBox::next() { if(selected_<item.size()-1) { ++selected_; } else { selected_ = 0; } }
590 void SelectBox::retreat() { if(selected_>0) { --selected_; } else { selected_ = item.size()-1; } }
591 void SelectBox::hid()
593 int wheel = Mouse::getWheelDelta().y;
596 area.stroke = theme->active_stroke[theme_type];
599 if(wheel>0 || mleft.pushed()) {
601 area.stroke = theme->active_stroke[theme_type];
605 SelectBox& SelectBox::draw(Drawable &target)
607 Point mouse = drawableMouse(target);
608 if(area.include(mouse)) {
609 area.stroke = theme->normal_stroke[theme_type];
611 area.fill = theme->over_background[theme_type];
613 area.stroke = theme->normal_stroke[theme_type];
614 area.fill = theme->normal_background[theme_type];
618 Canvas* tag = dynamic_cast<Canvas*>(&target);
619 if(tag!=0) tag->drawImage(*(theme->button_back), area);
622 item[selected_].locate(area.getLeft()+5, area.getBottom()-2);
623 item[selected_].draw(item[selected_].fill, target);
626 holder_.contents.clear();
628 holder_.setDatum(Point(area.getLeft()+2, area.getTop()-5));
629 holder_.append(item[selected_]);
630 item[selected_].setDatum(Point(0,0)).shift(5, item[selected_].getFont().size);
631 holder_.rotation = PI/2;
632 holder_.draw(target);
639 TitleBar *TitleBar::default_titlebar;
645 } /* <- namespace Widgets */
646 } /* <- namespace Psycholops */