예제 #1
0
파일: textbox.cpp 프로젝트: gfannes/nana
		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);
		}
예제 #2
0
파일: scroll.cpp 프로젝트: sarrow104/nana
            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;
                }
            }
예제 #3
0
파일: scroll.cpp 프로젝트: sarrow104/nana
            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;
            }
예제 #4
0
파일: scroll.cpp 프로젝트: sarrow104/nana
            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;
            }
예제 #5
0
파일: scroll.cpp 프로젝트: sarrow104/nana
        //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));
            }
예제 #6
0
파일: textbox.cpp 프로젝트: CodeBees/nana
		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);
		}
예제 #7
0
파일: progress.cpp 프로젝트: sarrow104/nana
            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;
                }
            }