Add text_changed event for combox, spinbox and textbox
This commit is contained in:
parent
7c93980530
commit
50f4bd79ce
@ -29,7 +29,7 @@ namespace nana
|
||||
combox & widget;
|
||||
|
||||
arg_combox(combox& wdg)
|
||||
: widget(wdg)
|
||||
: widget{ wdg }
|
||||
{}
|
||||
};
|
||||
|
||||
@ -40,7 +40,8 @@ namespace nana
|
||||
struct combox_events
|
||||
: public general_events
|
||||
{
|
||||
basic_event<arg_combox> selected;
|
||||
basic_event<arg_combox> selected;
|
||||
basic_event<arg_combox> text_changed;
|
||||
};
|
||||
|
||||
class drawer_impl;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* A textbase class implementation
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@ -511,6 +511,9 @@ namespace skeletons
|
||||
_m_first_change();
|
||||
changed_ = true;
|
||||
}
|
||||
|
||||
if (evt_agent_)
|
||||
evt_agent_->text_changed();
|
||||
}
|
||||
private:
|
||||
std::deque<string_type> text_cont_;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Definitions of textbase export interfaces
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@ -25,6 +25,7 @@ namespace nana{ namespace widgets
|
||||
virtual ~textbase_event_agent_interface() = default;
|
||||
|
||||
virtual void first_change() = 0; ///< An event for the text first change after text has been opened or stored.
|
||||
virtual void text_changed() = 0; ///< An event for the change of text.
|
||||
};
|
||||
}//end namespace skeletons
|
||||
}//end namespace widgets
|
||||
|
@ -17,10 +17,27 @@
|
||||
|
||||
namespace nana
|
||||
{
|
||||
class spinbox;
|
||||
|
||||
struct arg_spinbox
|
||||
{
|
||||
spinbox & widget;
|
||||
|
||||
arg_spinbox(spinbox& wdg)
|
||||
: widget{ wdg }
|
||||
{}
|
||||
};
|
||||
|
||||
namespace drawerbase
|
||||
{
|
||||
namespace spinbox
|
||||
{
|
||||
struct spinbox_events
|
||||
: public general_events
|
||||
{
|
||||
basic_event<arg_spinbox> text_changed;
|
||||
};
|
||||
|
||||
/// Declaration of internal spinbox implementation
|
||||
class implementation;
|
||||
|
||||
@ -58,7 +75,7 @@ namespace nana
|
||||
|
||||
/// Spinbox Widget
|
||||
class spinbox
|
||||
: public widget_object <category::widget_tag, drawerbase::spinbox::drawer, ::nana::general_events, ::nana::widgets::skeletons::text_editor_scheme>
|
||||
: public widget_object <category::widget_tag, drawerbase::spinbox::drawer, drawerbase::spinbox::spinbox_events, ::nana::widgets::skeletons::text_editor_scheme>
|
||||
{
|
||||
public:
|
||||
/// Constructs a spinbox.
|
||||
@ -83,6 +100,7 @@ namespace nana
|
||||
|
||||
/// Gets the spined value
|
||||
::nana::string value() const;
|
||||
void value(const ::nana::string&);
|
||||
int to_int() const;
|
||||
double to_double() const;
|
||||
|
||||
|
@ -40,14 +40,16 @@ namespace nana
|
||||
: public general_events
|
||||
{
|
||||
basic_event<arg_textbox> first_change;
|
||||
basic_event<arg_textbox> text_changed;
|
||||
};
|
||||
|
||||
class event_agent
|
||||
: public widgets::skeletons::textbase_event_agent_interface
|
||||
{
|
||||
public:
|
||||
event_agent(::nana::textbox& wdg);
|
||||
event_agent(::nana::textbox&);
|
||||
void first_change() override;
|
||||
void text_changed() override;
|
||||
private:
|
||||
::nana::textbox & widget_;
|
||||
};
|
||||
@ -57,7 +59,7 @@ namespace nana
|
||||
: public drawer_trigger
|
||||
{
|
||||
public:
|
||||
typedef widgets::skeletons::text_editor text_editor;
|
||||
using text_editor = widgets::skeletons::text_editor;
|
||||
|
||||
drawer();
|
||||
text_editor * editor();
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <nana/system/dataexch.hpp>
|
||||
#include <nana/gui/widgets/float_listbox.hpp>
|
||||
#include <nana/gui/widgets/skeletons/text_editor.hpp>
|
||||
#include <nana/gui/widgets/skeletons/textbase_export_interface.hpp>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
@ -23,6 +24,24 @@ namespace nana
|
||||
{
|
||||
namespace combox
|
||||
{
|
||||
class event_agent
|
||||
: public widgets::skeletons::textbase_event_agent_interface
|
||||
{
|
||||
public:
|
||||
event_agent(::nana::combox& wdg)
|
||||
: widget_{wdg}
|
||||
{}
|
||||
|
||||
void first_change() override{} //empty, because combox does not have this event.
|
||||
|
||||
void text_changed() override
|
||||
{
|
||||
widget_.events().text_changed.emit(::nana::arg_combox{ widget_ });
|
||||
}
|
||||
private:
|
||||
::nana::combox & widget_;
|
||||
};
|
||||
|
||||
struct item
|
||||
: public float_listbox::item_interface
|
||||
{
|
||||
@ -84,6 +103,9 @@ namespace nana
|
||||
editor_->multi_lines(false);
|
||||
editable(false);
|
||||
graph_ = &graph;
|
||||
|
||||
evt_agent_.reset(new event_agent{ static_cast<nana::combox&>(wd) });
|
||||
editor_->textbase().set_event_agent(evt_agent_.get());
|
||||
}
|
||||
|
||||
void detached()
|
||||
@ -508,7 +530,7 @@ namespace nana
|
||||
bool image_enabled_{ false };
|
||||
unsigned image_pixels_{ 16 };
|
||||
widgets::skeletons::text_editor * editor_{ nullptr };
|
||||
|
||||
std::unique_ptr<event_agent> evt_agent_;
|
||||
struct state_type
|
||||
{
|
||||
bool focused;
|
||||
|
@ -21,6 +21,24 @@ namespace nana
|
||||
{
|
||||
namespace spinbox
|
||||
{
|
||||
class event_agent
|
||||
: public widgets::skeletons::textbase_event_agent_interface
|
||||
{
|
||||
public:
|
||||
event_agent(::nana::spinbox& wdg)
|
||||
: widget_{ wdg }
|
||||
{}
|
||||
|
||||
void first_change() override{} //empty, because spinbox does not have this event.
|
||||
|
||||
void text_changed() override
|
||||
{
|
||||
widget_.events().text_changed.emit(::nana::arg_spinbox{ widget_ });
|
||||
}
|
||||
private:
|
||||
::nana::spinbox & widget_;
|
||||
};
|
||||
|
||||
enum class buttons
|
||||
{
|
||||
none, increase, decrease
|
||||
@ -32,6 +50,8 @@ namespace nana
|
||||
virtual ~range_interface() = default;
|
||||
|
||||
virtual std::wstring value() const = 0;
|
||||
virtual bool value(const std::wstring&) = 0;
|
||||
virtual bool check_value(const std::wstring&) const = 0;
|
||||
virtual void spin(bool increase) = 0;
|
||||
};
|
||||
|
||||
@ -51,6 +71,31 @@ namespace nana
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
bool value(const std::wstring& value_str) override
|
||||
{
|
||||
std::wstringstream ss;
|
||||
ss << value_str;
|
||||
|
||||
T v;
|
||||
ss >> v;
|
||||
if (begin_ <= v && v <= last_)
|
||||
{
|
||||
value_ = v;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool check_value(const std::wstring& value_str) const override
|
||||
{
|
||||
std::wstringstream ss;
|
||||
ss << value_str;
|
||||
|
||||
T v;
|
||||
ss >> v;
|
||||
return (begin_ <= v && v <= last_);
|
||||
}
|
||||
|
||||
void spin(bool increase) override
|
||||
{
|
||||
if (increase)
|
||||
@ -97,6 +142,27 @@ namespace nana
|
||||
return texts_[pos_];
|
||||
}
|
||||
|
||||
bool value(const std::wstring& value_str) override
|
||||
{
|
||||
auto i = std::find(texts_.cbegin(), texts_.cend(), value_str);
|
||||
if (i != texts_.cend())
|
||||
{
|
||||
pos_ = i - texts_.cbegin();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool check_value(const std::wstring& str) const override
|
||||
{
|
||||
for (auto & s : texts_)
|
||||
{
|
||||
if (s.find(str) != s.npos)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void spin(bool increase) override
|
||||
{
|
||||
if (texts_.empty())
|
||||
@ -147,6 +213,15 @@ namespace nana
|
||||
auto scheme = static_cast<::nana::widgets::skeletons::text_editor_scheme*>(API::dev::get_scheme(wd));
|
||||
editor_ = new ::nana::widgets::skeletons::text_editor(wd, graph, scheme);
|
||||
editor_->multi_lines(false);
|
||||
editor_->set_accept([this](::nana::char_t ch)
|
||||
{
|
||||
auto str = editor_->text();
|
||||
str += ch;
|
||||
return range_->check_value(str);
|
||||
});
|
||||
|
||||
evt_agent_.reset(new event_agent(static_cast<nana::spinbox&>(wdg)));
|
||||
editor_->textbase().set_event_agent(evt_agent_.get());
|
||||
|
||||
if (!range_)
|
||||
range_.reset(new range_numeric<int>(0, 100, 1));
|
||||
@ -171,6 +246,15 @@ namespace nana
|
||||
return range_->value();
|
||||
}
|
||||
|
||||
bool value(const ::nana::string& value_str)
|
||||
{
|
||||
if (!range_->value(value_str))
|
||||
return false;
|
||||
|
||||
_m_text();
|
||||
return true;
|
||||
}
|
||||
|
||||
void set_range(std::unique_ptr<range_interface> ptr)
|
||||
{
|
||||
range_.swap(ptr);
|
||||
@ -344,6 +428,7 @@ namespace nana
|
||||
private:
|
||||
::nana::paint::graphics * graph_{nullptr};
|
||||
::nana::widgets::skeletons::text_editor * editor_{nullptr};
|
||||
std::unique_ptr<event_agent> evt_agent_;
|
||||
buttons spin_stated_{ buttons::none };
|
||||
std::unique_ptr<range_interface> range_;
|
||||
::nana::timer timer_;
|
||||
@ -511,6 +596,16 @@ namespace nana
|
||||
return{};
|
||||
}
|
||||
|
||||
void spinbox::value(const ::nana::string& s)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
if (handle())
|
||||
{
|
||||
if (get_drawer_trigger().impl()->value(s))
|
||||
API::refresh_window(handle());
|
||||
}
|
||||
}
|
||||
|
||||
int spinbox::to_int() const
|
||||
{
|
||||
//std::stoi is not defined by MinGW
|
||||
|
@ -27,7 +27,12 @@ namespace nana{ namespace drawerbase {
|
||||
{
|
||||
widget_.events().first_change.emit(::nana::arg_textbox{ widget_ });
|
||||
}
|
||||
//
|
||||
|
||||
void event_agent::text_changed()
|
||||
{
|
||||
widget_.events().text_changed.emit(::nana::arg_textbox{ widget_ });
|
||||
}
|
||||
//end class event_agent
|
||||
|
||||
//class draweer
|
||||
drawer::drawer()
|
||||
|
@ -145,14 +145,8 @@ namespace nana
|
||||
{
|
||||
static std::shared_ptr<data> data_ptr;
|
||||
if (!data_ptr)
|
||||
{
|
||||
data_ptr = std::make_shared<data>();
|
||||
|
||||
//Initialize the predefined language text
|
||||
auto & table = data_ptr->table;
|
||||
table["Nana.OK"].assign(L"OK");
|
||||
table["Nana.Cancel"].assign(L"Cancel");
|
||||
}
|
||||
return data_ptr;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user