diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f6f1e54d --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +#This .gitignore created by qPCR4vir +#ignore thumbnails created by windows +Thumbs.db +#Ignore files build by Visual Studio +*.obj +*.exe +*.pdb +*.user +*.aps +*.pch +*.vspscc +*_i.c +*_p.c +*.ncb +*.tlb +*.tlh +*.bak +*.cache +*.ilk +*.log +[Bb]in +[Dd]ebug*/ +*.lib +*.sbr +obj/ +[Rr]elease*/ +_ReSharper*/ +[Tt]est[Rr]esult* +*.suo +*.sdf \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..3546c151 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# Nana C++ Library + +Nana is a C++ library designed to allow developers to easily create cross-platform GUI applications with modern C++11 style, currently it can work on Linux(X11) and Windows. The nana repository contains the entire source of library, you can browse the source code and submit your pull request for contributing. + +## License + +Nana is licensed under the [Boost Software License]. + +[Boost Software License]: http://www.boost.org/LICENSE_1_0.txt + +## Support + +The best way to get help with Nana library is by visiting http://nanapro.org/help.htm + +## Introduction to the Repository + +There are two main branches with an infinite lifetime: +* **master** is the main branch and it is marked as every version release. +* **develop** is also another main branch where the source code reflects a state with the lastest delivered developement changes for the next release. + +Other branches: +* **features** are used to develop new features for the upcoming or a distant future release. Feature branches are named as 'feature-FEATURENAME'. +* **hotfix** is meant to prepare for a new release, and fixes some bugs from the corresponding tag on the master branch. diff --git a/include/nana/gui/widgets/checkbox.hpp b/include/nana/gui/widgets/checkbox.hpp index 5f9da66a..0795fa1a 100644 --- a/include/nana/gui/widgets/checkbox.hpp +++ b/include/nana/gui/widgets/checkbox.hpp @@ -44,7 +44,6 @@ namespace drawerbase private: static const int interval = 4; widget* widget_; - unsigned state_; std::unique_ptr imptr_; implement * impl_; }; diff --git a/include/nana/gui/widgets/date_chooser.hpp b/include/nana/gui/widgets/date_chooser.hpp index 076ba51e..b4bf2126 100644 --- a/include/nana/gui/widgets/date_chooser.hpp +++ b/include/nana/gui/widgets/date_chooser.hpp @@ -56,7 +56,7 @@ namespace nana bool _m_get_trace(point, int & res); void _m_perf_transform(transform_action tfid, graph_reference, graph_reference dirtybuf, graph_reference newbuf, const nana::point& refpos); private: - void refresh(graph_reference); + void refresh(graph_reference) override; void attached(widget_reference, graph_reference) override; void mouse_move(graph_reference, const arg_mouse&) override; void mouse_leave(graph_reference, const arg_mouse&) override; diff --git a/include/nana/gui/widgets/progress.hpp b/include/nana/gui/widgets/progress.hpp index 14172397..083523b2 100644 --- a/include/nana/gui/widgets/progress.hpp +++ b/include/nana/gui/widgets/progress.hpp @@ -40,6 +40,7 @@ namespace nana bool _m_check_changing(unsigned) const; private: static const unsigned border = 2; + widget * widget_{nullptr}; nana::paint::graphics* graph_{nullptr}; unsigned draw_width_{static_cast(-1)}; diff --git a/include/nana/gui/widgets/scroll.hpp b/include/nana/gui/widgets/scroll.hpp index 25a952f9..7c09b74b 100644 --- a/include/nana/gui/widgets/scroll.hpp +++ b/include/nana/gui/widgets/scroll.hpp @@ -185,7 +185,7 @@ namespace nana return false; } private: - void attached(widget_reference widget, graph_reference graph) + void attached(widget_reference widget, graph_reference graph) override { graph_ = &graph; widget_ = static_cast< ::nana::scroll*>(&widget); @@ -195,12 +195,12 @@ namespace nana timer_.elapse(std::bind(&trigger::_m_tick, this)); } - void detached() + void detached() override { graph_ = nullptr; } - void refresh(graph_reference graph) + void refresh(graph_reference graph) override { drawer_.draw(graph, metrics_.what); } @@ -218,7 +218,7 @@ namespace nana API::lazy_refresh(); } - void mouse_move(graph_reference graph, const ::nana::arg_mouse& arg) + void mouse_move(graph_reference graph, const ::nana::arg_mouse& arg) override { bool redraw = false; if(metrics_.pressed && (metrics_.what == buttons::scroll)) @@ -245,7 +245,7 @@ namespace nana } } - void mouse_down(graph_reference graph, const arg_mouse& arg) + void mouse_down(graph_reference graph, const arg_mouse& arg) override { if(arg.left_button) { @@ -280,7 +280,7 @@ namespace nana } } - void mouse_up(graph_reference graph, const arg_mouse& arg) + void mouse_up(graph_reference graph, const arg_mouse& arg) override { timer_.stop(); @@ -292,7 +292,7 @@ namespace nana API::lazy_refresh(); } - void mouse_leave(graph_reference graph, const arg_mouse&) + void mouse_leave(graph_reference graph, const arg_mouse&) override { if(metrics_.pressed) return; @@ -301,7 +301,7 @@ namespace nana API::lazy_refresh(); } - void mouse_wheel(graph_reference graph, const arg_wheel& arg) + void mouse_wheel(graph_reference graph, const arg_wheel& arg) override { if(make_step(arg.upwards == false, 3)) { diff --git a/include/nana/gui/widgets/skeletons/text_token_stream.hpp b/include/nana/gui/widgets/skeletons/text_token_stream.hpp index 869bff8e..024c12ce 100644 --- a/include/nana/gui/widgets/skeletons/text_token_stream.hpp +++ b/include/nana/gui/widgets/skeletons/text_token_stream.hpp @@ -45,9 +45,7 @@ namespace nana{ namespace widgets{ namespace skeletons tokenizer(const nana::string& s, bool format_enabled) : iptr_(s.data()), endptr_(s.data() + s.size()), - format_enabled_(format_enabled), - format_state_(false), - revert_token_(token::eof) + format_enabled_(format_enabled) { } @@ -414,17 +412,14 @@ namespace nana{ namespace widgets{ namespace skeletons } } private: - const nana::char_t * iptr_; - const nana::char_t * endptr_; + const ::nana::char_t * iptr_; + const ::nana::char_t * endptr_; const bool format_enabled_; - bool format_state_; + bool format_state_{false}; - nana::string idstr_; + ::nana::string idstr_; std::pair binary_; - - std::size_t whspace_size_; - - token revert_token_; + token revert_token_{token::eof}; }; //The fblock states a format, and a format from which it is inherted @@ -528,7 +523,7 @@ namespace nana{ namespace widgets{ namespace skeletons { public: data_image(const nana::string& imgpath, const nana::size & sz, std::size_t limited) - : image_(imgpath), limited_(limited) + : image_(imgpath)//, limited_(limited) { size_ = image_.size(); @@ -597,7 +592,6 @@ namespace nana{ namespace widgets{ namespace skeletons nana::string str_; nana::paint::image image_; nana::size size_; - std::size_t limited_; }; class dstream @@ -927,7 +921,6 @@ namespace nana{ namespace widgets{ namespace skeletons } private: - bool format_enabled_; std::vector fblocks_; std::list > lines_; diff --git a/include/nana/gui/widgets/treebox.hpp b/include/nana/gui/widgets/treebox.hpp index ee5408e5..4d8748eb 100644 --- a/include/nana/gui/widgets/treebox.hpp +++ b/include/nana/gui/widgets/treebox.hpp @@ -416,8 +416,6 @@ namespace nana /// Determinte whether the checkbox is enabled. bool checkable() const; - treebox& icon(const nana::string& id, const node_image_type& node_img); - node_image_type& icon(const nana::string& id) const; void icon_erase(const nana::string& id); diff --git a/include/nana/gui/widgets/widget.hpp b/include/nana/gui/widgets/widget.hpp index 70aacb25..3a28d3bb 100644 --- a/include/nana/gui/widgets/widget.hpp +++ b/include/nana/gui/widgets/widget.hpp @@ -212,7 +212,7 @@ namespace nana } } - general_events& _m_get_general_events() const + general_events& _m_get_general_events() const override { return *events_; } @@ -295,7 +295,7 @@ namespace nana } } - general_events& _m_get_general_events() const + general_events& _m_get_general_events() const override { return *events_; } @@ -440,7 +440,7 @@ namespace nana API::dev::attach_drawer(*this, trigger_); } - general_events& _m_get_general_events() const + general_events& _m_get_general_events() const override { return *events_; } @@ -532,7 +532,7 @@ namespace nana } } - general_events& _m_get_general_events() const + general_events& _m_get_general_events() const override { return *events_; } diff --git a/include/nana/internationalization.hpp b/include/nana/internationalization.hpp index 4c9942af..341c8e97 100644 --- a/include/nana/internationalization.hpp +++ b/include/nana/internationalization.hpp @@ -127,7 +127,7 @@ namespace nana class arg_eval; template - class arg_function + class arg_function: public eval_arg { public: arg_function(std::function fn) @@ -208,4 +208,4 @@ namespace nana };//end class i18n_eval; } -#endif//NANA_I18N_HPP \ No newline at end of file +#endif//NANA_I18N_HPP diff --git a/source/gui/widgets/date_chooser.cpp b/source/gui/widgets/date_chooser.cpp index 7ef18a10..bb0cede5 100644 --- a/source/gui/widgets/date_chooser.cpp +++ b/source/gui/widgets/date_chooser.cpp @@ -53,7 +53,7 @@ namespace nana void trigger::week_name(unsigned index, const nana::string& str) { - if(0 <= index && index < 7) + if(index < 7) this->weekstr_[index] = str; } diff --git a/source/gui/widgets/skeletons/text_editor.cpp b/source/gui/widgets/skeletons/text_editor.cpp index 435e407e..f8ffa7f0 100644 --- a/source/gui/widgets/skeletons/text_editor.cpp +++ b/source/gui/widgets/skeletons/text_editor.cpp @@ -643,7 +643,7 @@ namespace nana{ namespace widgets pre_calc_line(i, pixels); } - std::size_t take_lines() const + std::size_t take_lines() const override { std::size_t lines = 0; for (auto & mtr : linemtr_) @@ -652,7 +652,7 @@ namespace nana{ namespace widgets return lines; } - std::size_t take_lines(std::size_t pos) const + std::size_t take_lines(std::size_t pos) const override { return (pos < linemtr_.size() ? linemtr_[pos].take_lines : 0); } diff --git a/source/gui/widgets/treebox.cpp b/source/gui/widgets/treebox.cpp index fdae39c5..1c14b6c2 100644 --- a/source/gui/widgets/treebox.cpp +++ b/source/gui/widgets/treebox.cpp @@ -29,53 +29,138 @@ namespace nana { typedef trigger::node_type node_type; - bool no_sensitive_compare(const nana::string& text, const nana::char_t *pattern, std::size_t len) + bool no_sensitive_compare(const nana::string& text, const nana::char_t *pattern, std::size_t len) + { + if(len <= text.length()) { - if(len <= text.length()) + const nana::char_t * s = text.c_str(); + for(std::size_t i = 0; i < len; ++i) { - const nana::char_t * s = text.c_str(); - for(std::size_t i = 0; i < len; ++i) + if('a' <= s[i] && s[i] <= 'z') { - if('a' <= s[i] && s[i] <= 'z') - { - if(pattern[i] != s[i] - ('a' - 'A')) - return false; - } - else - if(pattern[i] != s[i]) return false; + if(pattern[i] != s[i] - ('a' - 'A')) + return false; } - return true; + else + if(pattern[i] != s[i]) return false; + } + return true; + } + return false; + } + + const node_type* find_track_child_node(const node_type* node, const node_type * end, const nana::char_t* pattern, std::size_t len, bool &finish) + { + if(node->value.second.expanded) + { + node = node->child; + while(node) + { + if(no_sensitive_compare(node->value.second.text, pattern, len)) return node; + + if(node == end) break; + + if(node->value.second.expanded) + { + auto t = find_track_child_node(node, end, pattern, len, finish); + if(t || finish) + return t; + } + node = node->next; } - return false; } - const node_type* find_track_child_node(const node_type* node, const node_type * end, const nana::char_t* pattern, std::size_t len, bool &finish) + finish = (node && (node == end)); + return nullptr; + } + + class tlwnd_drawer + : public drawer_trigger, public compset_interface + { + public: + typedef drawer_trigger::graph_reference graph_reference; + + void assign(const item_attribute_t & item_attr, const pat::cloneable* renderer, const pat::cloneable * compset_placer) { - if(node->value.second.expanded) + if(renderer && compset_placer) { - node = node->child; + renderer_ = *renderer; + placer_ = *compset_placer; - while(node) - { - if(no_sensitive_compare(node->value.second.text, pattern, len)) return node; + item_attr_ = item_attr; - if(node == end) break; - - if(node->value.second.expanded) - { - auto t = find_track_child_node(node, end, pattern, len, finish); - if(t || finish) - return t; - } - node = node->next; - } + _m_draw(); } + } + private: + void _m_draw() + { + item_r_.x = item_r_.y = 0; + item_r_.width = placer_->item_width(*this->graph_, item_attr_); + item_r_.height = placer_->item_height(*this->graph_); - finish = (node && (node == end)); - return nullptr; + comp_attribute_t attr; + if(comp_attribute(component::text, attr)) + { + nana::paint::graphics item_graph(item_r_.width, item_r_.height); + item_graph.typeface(graph_->typeface()); + + auto bgcolor = widget_->background(); + auto fgcolor = widget_->foreground(); + renderer_->bground(item_graph, bgcolor, fgcolor, this); + renderer_->expander(item_graph, bgcolor, fgcolor, this); + renderer_->crook(item_graph, bgcolor, fgcolor, this); + renderer_->icon(item_graph, bgcolor, fgcolor, this); + renderer_->text(item_graph, bgcolor, fgcolor, this); + + item_graph.paste(attr.area, *graph_, 1, 1); + graph_->rectangle(0x0, false); + } + } + private: + // Implementation of drawer_trigger + void attached(widget_reference wd, graph_reference graph) override + { + widget_ = &wd; + graph_ = &graph; + graph.typeface(widget_->typeface()); + } + private: + // Implementation of compset_interface + virtual const item_attribute_t& item_attribute() const override + { + return item_attr_; } - class tooltip_window; + virtual bool comp_attribute(component_t comp, comp_attribute_t& comp_attr) const override + { + comp_attr.area = item_r_; + return placer_->locate(comp, item_attr_, &comp_attr.area); + } + private: + ::nana::paint::graphics * graph_; + ::nana::pat::cloneable renderer_; + ::nana::pat::cloneable placer_; + widget *widget_; + item_attribute_t item_attr_; + nana::rectangle item_r_; + };//end class tlwnd_drawer + + class tooltip_window + : public widget_object + { + public: + tooltip_window(window wd, const rectangle& r) + : widget_object(wd, false, rectangle(r).pare_off(-1), appear::bald()) + { + API::take_active(handle(), false, nullptr); + } + + drawer_trigger_t & impl() + { + return get_drawer_trigger(); + } + };//end class tooltip_window //item_locator should be defined before the definition of basic_implement class trigger::item_locator @@ -1456,7 +1541,6 @@ namespace nana } };//end class tooltip_window - //class trigger //struct treebox_node_type trigger::treebox_node_type::treebox_node_type() diff --git a/source/paint/image.cpp b/source/paint/image.cpp index 8385fd10..ec471d6a 100644 --- a/source/paint/image.cpp +++ b/source/paint/image.cpp @@ -1,6 +1,7 @@ /* * Paint Image Implementation - * Copyright(C) 2003-2013 Jinhao(cnjinhao@hotmail.com) + * Nana C++ Library(http://www.nanapro.org) + * 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 @@ -62,6 +63,8 @@ namespace paint ::DeleteObject(info.hbmMask); return true; } +#else + if(is_ico_){} //kill the unused compiler warning in Linux. #endif return false; } diff --git a/source/unicode_bidi.cpp b/source/unicode_bidi.cpp index 889e7c4c..ab90f538 100644 --- a/source/unicode_bidi.cpp +++ b/source/unicode_bidi.cpp @@ -958,8 +958,7 @@ namespace nana unsigned level_of_run = begin_character->level; bool head_of_run = true; - std::vector::iterator last = end - 1; - std::vector::iterator begin_neutral = end; + auto begin_neutral = end; //N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. //European and Arabic numbers act as if they were R in terms of their influence on neutrals.