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;
|
combox & widget;
|
||||||
|
|
||||||
arg_combox(combox& wdg)
|
arg_combox(combox& wdg)
|
||||||
: widget(wdg)
|
: widget{ wdg }
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -40,7 +40,8 @@ namespace nana
|
|||||||
struct combox_events
|
struct combox_events
|
||||||
: public general_events
|
: public general_events
|
||||||
{
|
{
|
||||||
basic_event<arg_combox> selected;
|
basic_event<arg_combox> selected;
|
||||||
|
basic_event<arg_combox> text_changed;
|
||||||
};
|
};
|
||||||
|
|
||||||
class drawer_impl;
|
class drawer_impl;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* A textbase class implementation
|
* A textbase class implementation
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* 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.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
@ -511,6 +511,9 @@ namespace skeletons
|
|||||||
_m_first_change();
|
_m_first_change();
|
||||||
changed_ = true;
|
changed_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (evt_agent_)
|
||||||
|
evt_agent_->text_changed();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
std::deque<string_type> text_cont_;
|
std::deque<string_type> text_cont_;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Definitions of textbase export interfaces
|
* Definitions of textbase export interfaces
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* 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.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (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 ~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 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 skeletons
|
||||||
}//end namespace widgets
|
}//end namespace widgets
|
||||||
|
@ -17,10 +17,27 @@
|
|||||||
|
|
||||||
namespace nana
|
namespace nana
|
||||||
{
|
{
|
||||||
|
class spinbox;
|
||||||
|
|
||||||
|
struct arg_spinbox
|
||||||
|
{
|
||||||
|
spinbox & widget;
|
||||||
|
|
||||||
|
arg_spinbox(spinbox& wdg)
|
||||||
|
: widget{ wdg }
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
namespace drawerbase
|
namespace drawerbase
|
||||||
{
|
{
|
||||||
namespace spinbox
|
namespace spinbox
|
||||||
{
|
{
|
||||||
|
struct spinbox_events
|
||||||
|
: public general_events
|
||||||
|
{
|
||||||
|
basic_event<arg_spinbox> text_changed;
|
||||||
|
};
|
||||||
|
|
||||||
/// Declaration of internal spinbox implementation
|
/// Declaration of internal spinbox implementation
|
||||||
class implementation;
|
class implementation;
|
||||||
|
|
||||||
@ -58,7 +75,7 @@ namespace nana
|
|||||||
|
|
||||||
/// Spinbox Widget
|
/// Spinbox Widget
|
||||||
class spinbox
|
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:
|
public:
|
||||||
/// Constructs a spinbox.
|
/// Constructs a spinbox.
|
||||||
@ -83,6 +100,7 @@ namespace nana
|
|||||||
|
|
||||||
/// Gets the spined value
|
/// Gets the spined value
|
||||||
::nana::string value() const;
|
::nana::string value() const;
|
||||||
|
void value(const ::nana::string&);
|
||||||
int to_int() const;
|
int to_int() const;
|
||||||
double to_double() const;
|
double to_double() const;
|
||||||
|
|
||||||
|
@ -40,14 +40,16 @@ namespace nana
|
|||||||
: public general_events
|
: public general_events
|
||||||
{
|
{
|
||||||
basic_event<arg_textbox> first_change;
|
basic_event<arg_textbox> first_change;
|
||||||
|
basic_event<arg_textbox> text_changed;
|
||||||
};
|
};
|
||||||
|
|
||||||
class event_agent
|
class event_agent
|
||||||
: public widgets::skeletons::textbase_event_agent_interface
|
: public widgets::skeletons::textbase_event_agent_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
event_agent(::nana::textbox& wdg);
|
event_agent(::nana::textbox&);
|
||||||
void first_change() override;
|
void first_change() override;
|
||||||
|
void text_changed() override;
|
||||||
private:
|
private:
|
||||||
::nana::textbox & widget_;
|
::nana::textbox & widget_;
|
||||||
};
|
};
|
||||||
@ -57,7 +59,7 @@ namespace nana
|
|||||||
: public drawer_trigger
|
: public drawer_trigger
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef widgets::skeletons::text_editor text_editor;
|
using text_editor = widgets::skeletons::text_editor;
|
||||||
|
|
||||||
drawer();
|
drawer();
|
||||||
text_editor * editor();
|
text_editor * editor();
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <nana/system/dataexch.hpp>
|
#include <nana/system/dataexch.hpp>
|
||||||
#include <nana/gui/widgets/float_listbox.hpp>
|
#include <nana/gui/widgets/float_listbox.hpp>
|
||||||
#include <nana/gui/widgets/skeletons/text_editor.hpp>
|
#include <nana/gui/widgets/skeletons/text_editor.hpp>
|
||||||
|
#include <nana/gui/widgets/skeletons/textbase_export_interface.hpp>
|
||||||
|
|
||||||
namespace nana
|
namespace nana
|
||||||
{
|
{
|
||||||
@ -23,6 +24,24 @@ namespace nana
|
|||||||
{
|
{
|
||||||
namespace combox
|
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
|
struct item
|
||||||
: public float_listbox::item_interface
|
: public float_listbox::item_interface
|
||||||
{
|
{
|
||||||
@ -84,6 +103,9 @@ namespace nana
|
|||||||
editor_->multi_lines(false);
|
editor_->multi_lines(false);
|
||||||
editable(false);
|
editable(false);
|
||||||
graph_ = &graph;
|
graph_ = &graph;
|
||||||
|
|
||||||
|
evt_agent_.reset(new event_agent{ static_cast<nana::combox&>(wd) });
|
||||||
|
editor_->textbase().set_event_agent(evt_agent_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void detached()
|
void detached()
|
||||||
@ -508,7 +530,7 @@ namespace nana
|
|||||||
bool image_enabled_{ false };
|
bool image_enabled_{ false };
|
||||||
unsigned image_pixels_{ 16 };
|
unsigned image_pixels_{ 16 };
|
||||||
widgets::skeletons::text_editor * editor_{ nullptr };
|
widgets::skeletons::text_editor * editor_{ nullptr };
|
||||||
|
std::unique_ptr<event_agent> evt_agent_;
|
||||||
struct state_type
|
struct state_type
|
||||||
{
|
{
|
||||||
bool focused;
|
bool focused;
|
||||||
|
@ -21,6 +21,24 @@ namespace nana
|
|||||||
{
|
{
|
||||||
namespace spinbox
|
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
|
enum class buttons
|
||||||
{
|
{
|
||||||
none, increase, decrease
|
none, increase, decrease
|
||||||
@ -32,6 +50,8 @@ namespace nana
|
|||||||
virtual ~range_interface() = default;
|
virtual ~range_interface() = default;
|
||||||
|
|
||||||
virtual std::wstring value() const = 0;
|
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;
|
virtual void spin(bool increase) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -51,6 +71,31 @@ namespace nana
|
|||||||
return ss.str();
|
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
|
void spin(bool increase) override
|
||||||
{
|
{
|
||||||
if (increase)
|
if (increase)
|
||||||
@ -97,6 +142,27 @@ namespace nana
|
|||||||
return texts_[pos_];
|
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
|
void spin(bool increase) override
|
||||||
{
|
{
|
||||||
if (texts_.empty())
|
if (texts_.empty())
|
||||||
@ -147,6 +213,15 @@ namespace nana
|
|||||||
auto scheme = static_cast<::nana::widgets::skeletons::text_editor_scheme*>(API::dev::get_scheme(wd));
|
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_ = new ::nana::widgets::skeletons::text_editor(wd, graph, scheme);
|
||||||
editor_->multi_lines(false);
|
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_)
|
if (!range_)
|
||||||
range_.reset(new range_numeric<int>(0, 100, 1));
|
range_.reset(new range_numeric<int>(0, 100, 1));
|
||||||
@ -171,6 +246,15 @@ namespace nana
|
|||||||
return range_->value();
|
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)
|
void set_range(std::unique_ptr<range_interface> ptr)
|
||||||
{
|
{
|
||||||
range_.swap(ptr);
|
range_.swap(ptr);
|
||||||
@ -344,6 +428,7 @@ namespace nana
|
|||||||
private:
|
private:
|
||||||
::nana::paint::graphics * graph_{nullptr};
|
::nana::paint::graphics * graph_{nullptr};
|
||||||
::nana::widgets::skeletons::text_editor * editor_{nullptr};
|
::nana::widgets::skeletons::text_editor * editor_{nullptr};
|
||||||
|
std::unique_ptr<event_agent> evt_agent_;
|
||||||
buttons spin_stated_{ buttons::none };
|
buttons spin_stated_{ buttons::none };
|
||||||
std::unique_ptr<range_interface> range_;
|
std::unique_ptr<range_interface> range_;
|
||||||
::nana::timer timer_;
|
::nana::timer timer_;
|
||||||
@ -511,6 +596,16 @@ namespace nana
|
|||||||
return{};
|
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
|
int spinbox::to_int() const
|
||||||
{
|
{
|
||||||
//std::stoi is not defined by MinGW
|
//std::stoi is not defined by MinGW
|
||||||
|
@ -27,7 +27,12 @@ namespace nana{ namespace drawerbase {
|
|||||||
{
|
{
|
||||||
widget_.events().first_change.emit(::nana::arg_textbox{ widget_ });
|
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
|
//class draweer
|
||||||
drawer::drawer()
|
drawer::drawer()
|
||||||
|
@ -145,14 +145,8 @@ namespace nana
|
|||||||
{
|
{
|
||||||
static std::shared_ptr<data> data_ptr;
|
static std::shared_ptr<data> data_ptr;
|
||||||
if (!data_ptr)
|
if (!data_ptr)
|
||||||
{
|
|
||||||
data_ptr = std::make_shared<data>();
|
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;
|
return data_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user