From a00137a7d8fe936e61c1f91bc229806208a34243 Mon Sep 17 00:00:00 2001 From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de> Date: Thu, 29 Feb 2024 08:09:50 +0100 Subject: [PATCH] qcustomplot updated to 2.1.1 of nov22 --- 3rdparty/GUI/qcustomplot/GPL.txt | 674 ----------------------- 3rdparty/GUI/qcustomplot/changelog.txt | 629 +++++++++++++++++++++ 3rdparty/GUI/qcustomplot/qcustomplot.cpp | 207 ++++--- 3rdparty/GUI/qcustomplot/qcustomplot.h | 219 +++++--- 4 files changed, 878 insertions(+), 851 deletions(-) delete mode 100644 3rdparty/GUI/qcustomplot/GPL.txt create mode 100755 3rdparty/GUI/qcustomplot/changelog.txt diff --git a/3rdparty/GUI/qcustomplot/GPL.txt b/3rdparty/GUI/qcustomplot/GPL.txt deleted file mode 100644 index 94a9ed024d3..00000000000 --- a/3rdparty/GUI/qcustomplot/GPL.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/3rdparty/GUI/qcustomplot/changelog.txt b/3rdparty/GUI/qcustomplot/changelog.txt new file mode 100755 index 00000000000..de330e7548e --- /dev/null +++ b/3rdparty/GUI/qcustomplot/changelog.txt @@ -0,0 +1,629 @@ +#### Version 2.1.1 released on 06.11.22 #### + +Added features: + - Qt6.4 Compatibility + +Bugfixes: + - dynamically changing device pixel ratios (e.g. when moving between different DPI screens) is handled properly + - bugfix Colormap autoscaling: recalculateDataBounds() if (0, 0) data point is NaN. + - minor bugfix in getMantissa for certain values due to rounding errors + - Graphs with line style lsImpulse properly ignore NaN data points + - fixed issue where QCP wasn't greyed out together with the rest of the UI on embedded systems when a modal dialog is shown + (QCustomPlot no longer has the Qt::WA_OpaquePaintEvent attribute enabled by default) + +Other: + - in QCPAxisPainterPrivate::getTickLabelData, don't use fixed 'e', but locale aware character of parent plot locale + - Axis rescaling now ignores +/- Inf in data values + - slight performance improvements of QCPColorMap colorization and fills. + +#### Version 2.1.0 released on 29.03.21 #### + +Added features: + - Compatibility up to Qt 6.0 + - Tech Preview: Radial Plots (see setupPolarPlotDemo in examples project) + - QCPAxisTickerDateTime can now be configured with a QTimeZone for adjusting the label display to arbitrary time zones + - QCPColorGradient (and thus also QCPColorMap) now has explicit configurable NaN handling (see QCPColorGradient::setNanHandling) + - added timing/benchmarking method QCustomPlot::replotTime(bool average) which returns the milliseconds per replot + - QCustomPlot::plottableAt has an optional output parameter dataIndex, providing the index of the data point at the probed position + - QCustomPlot::plottableAt<T> template method allows limiting the search to the specified QCPAbstractPlottable subclass T + - QCustomPlot::itemAt<T> template method allows limiting the search to the specified QCPAbstractItem subclass T + - Added Interaction flag QCP::iSelectPlottablesBeyondAxisRect, allows selection of data points very close to (and beyond of) the axes + - QCPAxisTickerDateTime::dateTimeToKey(QDate &) now also takes a TimeSpec to specify the interpretation of the start-of-day + - QCPAxisTickerLog now switches to linear ticks if zoomed in beyond where logarithmic ticks are reasonable + - Added QCustomPlot::afterLayout signal, for user code that crucially depends on layout sizes/positions, right before the draw step during a replot + +Bugfixes: + - Fixed bug where QCPLayer::replot wouldn't issue full replot even though invalidated buffers existed + - Fixed QCPCurve bug causing rendering artifacts when using keys/values smaller than about 1e-12 in some constellations + - Fixed getValueRange when used with explicit keyRange, now doesn't use key range expanded by one point to each side anymore + - Fixed bug of QCPAxis tick label font size change only propagating to the layout after second call to replot + - Fixed bug of QCPTextElement not respecting the configured text alignment flag (setTextFlags) + - Various documentation typos and improvements + +Other: + - QCP Now requires C++11. However, Qt4.6 compatibility is maintained in the QCP 2.x release series + - QCPColorScale is now initialized with gpCold gradient preset, which prevents color maps turning black when linking them to a default-created color scale without explicitly setting a gradient + - QCPLegend::clearItems is now faster in case of many legend items (>1000) + - Modernized expressions and thereby avoided some warnings (e.g. nullptr and casts) + - Switched to foreach (Qt macro) where possible (in preparation for switch to range-based for (C++11), soonest at next major release) + - Work around Qt bug, drawing lines with pen width 1 as slow as with pen widths > 1 (polyfill instead of line algorithm, also on Normal-DPI), by using pen width 0 in such cases. + - Added QCP::Interaction flag iNone=0x000 to allow explicitly specifying no interaction (Avoids QFlags::zero, which was deprecated in Qt5.14) + - QCP is now compatible with defines QT_USE_QSTRINGBUILDER, QT_USE_FAST_CONCATENATION (Qt<4.8), QT_USE_FAST_OPERATOR_PLUS (Qt<4.8) + +#### Version 2.0.1 released on 25.06.18 #### + +Bugfixes: + - Default filling order of QCPLayoutGrid is now foColumnsFirst instead of foRowsFirst, as intended and consistent with QCP1. + Note that this also changes the indexing order of e.g. QCustomPlot::axisRect(int index), compared with 2.0.0. You can change + the filling and thus indexing order yourself by calling QCPLayoutGrid::setFillOrder. + - fixed bug in QCPColorMap, when using alpha in the gradient color stops. Used to draw falsely black data points when the associated data value is exactly + on the first or last color stop. + - QCPDataSelection::enforceType(stDataRange) would erroneously add an empty data range to the selection, if the selection was already empty. + This in turn would cause isEmpty() to erroneously return false. + - fixed hypothetical crash when selectTest is called on a QCPItemCurve which has all of its points at the same position + +Other: + - Various documentation improvements and clarifications + - Prevent conflict with windows.h min/max macros if user forgets to define NOMINMAX + - compiling QCP shared libraries with static Qt is now easier + - added defines QCUSTOMPLOT_VERSION and QCUSTOMPLOT_VERSION_STR (the same way Qt does) to provide the used QCP version number + - added missing Q_DECL_OVERRIDE declarations, thus preventing warnings some compiler settings + - QCPAxisTicker and subclasses are no longer copyable by value, as intended + - QCPBarsGroup constructor is now explicit, as intended + - Qt 5.11 compatibility + +#### Version 2.0.0 released on 04.09.17 #### + +Added major features: + - Axis tick and tick label generation was completely refactored and is now handled in the QCPAxisTicker class (also see QCPAxis::setTicker). Available ticker subclasses for special uses cases: + QCPAxisTicker, QCPAxisTickerFixed, QCPAxisTickerLog, QCPAxisTickerPi, QCPAxisTickerTime, QCPAxisTickerDateTime, QCPAxisTickerText + - Data container is now based on QCPDataContainer template for unified data interface and significantly improved memory footprint and better performance for common use-cases, especially data adding/removing. + - New data selection mechanism allows selection of single data points and data ranges for plottables. See special documentation page "data selection mechanism". + - Rubber band/selection rect for data point selection and axis zooming is now available, see documentation of QCustomPlot::setSelectionRectMode and QCPSelectionRect. For this purpose, the new default + layer "overlay" was introduced, which is now the top layer, and holds the QCustomPlot's QCPSelectionRect instance. + - Data sharing between plottables of the same type (see setData methods taking a QSharedPointer) + - OpenGL hardware acceleration is now available across all Qt versions (including Qt4) in a unified, simple interface, with QCustomPlot::setOpenGl (experimental) + - QCPStatisticalBox can now display a series of statistical boxes instead of only a single one + - New QCPErrorBars plottable allows attaching error bars to any one-dimensional plottable (QCPGraph has thus lost its own error-bar capability) + - QCPColorMap now supports transparency via alpha in its color gradient stops, and via a dedicated cell-wise alpha map (see QCPColorMapData::setAlpha) + - Layers may now be individually replotted (QCPLayer::replot), if the mode (QCPLayer::setMode) is set to lmBuffered. Mutually adjacent lmLogical layers share a single paint buffer to save resources. + By default, the new topmost "overlay" layer which contains the selection rect is an lmBuffered layer. Updating the selection rect is thus very fast, independent of the plot contents. + - QCPLayerable (and thus practically all objects in QCP) now have virtual methods to receive mouse press/move/release/doubleclick/wheel events. Before, only QCPLayoutElement provided them. + this makes it much easier to subclass e.g. items and plottables to provide custom mouse interactions that were cumbersome and awkward with the simpler signal-based interface + +Added minor features: + - High-DPI support for Qt versions 5.0 and up, using device pixel ratio detected by Qt (can be changed manually via QCustomPlot::setBufferDevicePixelRatio). + - QCPGraph and QCPCurve can now be configured to only display every n'th scatter symbol, see ::setScatterSkip() method + - QCPFinancial allows to define bar width in absolute pixels and axis rect ratio, instead of only in plot key coordinates (see QCPFinancial::setWidthType) + - Range dragging/zooming can now be configured to affect more than one axis per orientation (see new overloads of QCPAxisRect::setRangeDragAxes/setRangeZoomAxes) + - Added QCPTextElement (replaces QCPPlotTitle) for general texts in layouts. Provides clicked and doubleClicked signals, as replacement for the removed QCustomPlot::titleClicked/titleDoubleClicked + - Export functions (QCustomPlot::savePng etc.) now support specifying the resolution that will be written to the image file header. This improves operability with other tools which respect metadata. + - Replots can now be queued to the next event loop iteration with replot(QCP::rpQueuedReplot). This way you can successively ask for a replot at multiple code locations without causing redundant replots + - QCPAxisRect::zoom(...) allows to zoom to a specific rectangular region given in pixel coordinates, either affecting all axes or a specified subset of axes. + - QCPRange::bounded returns a bounded range, trying to preserve its size. Works with rangeChanged signal to limit the allowed range (see rangeChanged doc) + - Plottable rescaleValueAxis method (and getValueRange) now take parameter inKeyRange, which allows rescaling of the value axis only with respect to data in the currently visible key range + - plottableClick and plottableDoubleClick signals now carry the clicked data point index as second parameter + - Added QCPAxis::scaleRange overload without "center" argument, which scales around the current axis range center + - Added QCPRange::expand/expanded overloads which take only one double parameter + - Plottables addToLegend/removeFromLegend methods now have overloads that take any QCPLegend, to make working with non-default legends easier (legends that are not QCustomPlot::legend) + - Added QCPStatisticalBox::setWhiskerAntialiased to allow controlling antialiasing state of whiskers independently of quartile box/median line + - The virtual method QCPLayoutElement::layoutChanged() now allows subclasses to react on a move of the layout element between logical positions in the parent layout, or between layouts + - QCPMarginGroup::commonMargin is now virtual, to facilitate subclassing of QCPMarginGroup + - QCPGraph::getPreparedData is now virtual, and thus allows subclasses to easily generate own plotted data, e.g. on-the-fly. + - Added QCPRange qDebug stream operator + - QCPLayoutGrid (and thus QCPLegend) can now wrap rows or columns at specified row/column counts, see setFillOrder, setWrap and the new addElement overload which doesn't have row/column index +Added minor features after beta: + - QCPGraph fill now renders separate fill segments when there are gaps in the graph data (created by inserting NaN values) + - fractional device pixel ratios are now used, if Qt version >= 5.6 + - Axes may now be dragged/zoomed individually by starting the drag/zoom on top of the axis (previously, this required additional code) + - Manual minimum and maximum layout element sizes (setMinimumSize/setMaximumSize) can now affect the inner or the outer rect, see QCPLayoutElement::setSizeConstraintRect + +Bugfixes [Also backported to 1.3.2]: + - Fixed possible crash when having a QCPGraph with scatters only and a non-transparent main/fill brush of the graph + - Fixed QCPItemPixmap not updating internally cached scaled pixmap if new pixmap set with same scaled dimensions + - When using log axis scale and zooming out as far as possible (~1e-280..1e280), axis doesn't end up in (via mouse) unrecoverable range with strange axis ticks anymore + - Axis tick label algorithm for beautifully typeset powers now checks whether "e" in tick label is actually part of a number before converting the exponent to superscript + - Fixed QCustomPlot::moveLayer performing incorrect move and possible crash in certain situations + - Fixed possible crash on QCustomPlot destruction due to wrong QObject-hierarchy. Only occurs if a QCPAxisRect is removed from the normal QCustomPlot destruction hierarchy by taking it out of its layout + - Fixed possible freeze when data values become infinity after coord-to-pixel transformation (e.g. maximally zoomed out log axis), and line style is not solid (e.g. dashed) or phFastPolylines is disabled + - Fixed a few missing enums in meta type system, by unifying usage of Q_ENUMS, Q_FLAGS and Q_DECLARE_METATYPE +Bugfixes [Not in 1.3.2]: + - Fixed QCPItemLine/QCPItemStraightLine not being selectable when defining coords are many orders of magnitude (>1e8) larger than currently viewed range + - Fixed/worked around crash due to bug in QPainter::drawPixmap with very large negative x/y pixel coordinates, when drawing sparse pixmap scatters + - Fixed possible (but unlikely) int overflow in adaptive sampling algorithm, that could cause plot artifacts when using extremely sparse data (with respect to current key axis range). + - Fixed QCPBarsGroup bug which caused stPlotCoords spacing to be wrong with vertical key axes + - A QCPBars axis rescale in the main window constructor (i.e. without well-defined plot size) now falls back to a datapoint-tight rescaling instead of doing nothing (because bar width can't be determined) + - Improved QCPBars stacking when using bars with very large keys and key separation at limit of double precision +Bugfixes after beta: + - fixed QCPCurve vertex optimization algorithm not handling log axes correctly + - upon removing the inner most axis, the offset of the new inner most axis (previously second axis) is now set to the value of the removed axis, instead of leaving a gap + - QCPColorMap now has a default gradient (gpCold) again, instead of an empty and thus black gradient + - doc: black QCPColorMap/QCPColorGradient documentation images fixed + - scatter styles ssDiamond, ssTriangle and ssTriangleInverted now get proper filling with the specified brush + - fixed click signals of plottable/axes/etc. not being emitted properly + - fixed uninitialized scatterSkip on QCPCurve, leading to irregular default appearance of scatter skips + - fixed device pixel ratio not being implemented correctly in cached tick labels + - QCPLayoutElement::setMaximum/setMinimum now is with respect to the inner rect as intended (and documented), instead of the outer rect (and this can now be changed via setSizeConstraintRect) + - fixed dllimport issue on template classes when compiling as shared library with MSVC + + +Summary of backward incompatible changes: + Plottable related: + - Removed QCustomPlot::addPlottable, not needed anymore as plottables now automatically register in their constructor + - Removed QCustomPlot::addItem, not needed anymore as items now automatically register in their constructor + - QCPAbstractPlottable::addToLegend/removeFromLegend are not virtual anymore. If your plottable requires a custom legend item, add it to the legend manually. + - setData/addData method overloads of plottables have changed to facilitate data sharing and new data container (see documentation) + - plottableClick and plottableDoubleClick signals now carry the clicked data point index as second parameter, and the QMouseEvent parameter has moved to third. + Check all your usages of those signals, because Qt's connect method only reports problems during runtime! + - setSelectable now not only limits what can be selected by the user, but limits also any programmatic selection changes via setSelected. + - enum QCPAbstractPlottable::SignDomain has changed namespace to QCP::SignDomain + Axis related: + - Removed QCPAxis::setAutoTicks, setAutoTickCount, setAutoTickLabels, setAutoTickStep, setAutoSubTicks, setTickLabelType, setDateTimeFormat, setDateTimeSpec, + setTickStep, setTickVector, setTickVectorLabels, setSubTickCount in favor of new QCPAxisTicker-based interface + - Added QCPAxis::setSubTicks to enable/disable subticks (manually controlling the subtick count needs subclassing of QCPAxisTicker, e.g. QCPAxisTickerText and QCPAxisTickerLog provide setSubTickCount) + Item related: + - Renamed QCPAbstractItem::rectSelectTest to rectDistance, to prevent confusion with new QCPAbstractPlottable1D::selectTestRect + - Renamed QCPItemAnchor::pixelPoint to QCPItemAnchor::pixelPosition (also affects subclass QCPItemPosition) + General: + - Renamed QCustomPlot::RefreshPriority enums (parameter of the replot() method): rpImmediate to rpImmediateRefresh, rpQueued to rpQueuedRefresh, rpHint to rpRefreshHint + - Renamed QCustomPlot::PlottingHint enum phForceRepaint to phImmediateRefresh + - Removed QCPPlotTitle layout element (See new QCPTextElement for almost drop-in replacement) + - Removed signals QCustomPlot::titleClicked/titleDoubleClicked, replaced by QCPTextElement signals clicked/doubleClicked. + - QCustomPlot::savePdf has changed parameters from (fileName, bool noCosmeticPen, width, height,...) to (fileName, width, height, QCP::ExportPen exportPen,...) + - Virtual methods QCPLayoutElement::mouseMoveEvent/mouseReleaseEvent (which are now introduced already in the superclass QCPLayerable) have gained an additional parameter const QPointF &startPos. + If you have reimplemented these methods, make sure to update your function signatures, otherwise your reimplementations will likely be ignored by the compiler without warning + - Creating a new QCPColorGradient without supplying a preset parameter in the constructor now creates an empty gradient, instead of loading the gpCold preset + +Other: + - Replaced usage of Qt's QVector2D with own QCPVector2D which uses double precision and offers some convenience functions + - Extended relative range to which QCPItemLine/QCPItemStraightLine can be zoomed before vanishing from ~1e9 to ~1e16 + - Removed QCPItemStraightLine::distToStraightLine (replaced by QCPVector2D::distanceToStraightLine) + - Removed QCPAbstractPlottable::distSqrToLine and QCPAbstractItem::distSqrToLine (replaced by QCPVector2D::distanceSquaredToLine) + - Qt5.5 compatibility (If you use PDF export, test your outputs, as output dimensions might change when switching Qt versions -- QCP does not try to emulate previous Qt version behaviour here) + - QCP now includes <QtPrintSupport/QtPrintSupport> instead of just <QtPrintSupport> because some users had problems with the latter. Please report if you now experience issues due to the new include. + - QCPGraph can now use a brush (filled polygon under the graph data) without having a graph line (line style lsNone) + - QCPFinancial is now two-colored (setTwoColored(true)) by default, and has green/red as default two-colored brushes and pens + - Plottable pixelsToCoords/coordsToPixels methods are now public, and offer transformations from pixel to plot coordinates and vice versa, using the plottable's axes + - Plottable getKeyRange/getValueRange methods are now public + - QCPBarsGroup now always places the QCPBars that was added to the group first towards lower keys, independent of axis orientation or direction (the ordering used to flip with axis orientation) + - Default focus policy for QCustomPlot is now Qt::ClickFocus, instead of Qt::NoFocus. + - tweaked QCPLegend and QCPAbstractLegendItem margins: The items have by default zero own margins, and QCPLegend row- and column spacing was increased to compensate. Legend was made slightly denser by default. + - Used doxygen version is now 1.8.12, and documentation/postprocessing-scripts were adapted accordingly. Expect minor issues and some warnings when using older doxygen. +Other after beta: + - Integrated OpenGL support (QCustomPlot::setOpenGl) is experimental for now, due the strong dependency on the system/graphics driver of the current implementation + - fixed some plot title font sizes in the example projects that were too small due to switch to QCPTextElement + - added missing override specifiers on reimplemented virtual methods + - changed to more intuitive defaults for QCPSelectionDecorator scatter style (now doesn't define an own scatter pen by default) + +#### Version 1.3.2 released on 22.12.15 #### + + Bugfixes [Backported from 2.0.0 branch]: + - Fixed possible crash when having a QCPGraph with scatters only and a non-transparent main/fill brush of the graph + - Fixed QCPItemPixmap not updating internally cached scaled pixmap if new pixmap set with same scaled dimensions + - When using log axis scale and zooming out as far as possible (~1e-280..1e280), axis doesn't end up in (via mouse) unrecoverable range with strange axis ticks anymore + - Axis tick label algorithm for beautifully typeset powers now checks whether "e" in tick label is actually part of a number before converting the exponent to superscript + - Fixed QCustomPlot::moveLayer performing incorrect move and possible crash in certain situations + - Fixed possible crash on QCustomPlot destruction due to wrong QObject-hierarchy. Only occurs if a QCPAxisRect is removed from the normal QCustomPlot destruction hierarchy by taking it out of its layout + - Fixed possible freeze when data values become infinity after coord-to-pixel transformation (e.g. maximally zoomed out log axis), and line style is not solid (e.g. dashed) or phFastPolylines is disabled + + Other [Backported from 2.0.0 branch]: + - A few documentation fixes/improvements + - Qt5.5 compatibility (If you use PDF export, test your outputs, as output dimensions might change when switching Qt versions -- QCP does not try to emulate previous Qt version behaviour here) + - QCP now includes <QtPrintSupport/QtPrintSupport> instead of just <QtPrintSupport> because some users had problems with the latter. Please report if you now experience issues due to the new include. + +#### Version 1.3.1 released on 25.04.15 #### + + Bugfixes: + - Fixed bug that prevented automatic axis rescaling when some graphs/curves had only NaN data points + - Improved QCPItemBracket selection boundaries, especially bsCurly and bsCalligraphic + - Fixed bug of axis rect and colorscale background shifted downward by one logical pixel (visible in scaled png and pdf export) + - Replot upon mouse release is now only performed if a selection change has actually happened (improves responsivity on particularly complex plots) + - Fixed bug that allowed scatter-only graphs to be selected by clicking the non-existent line between scatters + - Fixed crash when trying to select a scatter-only QCPGraph whose only points in the visible key range are at identical key coordinates and vertically off-screen, with adaptive sampling enabled + - Fixed pdf export of QCPColorMap with enabled interpolation (didn't appear interpolated in pdf) + - Reduced QCPColorMap jitter of internal cell boundaries for small sized maps when viewed with high zoom, by applying oversampling factors dependant on map size + - Fixed bug of QCPColorMap::fill() not causing the buffered internal image map to be updated, and thus the change didn't become visible immediately + - Axis labels with size set in pixels (setPixelSize) instead of points now correctly calculate the exponent's font size if beautifully typeset powers are enabled + - Fixed QCPColorMap appearing at the wrong position for logarithmic axes and color map spanning larger ranges + + Other: + - Pdf export used to embed entire QCPColorMaps, potentially leading to large files. Now only the visible portion of the map is embedded in the pdf + - Many documentation fixes and extensions, style modernization + - Reduced documentation file size (and thus full package size) by automatically reducing image palettes during package build + - Fixed MSVC warning message (at warning level 4) due to temporary QLists in some foreach statements + +#### Version 1.3.0 released on 27.12.14 #### + + Added features: + - New plottable class QCPFinancial allows display of candlestick/ohlc data + - New class QCPBarsGroup allows horizontal grouping of multiple QCPBars plottables + - Added QCPBars feature allowing non-zero base values (see property QCPBars::setBaseValue) + - Added QCPBars width type, for more flexible bar widths (see property QCPBars::setWidthType) + - New QCPCurve optimization algorithm, fixes bug which caused line flicker at deep zoom into curve segment + - Item positions can now have different position types and anchors for their x and y coordinates (QCPItemPosition::setTypeX/Y, setParentAnchorX/Y) + - QCPGraph and QCPCurve can now display gaps in their lines, when inserting quiet NaNs as values (std::numeric_limits<double>::quiet_NaN()) + - QCPAxis now supports placing the tick labels inside the axis rect, for particularly space saving plots (QCPAxis::setTickLabelSide) + Added features after beta: + - Made code compatible with QT_NO_CAST_FROM_ASCII, QT_NO_CAST_TO_ASCII + - Added compatibility with QT_NO_KEYWORDS after sending code files through a simple reg-ex script + - Added possibility to inject own QCPAxis(-subclasses) via second, optional QCPAxisRect::addAxis parameter + - Added parameter to QCPItemPixmap::setScaled to specify transformation mode + + Bugfixes: + - Fixed bug in QCPCurve rendering of very zoomed-in curves (via new optimization algorithm) + - Fixed conflict with MSVC-specific keyword "interface" in text-document-integration example + - Fixed QCPScatterStyle bug ignoring the specified pen in the custom scatter shape constructor + - Fixed bug (possible crash) during QCustomPlot teardown, when a QCPLegend that has no parent layout (i.e. was removed from layout manually) gets deleted + Bugfixes after beta: + - Fixed bug of QCPColorMap/QCPColorGradient colors being off by one color sampling step (only noticeable in special cases) + - Fixed bug of QCPGraph adaptive sampling on vertical key axis, causing staggered look + - Fixed low (float) precision in QCPCurve optimization algorithm, by not using QVector2D anymore + + Other: + - Qt 5.3 and Qt 5.4 compatibility + +#### Version 1.2.1 released on 07.04.14 #### + + Bugfixes: + - Fixed regression which garbled date-time tick labels on axes, if setTickLabelType is ltDateTime and setNumberFormat contains the "b" option + +#### Version 1.2.0 released on 14.03.14 #### + + Added features: + - Adaptive Sampling for QCPGraph greatly improves performance for high data densities (see QCPGraph::setAdaptiveSampling) + - QCPColorMap plottable with QCPColorScale layout element allows plotting of 2D color maps + - QCustomPlot::savePdf now has additional optional parameters pdfCreator and pdfTitle to set according PDF metadata fields + - QCustomPlot::replot now allows specifying whether the widget update is immediate (repaint) or queued (update) + - QCPRange operators +, -, *, / with double operand for range shifting and scaling, and ==, != for range comparison + - Layers now have a visibility property (QCPLayer::setVisible) + - static functions QCPAxis::opposite and QCPAxis::orientation now offer more convenience when handling axis types + - added notification signals for selectability change (selectableChanged) on all objects that have a selected/selectable property + - added notification signal for QCPAxis scaleType property + - added notification signal QCPLayerable::layerChanged + + Bugfixes: + - Fixed assert halt, when QCPAxis auto tick labels not disabled but nevertheless a custom non-number tick label ending in "e" given + - Fixed painting glitches when QCustomPlot resized inside a QMdiArea or under certain conditions inside a QLayout + - If changing QCPAxis::scaleType and thus causing range sanitizing and a range modification, rangeChanged wouldn't be emitted + - Fixed documentation bug that caused indentation to be lost in code examples + Bugfixes after beta: + - Fixed bug that caused crash if clicked-on legend item is removed in mousePressEvent. + - On some systems, font size defaults to -1, which used to cause a debug output in QCPAxisPainterPrivate::TickLabelDataQCP. Now it's checked before setting values based on the default font size. + - When using multiple axes on one side, setting one to invisible didn't properly compress the freed space. + - Fixed bug that allowed selection of plottables when clicking in the bottom or top margin of a QCPAxisRect (outside the inner rect) + + Other: + - In method QCPAbstractPlottable::getKeyRange/getValueRange, renamed parameter "validRange" to "foundRange", to better reflect its meaning (and contrast it from QCPRange::validRange) + - QCPAxis low-level axis painting methods exported to QCPAxisPainterPrivate + +#### Version 1.1.1 released on 09.12.13 #### + + Bugfixes: + - Fixed bug causing legends blocking input events from reaching underlying axis rect even if legend is invisible + - Added missing Q_PROPERTY for QCPAxis::setDateTimeSpec + - Fixed behaviour of QCPAxisRect::setupFullAxesBox (now transfers more properties from bottom/left to top/right axes and sets visibility of bottom/left axes to true) + - Made sure PDF export doesn't default to grayscale output on some systems + + Other: + - Plotting hint QCP::phForceRepaint is now enabled on all systems (and not only on windows) by default + - Documentation improvements + +#### Version 1.1.0 released on 04.11.13 #### + + Added features: + - Added QCPRange::expand and QCPRange::expanded + - Added QCPAxis::rescale to rescale axis to all associated plottables + - Added QCPAxis::setDateTimeSpec/dateTimeSpec to allow axis labels either in UTC or local time + - QCPAxis now additionally emits a rangeChanged signal overload that provides the old range as second parameter + + Bugfixes: + - Fixed QCustomPlot::rescaleAxes not rescaling properly if first plottable has an empty range + - QCPGraph::rescaleAxes/rescaleKeyAxis/rescaleValueAxis are no longer virtual (never were in base class, was a mistake) + - Fixed bugs in QCPAxis::items and QCPAxisRect::items not properly returning associated items and potentially stalling + + Other: + - Internal change from QWeakPointer to QPointer, thus got rid of deprecated Qt functionality + - Qt5.1 and Qt5.2 (beta1) compatibility + - Release packages now extract to single subdirectory and don't place multiple files in current working directory + +#### Version 1.0.1 released on 05.09.13 #### + + Bugfixes: + - using define flag QCUSTOMPLOT_CHECK_DATA caused debug output when data was correct, instead of invalid (fixed QCP::isInvalidData) + - documentation images are now properly shown when viewed with Qt Assistant + - fixed various documentation mistakes + + Other: + - Adapted documentation style sheet to better match Qt5 documentation + +#### Version 1.0.0 released on 01.08.13 #### + + Quick Summary: + - Layout system for multiple axis rects in one plot + - Multiple axes per side + - Qt5 compatibility + - More flexible and consistent scatter configuration with QCPScatterStyle + - Various interface cleanups/refactoring + - Pixmap-cached axis labels for improved replot performance + + Changes that break backward compatibility: + - QCustomPlot::axisRect() changed meaning due to the extensive changes to how axes and axis rects are handled + it now returns a pointer to a QCPAxisRect and takes an integer index as parameter. + - QCPAxis constructor changed to now take QCPAxisRect* as parent + - setAutoMargin, setMarginLeft/Right/Top/Bottom removed due to the axis rect changes (see QCPAxisRect::setMargins/setAutoMargins) + - setAxisRect removed due to the axis rect changes + - setAxisBackground(-Scaled/-ScaledMode) now moved to QCPAxisRect as setBackground(-Scaled/ScaledMode) (access via QCustomPlot::axisRects()) + - QCPLegend now is a QCPLayoutElement + - QCPAbstractPlottable::drawLegendIcon parameter "rect" changed from QRect to QRectF + - QCPAbstractLegendItem::draw second parameter removed (position/size now handled via QCPLayoutElement base class) + - removed QCPLegend::setMargin/setMarginLeft/Right/Top/Bottom (now inherits the capability from QCPLayoutElement::setMargins) + - removed QCPLegend::setMinimumSize (now inherits the capability from QCPLayoutElement::setMinimumSize) + - removed enum QCPLegend::PositionStyle, QCPLegend::positionStyle/setPositionStyle/position/setPosition (replaced by capabilities of QCPLayoutInset) + - QCPLegend transformed to work with new layout system (almost everything changed) + - removed entire title interface: QCustomPlot::setTitle/setTitleFont/setTitleColor/setTitleSelected/setTitleSelectedFont/setTitleSelectedColor and + the QCustomPlot::iSelectTitle interaction flag (all functionality is now given by the layout element "QCPPlotTitle" which can be added to the plot layout) + - selectTest functions now take two additional parameters: bool onlySelectable and QVariant *details=0 + - selectTest functions now ignores visibility of objects and (if parameter onlySelectable is true) does not anymore ignore selectability of the object + - moved QCustomPlot::Interaction/Interactions to QCP namespace as QCP::Interaction/Interactions + - moved QCustomPlot::setupFullAxesBox() to QCPAxisRect::setupFullAxesBox. Now also accepts parameter to decide whether to connect opposite axis ranges + - moved range dragging/zooming interface from QCustomPlot to QCPAxisRect (setRangeDrag, setRangeZoom, setRangeDragAxes, setRangeZoomAxes,...) + - rangeDrag/Zoom is now set to Qt::Horizontal|Qt::Vertical instead of 0 by default, on the other hand, iRangeDrag/Zoom is unset in interactions by + default (this makes enabling dragging/zooming easier by just adding the interaction flags) + - QCPScatterStyle takes over everything related to handling scatters in all plottables + - removed setScatterPen/Size on QCPGraph and QCPCurve, removed setOutlierPen/Size on QCPStatisticalBox (now handled via QCPScatterStyle) + - modified setScatterStyle on QCPGraph and QCPCurve, and setOutlierStyle on QCPStatisticalBox, to take QCPScatterStyle + - axis grid and subgrid are now reachable via the QCPGrid *QCPAxis::grid() method. (e.g. instead of xAxis->setGrid(true), write xAxis->grid()->setVisible(true)) + + Added features: + - Axis tick labels are now pixmap-cached, thus increasing replot performance (in usual setups by about 24%). See plotting hint phCacheLabels which is set by default + - Advanced layout system, including the classes QCPLayoutElement, QCPLayout, QCPLayoutGrid, QCPLayoutInset, QCPAxisRect + - QCustomPlot::axisRects() returns all the axis rects in the QCustomPlot. + - QCustomPlot::plotLayout() returns the top level layout (initially a QCPLayoutGrid with one QCPAxisRect inside) + - QCPAxis now may have an offset to the axis rect (setOffset) + - Multiple axes per QCPAxisRect side are now supported (see QCPAxisRect::addAxis) + - QCustomPlot::toPixmap renders the plot into a pixmap and returns it + - When setting tick label rotation to +90 or -90 degrees on a vertical axis, the labels are now centered vertically on the tick height + (This allows space saving vertical tick labels by having the text direction parallel to the axis) + - Substantially increased replot performance when using very large manual tick vectors (> 10000 ticks) via QCPAxis::setTickVector + - QCPAxis and QCPAxisRect now allow easy access to all plottables(), graphs() and items() that are associated with them + - Added QCustomPlot::hasItem method for consistency with plottable interface, hasPlottable + - Added QCPAxisRect::setMinimumMargins as replacement for hardcoded minimum axis margin (15 px) when auto margin is enabled + - Added Flags type QCPAxis::AxisTypes (from QCPAxis::AxisType), used in QCPAxisRect interface + - Automatic margin calculation can now be enabled/disabled on a per-side basis, see QCPAxisRect::setAutoMargins + - QCPAxisRect margins of multiple axis rects can be coupled via QCPMarginGroup + - Added new default layers "background" and "legend" (QCPAxisRect draws its background on the "background" layer, QCPLegend is on the "legend" layer by default) + - Custom scatter style via QCP::ssCustom and respective setCustomScatter functions that take a QPainterPath + - Filled scatters via QCPScatterStyle::setBrush + Added features after beta: + - Added QCustomPlot::toPainter method, to allow rendering with existing painter + - QCPItemEllipse now provides a center anchor + + Bugfixes: + - Fixed compile error on ARM + - Wrong legend icons were displayed if using pixmaps for scatters that are smaller than the legend icon rect + - Fixed clipping inaccuracy for rotated tick labels (were hidden too early, because the non-rotated bounding box was used) + - Fixed bug that caused wrong clipping of axis ticks and subticks when the ticks were given manually by QCPAxis::setTickVector + - Fixed Qt5 crash when dragging graph out of view (iterator out of bounds in QCPGraph::getVisibleDataBounds) + - Fixed QCPItemText not scaling properly when using scaled raster export + Bugfixes after beta: + - Fixed bug that clipped the rightmost pixel column of tick labels when caching activated (only visible on windows for superscript exponents) + - Restored compatibility to Qt4.6 + - Restored support for -no-RTTI compilation + - Empty manual tick labels are handled more gracefully (no QPainter qDebug messages anymore) + - Fixed type ambiguity in QCPLineEnding::draw causing compile error on ARM + - Fixed bug of grid layouts not propagating the minimum size from their child elements to the parent layout correctly + - Fixed bug of child elements (e.g. axis rects) of inset layouts not properly receiving mouse events + + Other: + - Opened up non-amalgamated project structure to public via git repository + +#### Version released on 09.06.12 #### + + Quick Summary: + - Items (arrows, text,...) + - Layers (easier control over rendering order) + - New antialiasing system (Each objects controls own antialiasing with setAntialiased) + - Performance Improvements + - improved pixel-precise drawing + - easier shared library creation/usage + + Changes that (might) break backward compatibility: + - enum QCPGraph::ScatterSymbol was moved to QCP namespace (now QCP::ScatterSymbol). + This replace should fix your code: "QCPGraph::ss" -> "QCP::ss" + - enum QCustomPlot::AntialiasedElement and flag QCustomPlot::AntialiasedElements was moved to QCP namespace + This replace should fix your code: "QCustomPlot::ae" -> "QCP::ae" + - the meaning of QCustomPlot::setAntialiasedElements has changed slightly: It is now an override to force elements to be antialiased. If you want to force + elements to not be drawn antialiased, use the new setNotAntialiasedElements. If an element is mentioned in neither of those functions, it now controls + its antialiasing itself via its "setAntialiased" function(s). (e.g. QCPAxis::setAntialiased(bool), QCPAbstractPlottable::setAntialiased(bool), + QCPAbstractPlottable::setAntialiasedScatters(bool), etc.) + - QCPAxis::setTickVector and QCPAxis::setTickVectorLabels no longer take a pointer but a const reference of the respective QVector as parameter. + (handing over a pointer didn't give any noticeable performance benefits but was inconsistent with the rest of the interface) + - Equally QCPAxis::tickVector and QCPAxis::tickVectorLabels don't return by pointer but by value now + - QCustomPlot::savePngScaled was removed, its purpose is now included as optional parameter "scale" of savePng. + - If you have derived from QCPAbstractPlottable: all selectTest functions now consistently take the argument "const QPointF &pos" which is the test point in pixel coordinates. + (the argument there was "double key, double value" in plot coordinates, before). + - QCPAbstractPlottable, QCPAxis and QCPLegend now inherit from QCPLayerable + - If you have derived from QCPAbstractPlottable: the draw method signature has changed from "draw (..) const" to "draw (..)", i.e. the method + is not const anymore. This allows the draw function of your plottable to perform buffering/caching operations, if necessary. + + Added features: + - Item system: QCPAbstractItem, QCPItemAnchor, QCPItemPosition, QCPLineEnding. Allows placing of lines, arrows, text, pixmaps etc. + - New Items: QCPItemStraightLine, QCPItemLine, QCPItemCurve, QCPItemEllipse, QCPItemRect, QCPItemPixmap, QCPItemText, QCPItemBracket, QCPItemTracer + - QCustomPlot::addItem/itemCount/item/removeItem/selectedItems + - signals QCustomPlot::itemClicked/itemDoubleClicked + - the QCustomPlot interactions property now includes iSelectItems (for selection of QCPAbstractItem) + - QCPLineEnding. Represents the different styles a line/curve can end (e.g. different arrows, circle, square, bar, etc.), see e.g. QCPItemCurve::setHead + - Layer system: QCPLayerable, QCPLayer. Allows more sophisticated control over drawing order and a kind of grouping. + - QCPAbstractPlottable, QCPAbstractItem, QCPAxis, QCPGrid, QCPLegend are layerables and derive from QCPLayerable + - QCustomPlot::addLayer/moveLayer/removeLayer/setCurrentLayer/layer/currentLayer/layerCount + - Initially there are three layers: "grid", "main", and "axes". The "main" layer is initially empty and set as current layer, so new plottables/items are put there. + - QCustomPlot::viewport now makes the previously inaccessible viewport rect read-only-accessible (needed that for item-interface) + - PNG export now allows transparent background by calling QCustomPlot::setColor(Qt::transparent) before savePng + - QCPStatisticalBox outlier symbols may now be all scatter symbols, not only hardcoded circles. + - perfect precision of scatter symbol/error bar drawing and clipping in both antialiased and non-antialiased mode, by introducing QCPPainter + that works around some QPainter bugs/inconveniences. Further, more complex symbols like ssCrossSquare used to look crooked, now they look good. + - new antialiasing control system: Each drawing element now has its own "setAntialiased" function to control whether it is drawn antialiased. + - QCustomPlot::setAntialiasedElements and QCustomPlot::setNotAntialiasedElements can be used to override the individual settings. + - Subclasses of QCPAbstractPlottable can now use the convenience functions like applyFillAntialiasingHint or applyScattersAntialiasingHint to + easily make their drawing code comply with the overall antialiasing system. + - QCustomPlot::setNoAntialiasingOnDrag allows greatly improved performance and responsiveness by temporarily disabling all antialiasing while + the user is dragging axis ranges + - QCPGraph can now show scatter symbols at data points and hide its line (see QCPGraph::setScatterStyle, setScatterSize, setScatterPixmap, setLineStyle) + - Grid drawing code was sourced out from QCPAxis to QCPGrid. QCPGrid is mainly an internal class and every QCPAxis owns one. The grid interface still + works through QCPAxis and hasn't changed. The separation allows the grid to be drawn on a different layer as the axes, such that e.g. a graph can + be above the grid but below the axes. + - QCustomPlot::hasPlottable(plottable), returns whether the QCustomPlot contains the plottable + - QCustomPlot::setPlottingHint/setPlottingHints, plotting hints control details about the plotting quality/speed + - export to jpg and bmp added (QCustomPlot::saveJpg/saveBmp), as well as control over compression quality for png and jpg + - multi-select-modifier may now be specified with QCustomPlot::setMultiSelectModifier and is not fixed to Ctrl anymore + + Bugfixes: + - fixed QCustomPlot ignores replot after it had size (0,0) even if size becomes valid again + - on Windows, a repaint used to be delayed during dragging/zooming of a complex plot, until the drag operation was done. + This was fixed, i.e. repaints are forced after a replot() call. See QCP::phForceRepaint and setPlottingHints. + - when using the raster paintengine and exporting to scaled PNG, pen widths are now scaled correctly (QPainter bug workaround via QCPPainter) + - PDF export now respects QCustomPlot background color (QCustomPlot::setColor), also Qt::transparent + - fixed a bug on QCPBars and QCPStatisticalBox where auto-rescaling of axis would fail when all data is very small (< 1e-11) + - fixed mouse event propagation bug that prevented range dragging from working on KDE (GNU/Linux) + - fixed a compiler warning on 64-bit systems due to pointer cast to int instead of quintptr in a qDebug output + + Other: + - Added support for easier shared library creation (including examples for compiling and using QCustomPlot as shared library) + - QCustomPlot now has the Qt::WA_OpaquePaintEvent widget attribute (gives slightly improved performance). + - QCP::aeGraphs (enum QCP::AntialiasedElement, previously QCustomPlot::aeGraphs) has been marked deprecated since version 02.02.12 and + was now removed. Use QCP::aePlottables instead. + - optional performance-quality-tradeoff for solid graph lines (see QCustomPlot::setPlottingHints). + - marked data classes and QCPRange as Q_MOVABLE_TYPE + - replaced usage of own macro FUNCNAME with Qt macro Q_FUNC_INFO + - QCustomPlot now returns a minimum size hint of 50*50 + +#### Version released on 31.03.12 #### + + Changes that (might) break backward compatibility: + - QCPAbstractLegendItem now inherits from QObject + - mousePress, mouseMove and mouseRelease signals are now emitted before and not after any QCustomPlot processing (range dragging, selecting, etc.) + + Added features: + - Interaction system: now allows selecting of objects like plottables, axes, legend and plot title, see QCustomPlot::setInteractions documentation + - Interaction system for plottables: + - setSelectable, setSelected, setSelectedPen, setSelectedBrush, selectTest on QCPAbstractPlottable and all derived plottables + - setSelectionTolerance on QCustomPlot + - selectedPlottables and selectedGraphs on QCustomPlot (returns the list of currently selected plottables/graphs) + - Interaction system for axes: + - setSelectable, setSelected, setSelectedBasePen, setSelectedTickPen, setSelectedSubTickPen, setSelectedLabelFont, setSelectedTickLabelFont, + setSelectedLabelColor, setSelectedTickLabelColor, selectTest on QCPAxis + - selectedAxes on QCustomPlot (returns a list of the axes that currently have selected parts) + - Interaction system for legend: + - setSelectable, setSelected, setSelectedBorderPen, setSelectedIconBorderPen, setSelectedBrush, setSelectedFont, setSelectedTextColor, selectedItems on QCPLegend + - setSelectedFont, setSelectedTextColor, setSelectable, setSelected on QCPAbstractLegendItem + - selectedLegends on QCustomPlot + - Interaction system for title: + - setSelectedTitleFont, setSelectedTitleColor, setTitleSelected on QCustomPlot + - new signals in accordance with the interaction system: + - selectionChangedByUser on QCustomPlot + - selectionChanged on QCPAbstractPlottable + - selectionChanged on QCPAxis + - selectionChanged on QCPLegend and QCPAbstractLegendItem + - plottableClick, legendClick, axisClick, titleClick, plottableDoubleClick, legendDoubleClick, axisDoubleClick, titleDoubleClick on QCustomPlot + - QCustomPlot::deselectAll (deselects everything, i.e. axes and plottables) + - QCPAbstractPlottable::pixelsToCoords (inverse function to the already existing coordsToPixels function) + - QCPRange::contains(double value) + - QCPAxis::setLabelColor and setTickLabelColor + - QCustomPlot::setTitleColor + - QCustomPlot now emits beforeReplot and afterReplot signals. Note that it is safe to make two customPlots mutually call eachothers replot functions + in one of these slots, it will not cause an infinite loop. (usefull for synchronizing axes ranges between two customPlots, because setRange alone doesn't replot) + - If the Qt version is 4.7 or greater, the tick label strings in date-time-mode now support sub-second accuracy (e.g. with format like "hh:mm:ss.zzz"). + + Bugfixes: + - tick labels/margins should no longer oscillate by one pixel when dragging range or replotting repeatedly while changing e.g. data. This + was caused by a bug in Qt's QFontMetrics::boundingRect function when the font has an integer point size (probably some rounding problem). + The fix hence consists of creating a temporary font (only for bounding-box calculation) which is 0.05pt larger and thus avoiding the + jittering rounding outcome. + - tick label, axis label and plot title colors used to be undefined. This was fixed by providing explicit color properties. + + Other: + - fixed some glitches in the documentation + - QCustomPlot::replot and QCustomPlot::rescaleAxes are now slots + +#### Version released on 02.02.12 #### + + Changes that break backward compatibility: + - renamed all secondary classes from QCustomPlot[...] to QCP[...]: + QCustomPlotAxis -> QCPAxis + QCustomPlotGraph -> QCPGraph + QCustomPlotRange -> QCPRange + QCustomPlotData -> QCPData + QCustomPlotDataMap -> QCPDataMap + QCustomPlotLegend -> QCPLegend + QCustomPlotDataMapIterator -> QCPDataMapIterator + QCustomPlotDataMutableMapIterator -> QCPDataMutableMapIterator + A simple search and replace on all code files should make your code run again, e.g. consider the regex "QCustomPlot(?=[AGRDL])" -> "QCP". + Make sure not to just replace "QCustomPlot" with "QCP" because the main class QCustomPlot hasn't changed to QCP. + This change was necessary because class names became unhandy, pardon my bad naming decision in the beginning. + - QCPAxis::tickLength() and QCPAxis::subTickLength() now each split into two functions for inward and outward ticks (tickLengthIn/tickLengthOut). + - QCPLegend now uses QCPAbstractLegendItem to carry item data (before, the legend was passed QCPGraphs directly) + - QCustomPlot::addGraph() now doesn't return the index of the created graph anymore, but a pointer to the created QCPGraph. + - QCustomPlot::setAutoAddGraphToLegend is replaced by setAutoAddPlottableToLegend + + Added features: + - Reversed axis range with QCPAxis::setRangeReversed(bool) + - Tick labels are now only drawn if not clipped by the viewport (widget border) on the sides (e.g. left and right on a horizontal axis). + - Zerolines. Like grid lines only with a separate pen (QCPAxis::setZeroLinePen), at tick position zero. + - Outward ticks. QCPAxis::setTickLength/setSubTickLength now accepts two arguments for inward and outward tick length. This doesn't break + backward compatibility because the second argument (outward) has default value zero and thereby a call with one argument hasn't changed its meaning. + - QCPGraph now inherits from QCPAbstractPlottable + - QCustomPlot::addPlottable/plottable/removePlottable/clearPlottables added to interface with the new QCPAbstractPlottable-based system. The simpler interface + which only acts on QCPGraphs (addGraph, graph, removeGraph, etc.) was adapted internally and is kept for backward compatibility and ease of use. + - QCPLegend items for plottables (e.g. graphs) can automatically wrap their texts to fit the widths, see QCPLegend::setMinimumSize and QCPPlottableLegendItem::setTextWrap. + - QCustomPlot::rescaleAxes. Adapts axis ranges to show all plottables/graphs, by calling QCPAbstractPlottable::rescaleAxes on all plottables in the plot. + - QCPCurve. For plotting of parametric curves. + - QCPBars. For plotting of bar charts. + - QCPStatisticalBox. For statistical box plots. + + Bugfixes: + - Fixed QCustomPlot::removeGraph(int) not being able to remove graph index 0 + - made QCustomPlot::replot() abort painting when painter initialization fails (e.g. because width/height of QCustomPlot is zero) + - The distance of the axis label from the axis ignored the tick label padding, this could have caused overlapping axis labels and tick labels + - fixed memory leak in QCustomPlot (dtor didn't delete legend) + - fixed bug that prevented QCPAxis::setRangeLower/Upper from setting the value to exactly 0. + + Other: + - Changed default error bar handle size (QCustomPlotGraph::setErrorBarSize) from 4 to 6. + - Removed QCustomPlotDataFetcher. Was deprecated and not used class. + - Extended documentation, especially class descriptions. + +#### Version released on 15.01.12 #### + + Changes that (might) break backward compatibility: + - QCustomPlotGraph now inherits from QObject + + Added features: + - Added axis background pixmap (QCustomPlot::setAxisBackground, setAxisBackgroundScaled, setAxisBackgroundScaledMode) + - Added width and height parameter on PDF export function QCustomPlot::savePdf(). This now allows PDF export to + have arbitrary dimensions, independent of the current geometry of the QCustomPlot. + - Added overload of QCustomPlot::removeGraph that takes QCustomPlotGraph* as parameter, instead the index of the graph + - Added all enums to the Qt meta system via Q_ENUMS(). The enums can now be transformed + to QString values easily with the Qt meta system, which makes saving state e.g. as XML + significantly nicer. + - added typedef QMapIterator<double,QCustomPlotData> QCustomPlotDataMapIterator + and typedef QMutableMapIterator<double,QCustomPlotData> QCustomPlotDataMutableMapIterator + for improved information hiding, when using iterators outside QCustomPlot code + + Bugfixes: + - Fixed savePngScaled. Axis/label drawing functions used to reset the painter transform + and thereby break savePngScaled. Now they buffer the current transform and restore it afterwards. + - Fixed some glitches in the doxygen comments (affects documentation only) + + Other: + - Changed the default tickLabelPadding of top axis from 3 to 6 pixels. Looks better. + - Changed the default QCustomPlot::setAntialiasedElements setting: Graph fills are now antialiased + by default. That's a bit slower, but makes fill borders look better. + +#### Version released on 19.11.11 #### + + Changes that break backward compatibility: + - QCustomPlotAxis: tickFont and setTickFont renamed to tickLabelFont and setTickLabelFont (for naming consistency) + + Other: + - QCustomPlotAxis: Added rotated tick labels, see setTickLabelRotation + diff --git a/3rdparty/GUI/qcustomplot/qcustomplot.cpp b/3rdparty/GUI/qcustomplot/qcustomplot.cpp index bbd6cb2e3e2..72b5bfb8bb3 100644 --- a/3rdparty/GUI/qcustomplot/qcustomplot.cpp +++ b/3rdparty/GUI/qcustomplot/qcustomplot.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** ** QCustomPlot, an easy to use, modern plotting widget for Qt ** -** Copyright (C) 2011-2021 Emanuel Eichhammer ** +** Copyright (C) 2011-2022 Emanuel Eichhammer ** ** ** ** This program is free software: you can redistribute it and/or modify ** ** it under the terms of the GNU General Public License as published by ** @@ -18,16 +18,16 @@ ** ** **************************************************************************** ** Author: Emanuel Eichhammer ** -** Website/Contact: http://www.qcustomplot.com/ ** -** Date: 29.03.21 ** -** Version: 2.1.0 ** +** Website/Contact: https://www.qcustomplot.com/ ** +** Date: 06.11.22 ** +** Version: 2.1.1 ** ****************************************************************************/ #include "qcustomplot.h" /* including file 'src/vector2d.cpp' */ -/* modified 2021-03-29T02:30:44, size 7973 */ +/* modified 2022-11-06T12:45:56, size 7973 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPVector2D @@ -272,7 +272,7 @@ QCPVector2D &QCPVector2D::operator-=(const QCPVector2D &vector) /* including file 'src/painter.cpp' */ -/* modified 2021-03-29T02:30:44, size 8656 */ +/* modified 2022-11-06T12:45:56, size 8656 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPPainter @@ -489,7 +489,7 @@ void QCPPainter::makeNonCosmetic() /* including file 'src/paintbuffer.cpp' */ -/* modified 2021-03-29T02:30:44, size 18915 */ +/* modified 2022-11-06T12:45:56, size 18915 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAbstractPaintBuffer @@ -976,7 +976,7 @@ void QCPPaintBufferGlFbo::reallocateBuffer() /* including file 'src/layer.cpp' */ -/* modified 2021-03-29T02:30:44, size 37615 */ +/* modified 2022-11-06T12:45:56, size 37615 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPLayer @@ -1836,7 +1836,7 @@ void QCPLayerable::wheelEvent(QWheelEvent *event) /* including file 'src/axis/range.cpp' */ -/* modified 2021-03-29T02:30:44, size 12221 */ +/* modified 2022-11-06T12:45:56, size 12221 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPRange @@ -2158,7 +2158,7 @@ bool QCPRange::validRange(const QCPRange &range) /* including file 'src/selection.cpp' */ -/* modified 2021-03-29T02:30:44, size 21837 */ +/* modified 2022-11-06T12:45:56, size 21837 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPDataRange @@ -2759,7 +2759,7 @@ QCPDataSelection QCPDataSelection::inverse(const QCPDataRange &outerRange) const /* including file 'src/selectionrect.cpp' */ -/* modified 2021-03-29T02:30:44, size 9215 */ +/* modified 2022-11-06T12:45:56, size 9215 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPSelectionRect @@ -2988,7 +2988,7 @@ void QCPSelectionRect::draw(QCPPainter *painter) /* including file 'src/layout.cpp' */ -/* modified 2021-03-29T02:30:44, size 78863 */ +/* modified 2022-11-06T12:45:56, size 78863 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPMarginGroup @@ -5161,7 +5161,7 @@ void QCPLayoutInset::addElement(QCPLayoutElement *element, const QRectF &rect) /* including file 'src/lineending.cpp' */ -/* modified 2021-03-29T02:30:44, size 11189 */ +/* modified 2022-11-06T12:45:56, size 11189 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPLineEnding @@ -5455,7 +5455,7 @@ void QCPLineEnding::draw(QCPPainter *painter, const QCPVector2D &pos, double ang /* including file 'src/axis/labelpainter.cpp' */ -/* modified 2021-03-29T02:30:44, size 27296 */ +/* modified 2022-11-06T12:45:56, size 27519 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -5653,8 +5653,8 @@ QByteArray QCPLabelPainterPrivate::generateLabelParameterHash() const QByteArray result; result.append(QByteArray::number(mParentPlot->bufferDevicePixelRatio())); result.append(QByteArray::number(mRotation)); - //result.append(QByteArray::number((int)tickLabelSide)); TODO: check whether this is really a cache-invalidating property - result.append(QByteArray::number((int)mSubstituteExponent)); + //result.append(QByteArray::number(int(tickLabelSide))); TODO: check whether this is really a cache-invalidating property + result.append(QByteArray::number(int(mSubstituteExponent))); result.append(QString(mMultiplicationSymbol).toUtf8()); result.append(mColor.name().toLatin1()+QByteArray::number(mColor.alpha(), 16)); result.append(mFont.toString().toLatin1()); @@ -5757,9 +5757,12 @@ QPointF QCPLabelPainterPrivate::getAnchorPos(const QPointF &tickPos) case asTopRight: return tickPos+QPointF(-mPadding*M_SQRT1_2, mPadding*M_SQRT1_2); case asBottomRight: return tickPos+QPointF(-mPadding*M_SQRT1_2, -mPadding*M_SQRT1_2); case asBottomLeft: return tickPos+QPointF(mPadding*M_SQRT1_2, -mPadding*M_SQRT1_2); + default: qDebug() << Q_FUNC_INFO << "invalid mode for anchor side: " << mAnchorSide; break; } + break; } case amSkewedUpright: + // fall through case amSkewedRotated: { QCPVector2D anchorNormal(tickPos-mAnchorReference); @@ -5768,6 +5771,7 @@ QPointF QCPLabelPainterPrivate::getAnchorPos(const QPointF &tickPos) anchorNormal.normalize(); return tickPos+(anchorNormal*mPadding).toPointF(); } + default: qDebug() << Q_FUNC_INFO << "invalid mode for anchor mode: " << mAnchorMode; break; } return tickPos; } @@ -5985,8 +5989,8 @@ QByteArray QCPLabelPainterPrivate::cacheKey(const QString &text, const QColor &c { return text.toUtf8()+ QByteArray::number(color.red()+256*color.green()+65536*color.blue(), 36)+ - QByteArray::number(color.alpha()+256*(int)side, 36)+ - QByteArray::number((int)(rotation*100)%36000, 36); + QByteArray::number(color.alpha()+256*int(side), 36)+ + QByteArray::number(int(rotation*100), 36); } QCPLabelPainterPrivate::AnchorSide QCPLabelPainterPrivate::skewedAnchorSide(const QPointF &tickPos, double sideExpandHorz, double sideExpandVert) const @@ -6054,7 +6058,7 @@ void QCPLabelPainterPrivate::analyzeFontMetrics() /* including file 'src/axis/axisticker.cpp' */ -/* modified 2021-03-29T02:30:44, size 18688 */ +/* modified 2022-11-06T12:45:56, size 18693 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTicker @@ -6438,7 +6442,7 @@ double QCPAxisTicker::pickClosest(double target, const QVector<double> &candidat */ double QCPAxisTicker::getMantissa(double input, double *magnitude) const { - const double mag = qPow(10.0, qFloor(qLn(input)/qLn(10.0))); + const double mag = std::pow(10.0, std::floor(std::log10(input))); if (magnitude) *magnitude = mag; return input/mag; } @@ -6474,7 +6478,7 @@ double QCPAxisTicker::cleanMantissa(double input) const /* including file 'src/axis/axistickerdatetime.cpp' */ -/* modified 2021-03-29T02:30:44, size 18829 */ +/* modified 2022-11-06T12:45:56, size 18829 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerDateTime @@ -6831,7 +6835,7 @@ double QCPAxisTickerDateTime::dateTimeToKey(const QDate &date, Qt::TimeSpec time /* including file 'src/axis/axistickertime.cpp' */ -/* modified 2021-03-29T02:30:44, size 11745 */ +/* modified 2022-11-06T12:45:56, size 11745 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerTime @@ -7080,7 +7084,7 @@ void QCPAxisTickerTime::replaceUnit(QString &text, QCPAxisTickerTime::TimeUnit u /* including file 'src/axis/axistickerfixed.cpp' */ -/* modified 2021-03-29T02:30:44, size 5575 */ +/* modified 2022-11-06T12:45:56, size 5575 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerFixed @@ -7182,7 +7186,7 @@ double QCPAxisTickerFixed::getTickStep(const QCPRange &range) /* including file 'src/axis/axistickertext.cpp' */ -/* modified 2021-03-29T02:30:44, size 8742 */ +/* modified 2022-11-06T12:45:56, size 8742 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerText @@ -7399,7 +7403,7 @@ QVector<double> QCPAxisTickerText::createTickVector(double tickStep, const QCPRa /* including file 'src/axis/axistickerpi.cpp' */ -/* modified 2021-03-29T02:30:44, size 11177 */ +/* modified 2022-11-06T12:45:56, size 11177 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerPi @@ -7686,7 +7690,7 @@ QString QCPAxisTickerPi::unicodeSubscript(int number) const /* including file 'src/axis/axistickerlog.cpp' */ -/* modified 2021-03-29T02:30:44, size 7890 */ +/* modified 2022-11-06T12:45:56, size 7890 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerLog @@ -7827,7 +7831,7 @@ QVector<double> QCPAxisTickerLog::createTickVector(double tickStep, const QCPRan /* including file 'src/axis/axis.cpp' */ -/* modified 2021-03-29T02:30:44, size 99883 */ +/* modified 2022-11-06T12:45:56, size 99911 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -10348,7 +10352,7 @@ QCPAxisPainterPrivate::TickLabelData QCPAxisPainterPrivate::getTickLabelData(con int eLast = -1; // last index of exponent part, rest of text after this will be suffixPart if (substituteExponent) { - ePos = text.indexOf(QLatin1Char('e')); + ePos = text.indexOf(QString(mParentPlot->locale().exponential())); if (ePos > 0 && text.at(ePos-1).isDigit()) { eLast = ePos; @@ -10545,7 +10549,7 @@ void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString /* including file 'src/scatterstyle.cpp' */ -/* modified 2021-03-29T02:30:44, size 17466 */ +/* modified 2022-11-06T12:45:56, size 17466 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPScatterStyle @@ -11018,7 +11022,7 @@ void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const /* including file 'src/plottable.cpp' */ -/* modified 2021-03-29T02:30:44, size 38818 */ +/* modified 2022-11-06T12:45:56, size 38818 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPSelectionDecorator @@ -11989,7 +11993,7 @@ void QCPAbstractPlottable::deselectEvent(bool *selectionStateChanged) /* including file 'src/item.cpp' */ -/* modified 2021-03-29T02:30:44, size 49486 */ +/* modified 2022-11-06T12:45:56, size 49486 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemAnchor @@ -13261,7 +13265,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const /* including file 'src/core.cpp' */ -/* modified 2021-03-29T02:30:44, size 127198 */ +/* modified 2022-11-06T12:45:56, size 127625 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCustomPlot @@ -13273,7 +13277,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const interacts with the user. For tutorials on how to use QCustomPlot, see the website\n - http://www.qcustomplot.com/ + https://www.qcustomplot.com/ */ /* start of documentation of inline functions */ @@ -13597,7 +13601,7 @@ QCustomPlot::QCustomPlot(QWidget *parent) : xAxis2(nullptr), yAxis2(nullptr), legend(nullptr), - mBufferDevicePixelRatio(1.0), // will be adapted to primary screen below + mBufferDevicePixelRatio(1.0), // will be adapted to true value below mPlotLayout(nullptr), mAutoAddPlottableToLegend(true), mAntialiasedElements(QCP::aeNone), @@ -13626,7 +13630,6 @@ QCustomPlot::QCustomPlot(QWidget *parent) : mOpenGlCacheLabelsBackup(true) { setAttribute(Qt::WA_NoMousePropagation); - setAttribute(Qt::WA_OpaquePaintEvent); setFocusPolicy(Qt::ClickFocus); setMouseTracking(true); QLocale currentLocale = locale(); @@ -15466,6 +15469,22 @@ QSize QCustomPlot::sizeHint() const void QCustomPlot::paintEvent(QPaintEvent *event) { Q_UNUSED(event) + + // detect if the device pixel ratio has changed (e.g. moving window between different DPI screens), and adapt buffers if necessary: +#ifdef QCP_DEVICEPIXELRATIO_SUPPORTED +# ifdef QCP_DEVICEPIXELRATIO_FLOAT + double newDpr = devicePixelRatioF(); +# else + double newDpr = devicePixelRatio(); +# endif + if (!qFuzzyCompare(mBufferDevicePixelRatio, newDpr)) + { + setBufferDevicePixelRatio(newDpr); + replot(QCustomPlot::rpQueuedRefresh); + return; + } +#endif + QCPPainter painter(this); if (painter.isActive()) { @@ -16480,7 +16499,7 @@ void QCustomPlot::toPainter(QCPPainter *painter, int width, int height) /* including file 'src/colorgradient.cpp' */ -/* modified 2021-03-29T02:30:44, size 25278 */ +/* modified 2022-11-06T12:45:56, size 25408 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -16710,10 +16729,10 @@ void QCPColorGradient::colorize(const double *data, const QCPRange &range, QRgb const double value = data[dataIndexFactor*i]; if (skipNanCheck || !std::isnan(value)) { - int index = int((!logarithmic ? value-range.lower : qLn(value/range.lower)) * posToIndexFactor); + qint64 index = qint64((!logarithmic ? value-range.lower : qLn(value/range.lower)) * posToIndexFactor); if (!mPeriodic) { - index = qBound(0, index, mLevelCount-1); + index = qBound(qint64(0), index, qint64(mLevelCount-1)); } else { index %= mLevelCount; @@ -16771,10 +16790,10 @@ void QCPColorGradient::colorize(const double *data, const unsigned char *alpha, const double value = data[dataIndexFactor*i]; if (skipNanCheck || !std::isnan(value)) { - int index = int((!logarithmic ? value-range.lower : qLn(value/range.lower)) * posToIndexFactor); + qint64 index = qint64((!logarithmic ? value-range.lower : qLn(value/range.lower)) * posToIndexFactor); if (!mPeriodic) { - index = qBound(0, index, mLevelCount-1); + index = qBound(qint64(0), index, qint64(mLevelCount-1)); } else { index %= mLevelCount; @@ -17017,7 +17036,7 @@ void QCPColorGradient::updateColorBuffer() for (int i=0; i<mLevelCount; ++i) { double position = i*indexToPosFactor; - QMap<double, QColor>::const_iterator it = mColorStops.lowerBound(position); + QMap<double, QColor>::const_iterator it = const_cast<const QMap<double, QColor>*>(&mColorStops)->lowerBound(position); // force using the const lowerBound method if (it == mColorStops.constEnd()) // position is on or after last stop, use color of last stop { if (useAlpha) @@ -17115,7 +17134,7 @@ void QCPColorGradient::updateColorBuffer() /* including file 'src/selectiondecorator-bracket.cpp' */ -/* modified 2021-03-29T02:30:44, size 12308 */ +/* modified 2022-11-06T12:45:56, size 12308 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPSelectionDecoratorBracket @@ -17401,7 +17420,7 @@ QPointF QCPSelectionDecoratorBracket::getPixelCoordinates(const QCPPlottableInte /* including file 'src/layoutelements/layoutelement-axisrect.cpp' */ -/* modified 2021-03-29T02:30:44, size 47193 */ +/* modified 2022-11-06T12:45:56, size 47193 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -18686,7 +18705,7 @@ void QCPAxisRect::wheelEvent(QWheelEvent *event) /* including file 'src/layoutelements/layoutelement-legend.cpp' */ -/* modified 2021-03-29T02:30:44, size 31762 */ +/* modified 2022-11-06T12:45:56, size 31762 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAbstractLegendItem @@ -19610,7 +19629,7 @@ void QCPLegend::parentPlotInitialized(QCustomPlot *parentPlot) /* including file 'src/layoutelements/layoutelement-textelement.cpp' */ -/* modified 2021-03-29T02:30:44, size 12925 */ +/* modified 2022-11-06T12:45:56, size 12925 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPTextElement @@ -20016,7 +20035,7 @@ QColor QCPTextElement::mainTextColor() const /* including file 'src/layoutelements/layoutelement-colorscale.cpp' */ -/* modified 2021-03-29T02:30:44, size 26531 */ +/* modified 2022-11-06T12:45:56, size 26531 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -20700,7 +20719,7 @@ void QCPColorScaleAxisRectPrivate::axisSelectableChanged(QCPAxis::SelectablePart /* including file 'src/plottables/plottable-graph.cpp' */ -/* modified 2021-03-29T02:30:44, size 74518 */ +/* modified 2022-11-06T12:45:57, size 74926 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPGraphData @@ -21530,21 +21549,37 @@ QVector<QPointF> QCPGraph::dataToImpulseLines(const QVector<QCPGraphData> &data) { for (int i=0; i<data.size(); ++i) { - const double key = keyAxis->coordToPixel(data.at(i).key); - result[i*2+0].setX(valueAxis->coordToPixel(0)); - result[i*2+0].setY(key); - result[i*2+1].setX(valueAxis->coordToPixel(data.at(i).value)); - result[i*2+1].setY(key); + const QCPGraphData ¤t = data.at(i); + if (!qIsNaN(current.value)) + { + const double key = keyAxis->coordToPixel(current.key); + result[i*2+0].setX(valueAxis->coordToPixel(0)); + result[i*2+0].setY(key); + result[i*2+1].setX(valueAxis->coordToPixel(current.value)); + result[i*2+1].setY(key); + } else + { + result[i*2+0] = QPointF(0, 0); + result[i*2+1] = QPointF(0, 0); + } } } else // key axis is horizontal { for (int i=0; i<data.size(); ++i) { - const double key = keyAxis->coordToPixel(data.at(i).key); - result[i*2+0].setX(key); - result[i*2+0].setY(valueAxis->coordToPixel(0)); - result[i*2+1].setX(key); - result[i*2+1].setY(valueAxis->coordToPixel(data.at(i).value)); + const QCPGraphData ¤t = data.at(i); + if (!qIsNaN(current.value)) + { + const double key = keyAxis->coordToPixel(data.at(i).key); + result[i*2+0].setX(key); + result[i*2+0].setY(valueAxis->coordToPixel(0)); + result[i*2+1].setX(key); + result[i*2+1].setY(valueAxis->coordToPixel(data.at(i).value)); + } else + { + result[i*2+0] = QPointF(0, 0); + result[i*2+1] = QPointF(0, 0); + } } } return result; @@ -22458,7 +22493,7 @@ int QCPGraph::findIndexBelowY(const QVector<QPointF> *data, double y) const /* including file 'src/plottables/plottable-curve.cpp' */ -/* modified 2021-03-29T02:30:44, size 63851 */ +/* modified 2022-11-06T12:45:56, size 63851 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPCurveData @@ -23916,7 +23951,7 @@ double QCPCurve::pointDistance(const QPointF &pixelPoint, QCPCurveDataContainer: /* including file 'src/plottables/plottable-bars.cpp' */ -/* modified 2021-03-29T02:30:44, size 43907 */ +/* modified 2022-11-06T12:45:56, size 43907 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -25092,7 +25127,7 @@ void QCPBars::connectBars(QCPBars *lower, QCPBars *upper) /* including file 'src/plottables/plottable-statisticalbox.cpp' */ -/* modified 2021-03-29T02:30:44, size 28951 */ +/* modified 2022-11-06T12:45:57, size 28951 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPStatisticalBoxData @@ -25754,7 +25789,7 @@ QVector<QLineF> QCPStatisticalBox::getWhiskerBarLines(QCPStatisticalBoxDataConta /* including file 'src/plottables/plottable-colormap.cpp' */ -/* modified 2021-03-29T02:30:44, size 48149 */ +/* modified 2022-11-06T12:45:56, size 48189 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPColorMapData @@ -26124,8 +26159,8 @@ void QCPColorMapData::recalculateDataBounds() { if (mKeySize > 0 && mValueSize > 0) { - double minHeight = mData[0]; - double maxHeight = mData[0]; + double minHeight = std::numeric_limits<double>::max(); + double maxHeight = -std::numeric_limits<double>::max(); const int dataCount = mValueSize*mKeySize; for (int i=0; i<dataCount; ++i) { @@ -26168,8 +26203,7 @@ void QCPColorMapData::clearAlpha() void QCPColorMapData::fill(double z) { const int dataCount = mValueSize*mKeySize; - for (int i=0; i<dataCount; ++i) - mData[i] = z; + memset(mData, z, dataCount*sizeof(*mData)); mDataBounds = QCPRange(z, z); mDataModified = true; } @@ -26188,8 +26222,7 @@ void QCPColorMapData::fillAlpha(unsigned char alpha) if (mAlpha || createAlpha(false)) { const int dataCount = mValueSize*mKeySize; - for (int i=0; i<dataCount; ++i) - mAlpha[i] = alpha; + memset(mAlpha, alpha, dataCount*sizeof(*mAlpha)); mDataModified = true; } } @@ -26887,7 +26920,7 @@ void QCPColorMap::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const /* including file 'src/plottables/plottable-financial.cpp' */ -/* modified 2021-03-29T02:30:44, size 42914 */ +/* modified 2022-11-06T12:45:57, size 42914 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPFinancialData @@ -27849,7 +27882,7 @@ QRectF QCPFinancial::selectionHitBox(QCPFinancialDataContainer::const_iterator i /* including file 'src/plottables/plottable-errorbar.cpp' */ -/* modified 2021-03-29T02:30:44, size 37679 */ +/* modified 2022-11-06T12:45:56, size 37679 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPErrorBarsData @@ -28817,7 +28850,7 @@ bool QCPErrorBars::rectIntersectsLine(const QRectF &pixelRect, const QLineF &lin /* including file 'src/items/item-straightline.cpp' */ -/* modified 2021-03-29T02:30:44, size 7596 */ +/* modified 2022-11-06T12:45:56, size 7596 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemStraightLine @@ -28998,7 +29031,7 @@ QPen QCPItemStraightLine::mainPen() const /* including file 'src/items/item-line.cpp' */ -/* modified 2021-03-29T02:30:44, size 8525 */ +/* modified 2022-11-06T12:45:56, size 8525 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemLine @@ -29229,7 +29262,7 @@ QPen QCPItemLine::mainPen() const /* including file 'src/items/item-curve.cpp' */ -/* modified 2021-03-29T02:30:44, size 7273 */ +/* modified 2022-11-06T12:45:56, size 7273 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemCurve @@ -29398,7 +29431,7 @@ QPen QCPItemCurve::mainPen() const /* including file 'src/items/item-rect.cpp' */ -/* modified 2021-03-29T02:30:44, size 6472 */ +/* modified 2022-11-06T12:45:56, size 6472 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemRect @@ -29555,7 +29588,7 @@ QBrush QCPItemRect::mainBrush() const /* including file 'src/items/item-text.cpp' */ -/* modified 2021-03-29T02:30:44, size 13335 */ +/* modified 2022-11-06T12:45:56, size 13335 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemText @@ -29903,7 +29936,7 @@ QBrush QCPItemText::mainBrush() const /* including file 'src/items/item-ellipse.cpp' */ -/* modified 2021-03-29T02:30:44, size 7881 */ +/* modified 2022-11-06T12:45:56, size 7881 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemEllipse @@ -30092,7 +30125,7 @@ QBrush QCPItemEllipse::mainBrush() const /* including file 'src/items/item-pixmap.cpp' */ -/* modified 2021-03-29T02:30:44, size 10622 */ +/* modified 2022-11-06T12:45:56, size 10622 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemPixmap @@ -30362,7 +30395,7 @@ QPen QCPItemPixmap::mainPen() const /* including file 'src/items/item-tracer.cpp' */ -/* modified 2021-03-29T02:30:44, size 14645 */ +/* modified 2022-11-06T12:45:56, size 14645 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemTracer @@ -30732,7 +30765,7 @@ QBrush QCPItemTracer::mainBrush() const /* including file 'src/items/item-bracket.cpp' */ -/* modified 2021-03-29T02:30:44, size 10705 */ +/* modified 2022-11-06T12:45:56, size 10705 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemBracket @@ -30973,7 +31006,7 @@ QPen QCPItemBracket::mainPen() const /* including file 'src/polar/radialaxis.cpp' */ -/* modified 2021-03-29T02:30:44, size 49415 */ +/* modified 2022-11-06T12:45:57, size 49415 */ @@ -32088,11 +32121,8 @@ QCPPolarAxisRadial::SelectablePart QCPPolarAxisRadial::getPartAt(const QPointF & return spTickLabels; else if (mAxisPainter->labelSelectionBox().contains(pos.toPoint())) return spAxisLabel; - else + else */ return spNone; - */ - - return spNone; } /* inherits documentation from base class */ @@ -32437,7 +32467,7 @@ QCP::Interaction QCPPolarAxisRadial::selectionCategory() const /* including file 'src/polar/layoutelement-angularaxis.cpp' */ -/* modified 2021-03-29T02:30:44, size 57266 */ +/* modified 2022-11-06T12:45:57, size 57266 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -32911,11 +32941,8 @@ QCPPolarAxisAngular::SelectablePart QCPPolarAxisAngular::getPartAt(const QPointF return spTickLabels; else if (mAxisPainter->labelSelectionBox().contains(pos.toPoint())) return spAxisLabel; - else + else */ return spNone; - */ - - return spNone; } /* inherits documentation from base class */ @@ -34131,7 +34158,7 @@ bool QCPPolarAxisAngular::registerPolarGraph(QCPPolarGraph *graph) /* including file 'src/polar/polargrid.cpp' */ -/* modified 2021-03-29T02:30:44, size 7493 */ +/* modified 2022-11-06T12:45:57, size 7493 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -34319,7 +34346,7 @@ void QCPPolarGrid::drawAngularGrid(QCPPainter *painter, const QPointF ¢er, d /* including file 'src/polar/polargraph.cpp' */ -/* modified 2021-03-29T02:30:44, size 44035 */ +/* modified 2022-11-06T12:45:57, size 44035 */ //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/3rdparty/GUI/qcustomplot/qcustomplot.h b/3rdparty/GUI/qcustomplot/qcustomplot.h index 642bd93cb34..02ed8fb2f35 100644 --- a/3rdparty/GUI/qcustomplot/qcustomplot.h +++ b/3rdparty/GUI/qcustomplot/qcustomplot.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** ** QCustomPlot, an easy to use, modern plotting widget for Qt ** -** Copyright (C) 2011-2021 Emanuel Eichhammer ** +** Copyright (C) 2011-2022 Emanuel Eichhammer ** ** ** ** This program is free software: you can redistribute it and/or modify ** ** it under the terms of the GNU General Public License as published by ** @@ -18,18 +18,11 @@ ** ** **************************************************************************** ** Author: Emanuel Eichhammer ** -** Website/Contact: http://www.qcustomplot.com/ ** -** Date: 29.03.21 ** -** Version: 2.1.0 ** +** Website/Contact: https://www.qcustomplot.com/ ** +** Date: 06.11.22 ** +** Version: 2.1.1 ** ****************************************************************************/ -/* - * ZR 16/02/2022 - * - * This is QCustomPlot 2.1.0 *patched* to be compatible with QT 6.2 LTS. - * Details at https://www.qcustomplot.com/index.php/support/forum/2380 - */ - #ifndef QCUSTOMPLOT_H #define QCUSTOMPLOT_H @@ -136,10 +129,10 @@ class QCPPolarGrid; class QCPPolarGraph; /* including file 'src/global.h' */ -/* modified 2021-03-29T02:30:44, size 16981 */ +/* modified 2022-11-06T12:45:57, size 18102 */ -#define QCUSTOMPLOT_VERSION_STR "2.1.0" -#define QCUSTOMPLOT_VERSION 0x020100 +#define QCUSTOMPLOT_VERSION_STR "2.1.1" +#define QCUSTOMPLOT_VERSION 0x020101 // decl definitions for shared library compilation/usage: #if defined(QT_STATIC_BUILD) @@ -160,11 +153,38 @@ class QCPPolarGraph; /*! The QCP Namespace contains general enums, QFlags and functions used throughout the QCustomPlot library. - + It provides QMetaObject-based reflection of its enums and flags via \a QCP::staticMetaObject. */ + +// Qt version < 6.2.0: to get metatypes Q_GADGET/Q_ENUMS/Q_FLAGS in namespace we have to make it look like a class during moc-run +#if QT_VERSION >= 0x060200 // don't use QT_VERSION_CHECK here, some moc versions don't understand it +namespace QCP { + Q_NAMESPACE // this is how to add the staticMetaObject to namespaces in newer Qt versions +#else // Qt version older than 6.2.0 +# ifndef Q_MOC_RUN namespace QCP { - Q_NAMESPACE +# else // not in moc run +class QCP { + Q_GADGET + Q_ENUMS(ExportPen) + Q_ENUMS(ResolutionUnit) + Q_ENUMS(SignDomain) + Q_ENUMS(MarginSide) + Q_ENUMS(AntialiasedElement) + Q_ENUMS(PlottingHint) + Q_ENUMS(Interaction) + Q_ENUMS(SelectionRectMode) + Q_ENUMS(SelectionType) + + Q_FLAGS(AntialiasedElements) + Q_FLAGS(PlottingHints) + Q_FLAGS(MarginSides) + Q_FLAGS(Interactions) +public: +# endif +#endif + /*! Defines the different units in which the image resolution can be specified in the export @@ -307,20 +327,6 @@ enum SelectionType { stNone ///< The plottable is not selectable ,stMultipleDataRanges ///< Any combination of data points/ranges can be selected }; - Q_ENUM_NS(ExportPen) - Q_ENUM_NS(ResolutionUnit) - Q_ENUM_NS(SignDomain) - Q_ENUM_NS(MarginSide) - Q_FLAG_NS(MarginSides) - Q_ENUM_NS(AntialiasedElement) - Q_FLAG_NS(AntialiasedElements) - Q_ENUM_NS(PlottingHint) - Q_FLAG_NS(PlottingHints) - Q_ENUM_NS(Interaction) - Q_FLAG_NS(Interactions) - Q_ENUM_NS(SelectionRectMode) - Q_ENUM_NS(SelectionType) - /*! \internal Returns whether the specified \a value is considered an invalid data value for plottables (i.e. @@ -381,18 +387,55 @@ inline int getMarginValue(const QMargins &margins, QCP::MarginSide side) return 0; } +// for newer Qt versions we have to declare the enums/flags as metatypes inside the namespace using Q_ENUM_NS/Q_FLAG_NS: +// if you change anything here, don't forget to change it for older Qt versions below, too, +// and at the start of the namespace in the fake moc-run class +#if QT_VERSION >= 0x060200 +Q_ENUM_NS(ExportPen) +Q_ENUM_NS(ResolutionUnit) +Q_ENUM_NS(SignDomain) +Q_ENUM_NS(MarginSide) +Q_ENUM_NS(AntialiasedElement) +Q_ENUM_NS(PlottingHint) +Q_ENUM_NS(Interaction) +Q_ENUM_NS(SelectionRectMode) +Q_ENUM_NS(SelectionType) + +Q_FLAG_NS(AntialiasedElements) +Q_FLAG_NS(PlottingHints) +Q_FLAG_NS(MarginSides) +Q_FLAG_NS(Interactions) +#else +extern const QMetaObject staticMetaObject; +#endif + } // end of namespace QCP + Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::AntialiasedElements) Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::PlottingHints) Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::MarginSides) Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::Interactions) -//no need to use Q_DECLARE_METATYPE on enum since Q_ENUM_NS adds enum as metatype automatically + +// for older Qt versions we have to declare the enums/flags as metatypes outside the namespace using Q_DECLARE_METATYPE: +// if you change anything here, don't forget to change it for newer Qt versions above, too, +// and at the start of the namespace in the fake moc-run class +#if QT_VERSION < QT_VERSION_CHECK(6, 2, 0) +Q_DECLARE_METATYPE(QCP::ExportPen) +Q_DECLARE_METATYPE(QCP::ResolutionUnit) +Q_DECLARE_METATYPE(QCP::SignDomain) +Q_DECLARE_METATYPE(QCP::MarginSide) +Q_DECLARE_METATYPE(QCP::AntialiasedElement) +Q_DECLARE_METATYPE(QCP::PlottingHint) +Q_DECLARE_METATYPE(QCP::Interaction) +Q_DECLARE_METATYPE(QCP::SelectionRectMode) +Q_DECLARE_METATYPE(QCP::SelectionType) +#endif /* end of 'src/global.h' */ /* including file 'src/vector2d.h' */ -/* modified 2021-03-29T02:30:44, size 4988 */ +/* modified 2022-11-06T12:45:56, size 4988 */ class QCP_LIB_DECL QCPVector2D { @@ -467,7 +510,7 @@ inline QDebug operator<< (QDebug d, const QCPVector2D &vec) /* including file 'src/painter.h' */ -/* modified 2021-03-29T02:30:44, size 4035 */ +/* modified 2022-11-06T12:45:56, size 4035 */ class QCP_LIB_DECL QCPPainter : public QPainter { @@ -526,7 +569,7 @@ Q_DECLARE_METATYPE(QCPPainter::PainterMode) /* including file 'src/paintbuffer.h' */ -/* modified 2021-03-29T02:30:44, size 5006 */ +/* modified 2022-11-06T12:45:56, size 5006 */ class QCP_LIB_DECL QCPAbstractPaintBuffer { @@ -634,7 +677,7 @@ protected: /* including file 'src/layer.h' */ -/* modified 2021-03-29T02:30:44, size 7038 */ +/* modified 2022-11-06T12:45:56, size 7038 */ class QCP_LIB_DECL QCPLayer : public QObject { @@ -783,7 +826,7 @@ private: /* including file 'src/axis/range.h' */ -/* modified 2021-03-29T02:30:44, size 5280 */ +/* modified 2022-11-06T12:45:56, size 5280 */ class QCP_LIB_DECL QCPRange { @@ -901,7 +944,7 @@ inline const QCPRange operator/(const QCPRange& range, double value) /* including file 'src/selection.h' */ -/* modified 2021-03-29T02:30:44, size 8569 */ +/* modified 2022-11-06T12:45:56, size 8569 */ class QCP_LIB_DECL QCPDataRange { @@ -1105,7 +1148,7 @@ inline QDebug operator<< (QDebug d, const QCPDataSelection &selection) /* including file 'src/selectionrect.h' */ -/* modified 2021-03-29T02:30:44, size 3354 */ +/* modified 2022-11-06T12:45:56, size 3354 */ class QCP_LIB_DECL QCPSelectionRect : public QCPLayerable { @@ -1159,7 +1202,7 @@ protected: /* including file 'src/layout.h' */ -/* modified 2021-03-29T02:30:44, size 14279 */ +/* modified 2022-11-06T12:45:56, size 14279 */ class QCP_LIB_DECL QCPMarginGroup : public QObject { @@ -1480,7 +1523,7 @@ Q_DECLARE_METATYPE(QCPLayoutInset::InsetPlacement) /* including file 'src/lineending.h' */ -/* modified 2021-03-29T02:30:44, size 4426 */ +/* modified 2022-11-06T12:45:56, size 4426 */ class QCP_LIB_DECL QCPLineEnding { @@ -1544,7 +1587,7 @@ Q_DECLARE_METATYPE(QCPLineEnding::EndingStyle) /* including file 'src/axis/labelpainter.h' */ -/* modified 2021-03-29T02:30:44, size 7086 */ +/* modified 2022-11-06T12:45:56, size 7086 */ class QCPLabelPainterPrivate { @@ -1684,7 +1727,7 @@ Q_DECLARE_METATYPE(QCPLabelPainterPrivate::AnchorSide) /* including file 'src/axis/axisticker.h' */ -/* modified 2021-03-29T02:30:44, size 4230 */ +/* modified 2022-11-06T12:45:56, size 4230 */ class QCP_LIB_DECL QCPAxisTicker { @@ -1749,7 +1792,7 @@ Q_DECLARE_METATYPE(QSharedPointer<QCPAxisTicker>) /* including file 'src/axis/axistickerdatetime.h' */ -/* modified 2021-03-29T02:30:44, size 3600 */ +/* modified 2022-11-06T12:45:56, size 3600 */ class QCP_LIB_DECL QCPAxisTickerDateTime : public QCPAxisTicker { @@ -1798,7 +1841,7 @@ protected: /* including file 'src/axis/axistickertime.h' */ -/* modified 2021-03-29T02:30:44, size 3542 */ +/* modified 2022-11-06T12:45:56, size 3542 */ class QCP_LIB_DECL QCPAxisTickerTime : public QCPAxisTicker { @@ -1850,7 +1893,7 @@ Q_DECLARE_METATYPE(QCPAxisTickerTime::TimeUnit) /* including file 'src/axis/axistickerfixed.h' */ -/* modified 2021-03-29T02:30:44, size 3308 */ +/* modified 2022-11-06T12:45:56, size 3308 */ class QCP_LIB_DECL QCPAxisTickerFixed : public QCPAxisTicker { @@ -1892,7 +1935,7 @@ Q_DECLARE_METATYPE(QCPAxisTickerFixed::ScaleStrategy) /* including file 'src/axis/axistickertext.h' */ -/* modified 2021-03-29T02:30:44, size 3090 */ +/* modified 2022-11-06T12:45:56, size 3090 */ class QCP_LIB_DECL QCPAxisTickerText : public QCPAxisTicker { @@ -1930,7 +1973,7 @@ protected: /* including file 'src/axis/axistickerpi.h' */ -/* modified 2021-03-29T02:30:44, size 3911 */ +/* modified 2022-11-06T12:45:56, size 3911 */ class QCP_LIB_DECL QCPAxisTickerPi : public QCPAxisTicker { @@ -1989,7 +2032,7 @@ Q_DECLARE_METATYPE(QCPAxisTickerPi::FractionStyle) /* including file 'src/axis/axistickerlog.h' */ -/* modified 2021-03-29T02:30:44, size 2594 */ +/* modified 2022-11-06T12:45:56, size 2594 */ class QCP_LIB_DECL QCPAxisTickerLog : public QCPAxisTicker { @@ -2021,7 +2064,7 @@ protected: /* including file 'src/axis/axis.h' */ -/* modified 2021-03-29T02:30:44, size 20913 */ +/* modified 2022-11-06T12:45:56, size 20913 */ class QCP_LIB_DECL QCPGrid :public QCPLayerable { @@ -2449,7 +2492,7 @@ protected: /* including file 'src/scatterstyle.h' */ -/* modified 2021-03-29T02:30:44, size 7275 */ +/* modified 2022-11-06T12:45:56, size 7275 */ class QCP_LIB_DECL QCPScatterStyle { @@ -2556,7 +2599,7 @@ Q_DECLARE_METATYPE(QCPScatterStyle::ScatterShape) /* including file 'src/datacontainer.h' */ -/* modified 2021-03-29T02:30:44, size 34070 */ +/* modified 2022-11-06T12:45:56, size 34305 */ /*! \relates QCPDataContainer Returns whether the sort key of \a a is less than the sort key of \a b. @@ -3225,6 +3268,8 @@ QCPRange QCPDataContainer<DataType>::keyRange(bool &foundRange, QCP::SignDomain output parameter \a foundRange indicates whether a sensible range was found. If this is false, you should not use the returned QCPRange (e.g. the data container is empty or all points have the same value). + + Inf and -Inf data values are ignored. If \a inKeyRange has both lower and upper bound set to zero (is equal to <tt>QCPRange()</tt>), all data points are considered, without any restriction on the keys. @@ -3262,12 +3307,12 @@ QCPRange QCPDataContainer<DataType>::valueRange(bool &foundRange, QCP::SignDomai if (restrictKeyRange && (it->mainKey() < inKeyRange.lower || it->mainKey() > inKeyRange.upper)) continue; current = it->valueRange(); - if ((current.lower < range.lower || !haveLower) && !qIsNaN(current.lower)) + if ((current.lower < range.lower || !haveLower) && !qIsNaN(current.lower) && std::isfinite(current.lower)) { range.lower = current.lower; haveLower = true; } - if ((current.upper > range.upper || !haveUpper) && !qIsNaN(current.upper)) + if ((current.upper > range.upper || !haveUpper) && !qIsNaN(current.upper) && std::isfinite(current.upper)) { range.upper = current.upper; haveUpper = true; @@ -3280,12 +3325,12 @@ QCPRange QCPDataContainer<DataType>::valueRange(bool &foundRange, QCP::SignDomai if (restrictKeyRange && (it->mainKey() < inKeyRange.lower || it->mainKey() > inKeyRange.upper)) continue; current = it->valueRange(); - if ((current.lower < range.lower || !haveLower) && current.lower < 0 && !qIsNaN(current.lower)) + if ((current.lower < range.lower || !haveLower) && current.lower < 0 && !qIsNaN(current.lower) && std::isfinite(current.lower)) { range.lower = current.lower; haveLower = true; } - if ((current.upper > range.upper || !haveUpper) && current.upper < 0 && !qIsNaN(current.upper)) + if ((current.upper > range.upper || !haveUpper) && current.upper < 0 && !qIsNaN(current.upper) && std::isfinite(current.upper)) { range.upper = current.upper; haveUpper = true; @@ -3298,12 +3343,12 @@ QCPRange QCPDataContainer<DataType>::valueRange(bool &foundRange, QCP::SignDomai if (restrictKeyRange && (it->mainKey() < inKeyRange.lower || it->mainKey() > inKeyRange.upper)) continue; current = it->valueRange(); - if ((current.lower < range.lower || !haveLower) && current.lower > 0 && !qIsNaN(current.lower)) + if ((current.lower < range.lower || !haveLower) && current.lower > 0 && !qIsNaN(current.lower) && std::isfinite(current.lower)) { range.lower = current.lower; haveLower = true; } - if ((current.upper > range.upper || !haveUpper) && current.upper > 0 && !qIsNaN(current.upper)) + if ((current.upper > range.upper || !haveUpper) && current.upper > 0 && !qIsNaN(current.upper) && std::isfinite(current.upper)) { range.upper = current.upper; haveUpper = true; @@ -3398,7 +3443,7 @@ void QCPDataContainer<DataType>::performAutoSqueeze() /* including file 'src/plottable.h' */ -/* modified 2021-03-29T02:30:44, size 8461 */ +/* modified 2022-11-06T12:45:56, size 8461 */ class QCP_LIB_DECL QCPSelectionDecorator { @@ -3555,7 +3600,7 @@ private: /* including file 'src/item.h' */ -/* modified 2021-03-29T02:30:44, size 9425 */ +/* modified 2022-11-06T12:45:56, size 9425 */ class QCP_LIB_DECL QCPItemAnchor { @@ -3740,7 +3785,7 @@ private: /* including file 'src/core.h' */ -/* modified 2021-03-29T02:30:44, size 19304 */ +/* modified 2022-11-06T12:45:56, size 19304 */ class QCP_LIB_DECL QCustomPlot : public QWidget { @@ -4110,7 +4155,7 @@ ItemType *QCustomPlot::itemAt(const QPointF &pos, bool onlySelectable) const /* including file 'src/plottable1d.h' */ -/* modified 2021-03-29T02:30:44, size 25638 */ +/* modified 2022-11-06T12:45:56, size 25638 */ class QCPPlottableInterface1D { @@ -4702,7 +4747,7 @@ void QCPAbstractPlottable1D<DataType>::drawPolyline(QCPPainter *painter, const Q /* including file 'src/colorgradient.h' */ -/* modified 2021-03-29T02:30:44, size 7262 */ +/* modified 2022-11-06T12:45:56, size 7262 */ class QCP_LIB_DECL QCPColorGradient { @@ -4805,7 +4850,7 @@ Q_DECLARE_METATYPE(QCPColorGradient::GradientPreset) /* including file 'src/selectiondecorator-bracket.h' */ -/* modified 2021-03-29T02:30:44, size 4458 */ +/* modified 2022-11-06T12:45:56, size 4458 */ class QCP_LIB_DECL QCPSelectionDecoratorBracket : public QCPSelectionDecorator { @@ -4874,7 +4919,7 @@ Q_DECLARE_METATYPE(QCPSelectionDecoratorBracket::BracketStyle) /* including file 'src/layoutelements/layoutelement-axisrect.h' */ -/* modified 2021-03-29T02:30:44, size 7529 */ +/* modified 2022-11-06T12:45:56, size 7529 */ class QCP_LIB_DECL QCPAxisRect : public QCPLayoutElement { @@ -5000,7 +5045,7 @@ private: /* including file 'src/layoutelements/layoutelement-legend.h' */ -/* modified 2021-03-29T02:30:44, size 10425 */ +/* modified 2022-11-06T12:45:56, size 10425 */ class QCP_LIB_DECL QCPAbstractLegendItem : public QCPLayoutElement { @@ -5218,7 +5263,7 @@ Q_DECLARE_METATYPE(QCPLegend::SelectablePart) /* including file 'src/layoutelements/layoutelement-textelement.h' */ -/* modified 2021-03-29T02:30:44, size 5359 */ +/* modified 2022-11-06T12:45:56, size 5359 */ class QCP_LIB_DECL QCPTextElement : public QCPLayoutElement { @@ -5305,7 +5350,7 @@ private: /* including file 'src/layoutelements/layoutelement-colorscale.h' */ -/* modified 2021-03-29T02:30:44, size 5939 */ +/* modified 2022-11-06T12:45:56, size 5939 */ class QCPColorScaleAxisRectPrivate : public QCPAxisRect @@ -5413,7 +5458,7 @@ private: /* including file 'src/plottables/plottable-graph.h' */ -/* modified 2021-03-29T02:30:44, size 9316 */ +/* modified 2022-11-06T12:45:56, size 9316 */ class QCP_LIB_DECL QCPGraphData { @@ -5552,7 +5597,7 @@ Q_DECLARE_METATYPE(QCPGraph::LineStyle) /* including file 'src/plottables/plottable-curve.h' */ -/* modified 2021-03-29T02:30:44, size 7434 */ +/* modified 2022-11-06T12:45:56, size 7434 */ class QCP_LIB_DECL QCPCurveData { @@ -5667,7 +5712,7 @@ Q_DECLARE_METATYPE(QCPCurve::LineStyle) /* including file 'src/plottables/plottable-bars.h' */ -/* modified 2021-03-29T02:30:44, size 8955 */ +/* modified 2022-11-06T12:45:56, size 8955 */ class QCP_LIB_DECL QCPBarsGroup : public QObject { @@ -5855,7 +5900,7 @@ Q_DECLARE_METATYPE(QCPBars::WidthType) /* including file 'src/plottables/plottable-statisticalbox.h' */ -/* modified 2021-03-29T02:30:44, size 7522 */ +/* modified 2022-11-06T12:45:56, size 7522 */ class QCP_LIB_DECL QCPStatisticalBoxData { @@ -5972,7 +6017,7 @@ protected: /* including file 'src/plottables/plottable-colormap.h' */ -/* modified 2021-03-29T02:30:44, size 7092 */ +/* modified 2022-11-06T12:45:56, size 7092 */ class QCP_LIB_DECL QCPColorMapData { @@ -6108,7 +6153,7 @@ protected: /* including file 'src/plottables/plottable-financial.h' */ -/* modified 2021-03-29T02:30:44, size 8644 */ +/* modified 2022-11-06T12:45:56, size 8644 */ class QCP_LIB_DECL QCPFinancialData { @@ -6247,7 +6292,7 @@ Q_DECLARE_METATYPE(QCPFinancial::ChartStyle) /* including file 'src/plottables/plottable-errorbar.h' */ -/* modified 2021-03-29T02:30:44, size 7749 */ +/* modified 2022-11-06T12:45:56, size 7749 */ class QCP_LIB_DECL QCPErrorBarsData { @@ -6372,7 +6417,7 @@ protected: /* including file 'src/items/item-straightline.h' */ -/* modified 2021-03-29T02:30:44, size 3137 */ +/* modified 2022-11-06T12:45:56, size 3137 */ class QCP_LIB_DECL QCPItemStraightLine : public QCPAbstractItem { @@ -6415,7 +6460,7 @@ protected: /* including file 'src/items/item-line.h' */ -/* modified 2021-03-29T02:30:44, size 3429 */ +/* modified 2022-11-06T12:45:56, size 3429 */ class QCP_LIB_DECL QCPItemLine : public QCPAbstractItem { @@ -6465,7 +6510,7 @@ protected: /* including file 'src/items/item-curve.h' */ -/* modified 2021-03-29T02:30:44, size 3401 */ +/* modified 2022-11-06T12:45:56, size 3401 */ class QCP_LIB_DECL QCPItemCurve : public QCPAbstractItem { @@ -6516,7 +6561,7 @@ protected: /* including file 'src/items/item-rect.h' */ -/* modified 2021-03-29T02:30:44, size 3710 */ +/* modified 2022-11-06T12:45:56, size 3710 */ class QCP_LIB_DECL QCPItemRect : public QCPAbstractItem { @@ -6575,7 +6620,7 @@ protected: /* including file 'src/items/item-text.h' */ -/* modified 2021-03-29T02:30:44, size 5576 */ +/* modified 2022-11-06T12:45:56, size 5576 */ class QCP_LIB_DECL QCPItemText : public QCPAbstractItem { @@ -6672,7 +6717,7 @@ protected: /* including file 'src/items/item-ellipse.h' */ -/* modified 2021-03-29T02:30:44, size 3890 */ +/* modified 2022-11-06T12:45:56, size 3890 */ class QCP_LIB_DECL QCPItemEllipse : public QCPAbstractItem { @@ -6734,7 +6779,7 @@ protected: /* including file 'src/items/item-pixmap.h' */ -/* modified 2021-03-29T02:30:44, size 4407 */ +/* modified 2022-11-06T12:45:56, size 4407 */ class QCP_LIB_DECL QCPItemPixmap : public QCPAbstractItem { @@ -6803,7 +6848,7 @@ protected: /* including file 'src/items/item-tracer.h' */ -/* modified 2021-03-29T02:30:44, size 4811 */ +/* modified 2022-11-06T12:45:56, size 4811 */ class QCP_LIB_DECL QCPItemTracer : public QCPAbstractItem { @@ -6889,7 +6934,7 @@ Q_DECLARE_METATYPE(QCPItemTracer::TracerStyle) /* including file 'src/items/item-bracket.h' */ -/* modified 2021-03-29T02:30:44, size 3991 */ +/* modified 2022-11-06T12:45:56, size 3991 */ class QCP_LIB_DECL QCPItemBracket : public QCPAbstractItem { @@ -6956,7 +7001,7 @@ Q_DECLARE_METATYPE(QCPItemBracket::BracketStyle) /* including file 'src/polar/radialaxis.h' */ -/* modified 2021-03-29T02:30:44, size 12227 */ +/* modified 2022-11-06T12:45:56, size 12227 */ class QCP_LIB_DECL QCPPolarAxisRadial : public QCPLayerable @@ -7208,7 +7253,7 @@ Q_DECLARE_METATYPE(QCPPolarAxisRadial::SelectablePart) /* including file 'src/polar/layoutelement-angularaxis.h' */ -/* modified 2021-03-29T02:30:44, size 13461 */ +/* modified 2022-11-06T12:45:56, size 13461 */ class QCP_LIB_DECL QCPPolarAxisAngular : public QCPLayoutElement { @@ -7481,7 +7526,7 @@ Q_DECLARE_METATYPE(QCPPolarAxisAngular::SelectablePart) /* including file 'src/polar/polargrid.h' */ -/* modified 2021-03-29T02:30:44, size 4506 */ +/* modified 2022-11-06T12:45:56, size 4506 */ class QCP_LIB_DECL QCPPolarGrid :public QCPLayerable { @@ -7561,7 +7606,7 @@ Q_DECLARE_METATYPE(QCPPolarGrid::GridType) /* including file 'src/polar/polargraph.h' */ -/* modified 2021-03-29T02:30:44, size 9606 */ +/* modified 2022-11-06T12:45:56, size 9606 */ class QCP_LIB_DECL QCPPolarLegendItem : public QCPAbstractLegendItem -- GitLab