void drawer::attached(graph_reference graph) { window wd = widget_->handle(); editor_ = new text_editor(wd, graph); editor_->textbase().bind_ext_evtbase(extra_evtbase); editor_->border_renderer(nana::make_fun(*this, &drawer::_m_draw_border)); _m_text_area(graph.width(), graph.height()); using namespace API::dev; make_drawer_event<events::focus>(wd); make_drawer_event<events::key_char>(wd); make_drawer_event<events::key_down>(wd); make_drawer_event<events::mouse_down>(wd); make_drawer_event<events::mouse_up>(wd); make_drawer_event<events::mouse_move>(wd); make_drawer_event<events::mouse_wheel>(wd); make_drawer_event<events::mouse_enter>(wd); make_drawer_event<events::mouse_leave>(wd); API::tabstop(wd); API::eat_tabstop(wd, true); API::effects_edge_nimbus(wd, effects::edge_nimbus::active); API::effects_edge_nimbus(wd, effects::edge_nimbus::over); }
void drawer::scroll_delta_pos(graph_reference graph, int mouse_pos) { if(mouse_pos + metrics_.scroll_mouse_offset == metrics_.scroll_pos) return; unsigned scale = vertical_ ? graph.height() : graph.width(); if(scale > fixedsize * 2) { int pos = mouse_pos - metrics_.scroll_mouse_offset; const unsigned scroll_area = static_cast<unsigned>(scale - fixedsize * 2 - metrics_.scroll_length); if(pos < 0) pos = 0; else if(pos > static_cast<int>(scroll_area)) pos = static_cast<int>(scroll_area); metrics_.scroll_pos = pos; auto value_max = metrics_.peak - metrics_.range; //Check scroll_area to avoiding division by zero. if (scroll_area) metrics_.value = pos * value_max / scroll_area; if(metrics_.value < value_max) { int selfpos = static_cast<int>(metrics_.value * scroll_area / value_max); int nextpos = static_cast<int>((metrics_.value + 1) * scroll_area / value_max); if(selfpos != nextpos && (pos - selfpos > nextpos - pos)) ++metrics_.value; } else metrics_.value = value_max; } }
buttons drawer::what(graph_reference graph, const point& screen_pos) { unsigned scale; int pos; if(vertical_) { scale = graph.height(); pos = screen_pos.y; } else { scale = graph.width(); pos = screen_pos.x; } const auto bound_pos = static_cast<int>(scale >= fixedsize * 2 ? fixedsize : scale / 2); if (pos < bound_pos) return buttons::first; if (pos > static_cast<int>(scale) - bound_pos) return buttons::second; if(metrics_.scroll_length) { if(metrics_.scroll_pos + static_cast<int>(fixedsize) <= pos && pos < metrics_.scroll_pos + static_cast<int>(fixedsize + metrics_.scroll_length)) return buttons::scroll; } if(static_cast<int>(fixedsize) <= pos && pos < metrics_.scroll_pos) return buttons::forward; else if(metrics_.scroll_pos + static_cast<int>(metrics_.scroll_length) <= pos && pos < static_cast<int>(scale - fixedsize)) return buttons::backward; return buttons::none; }
void drawer::_m_adjust_scroll(graph_reference graph) { if(metrics_.range == 0 || metrics_.peak <= metrics_.range) return; unsigned pixels = vertical_ ? graph.height() : graph.width(); int pos = 0; unsigned len = 0; if(pixels > fixedsize * 2) { pixels -= (fixedsize * 2); len = static_cast<unsigned>(pixels * metrics_.range / metrics_.peak); if(len < fixedsize) len = fixedsize; if(metrics_.value) { pos = static_cast<int>(pixels - len); if(metrics_.value + metrics_.range >= metrics_.peak) metrics_.value = metrics_.peak - metrics_.range; else pos = static_cast<int>((metrics_.value * pos) /(metrics_.peak - metrics_.range)); } } metrics_.scroll_pos = pos; metrics_.scroll_length = len; }
//private: void drawer::_m_background(graph_reference graph) { graph.rectangle(true, {0xf0, 0xf0, 0xf0}); if (!metrics_.pressed || !_m_check()) return; nana::rectangle_rotator r(vertical_, ::nana::rectangle{ graph.size() }); if(metrics_.what == buttons::forward) { r.x_ref() = static_cast<int>(fixedsize); r.w_ref() = metrics_.scroll_pos; } else if(buttons::backward == metrics_.what) { r.x_ref() = static_cast<int>(fixedsize + metrics_.scroll_pos + metrics_.scroll_length); r.w_ref() = static_cast<unsigned>((vertical_ ? graph.height() : graph.width()) - (fixedsize * 2 + metrics_.scroll_pos + metrics_.scroll_length)); } else return; auto result = r.result(); if (!result.empty()) graph.rectangle(result, true, static_cast<color_rgb>(0xDCDCDC)); }
void drawer::attached(widget_reference wdg, graph_reference graph) { auto wd = wdg.handle(); widget_ = &wdg; evt_agent_.reset(new event_agent(static_cast<::nana::textbox&>(wdg), editor_->text_position())); auto scheme = API::dev::get_scheme(wdg); editor_ = new text_editor(wd, graph, dynamic_cast<::nana::widgets::skeletons::text_editor_scheme*>(scheme)); editor_->textbase().set_event_agent(evt_agent_.get()); editor_->set_event(evt_agent_.get()); _m_text_area(graph.width(), graph.height()); API::tabstop(wd); API::eat_tabstop(wd, true); API::effects_edge_nimbus(wd, effects::edge_nimbus::active); API::effects_edge_nimbus(wd, effects::edge_nimbus::over); }
void trigger::_m_draw_progress(graph_reference graph) { unsigned width = graph.width() - border * 2; unsigned height = graph.height() - border * 2; if(false == unknown_) { if(draw_width_) graph.gradual_rectangle({ static_cast<int>(border), static_cast<int>(border), draw_width_, height }, { 0x6F, 0xFF, 0xA8 }, { 0x10, 0x75, 0x15 }, true); } else { unsigned block = width / 3; int left = (value_ < block ? 0 : value_ - block) + border; int right = (value_ >= width - 1 + border? width - 1 + border: value_); if(right >= left) graph.gradual_rectangle({ left, static_cast<int>(border), static_cast<unsigned>(right - left + 1), height }, { 0x6F, 0xFF, 0xA8 }, { 0x10, 0x75, 0x15 }, true); if(value_ >= width + block) value_ = 0; } }